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