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