From 1aaa82aefabae9229d01149dc3779709573d52cb Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Wed, 9 Dec 2015 14:28:30 -0800 Subject: [PATCH] qseecom: Add a new smc cmd to check RPMB key provision status A new smc cmd is added to check RPMB key provision status Change-Id: I50411bf9ae7f31589be34d7b5aaf48f2c12f0018 Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 23 +++++++++++++++++++---- include/soc/qcom/qseecomi.h | 7 +++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index fae69721b439..d5b8c3d17be8 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -336,6 +336,7 @@ static void __qseecom_disable_clk(enum qseecom_ce_hw_instance ce); static int __qseecom_init_clk(enum qseecom_ce_hw_instance ce); static int qseecom_load_commonlib_image(struct qseecom_dev_handle *data, char *cmnlib_name); +static void __qseecom_reentrancy_check_if_no_app_blocked(void); static int qseecom_enable_ice_setup(int usage); static int qseecom_disable_ice_setup(int usage); @@ -686,6 +687,13 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, ret = scm_call2(smc_id, &desc); break; } + case QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND: { + smc_id = TZ_OS_RPMB_CHECK_PROV_STATUS_ID; + desc.arginfo = TZ_OS_RPMB_CHECK_PROV_STATUS_ID_PARAM_ID; + __qseecom_reentrancy_check_if_no_app_blocked(); + ret = scm_call2(smc_id, &desc); + break; + } case QSEOS_GENERATE_KEY: { u32 tzbuflen = PAGE_ALIGN(sizeof (struct qseecom_key_generate_ireq) - @@ -2564,6 +2572,7 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, switch (req.cmd_id) { case QSEOS_RPMB_PROVISION_KEY_COMMAND: case QSEOS_RPMB_ERASE_COMMAND: + case QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND: send_req_ptr = &send_svc_ireq; req_buf_size = sizeof(send_svc_ireq); if (__qseecom_process_rpmb_svc_cmd(data, &req, @@ -2641,15 +2650,21 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, case QSEOS_RESULT_SUCCESS: break; case QSEOS_RESULT_INCOMPLETE: - pr_err("qseos_result_incomplete\n"); + pr_debug("qseos_result_incomplete\n"); ret = __qseecom_process_incomplete_cmd(data, &resp); if (ret) { - pr_err("process_incomplete_cmd fail: err: %d\n", - ret); + pr_err("process_incomplete_cmd fail with result: %d\n", + resp.result); + } + if (req.cmd_id == QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND) { + pr_warn("RPMB key status is 0x%x\n", resp.result); + *(uint32_t *)req.resp_buf = resp.result; + ret = 0; } break; case QSEOS_RESULT_FAILURE: - pr_err("process_incomplete_cmd failed err: %d\n", ret); + pr_err("scm call failed with resp.result: %d\n", resp.result); + ret = -EINVAL; break; default: pr_err("Response result %d not supported\n", diff --git a/include/soc/qcom/qseecomi.h b/include/soc/qcom/qseecomi.h index 03e0b461b68c..b361baa2062d 100644 --- a/include/soc/qcom/qseecomi.h +++ b/include/soc/qcom/qseecomi.h @@ -63,6 +63,7 @@ enum qseecom_qceos_cmd_id { QSEOS_TEE_INVOKE_MODFD_COMMAND = QSEOS_TEE_INVOKE_COMMAND, QSEOS_TEE_CLOSE_SESSION, QSEOS_TEE_REQUEST_CANCELLATION, + QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND = 0x1B, QSEOS_FSM_LTE_INIT_DB = 0x100, QSEOS_FSM_LTE_STORE_KENB = 0x101, QSEOS_FSM_LTE_GEN_KEYS = 0x102, @@ -560,6 +561,12 @@ __packed struct qseecom_client_send_fsm_key_req { #define TZ_OS_RPMB_ERASE_ID_PARAM_ID \ TZ_SYSCALL_CREATE_PARAM_ID_0 +#define TZ_OS_RPMB_CHECK_PROV_STATUS_ID \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_QSEE_OS, TZ_SVC_RPMB, 0x03) + +#define TZ_OS_RPMB_CHECK_PROV_STATUS_ID_PARAM_ID \ + TZ_SYSCALL_CREATE_PARAM_ID_0 + #define TZ_OS_KS_GEN_KEY_ID \ TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_QSEE_OS, TZ_SVC_KEYSTORE, 0x01)