diff --git a/patches/linux-5.5-openpower/0011-drivers-firmware-google-expose-CBMEM-as-sysfs-file.patch b/patches/linux-5.5-openpower/0011-drivers-firmware-google-expose-CBMEM-as-sysfs-file.patch new file mode 100644 index 00000000..5eeb98c7 --- /dev/null +++ b/patches/linux-5.5-openpower/0011-drivers-firmware-google-expose-CBMEM-as-sysfs-file.patch @@ -0,0 +1,89 @@ +From 9090a0266eb13b823656216c665182d45a4cd19b Mon Sep 17 00:00:00 2001 +From: Krystian Hebel +Date: Tue, 28 Mar 2023 18:31:21 +0200 +Subject: [PATCH] drivers/firmware/google: expose CBMEM as sysfs file + +Signed-off-by: Krystian Hebel +--- + drivers/firmware/google/Kconfig | 8 ++++++ + drivers/firmware/google/coreboot_table.c | 33 ++++++++++++++++++++++++ + 2 files changed, 41 insertions(+) + +diff --git a/drivers/firmware/google/Kconfig b/drivers/firmware/google/Kconfig +index a3a6ca659ffa..2d18ee174043 100644 +--- a/drivers/firmware/google/Kconfig ++++ b/drivers/firmware/google/Kconfig +@@ -29,6 +29,14 @@ config GOOGLE_COREBOOT_TABLE + device tree node /firmware/coreboot. + If unsure say N. + ++config GOOGLE_COREBOOT_CBMEM ++ bool "Expose CBMEM as file" ++ depends on GOOGLE_COREBOOT_TABLE ++ help ++ This option exposes raw contents of coreboot's CBMEM to be consumed ++ by userspace tools. Path to file: /sys/firmware/cbmem. ++ If unsure say N. ++ + config GOOGLE_COREBOOT_TABLE_ACPI + tristate + select GOOGLE_COREBOOT_TABLE +diff --git a/drivers/firmware/google/coreboot_table.c b/drivers/firmware/google/coreboot_table.c +index 8d132e4f008a..f93bdc49b1ac 100644 +--- a/drivers/firmware/google/coreboot_table.c ++++ b/drivers/firmware/google/coreboot_table.c +@@ -84,6 +84,18 @@ void coreboot_driver_unregister(struct coreboot_driver *driver) + } + EXPORT_SYMBOL(coreboot_driver_unregister); + ++#ifdef CONFIG_GOOGLE_COREBOOT_CBMEM ++static ssize_t cbmem_read(struct file *filp, struct kobject *kobp, ++ struct bin_attribute *bin_attr, char *buf, ++ loff_t pos, size_t count) ++{ ++ return memory_read_from_buffer(buf, count, &pos, ++ bin_attr->private, bin_attr->size); ++} ++ ++static BIN_ATTR_RO(cbmem, 0); ++#endif ++ + static int coreboot_table_populate(struct device *dev, void *ptr) + { + int i, ret; +@@ -160,11 +172,32 @@ static int coreboot_table_probe(struct platform_device *pdev) + } + memunmap(ptr); + ++#ifdef CONFIG_GOOGLE_COREBOOT_CBMEM ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 1); ++ if (res && res->start && res->end && resource_size(res)) { ++ bin_attr_cbmem.size = resource_size(res); ++ bin_attr_cbmem.private = memremap(res->start, ++ resource_size(res), ++ MEMREMAP_WB); ++ if (sysfs_create_bin_file(firmware_kobj, &bin_attr_cbmem)) { ++ bin_attr_cbmem.size = 0; ++ bin_attr_cbmem.private = NULL; ++ } ++ } ++#endif ++ + return ret; + } + + static int coreboot_table_remove(struct platform_device *pdev) + { ++#ifdef CONFIG_GOOGLE_COREBOOT_CBMEM ++ if (bin_attr_cbmem.private) { ++ sysfs_remove_bin_file(firmware_kobj, &bin_attr_cbmem); ++ memunmap(bin_attr_cbmem.private); ++ } ++#endif ++ + bus_unregister(&coreboot_bus_type); + return 0; + } +-- +2.17.1 +