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