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