xref: /optee_os/ta/qcom_pas/src/qcom_pas.c (revision 12d4328ff8cabfa9e1d1c18df9aa29de0da9cb00)
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