1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2026, Qualcomm Technologies, Inc. and/or its subsidiaries. 4 */ 5 6 #include <stdint.h> 7 #include <string.h> 8 9 #include "pas.h" 10 #include "pas_resources.h" 11 12 static TEE_Result get_mem_rsc(struct resource_table *rt, size_t *rt_size, 13 struct resource_table *table, 14 const struct fw_rsc_hdr *mem_hdr, 15 const struct fw_rsc_devmem *mem_res, 16 size_t table_header_size, size_t table_size) 17 { 18 uint8_t *p = (uint8_t *)rt; 19 uint32_t offset = 0; 20 21 if (rt_size && *rt_size < table_size) { 22 *rt_size = table_size; 23 24 return TEE_SUCCESS; 25 } 26 27 if (!rt) 28 return TEE_ERROR_BAD_PARAMETERS; 29 30 offset = table_header_size; 31 32 for (size_t i = 0; i < table->num; i++, mem_res++) { 33 table->offset[i] = offset; 34 memcpy(p + offset, mem_hdr, sizeof(*mem_hdr)); 35 offset += sizeof(*mem_hdr); 36 memcpy(p + offset, mem_res, sizeof(*mem_res)); 37 offset += sizeof(*mem_res); 38 } 39 40 memcpy(p, table, table_header_size); 41 42 return TEE_SUCCESS; 43 } 44 45 TEE_Result pas_get_resource_table(uint32_t pas_id, struct resource_table *rt, 46 size_t *rt_size) 47 { 48 switch (pas_id) { 49 case PAS_ID_WPSS: 50 return get_mem_rsc(rt, rt_size, &wpss_rt, &wpss_mem_hdr, 51 wpss_mem_res, 52 WPSS_RESOURCE_TABLE_HEADER_SIZE, 53 WPSS_RESOURCE_TABLE_SIZE); 54 case PAS_ID_TURING: 55 return get_mem_rsc(rt, rt_size, &turing_rt, &turing_mem_hdr, 56 turing_mem_res, 57 TURING_RESOURCE_TABLE_HEADER_SIZE, 58 TURING_RESOURCE_TABLE_SIZE); 59 case PAS_ID_QDSP6: 60 return get_mem_rsc(rt, rt_size, &lpass_rt, &lpass_mem_hdr, 61 lpass_mem_res, 62 LPASS_RESOURCE_TABLE_HEADER_SIZE, 63 LPASS_RESOURCE_TABLE_SIZE); 64 default: 65 return TEE_ERROR_NOT_SUPPORTED; 66 } 67 } 68