summaryrefslogtreecommitdiff
path: root/drivers/misc/imx8ulp
diff options
context:
space:
mode:
authorAlice Guo <[email protected]>2022-07-26 16:40:58 +0800
committerStefano Babic <[email protected]>2022-07-26 11:29:01 +0200
commit5d78ff733d647e694e803f87f2645a45229d1413 (patch)
treef9fff3cfa778661972d60ec23b04d16d7823cc37 /drivers/misc/imx8ulp
parent1a55a633e056201b1e214c42514f2b7bc987b342 (diff)
misc: imx8ulp: move fuse.c from imx8ulp to sentinel
The i.MX93 platform wants to reuse drivers/misc/imx8ulp/fuse.c. Moving fuse.c from the folder imx8ulp to sentinel makes it can be used by other platforms. Signed-off-by: Alice Guo <[email protected]> Signed-off-by: Peng Fan <[email protected]>
Diffstat (limited to 'drivers/misc/imx8ulp')
-rw-r--r--drivers/misc/imx8ulp/Makefile3
-rw-r--r--drivers/misc/imx8ulp/fuse.c200
2 files changed, 0 insertions, 203 deletions
diff --git a/drivers/misc/imx8ulp/Makefile b/drivers/misc/imx8ulp/Makefile
deleted file mode 100644
index 450e615e645..00000000000
--- a/drivers/misc/imx8ulp/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0+
-
-obj-$(CONFIG_CMD_FUSE) += fuse.o
diff --git a/drivers/misc/imx8ulp/fuse.c b/drivers/misc/imx8ulp/fuse.c
deleted file mode 100644
index 83d2c25731f..00000000000
--- a/drivers/misc/imx8ulp/fuse.c
+++ /dev/null
@@ -1,200 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright 2020 NXP
- */
-
-#include <common.h>
-#include <console.h>
-#include <errno.h>
-#include <fuse.h>
-#include <asm/arch/sys_proto.h>
-#include <asm/arch/imx-regs.h>
-#include <env.h>
-#include <asm/mach-imx/s400_api.h>
-#include <asm/global_data.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-#define FUSE_BANKS 64
-#define WORDS_PER_BANKS 8
-
-struct fsb_map_entry {
- s32 fuse_bank;
- u32 fuse_words;
- bool redundancy;
-};
-
-struct s400_map_entry {
- s32 fuse_bank;
- u32 fuse_words;
- u32 fuse_offset;
- u32 s400_index;
-};
-
-struct fsb_map_entry fsb_mapping_table[] = {
- { 3, 8 },
- { 4, 8 },
- { -1, 48 }, /* Reserve 48 words */
- { 5, 8 },
- { 6, 8 },
- { 8, 4, true },
- { 24, 4, true },
- { 26, 4, true },
- { 27, 4, true },
- { 28, 8 },
- { 29, 8 },
- { 30, 8 },
- { 31, 8 },
- { 37, 8 },
- { 38, 8 },
- { 39, 8 },
- { 40, 8 },
- { 41, 8 },
- { 42, 8 },
- { 43, 8 },
- { 44, 8 },
- { 45, 8 },
- { 46, 8 },
-};
-
-struct s400_map_entry s400_api_mapping_table[] = {
- { 1, 8 }, /* LOCK */
- { 2, 8 }, /* ECID */
- { 7, 4, 0, 1 }, /* OTP_UNIQ_ID */
- { 15, 8 }, /* OEM SRK HASH */
- { 23, 1, 4, 2 }, /* OTFAD */
- { 25, 8 }, /* Test config2 */
-};
-
-static s32 map_fsb_fuse_index(u32 bank, u32 word, bool *redundancy)
-{
- s32 size = ARRAY_SIZE(fsb_mapping_table);
- s32 i, word_pos = 0;
-
- /* map the fuse from ocotp fuse map to FSB*/
- for (i = 0; i < size; i++) {
- if (fsb_mapping_table[i].fuse_bank != -1 &&
- fsb_mapping_table[i].fuse_bank == bank) {
- break;
- }
-
- word_pos += fsb_mapping_table[i].fuse_words;
- }
-
- if (i == size)
- return -1; /* Failed to find */
-
- if (fsb_mapping_table[i].redundancy) {
- *redundancy = true;
- return (word >> 1) + word_pos;
- }
-
- *redundancy = false;
- return word + word_pos;
-}
-
-static s32 map_s400_fuse_index(u32 bank, u32 word)
-{
- s32 size = ARRAY_SIZE(s400_api_mapping_table);
- s32 i;
-
- /* map the fuse from ocotp fuse map to FSB*/
- for (i = 0; i < size; i++) {
- if (s400_api_mapping_table[i].fuse_bank != -1 &&
- s400_api_mapping_table[i].fuse_bank == bank) {
- if (word >= s400_api_mapping_table[i].fuse_offset &&
- word < (s400_api_mapping_table[i].fuse_offset +
- s400_api_mapping_table[i].fuse_words))
- break;
- }
- }
-
- if (i == size)
- return -1; /* Failed to find */
-
- if (s400_api_mapping_table[i].s400_index != 0)
- return s400_api_mapping_table[i].s400_index;
-
- return s400_api_mapping_table[i].fuse_bank * 8 + word;
-}
-
-int fuse_sense(u32 bank, u32 word, u32 *val)
-{
- s32 word_index;
- bool redundancy;
-
- if (bank >= FUSE_BANKS || word >= WORDS_PER_BANKS || !val)
- return -EINVAL;
-
- word_index = map_fsb_fuse_index(bank, word, &redundancy);
- if (word_index >= 0) {
- *val = readl((ulong)FSB_BASE_ADDR + 0x800 + (word_index << 2));
- if (redundancy)
- *val = (*val >> ((word % 2) * 16)) & 0xFFFF;
-
- return 0;
- }
-
- word_index = map_s400_fuse_index(bank, word);
- if (word_index >= 0) {
- u32 data[4];
- u32 res, size = 4;
- int ret;
-
- /* Only UID return 4 words */
- if (word_index != 1)
- size = 1;
-
- ret = ahab_read_common_fuse(word_index, data, size, &res);
- if (ret) {
- printf("ahab read fuse failed %d, 0x%x\n", ret, res);
- return ret;
- }
-
- if (word_index == 1) {
- *val = data[word]; /* UID */
- } else if (word_index == 2) {
- /*
- * OTFAD 3 bits as follow:
- * bit 0: OTFAD_ENABLE
- * bit 1: OTFAD_DISABLE_OVERRIDE
- * bit 2: KEY_BLOB_EN
- */
- *val = data[0] << 3;
- } else {
- *val = data[0];
- }
-
- return 0;
- }
-
- return -ENOENT;
-}
-
-int fuse_read(u32 bank, u32 word, u32 *val)
-{
- return fuse_sense(bank, word, val);
-}
-
-int fuse_prog(u32 bank, u32 word, u32 val)
-{
- u32 res;
- int ret;
-
- if (bank >= FUSE_BANKS || word >= WORDS_PER_BANKS || !val)
- return -EINVAL;
-
- ret = ahab_write_fuse((bank * 8 + word), val, false, &res);
- if (ret) {
- printf("ahab write fuse failed %d, 0x%x\n", ret, res);
- return ret;
- }
-
- return 0;
-}
-
-int fuse_override(u32 bank, u32 word, u32 val)
-{
- printf("Override fuse to i.MX8ULP in u-boot is forbidden\n");
- return -EPERM;
-}