]> git.baikalelectronics.ru Git - uboot.git/commitdiff
misc: fuse: support to access fuse on i.MX93
authorAlice Guo <alice.guo@nxp.com>
Tue, 26 Jul 2022 08:40:59 +0000 (16:40 +0800)
committerStefano Babic <sbabic@denx.de>
Tue, 26 Jul 2022 09:29:01 +0000 (11:29 +0200)
i.MX93 fuse can be accessed through FSB and s400-api. Add mapping tables
for i.MX93. The offset address of FSB accessing OTP shadow registers is
different between i.MX8ULP and i.MX93, so use macro to define the offset
address instead of hardcode.

Signed-off-by: Alice Guo <alice.guo@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
arch/arm/include/asm/arch-imx9/imx-regs.h
drivers/misc/sentinel/fuse.c

index 7b84b970b757fbeeb01aef6ecb621134905db73e..fa6951ebbe8eff0096c70218e34c3d0aee900c30 100644 (file)
@@ -19,6 +19,8 @@
 #define WDG4_BASE_ADDR      0x424a0000UL
 #define WDG5_BASE_ADDR      0x424b0000UL
 
+#define FSB_BASE_ADDR       0x47510000UL
+
 #if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__))
 #include <asm/types.h>
 #include <stdbool.h>
index 83d2c25731f9f880fb643f3a54fcb1fed8fe27e1..abb4c072f9b05a47b47b72173b80d4e8dce1343d 100644 (file)
@@ -31,6 +31,9 @@ struct s400_map_entry {
        u32 s400_index;
 };
 
+#if defined(CONFIG_IMX8ULP)
+#define FSB_OTP_SHADOW 0x800
+
 struct fsb_map_entry fsb_mapping_table[] = {
        { 3, 8 },
        { 4, 8 },
@@ -65,6 +68,31 @@ struct s400_map_entry s400_api_mapping_table[] = {
        { 23, 1, 4, 2 }, /* OTFAD */
        { 25, 8 }, /* Test config2 */
 };
+#elif defined(CONFIG_ARCH_IMX9)
+#define FSB_OTP_SHADOW 0x8000
+
+struct fsb_map_entry fsb_mapping_table[] = {
+       { 0, 8 },
+       { 1, 8 },
+       { 2, 8 },
+       { -1, 8 },
+       { 4, 8 },
+       { 5, 8 },
+       { 6, 8 }, /* UID */
+       { -1, 8 },
+       { 8, 8 },
+       { 9, 8 },
+       { 10, 8 },
+};
+
+struct s400_map_entry s400_api_mapping_table[] = {
+       { 3, 11 }, /* 24 .. 34 */
+       { 7, 8 },
+       { 16, 11 }, /* 128 .. 143 */
+       { 22, 8 },
+       { 23, 8 },
+};
+#endif
 
 static s32 map_fsb_fuse_index(u32 bank, u32 word, bool *redundancy)
 {
@@ -128,7 +156,7 @@ int fuse_sense(u32 bank, u32 word, u32 *val)
 
        word_index = map_fsb_fuse_index(bank, word, &redundancy);
        if (word_index >= 0) {
-               *val = readl((ulong)FSB_BASE_ADDR + 0x800 + (word_index << 2));
+               *val = readl((ulong)FSB_BASE_ADDR + FSB_OTP_SHADOW + (word_index << 2));
                if (redundancy)
                        *val = (*val >> ((word % 2) * 16)) & 0xFFFF;