xref: /arm-trusted-firmware/plat/mediatek/drivers/apusys/apusys.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2023, MediaTek Inc. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu /* TF-A system header */
8*91f16700Schasinglulu #include <common/debug.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu /* Vendor header */
11*91f16700Schasinglulu #include "apusys.h"
12*91f16700Schasinglulu #include "apusys_devapc.h"
13*91f16700Schasinglulu #include "apusys_power.h"
14*91f16700Schasinglulu #include "apusys_rv.h"
15*91f16700Schasinglulu #include "apusys_security_ctrl_plat.h"
16*91f16700Schasinglulu #include <lib/mtk_init/mtk_init.h>
17*91f16700Schasinglulu #include <mtk_sip_svc.h>
18*91f16700Schasinglulu 
19*91f16700Schasinglulu static u_register_t apusys_kernel_handler(u_register_t x1,
20*91f16700Schasinglulu 					  u_register_t x2,
21*91f16700Schasinglulu 					  u_register_t x3,
22*91f16700Schasinglulu 					  u_register_t x4,
23*91f16700Schasinglulu 					  void *handle,
24*91f16700Schasinglulu 					  struct smccc_res *smccc_ret)
25*91f16700Schasinglulu {
26*91f16700Schasinglulu 	uint32_t request_ops;
27*91f16700Schasinglulu 	int32_t ret = -1;
28*91f16700Schasinglulu 
29*91f16700Schasinglulu 	request_ops = (uint32_t)x1;
30*91f16700Schasinglulu 
31*91f16700Schasinglulu 	switch (request_ops) {
32*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_PWR_TOP_ON:
33*91f16700Schasinglulu 		ret = apusys_kernel_apusys_pwr_top_on();
34*91f16700Schasinglulu 		break;
35*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_PWR_TOP_OFF:
36*91f16700Schasinglulu 		ret = apusys_kernel_apusys_pwr_top_off();
37*91f16700Schasinglulu 		break;
38*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_RV_SETUP_REVISER:
39*91f16700Schasinglulu 		ret = apusys_kernel_apusys_rv_setup_reviser();
40*91f16700Schasinglulu 		break;
41*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_RV_RESET_MP:
42*91f16700Schasinglulu 		ret = apusys_kernel_apusys_rv_reset_mp();
43*91f16700Schasinglulu 		break;
44*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_RV_SETUP_BOOT:
45*91f16700Schasinglulu 		ret = apusys_kernel_apusys_rv_setup_boot();
46*91f16700Schasinglulu 		break;
47*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_RV_START_MP:
48*91f16700Schasinglulu 		ret = apusys_kernel_apusys_rv_start_mp();
49*91f16700Schasinglulu 		break;
50*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_RV_STOP_MP:
51*91f16700Schasinglulu 		ret = apusys_kernel_apusys_rv_stop_mp();
52*91f16700Schasinglulu 		break;
53*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_DEVAPC_INIT_RCX:
54*91f16700Schasinglulu 		ret = apusys_devapc_rcx_init();
55*91f16700Schasinglulu 		break;
56*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_RV_SETUP_SEC_MEM:
57*91f16700Schasinglulu 		ret = apusys_kernel_apusys_rv_setup_sec_mem();
58*91f16700Schasinglulu 		break;
59*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_RV_DISABLE_WDT_ISR:
60*91f16700Schasinglulu 		ret = apusys_kernel_apusys_rv_disable_wdt_isr();
61*91f16700Schasinglulu 		break;
62*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_RV_CLEAR_WDT_ISR:
63*91f16700Schasinglulu 		ret = apusys_kernel_apusys_rv_clear_wdt_isr();
64*91f16700Schasinglulu 		break;
65*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_RV_CG_GATING:
66*91f16700Schasinglulu 		ret = apusys_kernel_apusys_rv_cg_gating();
67*91f16700Schasinglulu 		break;
68*91f16700Schasinglulu 	case MTK_APUSYS_KERNEL_OP_APUSYS_RV_CG_UNGATING:
69*91f16700Schasinglulu 		ret = apusys_kernel_apusys_rv_cg_ungating();
70*91f16700Schasinglulu 		break;
71*91f16700Schasinglulu 	default:
72*91f16700Schasinglulu 		ERROR(MODULE_TAG "%s unknown request_ops = %x\n", MODULE_TAG, request_ops);
73*91f16700Schasinglulu 		break;
74*91f16700Schasinglulu 	}
75*91f16700Schasinglulu 
76*91f16700Schasinglulu 	return ret;
77*91f16700Schasinglulu }
78*91f16700Schasinglulu DECLARE_SMC_HANDLER(MTK_SIP_APUSYS_CONTROL, apusys_kernel_handler);
79*91f16700Schasinglulu 
80*91f16700Schasinglulu int apusys_init(void)
81*91f16700Schasinglulu {
82*91f16700Schasinglulu 	if (apusys_power_init() != 0) {
83*91f16700Schasinglulu 		return -1;
84*91f16700Schasinglulu 	}
85*91f16700Schasinglulu 
86*91f16700Schasinglulu 	if (apusys_devapc_ao_init() != 0) {
87*91f16700Schasinglulu 		return -1;
88*91f16700Schasinglulu 	}
89*91f16700Schasinglulu 
90*91f16700Schasinglulu 	apusys_security_ctrl_init();
91*91f16700Schasinglulu 	apusys_rv_mbox_mpu_init();
92*91f16700Schasinglulu 
93*91f16700Schasinglulu 	return 0;
94*91f16700Schasinglulu }
95*91f16700Schasinglulu MTK_PLAT_SETUP_1_INIT(apusys_init);
96