From: Ye Li <[email protected]>

Add ELE APIs to support read and write shadow fuses

Reviewed-by: Peng Fan <[email protected]>
Signed-off-by: Ye Li <[email protected]>
Signed-off-by: Peng Fan <[email protected]>
---
 arch/arm/include/asm/mach-imx/ele_api.h |  4 ++
 drivers/misc/imx_ele/ele_api.c          | 66 +++++++++++++++++++++++++
 2 files changed, 70 insertions(+)

diff --git a/arch/arm/include/asm/mach-imx/ele_api.h 
b/arch/arm/include/asm/mach-imx/ele_api.h
index d4ac567e7ed..19d12696a1e 100644
--- a/arch/arm/include/asm/mach-imx/ele_api.h
+++ b/arch/arm/include/asm/mach-imx/ele_api.h
@@ -47,6 +47,8 @@
 #define ELE_ATTEST_REQ (0xDB)
 #define ELE_RELEASE_PATCH_REQ (0xDC)
 #define ELE_OTP_SEQ_SWITH_REQ (0xDD)
+#define ELE_WRITE_SHADOW_REQ (0xF2)
+#define ELE_READ_SHADOW_REQ (0xF3)
 
 /* ELE failure indications */
 #define ELE_ROM_PING_FAILURE_IND (0x0A)
@@ -154,4 +156,6 @@ int ele_release_m33_trout(void);
 int ele_write_secure_fuse(ulong signed_msg_blk, u32 *response);
 int ele_return_lifecycle_update(ulong signed_msg_blk, u32 *response);
 int ele_start_rng(void);
+int ele_write_shadow_fuse(u32 fuse_id, u32 fuse_val, u32 *response);
+int ele_read_shadow_fuse(u32 fuse_id, u32 *fuse_val, u32 *response);
 #endif
diff --git a/drivers/misc/imx_ele/ele_api.c b/drivers/misc/imx_ele/ele_api.c
index fd57928c5f8..62cf1a137ea 100644
--- a/drivers/misc/imx_ele/ele_api.c
+++ b/drivers/misc/imx_ele/ele_api.c
@@ -268,6 +268,72 @@ int ele_write_fuse(u16 fuse_id, u32 fuse_val, bool lock, 
u32 *response)
        return ret;
 }
 
+int ele_write_shadow_fuse(u32 fuse_id, u32 fuse_val, u32 *response)
+{
+       struct udevice *dev = gd->arch.ele_dev;
+       int size = sizeof(struct ele_msg);
+       struct ele_msg msg;
+       int ret;
+
+       if (!dev) {
+               printf("ele dev is not initialized\n");
+               return -ENODEV;
+       }
+
+       msg.version = ELE_VERSION;
+       msg.tag = ELE_CMD_TAG;
+       msg.size = 3;
+       msg.command = ELE_WRITE_SHADOW_REQ;
+       msg.data[0] = fuse_id;
+       msg.data[1] = fuse_val;
+
+       ret = misc_call(dev, false, &msg, size, &msg, size);
+       if (ret)
+               printf("Error: %s: ret %d, fuse_id 0x%x, response 0x%x\n",
+                      __func__, ret, fuse_id, msg.data[0]);
+
+       if (response)
+               *response = msg.data[0];
+
+       return ret;
+}
+
+int ele_read_shadow_fuse(u32 fuse_id, u32 *fuse_val, u32 *response)
+{
+       struct udevice *dev = gd->arch.ele_dev;
+       int size = sizeof(struct ele_msg);
+       struct ele_msg msg = {};
+       int ret;
+
+       if (!dev) {
+               printf("ele dev is not initialized\n");
+               return -ENODEV;
+       }
+
+       if (!fuse_val) {
+               printf("Invalid parameters for shadow read\n");
+               return -EINVAL;
+       }
+
+       msg.version = ELE_VERSION;
+       msg.tag = ELE_CMD_TAG;
+       msg.size = 2;
+       msg.command = ELE_READ_SHADOW_REQ;
+       msg.data[0] = fuse_id;
+
+       ret = misc_call(dev, false, &msg, size, &msg, size);
+       if (ret)
+               printf("Error: %s: ret %d, fuse_id 0x%x, response 0x%x\n",
+                      __func__, ret, fuse_id, msg.data[0]);
+
+       if (response)
+               *response = msg.data[0];
+
+       *fuse_val = msg.data[1];
+
+       return ret;
+}
+
 int ele_release_caam(u32 core_did, u32 *response)
 {
        struct udevice *dev = gd->arch.ele_dev;
-- 
2.35.3

Reply via email to