Commit dbfa45e8 authored by Anson Huang's avatar Anson Huang
Browse files

imx: add i.MX8 SoCs OTP SIP(silicon provider) service support



For NXP's i.MX8 SoCs with system controller inside, OTP is
maintained by SCFW, Linux needs to call SMC to trap to TF-A
for OTP read/write etc. operations by calling SCFW API.

This patch adds OTP SIP service support.
Signed-off-by: default avatarAnson Huang <Anson.Huang@nxp.com>
parent 936840f1
...@@ -102,3 +102,29 @@ int imx_wakeup_src_handler(uint32_t smc_fid, ...@@ -102,3 +102,29 @@ int imx_wakeup_src_handler(uint32_t smc_fid,
return SMC_OK; return SMC_OK;
} }
int imx_otp_handler(uint32_t smc_fid,
void *handle,
u_register_t x1,
u_register_t x2)
{
int ret;
uint32_t fuse;
switch (smc_fid) {
case IMX_SIP_OTP_READ:
ret = sc_misc_otp_fuse_read(ipc_handle, x1, &fuse);
SMC_RET2(handle, ret, fuse);
break;
case IMX_SIP_OTP_WRITE:
ret = sc_misc_otp_fuse_write(ipc_handle, x1, x2);
SMC_RET1(handle, ret);
break;
default:
ret = SMC_UNK;
SMC_RET1(handle, ret);
break;
}
return ret;
}
...@@ -34,6 +34,9 @@ static uintptr_t imx_sip_handler(unsigned int smc_fid, ...@@ -34,6 +34,9 @@ static uintptr_t imx_sip_handler(unsigned int smc_fid,
break; break;
case IMX_SIP_WAKEUP_SRC: case IMX_SIP_WAKEUP_SRC:
SMC_RET1(handle, imx_wakeup_src_handler(smc_fid, x1, x2, x3)); SMC_RET1(handle, imx_wakeup_src_handler(smc_fid, x1, x2, x3));
case IMX_SIP_OTP_READ:
case IMX_SIP_OTP_WRITE:
return imx_otp_handler(smc_fid, handle, x1, x2);
#endif #endif
default: default:
WARN("Unimplemented i.MX SiP Service Call: 0x%x\n", smc_fid); WARN("Unimplemented i.MX SiP Service Call: 0x%x\n", smc_fid);
......
...@@ -18,6 +18,9 @@ ...@@ -18,6 +18,9 @@
#define IMX_SIP_WAKEUP_SRC_SCU 0x1 #define IMX_SIP_WAKEUP_SRC_SCU 0x1
#define IMX_SIP_WAKEUP_SRC_IRQSTEER 0x2 #define IMX_SIP_WAKEUP_SRC_IRQSTEER 0x2
#define IMX_SIP_OTP_READ 0xC200000A
#define IMX_SIP_OTP_WRITE 0xC200000B
#if (defined(PLAT_IMX8QM) || defined(PLAT_IMX8QX)) #if (defined(PLAT_IMX8QM) || defined(PLAT_IMX8QX))
int imx_cpufreq_handler(uint32_t smc_fid, u_register_t x1, int imx_cpufreq_handler(uint32_t smc_fid, u_register_t x1,
u_register_t x2, u_register_t x3); u_register_t x2, u_register_t x3);
...@@ -25,6 +28,8 @@ int imx_srtc_handler(uint32_t smc_fid, void *handle, u_register_t x1, ...@@ -25,6 +28,8 @@ int imx_srtc_handler(uint32_t smc_fid, void *handle, u_register_t x1,
u_register_t x2, u_register_t x3, u_register_t x4); u_register_t x2, u_register_t x3, u_register_t x4);
int imx_wakeup_src_handler(uint32_t smc_fid, u_register_t x1, int imx_wakeup_src_handler(uint32_t smc_fid, u_register_t x1,
u_register_t x2, u_register_t x3); u_register_t x2, u_register_t x3);
int imx_otp_handler(uint32_t smc_fid, void *handle,
u_register_t x1, u_register_t x2);
#endif #endif
#endif /* __IMX_SIP_SVC_H__ */ #endif /* __IMX_SIP_SVC_H__ */
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment