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