// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2026, Qualcomm Technologies, Inc. and/or its subsidiaries. */ #include #include #include #include #include #include static size_t session_refcount; static TEE_TASessionHandle pta_session; static TEE_Result qcom_pas_auth_and_reset(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS]) { const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE); if (pt != exp_pt) return TEE_ERROR_BAD_PARAMETERS; /* Firmware authentication - TODO */ return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, PTA_QCOM_PAS_AUTH_AND_RESET, pt, params, NULL); } TEE_Result TA_CreateEntryPoint(void) { return TEE_SUCCESS; } void TA_DestroyEntryPoint(void) { } TEE_Result TA_OpenSessionEntryPoint(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS], void **sess __unused) { static const TEE_UUID uuid = PTA_QCOM_PAS_UUID; TEE_Result res = TEE_ERROR_GENERIC; TEE_PropSetHandle h = TEE_HANDLE_NULL; TEE_Identity id = { }; res = TEE_AllocatePropertyEnumerator(&h); if (res != TEE_SUCCESS) goto error; TEE_StartPropertyEnumerator(h, TEE_PROPSET_CURRENT_CLIENT); res = TEE_GetPropertyAsIdentity(h, NULL, &id); if (res != TEE_SUCCESS) goto error; if (id.login != TEE_LOGIN_REE_KERNEL) { res = TEE_ERROR_ACCESS_DENIED; goto error; } if (!session_refcount) { res = TEE_OpenTASession(&uuid, TEE_TIMEOUT_INFINITE, pt, params, &pta_session, NULL); if (res != TEE_SUCCESS) goto error; } session_refcount++; res = TEE_SUCCESS; error: if (h) TEE_FreePropertyEnumerator(h); return res; } void TA_CloseSessionEntryPoint(void *sess __unused) { session_refcount--; if (!session_refcount) TEE_CloseTASession(pta_session); } TEE_Result TA_InvokeCommandEntryPoint(void *sess __unused, uint32_t cmd_id, uint32_t pt, TEE_Param params[TEE_NUM_PARAMS]) { switch (cmd_id) { case TA_QCOM_PAS_IS_SUPPORTED: return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, PTA_QCOM_PAS_IS_SUPPORTED, pt, params, NULL); case TA_QCOM_PAS_CAPABILITIES: return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, PTA_QCOM_PAS_CAPABILITIES, pt, params, NULL); case TA_QCOM_PAS_INIT_IMAGE: return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, PTA_QCOM_PAS_INIT_IMAGE, pt, params, NULL); case TA_QCOM_PAS_MEM_SETUP: return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, PTA_QCOM_PAS_MEM_SETUP, pt, params, NULL); case TA_QCOM_PAS_GET_RESOURCE_TABLE: return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, PTA_QCOM_PAS_GET_RESOURCE_TABLE, pt, params, NULL); case TA_QCOM_PAS_AUTH_AND_RESET: return qcom_pas_auth_and_reset(pt, params); case TA_QCOM_PAS_SET_REMOTE_STATE: return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, PTA_QCOM_PAS_SET_REMOTE_STATE, pt, params, NULL); case TA_QCOM_PAS_SHUTDOWN: return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, PTA_QCOM_PAS_SHUTDOWN, pt, params, NULL); default: return TEE_ERROR_NOT_IMPLEMENTED; } }