1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <common/debug.h> 10*91f16700Schasinglulu #include <common/runtime_svc.h> 11*91f16700Schasinglulu #include <drivers/console.h> 12*91f16700Schasinglulu #include <lib/mmio.h> 13*91f16700Schasinglulu #include <tools_share/uuid.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #include <mtk_plat_common.h> 16*91f16700Schasinglulu #include <mtk_sip_svc.h> 17*91f16700Schasinglulu #include <plat_sip_calls.h> 18*91f16700Schasinglulu 19*91f16700Schasinglulu /* Mediatek SiP Service UUID */ 20*91f16700Schasinglulu DEFINE_SVC_UUID2(mtk_sip_svc_uid, 21*91f16700Schasinglulu 0xa42b58f7, 0x6242, 0x7d4d, 0x80, 0xe5, 22*91f16700Schasinglulu 0x8f, 0x95, 0x05, 0x00, 0x0f, 0x3d); 23*91f16700Schasinglulu 24*91f16700Schasinglulu #pragma weak mediatek_plat_sip_handler 25*91f16700Schasinglulu uintptr_t mediatek_plat_sip_handler(uint32_t smc_fid, 26*91f16700Schasinglulu u_register_t x1, 27*91f16700Schasinglulu u_register_t x2, 28*91f16700Schasinglulu u_register_t x3, 29*91f16700Schasinglulu u_register_t x4, 30*91f16700Schasinglulu void *cookie, 31*91f16700Schasinglulu void *handle, 32*91f16700Schasinglulu u_register_t flags) 33*91f16700Schasinglulu { 34*91f16700Schasinglulu ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid); 35*91f16700Schasinglulu SMC_RET1(handle, SMC_UNK); 36*91f16700Schasinglulu } 37*91f16700Schasinglulu 38*91f16700Schasinglulu /* 39*91f16700Schasinglulu * This function handles Mediatek defined SiP Calls */ 40*91f16700Schasinglulu uintptr_t mediatek_sip_handler(uint32_t smc_fid, 41*91f16700Schasinglulu u_register_t x1, 42*91f16700Schasinglulu u_register_t x2, 43*91f16700Schasinglulu u_register_t x3, 44*91f16700Schasinglulu u_register_t x4, 45*91f16700Schasinglulu void *cookie, 46*91f16700Schasinglulu void *handle, 47*91f16700Schasinglulu u_register_t flags) 48*91f16700Schasinglulu { 49*91f16700Schasinglulu uint32_t ns; 50*91f16700Schasinglulu 51*91f16700Schasinglulu /* if parameter is sent from SMC32. Clean top 32 bits */ 52*91f16700Schasinglulu clean_top_32b_of_param(smc_fid, &x1, &x2, &x3, &x4); 53*91f16700Schasinglulu 54*91f16700Schasinglulu /* Determine which security state this SMC originated from */ 55*91f16700Schasinglulu ns = is_caller_non_secure(flags); 56*91f16700Schasinglulu if (!ns) { 57*91f16700Schasinglulu /* SiP SMC service secure world's call */ 58*91f16700Schasinglulu ; 59*91f16700Schasinglulu } else { 60*91f16700Schasinglulu /* SiP SMC service normal world's call */ 61*91f16700Schasinglulu switch (smc_fid) { 62*91f16700Schasinglulu #if MTK_SIP_SET_AUTHORIZED_SECURE_REG_ENABLE 63*91f16700Schasinglulu case MTK_SIP_SET_AUTHORIZED_SECURE_REG: { 64*91f16700Schasinglulu /* only use ret here */ 65*91f16700Schasinglulu uint64_t ret; 66*91f16700Schasinglulu 67*91f16700Schasinglulu ret = mt_sip_set_authorized_sreg((uint32_t)x1, 68*91f16700Schasinglulu (uint32_t)x2); 69*91f16700Schasinglulu SMC_RET1(handle, ret); 70*91f16700Schasinglulu } 71*91f16700Schasinglulu #endif 72*91f16700Schasinglulu #if MTK_SIP_KERNEL_BOOT_ENABLE 73*91f16700Schasinglulu case MTK_SIP_KERNEL_BOOT_AARCH32: 74*91f16700Schasinglulu boot_to_kernel(x1, x2, x3, x4); 75*91f16700Schasinglulu SMC_RET0(handle); 76*91f16700Schasinglulu #endif 77*91f16700Schasinglulu default: 78*91f16700Schasinglulu /* Do nothing in default case */ 79*91f16700Schasinglulu break; 80*91f16700Schasinglulu } 81*91f16700Schasinglulu } 82*91f16700Schasinglulu 83*91f16700Schasinglulu return mediatek_plat_sip_handler(smc_fid, x1, x2, x3, x4, 84*91f16700Schasinglulu cookie, handle, flags); 85*91f16700Schasinglulu 86*91f16700Schasinglulu } 87*91f16700Schasinglulu 88*91f16700Schasinglulu /* 89*91f16700Schasinglulu * This function is responsible for handling all SiP calls from the NS world 90*91f16700Schasinglulu */ 91*91f16700Schasinglulu uintptr_t sip_smc_handler(uint32_t smc_fid, 92*91f16700Schasinglulu u_register_t x1, 93*91f16700Schasinglulu u_register_t x2, 94*91f16700Schasinglulu u_register_t x3, 95*91f16700Schasinglulu u_register_t x4, 96*91f16700Schasinglulu void *cookie, 97*91f16700Schasinglulu void *handle, 98*91f16700Schasinglulu u_register_t flags) 99*91f16700Schasinglulu { 100*91f16700Schasinglulu switch (smc_fid) { 101*91f16700Schasinglulu case SIP_SVC_CALL_COUNT: 102*91f16700Schasinglulu /* Return the number of Mediatek SiP Service Calls. */ 103*91f16700Schasinglulu SMC_RET1(handle, 104*91f16700Schasinglulu MTK_COMMON_SIP_NUM_CALLS + MTK_PLAT_SIP_NUM_CALLS); 105*91f16700Schasinglulu 106*91f16700Schasinglulu case SIP_SVC_UID: 107*91f16700Schasinglulu /* Return UID to the caller */ 108*91f16700Schasinglulu SMC_UUID_RET(handle, mtk_sip_svc_uid); 109*91f16700Schasinglulu 110*91f16700Schasinglulu case SIP_SVC_VERSION: 111*91f16700Schasinglulu /* Return the version of current implementation */ 112*91f16700Schasinglulu SMC_RET2(handle, MTK_SIP_SVC_VERSION_MAJOR, 113*91f16700Schasinglulu MTK_SIP_SVC_VERSION_MINOR); 114*91f16700Schasinglulu 115*91f16700Schasinglulu default: 116*91f16700Schasinglulu return mediatek_sip_handler(smc_fid, x1, x2, x3, x4, 117*91f16700Schasinglulu cookie, handle, flags); 118*91f16700Schasinglulu } 119*91f16700Schasinglulu } 120*91f16700Schasinglulu 121*91f16700Schasinglulu /* Define a runtime service descriptor for fast SMC calls */ 122*91f16700Schasinglulu DECLARE_RT_SVC( 123*91f16700Schasinglulu mediatek_sip_svc, 124*91f16700Schasinglulu OEN_SIP_START, 125*91f16700Schasinglulu OEN_SIP_END, 126*91f16700Schasinglulu SMC_TYPE_FAST, 127*91f16700Schasinglulu NULL, 128*91f16700Schasinglulu sip_smc_handler 129*91f16700Schasinglulu ); 130