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
get_mem_rsc(struct resource_table * rt,size_t * rt_size,struct resource_table * table,const struct fw_rsc_hdr * mem_hdr,const struct fw_rsc_devmem * mem_res,size_t table_header_size,size_t table_size)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
pas_get_resource_table(uint32_t pas_id,struct resource_table * rt,size_t * rt_size)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