xref: /rk3399_ARM-atf/services/std_svc/firme/firme_main.c (revision 430f246e58d146949d399d72294f56403672bee0)
1 /*
2  * Copyright (c) 2026, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <stdint.h>
8 
9 #include <arch.h>
10 #include <arch_features.h>
11 #include <common/debug.h>
12 #include <lib/gpt_rme/gpt_rme.h>
13 #include <lib/smccc.h>
14 #include <services/firme_svc.h>
15 #include <smccc_helpers.h>
16 
is_base_service_fid(uint32_t fid)17 static inline bool is_base_service_fid(uint32_t fid)
18 {
19 	switch (fid) {
20 	case FIRME_SERVICE_VERSION_FID:
21 	case FIRME_SERVICE_FEATURES_FID:
22 		return true;
23 	default:
24 		return false;
25 	}
26 }
27 
is_granule_mgmt_service_fid(uint32_t fid)28 static inline bool is_granule_mgmt_service_fid(uint32_t fid)
29 {
30 	switch (fid) {
31 	case FIRME_GM_GPI_SET_FID:
32 	case FIRME_GM_GPI_OP_CONTINUE:
33 	case FIRME_GM_L1_GPT_CREATE:
34 	case FIRME_GM_L1_GPT_DESTROY:
35 		return true;
36 	default:
37 		return false;
38 	}
39 }
40 
is_ide_key_mgmt_service_fid(uint32_t fid)41 static inline bool is_ide_key_mgmt_service_fid(uint32_t fid)
42 {
43 	switch (fid) {
44 	case FIRME_IDE_KEYSET_PROG:
45 	case FIRME_IDE_KEYSET_GO:
46 	case FIRME_IDE_KEYSET_STOP:
47 	case FIRME_IDE_KEYSET_POLL:
48 		return true;
49 	default:
50 		return false;
51 	}
52 }
53 
is_mecid_service_fid(uint32_t fid)54 static inline bool is_mecid_service_fid(uint32_t fid)
55 {
56 	if (fid == FIRME_MEC_REFRESH) {
57 		return true;
58 	} else {
59 		return false;
60 	}
61 }
62 
is_attestation_service_fid(uint32_t fid)63 static inline bool is_attestation_service_fid(uint32_t fid)
64 {
65 	switch (fid) {
66 	case FIRME_ATTEST_PAT_GET:
67 	case FIRME_ATTEST_RAK_GET:
68 	case FIRME_ATTEST_RAT_SIGN:
69 	case FIRME_ATTEST_PAT_EXT_CLAIMS_STAGE:
70 	case FIRME_ATTEST_PAT_EXT_CLAIMS_CLEAR:
71 	case FIRME_ATTEST_PAT_EXT_CLAIMS_FINALISE:
72 		return true;
73 	default:
74 		return false;
75 	}
76 }
77 
is_integrated_device_mgmt_service_fid(uint32_t fid)78 static inline bool is_integrated_device_mgmt_service_fid(uint32_t fid)
79 {
80 	switch (fid) {
81 	case FIRME_IDEV_OP_START:
82 	case FIRME_IDEV_OP_CONTINUE:
83 		return true;
84 	default:
85 		return false;
86 	}
87 }
88 
get_instance_from_flags(uint64_t flags)89 static inline firme_instance_e get_instance_from_flags(uint64_t flags)
90 {
91 	switch (caller_sec_state(flags)) {
92 	case SMC_FROM_NON_SECURE:
93 		return FIRME_NONSECURE;
94 	case SMC_FROM_SECURE:
95 		return FIRME_SECURE;
96 	case SMC_FROM_REALM:
97 		return FIRME_REALM;
98 	}
99 	panic();
100 }
101 
firme_handler(uint32_t smc_fid,uint64_t x1,uint64_t x2,uint64_t x3,uint64_t x4,void * cookie,void * handle,uint64_t flags)102 uint64_t firme_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3,
103 		       uint64_t x4, void *cookie, void *handle, uint64_t flags)
104 {
105 	firme_instance_e instance = get_instance_from_flags(flags);
106 
107 	/* Determine which FIRME service needs to handle this call */
108 	if (is_base_service_fid(smc_fid)) {
109 		return firme_base_service_handler(instance, smc_fid, x1, x2, x3,
110 						  x4, cookie, handle, flags);
111 	}
112 
113 	else if (is_granule_mgmt_service_fid(smc_fid)) {
114 		return firme_granule_mgmt_service_handler(instance, smc_fid, x1,
115 							  x2, x3, x4, cookie,
116 							  handle, flags);
117 	}
118 
119 	else if (is_ide_key_mgmt_service_fid(smc_fid)) {
120 	}
121 
122 	else if (is_mecid_service_fid(smc_fid)) {
123 	}
124 
125 	else if (is_attestation_service_fid(smc_fid)) {
126 	}
127 
128 	else if (is_integrated_device_mgmt_service_fid(smc_fid)) {
129 	}
130 
131 	ERROR("FIRME ABI 0x%X is not supported.\n", smc_fid);
132 	SMC_RET1(handle, FIRME_NOT_SUPPORTED);
133 }
134