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