On 3/1/21 11:44 PM, Rafał Miłecki wrote: > From: Rafał Miłecki <rafal@xxxxxxxxxx> > > Add support for platform device providing mapping resource. This allows > reading NVRAM based on DT mapping binding. It's required for devices > that boot depending on NVRAM stored setup and provides early access to > NVRAM data. > > Signed-off-by: Rafał Miłecki <rafal@xxxxxxxxxx> > --- > bcm47xx_nvram driver was originally added through MIPS tree, but this > change doesn't affect BCM47XX (MIPS) as it doesn't use DT. It targets > ARCH_BCM_5301X so I suggest this goes through the stblinux.git tree. Can you see if this change can be replaced by the nvmem-rmem work that Nicolas recently did to support something similar for the Raspberry Pi 4: https://lkml.org/lkml/2021/1/29/235 > --- > drivers/firmware/broadcom/bcm47xx_nvram.c | 55 +++++++++++++++++++++++ > 1 file changed, 55 insertions(+) > > diff --git a/drivers/firmware/broadcom/bcm47xx_nvram.c b/drivers/firmware/broadcom/bcm47xx_nvram.c > index 835ece9c00f1..d5d19dd1b9e1 100644 > --- a/drivers/firmware/broadcom/bcm47xx_nvram.c > +++ b/drivers/firmware/broadcom/bcm47xx_nvram.c > @@ -13,6 +13,7 @@ > #include <linux/kernel.h> > #include <linux/string.h> > #include <linux/mtd/mtd.h> > +#include <linux/platform_device.h> > #include <linux/bcm47xx_nvram.h> > > #define NVRAM_MAGIC 0x48534C46 /* 'FLSH' */ > @@ -162,6 +163,60 @@ static int nvram_init(void) > return -ENXIO; > } > > +static int brcm_nvram_probe(struct platform_device *pdev) > +{ > + struct nvram_header __iomem *header; > + struct device *dev = &pdev->dev; > + struct resource *res; > + void __iomem *mmio; > + size_t copy_len; > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + if (!res) { > + dev_err(dev, "Failed to get resource\n"); > + return -ENODEV; > + } > + > + mmio = ioremap(res->start, resource_size(res)); > + if (!mmio) > + return -ENOMEM; > + > + header = (struct nvram_header *)mmio; > + copy_len = DIV_ROUND_UP(sizeof(*header) + header->len, 4); > + if (header->magic != NVRAM_MAGIC) { > + dev_err(dev, "No NVRAM found at %pR\n", res); > + return -EPROTO; > + } else if (copy_len > resource_size(res)) { > + dev_err(dev, "NVRAM size exceeds %pR\n", res); > + return -ERANGE; > + } else if (copy_len >= NVRAM_SPACE) { > + dev_err(dev, "NVRAM size exceeds buffer size %d\n", NVRAM_SPACE); > + return -ENOMEM; > + } > + > + __ioread32_copy(nvram_buf, mmio, copy_len); > + nvram_buf[NVRAM_SPACE - 1] = '\0'; > + > + iounmap(mmio); > + > + return 0; > +} > + > +static const struct of_device_id brcm_nvram_of_match[] = { > + { .compatible = "brcm,nvram "}, > + {}, > +}; > + > +static struct platform_driver brcm_nvram_driver = { > + .driver = { > + .name = "brcm_nvram", > + .of_match_table = brcm_nvram_of_match, > + }, > + .probe = brcm_nvram_probe, > +}; > + > +module_platform_driver(brcm_nvram_driver); > + > int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len) > { > char *var, *value, *end, *eq; > -- Florian