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 uint64_t mediatek_plat_sip_handler(uint32_t smc_fid, 23 uint64_t x1, 24 uint64_t x2, 25 uint64_t x3, 26 uint64_t x4, 27 void *cookie, 28 void *handle, 29 uint64_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 uint64_t mediatek_sip_handler(uint32_t smc_fid, 38 uint64_t x1, 39 uint64_t x2, 40 uint64_t x3, 41 uint64_t x4, 42 void *cookie, 43 void *handle, 44 uint64_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 } 75 } 76 77 return mediatek_plat_sip_handler(smc_fid, x1, x2, x3, x4, 78 cookie, handle, flags); 79 80 } 81 82 /* 83 * This function is responsible for handling all SiP calls from the NS world 84 */ 85 uint64_t sip_smc_handler(uint32_t smc_fid, 86 uint64_t x1, 87 uint64_t x2, 88 uint64_t x3, 89 uint64_t x4, 90 void *cookie, 91 void *handle, 92 uint64_t flags) 93 { 94 switch (smc_fid) { 95 case SIP_SVC_CALL_COUNT: 96 /* Return the number of Mediatek SiP Service Calls. */ 97 SMC_RET1(handle, 98 MTK_COMMON_SIP_NUM_CALLS + MTK_PLAT_SIP_NUM_CALLS); 99 100 case SIP_SVC_UID: 101 /* Return UID to the caller */ 102 SMC_UUID_RET(handle, mtk_sip_svc_uid); 103 104 case SIP_SVC_VERSION: 105 /* Return the version of current implementation */ 106 SMC_RET2(handle, MTK_SIP_SVC_VERSION_MAJOR, 107 MTK_SIP_SVC_VERSION_MINOR); 108 109 default: 110 return mediatek_sip_handler(smc_fid, x1, x2, x3, x4, 111 cookie, handle, flags); 112 } 113 } 114 115 /* Define a runtime service descriptor for fast SMC calls */ 116 DECLARE_RT_SVC( 117 mediatek_sip_svc, 118 OEN_SIP_START, 119 OEN_SIP_END, 120 SMC_TYPE_FAST, 121 NULL, 122 sip_smc_handler 123 ); 124