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