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