xref: /optee_os/core/pta/qcom/pas/pas.c (revision fedadb6460b1ea7db709c6f5a0572f5a8cb8e5c9)
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