xref: /rk3399_ARM-atf/plat/arm/common/arm_sip_svc.c (revision 82cb2c1ad9897473743f08437d0a3995bed561b9)
1f10796a0Sdp-arm /*
2f10796a0Sdp-arm  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3f10796a0Sdp-arm  *
4*82cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
5f10796a0Sdp-arm  */
6f10796a0Sdp-arm 
7f10796a0Sdp-arm #include <arm_sip_svc.h>
8f10796a0Sdp-arm #include <debug.h>
9f10796a0Sdp-arm #include <pmf.h>
10f10796a0Sdp-arm #include <runtime_svc.h>
11f10796a0Sdp-arm #include <stdint.h>
12f10796a0Sdp-arm #include <uuid.h>
13f10796a0Sdp-arm 
14f10796a0Sdp-arm 
15f10796a0Sdp-arm /* ARM SiP Service UUID */
16f10796a0Sdp-arm DEFINE_SVC_UUID(arm_sip_svc_uid,
17f10796a0Sdp-arm 		0xe2756d55, 0x3360, 0x4bb5, 0xbf, 0xf3,
18f10796a0Sdp-arm 		0x62, 0x79, 0xfd, 0x11, 0x37, 0xff);
19f10796a0Sdp-arm 
20f10796a0Sdp-arm static int arm_sip_setup(void)
21f10796a0Sdp-arm {
22f10796a0Sdp-arm 	if (pmf_setup() != 0)
23f10796a0Sdp-arm 		return 1;
24f10796a0Sdp-arm 	return 0;
25f10796a0Sdp-arm }
26f10796a0Sdp-arm 
27f10796a0Sdp-arm /*
28f10796a0Sdp-arm  * This function handles ARM defined SiP Calls
29f10796a0Sdp-arm  */
30f10796a0Sdp-arm static uintptr_t arm_sip_handler(unsigned int smc_fid,
31f10796a0Sdp-arm 			u_register_t x1,
32f10796a0Sdp-arm 			u_register_t x2,
33f10796a0Sdp-arm 			u_register_t x3,
34f10796a0Sdp-arm 			u_register_t x4,
35f10796a0Sdp-arm 			void *cookie,
36f10796a0Sdp-arm 			void *handle,
37f10796a0Sdp-arm 			u_register_t flags)
38f10796a0Sdp-arm {
39f10796a0Sdp-arm 	/*
40f10796a0Sdp-arm 	 * Dispatch PMF calls to PMF SMC handler and return its return
41f10796a0Sdp-arm 	 * value
42f10796a0Sdp-arm 	 */
43f10796a0Sdp-arm 	if (is_pmf_fid(smc_fid)) {
44f10796a0Sdp-arm 		return pmf_smc_handler(smc_fid, x1, x2, x3, x4, cookie,
45f10796a0Sdp-arm 				handle, flags);
46f10796a0Sdp-arm 	}
47f10796a0Sdp-arm 
48f10796a0Sdp-arm 	switch (smc_fid) {
49f10796a0Sdp-arm 	case ARM_SIP_SVC_CALL_COUNT:
50f10796a0Sdp-arm 		/*
51f10796a0Sdp-arm 		 * Return the number of SiP Service Calls. PMF is the only
52f10796a0Sdp-arm 		 * SiP service implemented; so return number of PMF calls
53f10796a0Sdp-arm 		 */
54f10796a0Sdp-arm 		SMC_RET1(handle, PMF_NUM_SMC_CALLS);
55f10796a0Sdp-arm 
56f10796a0Sdp-arm 	case ARM_SIP_SVC_UID:
57f10796a0Sdp-arm 		/* Return UID to the caller */
58f10796a0Sdp-arm 		SMC_UUID_RET(handle, arm_sip_svc_uid);
59f10796a0Sdp-arm 
60f10796a0Sdp-arm 	case ARM_SIP_SVC_VERSION:
61f10796a0Sdp-arm 		/* Return the version of current implementation */
62f10796a0Sdp-arm 		SMC_RET2(handle, ARM_SIP_SVC_VERSION_MAJOR, ARM_SIP_SVC_VERSION_MINOR);
63f10796a0Sdp-arm 
64f10796a0Sdp-arm 	default:
65f10796a0Sdp-arm 		WARN("Unimplemented ARM SiP Service Call: 0x%x \n", smc_fid);
66f10796a0Sdp-arm 		SMC_RET1(handle, SMC_UNK);
67f10796a0Sdp-arm 	}
68f10796a0Sdp-arm 
69f10796a0Sdp-arm }
70f10796a0Sdp-arm 
71f10796a0Sdp-arm 
72f10796a0Sdp-arm /* Define a runtime service descriptor for fast SMC calls */
73f10796a0Sdp-arm DECLARE_RT_SVC(
74f10796a0Sdp-arm 	arm_sip_svc,
75f10796a0Sdp-arm 	OEN_SIP_START,
76f10796a0Sdp-arm 	OEN_SIP_END,
77f10796a0Sdp-arm 	SMC_TYPE_FAST,
78f10796a0Sdp-arm 	arm_sip_setup,
79f10796a0Sdp-arm 	arm_sip_handler
80f10796a0Sdp-arm );
81