1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2026, Qualcomm Technologies, Inc. and/or its subsidiaries. 4 */ 5 6 #include <pta_qcom_pas.h> 7 #include <ta_qcom_pas.h> 8 #include <tee_internal_api.h> 9 #include <tee_internal_api_extensions.h> 10 #include <types_ext.h> 11 #include <utee_defines.h> 12 13 static size_t session_refcount; 14 static TEE_TASessionHandle pta_session; 15 16 static TEE_Result qcom_pas_auth_and_reset(uint32_t pt, 17 TEE_Param params[TEE_NUM_PARAMS]) 18 { 19 const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 20 TEE_PARAM_TYPE_VALUE_INPUT, 21 TEE_PARAM_TYPE_MEMREF_INPUT, 22 TEE_PARAM_TYPE_NONE); 23 if (pt != exp_pt) 24 return TEE_ERROR_BAD_PARAMETERS; 25 26 /* Firmware authentication - TODO */ 27 28 return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, 29 PTA_QCOM_PAS_AUTH_AND_RESET, 30 pt, params, NULL); 31 } 32 33 TEE_Result TA_CreateEntryPoint(void) 34 { 35 return TEE_SUCCESS; 36 } 37 38 void TA_DestroyEntryPoint(void) 39 { 40 } 41 42 TEE_Result TA_OpenSessionEntryPoint(uint32_t pt, 43 TEE_Param params[TEE_NUM_PARAMS], 44 void **sess __unused) 45 { 46 static const TEE_UUID uuid = PTA_QCOM_PAS_UUID; 47 TEE_Result res = TEE_ERROR_GENERIC; 48 TEE_PropSetHandle h = TEE_HANDLE_NULL; 49 TEE_Identity id = { }; 50 51 res = TEE_AllocatePropertyEnumerator(&h); 52 if (res != TEE_SUCCESS) 53 goto error; 54 55 TEE_StartPropertyEnumerator(h, TEE_PROPSET_CURRENT_CLIENT); 56 57 res = TEE_GetPropertyAsIdentity(h, NULL, &id); 58 if (res != TEE_SUCCESS) 59 goto error; 60 61 if (id.login != TEE_LOGIN_REE_KERNEL) { 62 res = TEE_ERROR_ACCESS_DENIED; 63 goto error; 64 } 65 66 if (!session_refcount) { 67 res = TEE_OpenTASession(&uuid, TEE_TIMEOUT_INFINITE, pt, params, 68 &pta_session, NULL); 69 if (res != TEE_SUCCESS) 70 goto error; 71 } 72 73 session_refcount++; 74 res = TEE_SUCCESS; 75 error: 76 if (h) 77 TEE_FreePropertyEnumerator(h); 78 79 return res; 80 } 81 82 void TA_CloseSessionEntryPoint(void *sess __unused) 83 { 84 session_refcount--; 85 86 if (!session_refcount) 87 TEE_CloseTASession(pta_session); 88 } 89 90 TEE_Result TA_InvokeCommandEntryPoint(void *sess __unused, uint32_t cmd_id, 91 uint32_t pt, 92 TEE_Param params[TEE_NUM_PARAMS]) 93 { 94 switch (cmd_id) { 95 case TA_QCOM_PAS_IS_SUPPORTED: 96 return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, 97 PTA_QCOM_PAS_IS_SUPPORTED, 98 pt, params, NULL); 99 case TA_QCOM_PAS_CAPABILITIES: 100 return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, 101 PTA_QCOM_PAS_CAPABILITIES, 102 pt, params, NULL); 103 case TA_QCOM_PAS_INIT_IMAGE: 104 return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, 105 PTA_QCOM_PAS_INIT_IMAGE, 106 pt, params, NULL); 107 case TA_QCOM_PAS_MEM_SETUP: 108 return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, 109 PTA_QCOM_PAS_MEM_SETUP, 110 pt, params, NULL); 111 case TA_QCOM_PAS_GET_RESOURCE_TABLE: 112 return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, 113 PTA_QCOM_PAS_GET_RESOURCE_TABLE, 114 pt, params, NULL); 115 case TA_QCOM_PAS_AUTH_AND_RESET: 116 return qcom_pas_auth_and_reset(pt, params); 117 case TA_QCOM_PAS_SET_REMOTE_STATE: 118 return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, 119 PTA_QCOM_PAS_SET_REMOTE_STATE, 120 pt, params, NULL); 121 case TA_QCOM_PAS_SHUTDOWN: 122 return TEE_InvokeTACommand(pta_session, TEE_TIMEOUT_INFINITE, 123 PTA_QCOM_PAS_SHUTDOWN, 124 pt, params, NULL); 125 default: 126 return TEE_ERROR_NOT_IMPLEMENTED; 127 } 128 } 129