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