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