diff --git a/drivers/aml_tee/optee/optee_smc.h b/drivers/aml_tee/optee/optee_smc.h index 15240ee9c..4fd57f6ea 100644 --- a/drivers/aml_tee/optee/optee_smc.h +++ b/drivers/aml_tee/optee/optee_smc.h @@ -587,6 +587,22 @@ struct optee_smc_disable_shm_cache_result { #define OPTEE_SMC_GET_LOGGER_CONFIG \ OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_GET_LOGGER_CONFIG) +/* + * Get Dynamic SHM Status + * + * Call register usage: + * a0 SMC Function ID, OPTEE_SMC_GET_DYN_SHM_STATS + * a1-7 Not used + * + * Normal return register usage: + * a0 Get result + * a1 Dynamic SHM Status + * a2-7 Preserved + */ +#define OPTEE_SMC_FUNCID_GET_DYN_SHM_STATS 0xE005 +#define OPTEE_SMC_GET_DYN_SHM_STATS \ + OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_GET_DYN_SHM_STATS) + /* Returned in a0 */ #define OPTEE_SMC_RETURN_UNKNOWN_FUNCTION 0xFFFFFFFF diff --git a/drivers/aml_tee/optee/smc_abi.c b/drivers/aml_tee/optee/smc_abi.c index 4b318184a..5e9bcc3eb 100644 --- a/drivers/aml_tee/optee/smc_abi.c +++ b/drivers/aml_tee/optee/smc_abi.c @@ -1185,6 +1185,17 @@ static bool optee_msg_api_revision_is_compatible(optee_invoke_fn *invoke_fn) return false; } +static bool optee_get_dynamic_shm_stats(optee_invoke_fn *invoke_fn) +{ + struct arm_smccc_res res; + + invoke_fn(OPTEE_SMC_GET_DYN_SHM_STATS, 0, 0, 0, 0, 0, 0, 0, &res); + if (res.a0 == OPTEE_SMC_RETURN_OK && res.a1 == 1) + return true; + + return false; +} + static bool optee_msg_exchange_capabilities(optee_invoke_fn *invoke_fn, u32 *sec_caps, u32 *max_notif_value, unsigned int *rpc_param_count) @@ -1410,8 +1421,11 @@ static int optee_probe(struct platform_device *pdev) return -EINVAL; } - // disable dynamic share memory - sec_caps &= ~(OPTEE_SMC_SEC_CAP_DYNAMIC_SHM); + /* + * If stats is false, Dynamic Shared Memory will be disabled + */ + if (!optee_get_dynamic_shm_stats(invoke_fn)) + sec_caps &= ~(OPTEE_SMC_SEC_CAP_DYNAMIC_SHM); /* * Try to use dynamic shared memory if possible