diff --git a/drivers/firmware/qcom_scm-smc.c b/drivers/firmware/qcom_scm-smc.c index 55be823ecdfe..5bbdc7a29847 100644 --- a/drivers/firmware/qcom_scm-smc.c +++ b/drivers/firmware/qcom_scm-smc.c @@ -1078,6 +1078,19 @@ int __qcom_scm_qsmmu500_wait_safe_toggle(struct device *dev, bool en) return qcom_scm_call_atomic(dev, &desc); } +int __qcom_scm_ice_restore_cfg(struct device *dev) +{ + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_KEYSTORE, + .cmd = QCOM_SCM_ICE_RESTORE_KEY_ID, + .owner = ARM_SMCCC_OWNER_TRUSTED_OS + }; + + desc.arginfo = QCOM_SCM_ARGS(0); + + return qcom_scm_call(dev, &desc); +} + void __qcom_scm_init(void) { __query_convention(); diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index c9f2fca19366..53c3bc01a7aa 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -505,6 +505,12 @@ int qcom_scm_qsmmu500_wait_safe_toggle(bool en) } EXPORT_SYMBOL(qcom_scm_qsmmu500_wait_safe_toggle); +int qcom_scm_ice_restore_cfg(void) +{ + return __qcom_scm_ice_restore_cfg(__scm->dev); +} +EXPORT_SYMBOL(qcom_scm_ice_restore_cfg); + /** * qcom_scm_is_available() - Checks if SCM is available */ diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index 45cd42103f20..e8bffb5ee040 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -4,6 +4,7 @@ #ifndef __QCOM_SCM_INT_H #define __QCOM_SCM_INT_H +// SIP Services and Function IDs #define QCOM_SCM_SVC_BOOT 0x01 #define QCOM_SCM_BOOT_SET_ADDR 0x01 #define QCOM_SCM_BOOT_TERMINATE_PC 0x02 @@ -77,7 +78,6 @@ extern int __qcom_scm_assign_mem(struct device *dev, phys_addr_t dest, size_t dest_sz); #define QCOM_SCM_IOMMU_TLBINVAL_FLAG 0x00000001 - #define QCOM_SCM_SVC_HDCP 0x11 #define QCOM_SCM_HDCP_INVOKE 0x01 extern int __qcom_scm_hdcp_req(struct device *dev, @@ -89,6 +89,11 @@ extern int __qcom_scm_qsmmu500_wait_safe_toggle(struct device *dev, bool enable); #define QCOM_SCM_SMMU_CONFIG_ERRATA1_CLIENT_ALL 0x2 +// TOS Services and Function IDs +#define QCOM_SCM_SVC_KEYSTORE 0x05 +#define QCOM_SCM_ICE_RESTORE_KEY_ID 0x06 +extern int __qcom_scm_ice_restore_cfg(struct device *dev); + extern void __qcom_scm_init(void); /* common error codes */ diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index efad236365aa..79522b0e09d6 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -66,6 +66,7 @@ extern bool qcom_scm_hdcp_available(void); extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp); extern int qcom_scm_qsmmu500_wait_safe_toggle(bool en); +extern int qcom_scm_ice_restore_cfg(void); extern bool qcom_scm_is_available(void); #else @@ -114,6 +115,7 @@ static inline int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp) { return -ENODEV; } static inline int qcom_scm_qsmmu500_wait_safe_toggle(bool en) { return -ENODEV; } +static inline int qcom_scm_ice_restore_cfg(void) { return -ENODEV; } static inline bool qcom_scm_is_available(void) { return false; } #endif #endif