xref: /optee_os/core/pta/device.c (revision 9389d8030ef198c9d7b8ab7ea8e877e0ace3369d)
15843bb75SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
25843bb75SJerome Forissier /*
35843bb75SJerome Forissier  * Copyright (C) 2019, Linaro Limited
45843bb75SJerome Forissier  */
55843bb75SJerome Forissier 
65843bb75SJerome Forissier /*
75843bb75SJerome Forissier  * This pseudo TA is used by normal world OS TEE driver to fetch pseudo TA's
85843bb75SJerome Forissier  * UUIDs which can act as TEE bus devices.
95843bb75SJerome Forissier  */
105843bb75SJerome Forissier 
11*9389d803SMaxim Uvarov #include <config.h>
12*9389d803SMaxim Uvarov #include <kernel/early_ta.h>
13*9389d803SMaxim Uvarov #include <kernel/linker.h>
145843bb75SJerome Forissier #include <kernel/pseudo_ta.h>
155843bb75SJerome Forissier #include <kernel/tee_ta_manager.h>
165843bb75SJerome Forissier #include <pta_device.h>
175843bb75SJerome Forissier #include <string.h>
185843bb75SJerome Forissier #include <tee/uuid.h>
195843bb75SJerome Forissier #include <user_ta_header.h>
205843bb75SJerome Forissier 
215843bb75SJerome Forissier #define PTA_NAME "device.pta"
225843bb75SJerome Forissier 
23*9389d803SMaxim Uvarov static void add_ta(uint32_t flags, const TEE_UUID *uuid, uint8_t *buf,
24*9389d803SMaxim Uvarov 		   uint32_t blen, uint32_t *pos)
25*9389d803SMaxim Uvarov {
26*9389d803SMaxim Uvarov 	if (flags & TA_FLAG_DEVICE_ENUM) {
27*9389d803SMaxim Uvarov 		if (*pos + sizeof(*uuid) <= blen)
28*9389d803SMaxim Uvarov 			tee_uuid_to_octets(buf + *pos, uuid);
29*9389d803SMaxim Uvarov 
30*9389d803SMaxim Uvarov 		*pos += sizeof(*uuid);
31*9389d803SMaxim Uvarov 	}
32*9389d803SMaxim Uvarov }
33*9389d803SMaxim Uvarov 
345843bb75SJerome Forissier static TEE_Result get_devices(uint32_t types,
355843bb75SJerome Forissier 			      TEE_Param params[TEE_NUM_PARAMS])
365843bb75SJerome Forissier {
37*9389d803SMaxim Uvarov 	const struct pseudo_ta_head *ta = NULL;
38*9389d803SMaxim Uvarov 	const struct early_ta *eta = NULL;
39*9389d803SMaxim Uvarov 	void *buf = NULL;
40*9389d803SMaxim Uvarov 	uint32_t blen = 0;
41*9389d803SMaxim Uvarov 	uint32_t pos = 0;
425843bb75SJerome Forissier 
435843bb75SJerome Forissier 	if (types != TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_OUTPUT,
445843bb75SJerome Forissier 				     TEE_PARAM_TYPE_NONE,
455843bb75SJerome Forissier 				     TEE_PARAM_TYPE_NONE,
465843bb75SJerome Forissier 				     TEE_PARAM_TYPE_NONE))
475843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
485843bb75SJerome Forissier 
495843bb75SJerome Forissier 	if (!params[0].memref.buffer && (params[0].memref.size > 0))
505843bb75SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
515843bb75SJerome Forissier 
52*9389d803SMaxim Uvarov 	buf =  params[0].memref.buffer;
53*9389d803SMaxim Uvarov 	blen = params[0].memref.size;
545843bb75SJerome Forissier 
55*9389d803SMaxim Uvarov 	SCATTERED_ARRAY_FOREACH(ta, pseudo_tas, struct pseudo_ta_head)
56*9389d803SMaxim Uvarov 		add_ta(ta->flags, &ta->uuid, buf, blen, &pos);
575843bb75SJerome Forissier 
58*9389d803SMaxim Uvarov 	if (IS_ENABLED(CFG_EARLY_TA))
59*9389d803SMaxim Uvarov 		for_each_early_ta(eta)
60*9389d803SMaxim Uvarov 			add_ta(eta->flags, &eta->uuid, buf, blen, &pos);
615843bb75SJerome Forissier 
62*9389d803SMaxim Uvarov 	params[0].memref.size = pos;
63*9389d803SMaxim Uvarov 	if (pos > blen)
64*9389d803SMaxim Uvarov 		return TEE_ERROR_SHORT_BUFFER;
65*9389d803SMaxim Uvarov 
66*9389d803SMaxim Uvarov 	return TEE_SUCCESS;
675843bb75SJerome Forissier }
685843bb75SJerome Forissier 
695843bb75SJerome Forissier static TEE_Result invoke_command(void *pSessionContext __unused,
705843bb75SJerome Forissier 				 uint32_t nCommandID, uint32_t nParamTypes,
715843bb75SJerome Forissier 				 TEE_Param pParams[TEE_NUM_PARAMS])
725843bb75SJerome Forissier {
735843bb75SJerome Forissier 	switch (nCommandID) {
745843bb75SJerome Forissier 	case PTA_CMD_GET_DEVICES:
755843bb75SJerome Forissier 		return get_devices(nParamTypes, pParams);
765843bb75SJerome Forissier 	default:
775843bb75SJerome Forissier 		break;
785843bb75SJerome Forissier 	}
795843bb75SJerome Forissier 
805843bb75SJerome Forissier 	return TEE_ERROR_NOT_IMPLEMENTED;
815843bb75SJerome Forissier }
825843bb75SJerome Forissier 
835843bb75SJerome Forissier pseudo_ta_register(.uuid = PTA_DEVICE_UUID, .name = PTA_NAME,
845843bb75SJerome Forissier 		   .flags = PTA_DEFAULT_FLAGS,
855843bb75SJerome Forissier 		   .invoke_command_entry_point = invoke_command);
86