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
venus_reset_cpu(struct qcom_pas_data * data)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
venus_fw_shutdown(struct qcom_pas_data * data)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
venus_fw_start(struct qcom_pas_data * data)61 TEE_Result venus_fw_start(struct qcom_pas_data *data)
62 {
63 return venus_reset_cpu(data);
64 }
65
venus_fw_set_state(struct qcom_pas_data * data,bool power_on)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