xref: /rk3399_ARM-atf/services/std_svc/std_svc_setup.c (revision fb037bfb7cbf7b404c069b4ebac5a10059d948b1)
1 /*
2  * Copyright (c) 2014, ARM Limited and Contributors. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * Redistributions of source code must retain the above copyright notice, this
8  * list of conditions and the following disclaimer.
9  *
10  * Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  *
14  * Neither the name of ARM nor the names of its contributors may be used
15  * to endorse or promote products derived from this software without specific
16  * prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #include <stdint.h>
32 #include <uuid.h>
33 #include <context_mgmt.h>
34 #include <runtime_svc.h>
35 #include <std_svc.h>
36 #include <psci.h>
37 #include <debug.h>
38 
39 /* Standard Service UUID */
40 DEFINE_SVC_UUID(arm_svc_uid,
41 		0x108d905b, 0xf863, 0x47e8, 0xae, 0x2d,
42 		0xc0, 0xfb, 0x56, 0x41, 0xf6, 0xe2);
43 
44 /* Setup Standard Services */
45 static int32_t std_svc_setup(void)
46 {
47 	/*
48 	 * PSCI is the only specification implemented as a Standard Service.
49 	 * Invoke PSCI setup from here
50 	 */
51 	return psci_setup();
52 }
53 
54 /*
55  * Top-level Standard Service SMC handler. This handler will in turn dispatch
56  * calls to PSCI SMC handler
57  */
58 uint64_t std_svc_smc_handler(uint32_t smc_fid,
59 			     uint64_t x1,
60 			     uint64_t x2,
61 			     uint64_t x3,
62 			     uint64_t x4,
63 			     void *cookie,
64 			     void *handle,
65 			     uint64_t flags)
66 {
67 	/*
68 	 * Dispatch PSCI calls to PSCI SMC handler and return its return
69 	 * value
70 	 */
71 	if (is_psci_fid(smc_fid)) {
72 		return psci_smc_handler(smc_fid, x1, x2, x3, x4, cookie,
73 				handle, flags);
74 	}
75 
76 	switch (smc_fid) {
77 	case ARM_STD_SVC_CALL_COUNT:
78 		/*
79 		 * Return the number of Standard Service Calls. PSCI is the only
80 		 * standard service implemented; so return number of PSCI calls
81 		 */
82 		SMC_RET1(handle, PSCI_NUM_CALLS);
83 
84 	case ARM_STD_SVC_UID:
85 		/* Return UID to the caller */
86 		SMC_UUID_RET(handle, arm_svc_uid);
87 
88 	case ARM_STD_SVC_VERSION:
89 		/* Return the version of current implementation */
90 		SMC_RET2(handle, STD_SVC_VERSION_MAJOR, STD_SVC_VERSION_MINOR);
91 
92 	default:
93 		WARN("Unimplemented Standard Service Call: 0x%x \n", smc_fid);
94 		SMC_RET1(handle, SMC_UNK);
95 	}
96 }
97 
98 /* Register Standard Service Calls as runtime service */
99 DECLARE_RT_SVC(
100 		std_svc,
101 
102 		OEN_STD_START,
103 		OEN_STD_END,
104 		SMC_TYPE_FAST,
105 		std_svc_setup,
106 		std_svc_smc_handler
107 );
108