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
qcom_pas_auth_and_reset(uint32_t pt,TEE_Param params[TEE_NUM_PARAMS])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
TA_CreateEntryPoint(void)33 TEE_Result TA_CreateEntryPoint(void)
34 {
35 return TEE_SUCCESS;
36 }
37
TA_DestroyEntryPoint(void)38 void TA_DestroyEntryPoint(void)
39 {
40 }
41
TA_OpenSessionEntryPoint(uint32_t pt,TEE_Param params[TEE_NUM_PARAMS],void ** sess __unused)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
TA_CloseSessionEntryPoint(void * sess __unused)82 void TA_CloseSessionEntryPoint(void *sess __unused)
83 {
84 session_refcount--;
85
86 if (!session_refcount)
87 TEE_CloseTASession(pta_session);
88 }
89
TA_InvokeCommandEntryPoint(void * sess __unused,uint32_t cmd_id,uint32_t pt,TEE_Param params[TEE_NUM_PARAMS])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