/* * Copyright (c) 2026, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include #include #include #include #include static inline bool is_base_service_fid(uint32_t fid) { switch (fid) { case FIRME_SERVICE_VERSION_FID: case FIRME_SERVICE_FEATURES_FID: return true; default: return false; } } static inline bool is_granule_mgmt_service_fid(uint32_t fid) { switch (fid) { case FIRME_GM_GPI_SET_FID: case FIRME_GM_GPI_OP_CONTINUE: case FIRME_GM_L1_GPT_CREATE: case FIRME_GM_L1_GPT_DESTROY: return true; default: return false; } } static inline bool is_ide_key_mgmt_service_fid(uint32_t fid) { switch (fid) { case FIRME_IDE_KEYSET_PROG: case FIRME_IDE_KEYSET_GO: case FIRME_IDE_KEYSET_STOP: case FIRME_IDE_KEYSET_POLL: return true; default: return false; } } static inline bool is_mecid_service_fid(uint32_t fid) { if (fid == FIRME_MEC_REFRESH) { return true; } else { return false; } } static inline bool is_attestation_service_fid(uint32_t fid) { switch (fid) { case FIRME_ATTEST_PAT_GET: case FIRME_ATTEST_RAK_GET: case FIRME_ATTEST_RAT_SIGN: case FIRME_ATTEST_PAT_EXT_CLAIMS_STAGE: case FIRME_ATTEST_PAT_EXT_CLAIMS_CLEAR: case FIRME_ATTEST_PAT_EXT_CLAIMS_FINALISE: return true; default: return false; } } static inline bool is_integrated_device_mgmt_service_fid(uint32_t fid) { switch (fid) { case FIRME_IDEV_OP_START: case FIRME_IDEV_OP_CONTINUE: return true; default: return false; } } static inline firme_instance_e get_instance_from_flags(uint64_t flags) { switch (caller_sec_state(flags)) { case SMC_FROM_NON_SECURE: return FIRME_NONSECURE; case SMC_FROM_SECURE: return FIRME_SECURE; case SMC_FROM_REALM: return FIRME_REALM; } panic(); } uint64_t 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) { firme_instance_e instance = get_instance_from_flags(flags); /* Determine which FIRME service needs to handle this call */ if (is_base_service_fid(smc_fid)) { return firme_base_service_handler(instance, smc_fid, x1, x2, x3, x4, cookie, handle, flags); } else if (is_granule_mgmt_service_fid(smc_fid)) { return firme_granule_mgmt_service_handler(instance, smc_fid, x1, x2, x3, x4, cookie, handle, flags); } else if (is_ide_key_mgmt_service_fid(smc_fid)) { } else if (is_mecid_service_fid(smc_fid)) { } else if (is_attestation_service_fid(smc_fid)) { } else if (is_integrated_device_mgmt_service_fid(smc_fid)) { } ERROR("FIRME ABI 0x%X is not supported.\n", smc_fid); SMC_RET1(handle, FIRME_NOT_SUPPORTED); }