From: Ye Li <[email protected]>

Add V2X Get State API to return V2X states for debug purpose

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

diff --git a/arch/arm/include/asm/mach-imx/ele_api.h 
b/arch/arm/include/asm/mach-imx/ele_api.h
index 04e7f20a2a6..8d779d6ae1b 100644
--- a/arch/arm/include/asm/mach-imx/ele_api.h
+++ b/arch/arm/include/asm/mach-imx/ele_api.h
@@ -30,6 +30,7 @@
 #define ELE_START_RNG (0xA3)
 #define ELE_CMD_DERIVE_KEY (0xA9)
 #define ELE_GENERATE_DEK_BLOB (0xAF)
+#define ELE_V2X_GET_STATE_REQ (0xB2)
 #define ELE_ENABLE_PATCH_REQ (0xC3)
 #define ELE_RELEASE_RDC_REQ (0xC4)
 #define ELE_GET_FW_STATUS_REQ (0xC5)
@@ -141,6 +142,12 @@ struct ele_get_info_data {
        u32 reserved[8];
 };
 
+struct v2x_get_state {
+       u8 v2x_state;
+       u8 v2x_power_state;
+       u32 v2x_err_code;
+};
+
 int ele_release_rdc(u8 core_id, u8 xrdc, u32 *response);
 int ele_auth_oem_ctnr(ulong ctnr_addr, u32 *response);
 int ele_release_container(u32 *response);
@@ -166,4 +173,5 @@ int ele_read_shadow_fuse(u32 fuse_id, u32 *fuse_val, u32 
*response);
 int ele_set_gmid(u32 *response);
 int ele_volt_change_start_req(void);
 int ele_volt_change_finish_req(void);
+int ele_v2x_get_state(struct v2x_get_state *state, u32 *response);
 #endif
diff --git a/drivers/misc/imx_ele/ele_api.c b/drivers/misc/imx_ele/ele_api.c
index 8ee0a7733ca..355fd86ed8c 100644
--- a/drivers/misc/imx_ele/ele_api.c
+++ b/drivers/misc/imx_ele/ele_api.c
@@ -795,6 +795,38 @@ int ele_generate_dek_blob(u32 key_id, u32 src_paddr, u32 
dst_paddr, u32 max_outp
        return ret;
 }
 
+int ele_v2x_get_state(struct v2x_get_state *state, 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 = 1;
+       msg.command = ELE_V2X_GET_STATE_REQ;
+
+       ret = misc_call(dev, false, &msg, size, &msg, size);
+       if (ret)
+               printf("Error: %s: ret %d, response 0x%x\n",
+                      __func__, ret, msg.data[0]);
+
+       if (response)
+               *response = msg.data[0];
+
+       state->v2x_state = msg.data[1] & 0xFF;
+       state->v2x_power_state = (msg.data[1] & 0xFF00) >> 8;
+       state->v2x_err_code = msg.data[2];
+
+       return ret;
+}
+
 int ele_volt_change_start_req(void)
 {
        struct udevice *dev = gd->arch.ele_dev;
-- 
2.34.1

Reply via email to