diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-5.10/950-0446-nvmem-Add-driver-to-expose-reserved-memory-as-nvmem.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.10/950-0446-nvmem-Add-driver-to-expose-reserved-memory-as-nvmem.patch | 163 |
1 files changed, 0 insertions, 163 deletions
diff --git a/target/linux/bcm27xx/patches-5.10/950-0446-nvmem-Add-driver-to-expose-reserved-memory-as-nvmem.patch b/target/linux/bcm27xx/patches-5.10/950-0446-nvmem-Add-driver-to-expose-reserved-memory-as-nvmem.patch deleted file mode 100644 index 79fc84f5ac..0000000000 --- a/target/linux/bcm27xx/patches-5.10/950-0446-nvmem-Add-driver-to-expose-reserved-memory-as-nvmem.patch +++ /dev/null @@ -1,163 +0,0 @@ -From 639949895123bb937b374ccacae0675ff4ab6e55 Mon Sep 17 00:00:00 2001 -From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> -Date: Thu, 10 Dec 2020 12:13:49 +0100 -Subject: [PATCH] nvmem: Add driver to expose reserved memory as nvmem - -Firmware/co-processors might use reserved memory areas in order to pass -data stemming from an nvmem device otherwise non accessible to Linux. -For example an EEPROM memory only physically accessible to firmware, or -data only accessible early at boot time. - -In order to expose this data to other drivers and user-space, the driver -models the reserved memory area as an nvmem device. - -Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> - ---- - -Changes since v1: - - Remove reserved memory phandle indirection by directly creating a - platform device from the reserved memory DT node - - Only map memory upon reading it to avoid corruption - - Small cosmetic cleanups ---- - drivers/nvmem/Kconfig | 8 ++++ - drivers/nvmem/Makefile | 2 + - drivers/nvmem/rmem.c | 97 ++++++++++++++++++++++++++++++++++++++++++ - drivers/of/platform.c | 1 + - 4 files changed, 108 insertions(+) - create mode 100644 drivers/nvmem/rmem.c - ---- a/drivers/nvmem/Kconfig -+++ b/drivers/nvmem/Kconfig -@@ -270,4 +270,12 @@ config SPRD_EFUSE - This driver can also be built as a module. If so, the module - will be called nvmem-sprd-efuse. - -+config NVMEM_RMEM -+ tristate "Reserved Memory Based Driver Support" -+ help -+ This drivers maps reserved memory into an nvmem device. It might be -+ useful to expose information left by firmware in memory. -+ -+ This driver can also be built as a module. If so, the module -+ will be called nvmem-rmem. - endif ---- a/drivers/nvmem/Makefile -+++ b/drivers/nvmem/Makefile -@@ -55,3 +55,5 @@ obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynq - nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o - obj-$(CONFIG_SPRD_EFUSE) += nvmem_sprd_efuse.o - nvmem_sprd_efuse-y := sprd-efuse.o -+obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o -+nvmem-rmem-y := rmem.o ---- /dev/null -+++ b/drivers/nvmem/rmem.c -@@ -0,0 +1,97 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Copyright (C) 2020 Nicolas Saenz Julienne <nsaenzjulienne@suse.de> -+ */ -+ -+#include <linux/io.h> -+#include <linux/module.h> -+#include <linux/nvmem-provider.h> -+#include <linux/of_reserved_mem.h> -+#include <linux/platform_device.h> -+ -+struct rmem { -+ struct device *dev; -+ struct nvmem_device *nvmem; -+ struct reserved_mem *mem; -+ -+ phys_addr_t size; -+}; -+ -+static int rmem_read(void *context, unsigned int offset, -+ void *val, size_t bytes) -+{ -+ struct rmem *priv = context; -+ size_t available = priv->mem->size; -+ loff_t off = offset; -+ void *addr; -+ int count; -+ -+ /* -+ * Only map the reserved memory at this point to avoid potential rogue -+ * kernel threads inadvertently modifying it. Based on the current -+ * uses-cases for this driver, the performance hit isn't a concern. -+ * Nor is likely to be, given the nature of the subsystem. Most nvmem -+ * devices operate over slow buses to begin with. -+ * -+ * An alternative would be setting the memory as RO, set_memory_ro(), -+ * but as of Dec 2020 this isn't possible on arm64. -+ */ -+ addr = memremap(priv->mem->base, available, MEMREMAP_WB); -+ if (IS_ERR(addr)) { -+ dev_err(priv->dev, "Failed to remap memory region\n"); -+ return PTR_ERR(addr); -+ } -+ -+ count = memory_read_from_buffer(val, bytes, &off, addr, available); -+ -+ memunmap(addr); -+ -+ return count; -+} -+ -+static int rmem_probe(struct platform_device *pdev) -+{ -+ struct nvmem_config config = { }; -+ struct device *dev = &pdev->dev; -+ struct reserved_mem *mem; -+ struct rmem *priv; -+ -+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); -+ if (!priv) -+ return -ENOMEM; -+ priv->dev = dev; -+ -+ mem = of_reserved_mem_lookup(dev->of_node); -+ if (!mem) { -+ dev_err(dev, "Failed to lookup reserved memory\n"); -+ return -EINVAL; -+ } -+ priv->mem = mem; -+ -+ config.dev = dev; -+ config.priv = priv; -+ config.name = "rmem"; -+ config.size = mem->size; -+ config.reg_read = rmem_read; -+ -+ return PTR_ERR_OR_ZERO(devm_nvmem_register(dev, &config)); -+} -+ -+static const struct of_device_id rmem_match[] = { -+ { .compatible = "nvmem-rmem", }, -+ { /* sentinel */ }, -+}; -+MODULE_DEVICE_TABLE(of, rmem_match); -+ -+static struct platform_driver rmem_driver = { -+ .probe = rmem_probe, -+ .driver = { -+ .name = "rmem", -+ .of_match_table = rmem_match, -+ }, -+}; -+module_platform_driver(rmem_driver); -+ -+MODULE_AUTHOR("Nicolas Saenz Julienne <nsaenzjulienne@suse.de>"); -+MODULE_DESCRIPTION("Reserved Memory Based nvmem Driver"); -+MODULE_LICENSE("GPL"); ---- a/drivers/of/platform.c -+++ b/drivers/of/platform.c -@@ -511,6 +511,7 @@ static const struct of_device_id reserve - { .compatible = "qcom,rmtfs-mem" }, - { .compatible = "qcom,cmd-db" }, - { .compatible = "ramoops" }, -+ { .compatible = "nvmem-rmem" }, - {} - }; - |