xref: /rk3399_ARM-atf/plat/rockchip/common/rockchip_sip_svc.c (revision 82cb2c1ad9897473743f08437d0a3995bed561b9)
11760db68SCaesar Wang /*
21760db68SCaesar Wang  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
31760db68SCaesar Wang  *
4*82cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
51760db68SCaesar Wang  */
61760db68SCaesar Wang 
71760db68SCaesar Wang #include <assert.h>
81760db68SCaesar Wang #include <debug.h>
91760db68SCaesar Wang #include <mmio.h>
101760db68SCaesar Wang #include <plat_sip_calls.h>
111760db68SCaesar Wang #include <rockchip_sip_svc.h>
121760db68SCaesar Wang #include <runtime_svc.h>
131760db68SCaesar Wang #include <uuid.h>
141760db68SCaesar Wang 
151760db68SCaesar Wang /* Rockchip SiP Service UUID */
161760db68SCaesar Wang DEFINE_SVC_UUID(rk_sip_svc_uid,
171760db68SCaesar Wang 		0xe86fc7e2, 0x313e, 0x11e6, 0xb7, 0x0d,
181760db68SCaesar Wang 		0x8f, 0x88, 0xee, 0x74, 0x7b, 0x72);
191760db68SCaesar Wang 
201760db68SCaesar Wang #pragma weak rockchip_plat_sip_handler
211760db68SCaesar Wang uint64_t rockchip_plat_sip_handler(uint32_t smc_fid,
221760db68SCaesar Wang 				   uint64_t x1,
231760db68SCaesar Wang 				   uint64_t x2,
241760db68SCaesar Wang 				   uint64_t x3,
251760db68SCaesar Wang 				   uint64_t x4,
261760db68SCaesar Wang 				   void *cookie,
271760db68SCaesar Wang 				   void *handle,
281760db68SCaesar Wang 				   uint64_t flags)
291760db68SCaesar Wang {
301760db68SCaesar Wang 	ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid);
311760db68SCaesar Wang 	SMC_RET1(handle, SMC_UNK);
321760db68SCaesar Wang }
331760db68SCaesar Wang 
341760db68SCaesar Wang /*
351760db68SCaesar Wang  * This function is responsible for handling all SiP calls from the NS world
361760db68SCaesar Wang  */
371760db68SCaesar Wang uint64_t sip_smc_handler(uint32_t smc_fid,
381760db68SCaesar Wang 			 uint64_t x1,
391760db68SCaesar Wang 			 uint64_t x2,
401760db68SCaesar Wang 			 uint64_t x3,
411760db68SCaesar Wang 			 uint64_t x4,
421760db68SCaesar Wang 			 void *cookie,
431760db68SCaesar Wang 			 void *handle,
441760db68SCaesar Wang 			 uint64_t flags)
451760db68SCaesar Wang {
461760db68SCaesar Wang 	uint32_t ns;
471760db68SCaesar Wang 
481760db68SCaesar Wang 	/* Determine which security state this SMC originated from */
491760db68SCaesar Wang 	ns = is_caller_non_secure(flags);
501760db68SCaesar Wang 	if (!ns)
511760db68SCaesar Wang 		SMC_RET1(handle, SMC_UNK);
521760db68SCaesar Wang 
531760db68SCaesar Wang 	switch (smc_fid) {
541760db68SCaesar Wang 	case SIP_SVC_CALL_COUNT:
551760db68SCaesar Wang 		/* Return the number of Rockchip SiP Service Calls. */
561760db68SCaesar Wang 		SMC_RET1(handle,
571760db68SCaesar Wang 			 RK_COMMON_SIP_NUM_CALLS + RK_PLAT_SIP_NUM_CALLS);
581760db68SCaesar Wang 
591760db68SCaesar Wang 	case SIP_SVC_UID:
601760db68SCaesar Wang 		/* Return UID to the caller */
611760db68SCaesar Wang 		SMC_UUID_RET(handle, rk_sip_svc_uid);
621760db68SCaesar Wang 		break;
631760db68SCaesar Wang 
641760db68SCaesar Wang 	case SIP_SVC_VERSION:
651760db68SCaesar Wang 		/* Return the version of current implementation */
661760db68SCaesar Wang 		SMC_RET2(handle, RK_SIP_SVC_VERSION_MAJOR,
671760db68SCaesar Wang 			RK_SIP_SVC_VERSION_MINOR);
681760db68SCaesar Wang 		break;
691760db68SCaesar Wang 
701760db68SCaesar Wang 	default:
711760db68SCaesar Wang 		return rockchip_plat_sip_handler(smc_fid, x1, x2, x3, x4,
721760db68SCaesar Wang 			cookie, handle, flags);
731760db68SCaesar Wang 	}
741760db68SCaesar Wang }
751760db68SCaesar Wang 
761760db68SCaesar Wang /* Define a runtime service descriptor for fast SMC calls */
771760db68SCaesar Wang DECLARE_RT_SVC(
781760db68SCaesar Wang 	rockchip_sip_svc,
791760db68SCaesar Wang 	OEN_SIP_START,
801760db68SCaesar Wang 	OEN_SIP_END,
811760db68SCaesar Wang 	SMC_TYPE_FAST,
821760db68SCaesar Wang 	NULL,
831760db68SCaesar Wang 	sip_smc_handler
841760db68SCaesar Wang );
85