2 * Copyright 2012 Red Hat, Inc <mjg@redhat.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/init.h>
12 #include <linux/device.h>
13 #include <linux/sysfs.h>
15 #include <acpi/acpi.h>
16 #include <acpi/acpi_bus.h>
18 static struct acpi_table_bgrt
*bgrt_tab
;
19 static struct kobject
*bgrt_kobj
;
24 } __attribute ((packed
));
26 static struct bmp_header bmp_header
;
28 static ssize_t
show_version(struct device
*dev
,
29 struct device_attribute
*attr
, char *buf
)
31 return snprintf(buf
, PAGE_SIZE
, "%d\n", bgrt_tab
->version
);
33 static DEVICE_ATTR(version
, S_IRUGO
, show_version
, NULL
);
35 static ssize_t
show_status(struct device
*dev
,
36 struct device_attribute
*attr
, char *buf
)
38 return snprintf(buf
, PAGE_SIZE
, "%d\n", bgrt_tab
->status
);
40 static DEVICE_ATTR(status
, S_IRUGO
, show_status
, NULL
);
42 static ssize_t
show_type(struct device
*dev
,
43 struct device_attribute
*attr
, char *buf
)
45 return snprintf(buf
, PAGE_SIZE
, "%d\n", bgrt_tab
->image_type
);
47 static DEVICE_ATTR(type
, S_IRUGO
, show_type
, NULL
);
49 static ssize_t
show_xoffset(struct device
*dev
,
50 struct device_attribute
*attr
, char *buf
)
52 return snprintf(buf
, PAGE_SIZE
, "%d\n", bgrt_tab
->image_offset_x
);
54 static DEVICE_ATTR(xoffset
, S_IRUGO
, show_xoffset
, NULL
);
56 static ssize_t
show_yoffset(struct device
*dev
,
57 struct device_attribute
*attr
, char *buf
)
59 return snprintf(buf
, PAGE_SIZE
, "%d\n", bgrt_tab
->image_offset_y
);
61 static DEVICE_ATTR(yoffset
, S_IRUGO
, show_yoffset
, NULL
);
63 static ssize_t
show_image(struct file
*file
, struct kobject
*kobj
,
64 struct bin_attribute
*attr
, char *buf
, loff_t off
, size_t count
)
66 int size
= attr
->size
;
67 void __iomem
*image
= attr
->private;
72 if (off
+ count
> size
)
75 memcpy_fromio(buf
, image
+off
, count
);
81 static struct bin_attribute image_attr
= {
89 static struct attribute
*bgrt_attributes
[] = {
90 &dev_attr_version
.attr
,
91 &dev_attr_status
.attr
,
93 &dev_attr_xoffset
.attr
,
94 &dev_attr_yoffset
.attr
,
98 static struct attribute_group bgrt_attribute_group
= {
99 .attrs
= bgrt_attributes
,
102 static int __init
bgrt_init(void)
111 status
= acpi_get_table("BGRT", 0,
112 (struct acpi_table_header
**)&bgrt_tab
);
114 if (ACPI_FAILURE(status
))
117 sysfs_bin_attr_init(&image_attr
);
119 bgrt
= ioremap(bgrt_tab
->image_address
, sizeof(struct bmp_header
));
126 memcpy_fromio(&bmp_header
, bgrt
, sizeof(bmp_header
));
127 image_attr
.size
= bmp_header
.size
;
130 image_attr
.private = ioremap(bgrt_tab
->image_address
, image_attr
.size
);
132 if (!image_attr
.private) {
138 bgrt_kobj
= kobject_create_and_add("bgrt", acpi_kobj
);
144 ret
= sysfs_create_group(bgrt_kobj
, &bgrt_attribute_group
);
148 ret
= sysfs_create_bin_file(bgrt_kobj
, &image_attr
);
155 sysfs_remove_group(bgrt_kobj
, &bgrt_attribute_group
);
157 kobject_put(bgrt_kobj
);
159 iounmap(image_attr
.private);
164 static void __exit
bgrt_exit(void)
166 iounmap(image_attr
.private);
167 sysfs_remove_group(bgrt_kobj
, &bgrt_attribute_group
);
168 sysfs_remove_bin_file(bgrt_kobj
, &image_attr
);
171 module_init(bgrt_init
);
172 module_exit(bgrt_exit
);
174 MODULE_AUTHOR("Matthew Garrett");
175 MODULE_DESCRIPTION("BGRT boot graphic support");
176 MODULE_LICENSE("GPL");