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