xref: /optee_os/core/pta/qcom/pas/pas.h (revision fedadb6460b1ea7db709c6f5a0572f5a8cb8e5c9)
1*fedadb64SJorge Ramirez-Ortiz /* SPDX-License-Identifier: BSD-2-Clause */
2*fedadb64SJorge Ramirez-Ortiz /*
3*fedadb64SJorge Ramirez-Ortiz  * Copyright (c) 2025, Linaro Limited
4*fedadb64SJorge Ramirez-Ortiz  * Copyright (c) 2026, Qualcomm Technologies, Inc. and/or its subsidiaries.
5*fedadb64SJorge Ramirez-Ortiz  */
6*fedadb64SJorge Ramirez-Ortiz 
7*fedadb64SJorge Ramirez-Ortiz #ifndef _PAS_H_
8*fedadb64SJorge Ramirez-Ortiz #define _PAS_H_
9*fedadb64SJorge Ramirez-Ortiz 
10*fedadb64SJorge Ramirez-Ortiz #include <kernel/thread_arch.h>
11*fedadb64SJorge Ramirez-Ortiz #include <mm/core_memprot.h>
12*fedadb64SJorge Ramirez-Ortiz #include <drivers/clk_qcom.h>
13*fedadb64SJorge Ramirez-Ortiz #include <stdint.h>
14*fedadb64SJorge Ramirez-Ortiz 
15*fedadb64SJorge Ramirez-Ortiz #define DEFINE_RESOURCE_TABLE(prefix, num_res)			\
16*fedadb64SJorge Ramirez-Ortiz 	enum {							\
17*fedadb64SJorge Ramirez-Ortiz 		prefix##_NUM_MEM_RESOURCES = (num_res),		\
18*fedadb64SJorge Ramirez-Ortiz 		prefix##_SIZE_MEM_RES =				\
19*fedadb64SJorge Ramirez-Ortiz 			(sizeof(struct fw_rsc_hdr) +		\
20*fedadb64SJorge Ramirez-Ortiz 			 sizeof(struct fw_rsc_devmem)),		\
21*fedadb64SJorge Ramirez-Ortiz 		prefix##_RESOURCE_TABLE_HEADER_SIZE =		\
22*fedadb64SJorge Ramirez-Ortiz 			(sizeof(struct resource_table) +	\
23*fedadb64SJorge Ramirez-Ortiz 			 (prefix##_NUM_MEM_RESOURCES *		\
24*fedadb64SJorge Ramirez-Ortiz 			  sizeof(uint32_t))),			\
25*fedadb64SJorge Ramirez-Ortiz 		prefix##_RESOURCE_TABLE_SIZE =			\
26*fedadb64SJorge Ramirez-Ortiz 			(prefix##_RESOURCE_TABLE_HEADER_SIZE +	\
27*fedadb64SJorge Ramirez-Ortiz 			 (prefix##_NUM_MEM_RESOURCES *		\
28*fedadb64SJorge Ramirez-Ortiz 			  prefix##_SIZE_MEM_RES)),		\
29*fedadb64SJorge Ramirez-Ortiz 	}
30*fedadb64SJorge Ramirez-Ortiz 
31*fedadb64SJorge Ramirez-Ortiz struct resource_table {
32*fedadb64SJorge Ramirez-Ortiz 	uint32_t ver;
33*fedadb64SJorge Ramirez-Ortiz 	uint32_t num;
34*fedadb64SJorge Ramirez-Ortiz 	uint32_t reserved[2];
35*fedadb64SJorge Ramirez-Ortiz 	uint32_t offset[];
36*fedadb64SJorge Ramirez-Ortiz } __packed;
37*fedadb64SJorge Ramirez-Ortiz 
38*fedadb64SJorge Ramirez-Ortiz struct fw_rsc_hdr {
39*fedadb64SJorge Ramirez-Ortiz 	uint32_t type;
40*fedadb64SJorge Ramirez-Ortiz 	uint8_t data[];
41*fedadb64SJorge Ramirez-Ortiz } __packed;
42*fedadb64SJorge Ramirez-Ortiz 
43*fedadb64SJorge Ramirez-Ortiz enum fw_resource_type {
44*fedadb64SJorge Ramirez-Ortiz 	RSC_CARVEOUT		= 0,
45*fedadb64SJorge Ramirez-Ortiz 	RSC_DEVMEM		= 1,
46*fedadb64SJorge Ramirez-Ortiz 	RSC_TRACE		= 2,
47*fedadb64SJorge Ramirez-Ortiz 	RSC_VDEV		= 3,
48*fedadb64SJorge Ramirez-Ortiz 	RSC_LAST		= 4,
49*fedadb64SJorge Ramirez-Ortiz 	RSC_VENDOR_START	= 128,
50*fedadb64SJorge Ramirez-Ortiz 	RSC_VENDOR_END		= 512,
51*fedadb64SJorge Ramirez-Ortiz };
52*fedadb64SJorge Ramirez-Ortiz 
53*fedadb64SJorge Ramirez-Ortiz #define IOMMU_READ	BIT(0)
54*fedadb64SJorge Ramirez-Ortiz #define IOMMU_WRITE	BIT(1)
55*fedadb64SJorge Ramirez-Ortiz 
56*fedadb64SJorge Ramirez-Ortiz struct fw_rsc_devmem {
57*fedadb64SJorge Ramirez-Ortiz 	uint32_t da;
58*fedadb64SJorge Ramirez-Ortiz 	uint32_t pa;
59*fedadb64SJorge Ramirez-Ortiz 	uint32_t len;
60*fedadb64SJorge Ramirez-Ortiz 	uint32_t flags;
61*fedadb64SJorge Ramirez-Ortiz 	uint32_t reserved;
62*fedadb64SJorge Ramirez-Ortiz 	uint8_t name[32];
63*fedadb64SJorge Ramirez-Ortiz } __packed;
64*fedadb64SJorge Ramirez-Ortiz 
65*fedadb64SJorge Ramirez-Ortiz struct qcom_pas_data {
66*fedadb64SJorge Ramirez-Ortiz 	uint32_t pas_id;
67*fedadb64SJorge Ramirez-Ortiz 	struct io_pa_va base;
68*fedadb64SJorge Ramirez-Ortiz 	size_t size;
69*fedadb64SJorge Ramirez-Ortiz 	paddr_t fw_base;
70*fedadb64SJorge Ramirez-Ortiz 	size_t fw_size;
71*fedadb64SJorge Ramirez-Ortiz 	enum qcom_clk_group clk_group;
72*fedadb64SJorge Ramirez-Ortiz };
73*fedadb64SJorge Ramirez-Ortiz 
74*fedadb64SJorge Ramirez-Ortiz TEE_Result pas_get_resource_table(uint32_t pas_id, struct resource_table *rt,
75*fedadb64SJorge Ramirez-Ortiz 				  size_t *rt_size);
76*fedadb64SJorge Ramirez-Ortiz 
77*fedadb64SJorge Ramirez-Ortiz TEE_Result wpss_fw_start(struct qcom_pas_data *data);
78*fedadb64SJorge Ramirez-Ortiz TEE_Result wpss_fw_shutdown(struct qcom_pas_data *data);
79*fedadb64SJorge Ramirez-Ortiz 
80*fedadb64SJorge Ramirez-Ortiz TEE_Result compute_fw_start(struct qcom_pas_data *data);
81*fedadb64SJorge Ramirez-Ortiz TEE_Result compute_fw_shutdown(struct qcom_pas_data *data);
82*fedadb64SJorge Ramirez-Ortiz 
83*fedadb64SJorge Ramirez-Ortiz TEE_Result lpass_fw_start(struct qcom_pas_data *data);
84*fedadb64SJorge Ramirez-Ortiz TEE_Result lpass_fw_shutdown(struct qcom_pas_data *data);
85*fedadb64SJorge Ramirez-Ortiz 
86*fedadb64SJorge Ramirez-Ortiz TEE_Result venus_fw_start(struct qcom_pas_data *data);
87*fedadb64SJorge Ramirez-Ortiz TEE_Result venus_fw_shutdown(struct qcom_pas_data *data);
88*fedadb64SJorge Ramirez-Ortiz TEE_Result venus_fw_set_state(struct qcom_pas_data *data, bool power_on);
89*fedadb64SJorge Ramirez-Ortiz 
90*fedadb64SJorge Ramirez-Ortiz #endif /* _PAS_H_ */
91