Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-only
2 : : /*
3 : : * BGRT boot graphic support
4 : : * Authors: Matthew Garrett, Josh Triplett <josh@joshtriplett.org>
5 : : * Copyright 2012 Red Hat, Inc <mjg@redhat.com>
6 : : * Copyright 2012 Intel Corporation
7 : : */
8 : :
9 : : #include <linux/kernel.h>
10 : : #include <linux/init.h>
11 : : #include <linux/device.h>
12 : : #include <linux/sysfs.h>
13 : : #include <linux/efi-bgrt.h>
14 : :
15 : : static void *bgrt_image;
16 : : static struct kobject *bgrt_kobj;
17 : :
18 : 0 : static ssize_t show_version(struct device *dev,
19 : : struct device_attribute *attr, char *buf)
20 : : {
21 : 0 : return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.version);
22 : : }
23 : : static DEVICE_ATTR(version, S_IRUGO, show_version, NULL);
24 : :
25 : 0 : static ssize_t show_status(struct device *dev,
26 : : struct device_attribute *attr, char *buf)
27 : : {
28 : 0 : return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.status);
29 : : }
30 : : static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
31 : :
32 : 0 : static ssize_t show_type(struct device *dev,
33 : : struct device_attribute *attr, char *buf)
34 : : {
35 : 0 : return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.image_type);
36 : : }
37 : : static DEVICE_ATTR(type, S_IRUGO, show_type, NULL);
38 : :
39 : 0 : static ssize_t show_xoffset(struct device *dev,
40 : : struct device_attribute *attr, char *buf)
41 : : {
42 : 0 : return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.image_offset_x);
43 : : }
44 : : static DEVICE_ATTR(xoffset, S_IRUGO, show_xoffset, NULL);
45 : :
46 : 0 : static ssize_t show_yoffset(struct device *dev,
47 : : struct device_attribute *attr, char *buf)
48 : : {
49 : 0 : return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.image_offset_y);
50 : : }
51 : : static DEVICE_ATTR(yoffset, S_IRUGO, show_yoffset, NULL);
52 : :
53 : 0 : static ssize_t image_read(struct file *file, struct kobject *kobj,
54 : : struct bin_attribute *attr, char *buf, loff_t off, size_t count)
55 : : {
56 : 0 : memcpy(buf, attr->private + off, count);
57 : 0 : return count;
58 : : }
59 : :
60 : : static BIN_ATTR_RO(image, 0); /* size gets filled in later */
61 : :
62 : : static struct attribute *bgrt_attributes[] = {
63 : : &dev_attr_version.attr,
64 : : &dev_attr_status.attr,
65 : : &dev_attr_type.attr,
66 : : &dev_attr_xoffset.attr,
67 : : &dev_attr_yoffset.attr,
68 : : NULL,
69 : : };
70 : :
71 : : static struct bin_attribute *bgrt_bin_attributes[] = {
72 : : &bin_attr_image,
73 : : NULL,
74 : : };
75 : :
76 : : static const struct attribute_group bgrt_attribute_group = {
77 : : .attrs = bgrt_attributes,
78 : : .bin_attrs = bgrt_bin_attributes,
79 : : };
80 : :
81 : 0 : int __init acpi_parse_bgrt(struct acpi_table_header *table)
82 : : {
83 : 0 : efi_bgrt_init(table);
84 : 0 : return 0;
85 : : }
86 : :
87 : 3 : static int __init bgrt_init(void)
88 : : {
89 : 3 : int ret;
90 : :
91 [ - + ]: 3 : if (!bgrt_tab.image_address)
92 : : return -ENODEV;
93 : :
94 : 0 : bgrt_image = memremap(bgrt_tab.image_address, bgrt_image_size,
95 : : MEMREMAP_WB);
96 [ # # ]: 0 : if (!bgrt_image) {
97 : 0 : pr_notice("Ignoring BGRT: failed to map image memory\n");
98 : 0 : return -ENOMEM;
99 : : }
100 : :
101 : 0 : bin_attr_image.private = bgrt_image;
102 : 0 : bin_attr_image.size = bgrt_image_size;
103 : :
104 : 0 : bgrt_kobj = kobject_create_and_add("bgrt", acpi_kobj);
105 [ # # ]: 0 : if (!bgrt_kobj) {
106 : 0 : ret = -EINVAL;
107 : 0 : goto out_memmap;
108 : : }
109 : :
110 : 0 : ret = sysfs_create_group(bgrt_kobj, &bgrt_attribute_group);
111 [ # # ]: 0 : if (ret)
112 : 0 : goto out_kobject;
113 : :
114 : : return 0;
115 : :
116 : : out_kobject:
117 : 0 : kobject_put(bgrt_kobj);
118 : 0 : out_memmap:
119 : 0 : memunmap(bgrt_image);
120 : 0 : return ret;
121 : : }
122 : : device_initcall(bgrt_init);
|