1 /* 2 * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <assert.h> 8 9 #include <common/debug.h> 10 #include <common/runtime_svc.h> 11 #include <lib/mmio.h> 12 #include <tools_share/uuid.h> 13 14 #include <plat_sip_calls.h> 15 #include <rockchip_sip_svc.h> 16 17 /* Rockchip SiP Service UUID */ 18 DEFINE_SVC_UUID2(rk_sip_svc_uid, 19 0xe2c76fe8, 0x3e31, 0xe611, 0xb7, 0x0d, 20 0x8f, 0x88, 0xee, 0x74, 0x7b, 0x72); 21 22 #pragma weak rockchip_plat_sip_handler 23 uintptr_t rockchip_plat_sip_handler(uint32_t smc_fid, 24 u_register_t x1, 25 u_register_t x2, 26 u_register_t x3, 27 u_register_t x4, 28 void *cookie, 29 void *handle, 30 u_register_t flags) 31 { 32 ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid); 33 SMC_RET1(handle, SMC_UNK); 34 } 35 36 /* 37 * This function is responsible for handling all SiP calls from the NS world 38 */ 39 uintptr_t sip_smc_handler(uint32_t smc_fid, 40 u_register_t x1, 41 u_register_t x2, 42 u_register_t x3, 43 u_register_t x4, 44 void *cookie, 45 void *handle, 46 u_register_t flags) 47 { 48 uint32_t ns; 49 50 /* Determine which security state this SMC originated from */ 51 ns = is_caller_non_secure(flags); 52 if (!ns) 53 SMC_RET1(handle, SMC_UNK); 54 55 switch (smc_fid) { 56 case SIP_SVC_CALL_COUNT: 57 /* Return the number of Rockchip SiP Service Calls. */ 58 SMC_RET1(handle, 59 RK_COMMON_SIP_NUM_CALLS + RK_PLAT_SIP_NUM_CALLS); 60 61 case SIP_SVC_UID: 62 /* Return UID to the caller */ 63 SMC_UUID_RET(handle, rk_sip_svc_uid); 64 65 case SIP_SVC_VERSION: 66 /* Return the version of current implementation */ 67 SMC_RET2(handle, RK_SIP_SVC_VERSION_MAJOR, 68 RK_SIP_SVC_VERSION_MINOR); 69 70 default: 71 return rockchip_plat_sip_handler(smc_fid, x1, x2, x3, x4, 72 cookie, handle, flags); 73 } 74 } 75 76 /* Define a runtime service descriptor for fast SMC calls */ 77 DECLARE_RT_SVC( 78 rockchip_sip_svc, 79 OEN_SIP_START, 80 OEN_SIP_END, 81 SMC_TYPE_FAST, 82 NULL, 83 sip_smc_handler 84 ); 85