xref: /optee_os/core/pta/qcom/pas/venus.c (revision abca35a69f9bea0496cf05e025c3c36e6d5ea68b)
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