xref: /rk3399_ARM-atf/services/el3/ven_el3_svc.c (revision 270d5c5cd9ad6cecc4b581e8a257c6fcfe7d78d6)
1 /*
2  * Copyright (c) 2024-2025, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <stdint.h>
8 
9 #include <common/debug.h>
10 #include <common/runtime_svc.h>
11 #include <lib/debugfs.h>
12 #include <lib/pmf/pmf.h>
13 #if PLAT_ARM_ACS_SMC_HANDLER
14 #include <plat/arm/common/plat_acs_smc_handler.h>
15 #endif /* PLAT_ARM_ACS_SMC_HANDLER */
16 #include <services/spm_mm_svc.h>
17 #include <services/ven_el3_svc.h>
18 #include <tools_share/uuid.h>
19 
20 /* vendor-specific EL3 UUID */
21 DEFINE_SVC_UUID2(ven_el3_svc_uid,
22 	0xb6011dca, 0x57c4, 0x407e, 0x83, 0xf0,
23 	0xa7, 0xed, 0xda, 0xf0, 0xdf, 0x6c);
24 
25 static int ven_el3_svc_setup(void)
26 {
27 #if USE_DEBUGFS
28 	if (debugfs_smc_setup() != 0) {
29 		return 1;
30 	}
31 #endif /* USE_DEBUGFS */
32 
33 #if ENABLE_PMF
34 	if (pmf_setup() != 0) {
35 		return 1;
36 	}
37 #endif /* ENABLE_PMF */
38 
39 	return 0;
40 }
41 
42 /*
43  * This function handles Arm defined vendor-specific EL3 Service Calls.
44  */
45 static uintptr_t ven_el3_svc_handler(unsigned int smc_fid,
46 			u_register_t x1,
47 			u_register_t x2,
48 			u_register_t x3,
49 			u_register_t x4,
50 			void *cookie,
51 			void *handle,
52 			u_register_t flags)
53 {
54 #if USE_DEBUGFS
55 	/*
56 	 * Dispatch debugfs calls to debugfs SMC handler and return its
57 	 * return value.
58 	 */
59 	if (is_debugfs_fid(smc_fid)) {
60 		return debugfs_smc_handler(smc_fid, x1, x2, x3, x4, cookie,
61 			handle, flags);
62 	}
63 #endif /* USE_DEBUGFS */
64 
65 #if ENABLE_PMF
66 
67 	/*
68 	 * Dispatch PMF calls to PMF SMC handler and return its return
69 	 * value
70 	 */
71 	if (is_pmf_fid(smc_fid)) {
72 		return pmf_smc_handler(smc_fid, x1, x2, x3, x4, cookie,
73 				handle, flags);
74 	}
75 
76 #endif /* ENABLE_PMF */
77 
78 #if PLAT_ARM_ACS_SMC_HANDLER
79 	/*
80 	 * Dispatch ACS calls to ACS SMC handler and return its return value
81 	 */
82 	if (is_acs_fid(smc_fid)) {
83 		return plat_arm_acs_smc_handler(smc_fid, x1, x2, x3, x4, handle);
84 	}
85 #endif /* PLAT_ARM_ACS_SMC_HANDLER */
86 
87 	switch (smc_fid) {
88 	case VEN_EL3_SVC_UID:
89 		/* Return UID to the caller */
90 		SMC_UUID_RET(handle, ven_el3_svc_uid);
91 		break;
92 	case VEN_EL3_SVC_VERSION:
93 		SMC_RET2(handle, VEN_EL3_SVC_VERSION_MAJOR, VEN_EL3_SVC_VERSION_MINOR);
94 		break;
95 #if SPM_MM
96 	/*
97 	 * Handle TPM start SMC as mentioned in TCG ACPI specification.
98 	 */
99 	case TPM_START_SMC_32:
100 	case TPM_START_SMC_64:
101 		return spm_mm_tpm_start_handler(smc_fid, x1, x2, x3, x4, cookie,
102 						handle, flags);
103 		break;
104 #endif
105 	default:
106 		WARN("Unimplemented vendor-specific EL3 Service call: 0x%x\n", smc_fid);
107 		SMC_RET1(handle, SMC_UNK);
108 		break;
109 	}
110 }
111 
112 /* Define a runtime service descriptor for fast SMC calls */
113 DECLARE_RT_SVC(
114 	ven_el3_svc,
115 	OEN_VEN_EL3_START,
116 	OEN_VEN_EL3_END,
117 	SMC_TYPE_FAST,
118 	ven_el3_svc_setup,
119 	ven_el3_svc_handler
120 );
121