1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2026, Qualcomm Technologies, Inc. and/or its subsidiaries. 4 */ 5 6 #include <io.h> 7 #include <mm/core_mmu.h> 8 #include <stdint.h> 9 #include <string.h> 10 11 #include "pas.h" 12 #include "video.h" 13 14 #define WRAPPER_IRIS_VERSION 0x0 15 #define WRAPPER_CPA_START_ADDR 0x1020 16 #define WRAPPER_CPA_END_ADDR 0x1024 17 #define WRAPPER_FW_START_ADDR 0x1028 18 #define WRAPPER_FW_END_ADDR 0x102C 19 #define WRAPPER_NONPIX_START_ADDR 0x1030 20 #define WRAPPER_NONPIX_END_ADDR 0x1034 21 #define WRAPPER_TZ_XTSS_SW_RESET 0x1000 22 #define WRAPPER_XTSS_SW_RESET_BIT BIT(0) 23 24 static TEE_Result venus_reset_cpu(struct qcom_pas_data *data) 25 { 26 vaddr_t base = io_pa_or_va(&data->base, data->size); 27 28 if (!base) 29 return TEE_ERROR_GENERIC; 30 31 base += IRIS_WRAPPER_TOP_TZ_REG_BASE; 32 33 io_write32(base + WRAPPER_FW_START_ADDR, 0); 34 io_write32(base + WRAPPER_FW_END_ADDR, data->fw_size); 35 io_write32(base + WRAPPER_CPA_START_ADDR, 0); 36 io_write32(base + WRAPPER_CPA_END_ADDR, data->fw_size); 37 io_write32(base + WRAPPER_NONPIX_START_ADDR, data->fw_size); 38 io_write32(base + WRAPPER_NONPIX_END_ADDR, data->fw_size); 39 io_write32(base + WRAPPER_TZ_XTSS_SW_RESET, 0); 40 41 return TEE_SUCCESS; 42 } 43 44 TEE_Result venus_fw_shutdown(struct qcom_pas_data *data) 45 { 46 vaddr_t base = io_pa_or_va(&data->base, data->size); 47 uint32_t reg; 48 49 if (!base) 50 return TEE_ERROR_GENERIC; 51 52 base += IRIS_WRAPPER_TOP_TZ_REG_BASE; 53 54 reg = io_read32(base + WRAPPER_TZ_XTSS_SW_RESET); 55 reg |= WRAPPER_XTSS_SW_RESET_BIT; 56 io_write32(base + WRAPPER_TZ_XTSS_SW_RESET, reg); 57 58 return TEE_SUCCESS; 59 } 60 61 TEE_Result venus_fw_start(struct qcom_pas_data *data) 62 { 63 return venus_reset_cpu(data); 64 } 65 66 TEE_Result venus_fw_set_state(struct qcom_pas_data *data, bool power_on) 67 { 68 if (power_on) 69 return venus_reset_cpu(data); 70 71 return venus_fw_shutdown(data); 72 } 73 74