xref: /rk3399_ARM-atf/plat/rockchip/common/rockchip_sip_svc.c (revision 57d1e5faf21c160c2dd3f152f5195a13ba8c7c70)
11760db68SCaesar Wang /*
21760db68SCaesar Wang  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
31760db68SCaesar Wang  *
482cb2c1aSdp-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
21*57d1e5faSMasahiro Yamada uintptr_t rockchip_plat_sip_handler(uint32_t smc_fid,
22*57d1e5faSMasahiro Yamada 				    u_register_t x1,
23*57d1e5faSMasahiro Yamada 				    u_register_t x2,
24*57d1e5faSMasahiro Yamada 				    u_register_t x3,
25*57d1e5faSMasahiro Yamada 				    u_register_t x4,
261760db68SCaesar Wang 				    void *cookie,
271760db68SCaesar Wang 				    void *handle,
28*57d1e5faSMasahiro Yamada 				    u_register_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  */
37*57d1e5faSMasahiro Yamada uintptr_t sip_smc_handler(uint32_t smc_fid,
38*57d1e5faSMasahiro Yamada 			  u_register_t x1,
39*57d1e5faSMasahiro Yamada 			  u_register_t x2,
40*57d1e5faSMasahiro Yamada 			  u_register_t x3,
41*57d1e5faSMasahiro Yamada 			  u_register_t x4,
421760db68SCaesar Wang 			  void *cookie,
431760db68SCaesar Wang 			  void *handle,
44*57d1e5faSMasahiro Yamada 			  u_register_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 
631760db68SCaesar Wang 	case SIP_SVC_VERSION:
641760db68SCaesar Wang 		/* Return the version of current implementation */
651760db68SCaesar Wang 		SMC_RET2(handle, RK_SIP_SVC_VERSION_MAJOR,
661760db68SCaesar Wang 			RK_SIP_SVC_VERSION_MINOR);
671760db68SCaesar Wang 
681760db68SCaesar Wang 	default:
691760db68SCaesar Wang 		return rockchip_plat_sip_handler(smc_fid, x1, x2, x3, x4,
701760db68SCaesar Wang 			cookie, handle, flags);
711760db68SCaesar Wang 	}
721760db68SCaesar Wang }
731760db68SCaesar Wang 
741760db68SCaesar Wang /* Define a runtime service descriptor for fast SMC calls */
751760db68SCaesar Wang DECLARE_RT_SVC(
761760db68SCaesar Wang 	rockchip_sip_svc,
771760db68SCaesar Wang 	OEN_SIP_START,
781760db68SCaesar Wang 	OEN_SIP_END,
791760db68SCaesar Wang 	SMC_TYPE_FAST,
801760db68SCaesar Wang 	NULL,
811760db68SCaesar Wang 	sip_smc_handler
821760db68SCaesar Wang );
83