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