soc/tegra: fuse: Add nvmem keepout list
authorKartik <kkartik@nvidia.com>
Fri, 7 Oct 2022 09:51:07 +0000 (15:21 +0530)
committerThierry Reding <treding@nvidia.com>
Mon, 24 Oct 2022 15:09:55 +0000 (17:09 +0200)
On Tegra186 and later, various FUSE offsets are restricted and cannot be
accessed from CCPLEX. Currently nvmem binary interface allows reading
such offsets from userspace, which results in RAS errors.

Add nvmem keepout lists to avoid any reads to restricted offsets.

Signed-off-by: Kartik <kkartik@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/soc/tegra/fuse/fuse-tegra.c
drivers/soc/tegra/fuse/fuse-tegra30.c
drivers/soc/tegra/fuse/fuse.h

index 793032f4f015eef8a8829c873b19ea96428f8039..ea25a1dcafc2351c8948648b589ab4f9c2871ae4 100644 (file)
@@ -149,6 +149,8 @@ static int tegra_fuse_probe(struct platform_device *pdev)
        nvmem.owner = THIS_MODULE;
        nvmem.cells = fuse->soc->cells;
        nvmem.ncells = fuse->soc->num_cells;
+       nvmem.keepout = fuse->soc->keepouts;
+       nvmem.nkeepout = fuse->soc->num_keepouts;
        nvmem.type = NVMEM_TYPE_OTP;
        nvmem.read_only = true;
        nvmem.root_only = true;
index 86547be567af0ad23972cbf92b1f3bd8ea0a4624..932a03c64534aef8e8bc4edf9f8fe3350e085566 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/io.h>
 #include <linux/kernel.h>
 #include <linux/nvmem-consumer.h>
+#include <linux/nvmem-provider.h>
 #include <linux/of_device.h>
 #include <linux/of_address.h>
 #include <linux/platform_device.h>
@@ -494,6 +495,14 @@ static const struct nvmem_cell_lookup tegra186_fuse_lookups[] = {
        },
 };
 
+static const struct nvmem_keepout tegra186_fuse_keepouts[] = {
+       { .start = 0x01c, .end = 0x0f0 },
+       { .start = 0x138, .end = 0x198 },
+       { .start = 0x1d8, .end = 0x250 },
+       { .start = 0x280, .end = 0x290 },
+       { .start = 0x340, .end = 0x344 }
+};
+
 static const struct tegra_fuse_info tegra186_fuse_info = {
        .read = tegra30_fuse_read,
        .size = 0x478,
@@ -507,6 +516,8 @@ const struct tegra_fuse_soc tegra186_fuse_soc = {
        .num_lookups = ARRAY_SIZE(tegra186_fuse_lookups),
        .cells = tegra186_fuse_cells,
        .num_cells = ARRAY_SIZE(tegra186_fuse_cells),
+       .keepouts = tegra186_fuse_keepouts,
+       .num_keepouts = ARRAY_SIZE(tegra186_fuse_keepouts),
        .soc_attr_group = &tegra_soc_attr_group,
        .clk_suspend_on = false,
 };
@@ -576,6 +587,15 @@ static const struct nvmem_cell_lookup tegra194_fuse_lookups[] = {
        },
 };
 
+static const struct nvmem_keepout tegra194_fuse_keepouts[] = {
+       { .start = 0x01c, .end = 0x0b8 },
+       { .start = 0x12c, .end = 0x198 },
+       { .start = 0x1a0, .end = 0x1bc },
+       { .start = 0x1d8, .end = 0x250 },
+       { .start = 0x270, .end = 0x290 },
+       { .start = 0x310, .end = 0x45c }
+};
+
 static const struct tegra_fuse_info tegra194_fuse_info = {
        .read = tegra30_fuse_read,
        .size = 0x650,
@@ -589,6 +609,8 @@ const struct tegra_fuse_soc tegra194_fuse_soc = {
        .num_lookups = ARRAY_SIZE(tegra194_fuse_lookups),
        .cells = tegra194_fuse_cells,
        .num_cells = ARRAY_SIZE(tegra194_fuse_cells),
+       .keepouts = tegra194_fuse_keepouts,
+       .num_keepouts = ARRAY_SIZE(tegra194_fuse_keepouts),
        .soc_attr_group = &tegra194_soc_attr_group,
        .clk_suspend_on = false,
 };
@@ -625,6 +647,20 @@ static const struct nvmem_cell_lookup tegra234_fuse_lookups[] = {
        },
 };
 
+static const struct nvmem_keepout tegra234_fuse_keepouts[] = {
+       { .start = 0x01c, .end = 0x0c8 },
+       { .start = 0x12c, .end = 0x184 },
+       { .start = 0x190, .end = 0x198 },
+       { .start = 0x1a0, .end = 0x204 },
+       { .start = 0x21c, .end = 0x250 },
+       { .start = 0x25c, .end = 0x2f0 },
+       { .start = 0x310, .end = 0x3d8 },
+       { .start = 0x400, .end = 0x4f0 },
+       { .start = 0x4f8, .end = 0x7e8 },
+       { .start = 0x8d0, .end = 0x8d8 },
+       { .start = 0xacc, .end = 0xf00 }
+};
+
 static const struct tegra_fuse_info tegra234_fuse_info = {
        .read = tegra30_fuse_read,
        .size = 0x98c,
@@ -638,6 +674,8 @@ const struct tegra_fuse_soc tegra234_fuse_soc = {
        .num_lookups = ARRAY_SIZE(tegra234_fuse_lookups),
        .cells = tegra234_fuse_cells,
        .num_cells = ARRAY_SIZE(tegra234_fuse_cells),
+       .keepouts = tegra234_fuse_keepouts,
+       .num_keepouts = ARRAY_SIZE(tegra234_fuse_keepouts),
        .soc_attr_group = &tegra194_soc_attr_group,
        .clk_suspend_on = false,
 };
index 02442157b231ccec9026a9cfde9ef3cdd0a349ee..90f23be738947a5b5ebd7e8dc03e01bdd5d6b434 100644 (file)
@@ -34,6 +34,8 @@ struct tegra_fuse_soc {
        unsigned int num_lookups;
        const struct nvmem_cell_info *cells;
        unsigned int num_cells;
+       const struct nvmem_keepout *keepouts;
+       unsigned int num_keepouts;
 
        const struct attribute_group *soc_attr_group;