]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
misc: ele_api: Add read/write shadow fuse APIs
authorYe Li <ye.li@nxp.com>
Sun, 6 Oct 2024 00:30:03 +0000 (08:30 +0800)
committerFabio Estevam <festevam@denx.de>
Sun, 13 Oct 2024 12:43:05 +0000 (09:43 -0300)
Add ELE APIs to support read and write shadow fuses

Reviewed-by: Peng Fan <peng.fan@nxp.com>
Signed-off-by: Ye Li <ye.li@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
arch/arm/include/asm/mach-imx/ele_api.h
drivers/misc/imx_ele/ele_api.c

index d4ac567e7eda64a79b146f289e05d52c1a9f5bb1..19d12696a1eef1e2602da9bc9ef6dabfdbdb62d3 100644 (file)
@@ -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
index 8f321fbf40e4eff3ab9d33fec6d8673e68d42c83..661f70cf870f30623c04e71ab865b9db3d4636be 100644 (file)
@@ -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;