Merge tag 'driver-core-6.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / drivers / acpi / bgrt.c
CommitLineData
d2912cb1 1// SPDX-License-Identifier: GPL-2.0-only
d1ff4b1c 2/*
cc079f8c
PG
3 * BGRT boot graphic support
4 * Authors: Matthew Garrett, Josh Triplett <josh@joshtriplett.org>
d1ff4b1c 5 * Copyright 2012 Red Hat, Inc <mjg@redhat.com>
2223af38 6 * Copyright 2012 Intel Corporation
d1ff4b1c
MG
7 */
8
9#include <linux/kernel.h>
d1ff4b1c
MG
10#include <linux/init.h>
11#include <linux/device.h>
12#include <linux/sysfs.h>
2223af38 13#include <linux/efi-bgrt.h>
d1ff4b1c 14
7b0a9114 15static void *bgrt_image;
d1ff4b1c
MG
16static struct kobject *bgrt_kobj;
17
f37ccf8f
NC
18#define BGRT_SHOW(_name, _member) \
19 static ssize_t _name##_show(struct kobject *kobj, \
20 struct kobj_attribute *attr, char *buf) \
21 { \
6554ca9c 22 return sysfs_emit(buf, "%d\n", bgrt_tab._member); \
f37ccf8f 23 } \
db2d1693 24 static struct kobj_attribute bgrt_attr_##_name = __ATTR_RO(_name)
f37ccf8f
NC
25
26BGRT_SHOW(version, version);
27BGRT_SHOW(status, status);
28BGRT_SHOW(type, image_type);
29BGRT_SHOW(xoffset, image_offset_x);
30BGRT_SHOW(yoffset, image_offset_y);
d1ff4b1c 31
66bc1a17 32static BIN_ATTR_SIMPLE_RO(image);
d1ff4b1c
MG
33
34static struct attribute *bgrt_attributes[] = {
f37ccf8f
NC
35 &bgrt_attr_version.attr,
36 &bgrt_attr_status.attr,
37 &bgrt_attr_type.attr,
38 &bgrt_attr_xoffset.attr,
39 &bgrt_attr_yoffset.attr,
d1ff4b1c
MG
40 NULL,
41};
42
65f44679
GK
43static struct bin_attribute *bgrt_bin_attributes[] = {
44 &bin_attr_image,
45 NULL,
46};
47
7e536269 48static const struct attribute_group bgrt_attribute_group = {
d1ff4b1c 49 .attrs = bgrt_attributes,
65f44679 50 .bin_attrs = bgrt_bin_attributes,
d1ff4b1c
MG
51};
52
6e7300cf
BS
53int __init acpi_parse_bgrt(struct acpi_table_header *table)
54{
55 efi_bgrt_init(table);
56 return 0;
57}
58
d1ff4b1c
MG
59static int __init bgrt_init(void)
60{
d1ff4b1c 61 int ret;
d1ff4b1c 62
7b0a9114 63 if (!bgrt_tab.image_address)
d1ff4b1c
MG
64 return -ENODEV;
65
7b0a9114
DY
66 bgrt_image = memremap(bgrt_tab.image_address, bgrt_image_size,
67 MEMREMAP_WB);
68 if (!bgrt_image) {
69 pr_notice("Ignoring BGRT: failed to map image memory\n");
70 return -ENOMEM;
71 }
72
65f44679
GK
73 bin_attr_image.private = bgrt_image;
74 bin_attr_image.size = bgrt_image_size;
d1ff4b1c
MG
75
76 bgrt_kobj = kobject_create_and_add("bgrt", acpi_kobj);
7b0a9114
DY
77 if (!bgrt_kobj) {
78 ret = -EINVAL;
79 goto out_memmap;
80 }
d1ff4b1c
MG
81
82 ret = sysfs_create_group(bgrt_kobj, &bgrt_attribute_group);
83 if (ret)
84 goto out_kobject;
85
d1ff4b1c
MG
86 return 0;
87
d1ff4b1c
MG
88out_kobject:
89 kobject_put(bgrt_kobj);
7b0a9114
DY
90out_memmap:
91 memunmap(bgrt_image);
d1ff4b1c
MG
92 return ret;
93}
cc079f8c 94device_initcall(bgrt_init);