diff --git a/docs/getting_started/porting-guide.rst b/docs/getting_started/porting-guide.rst index c98f3cc..7aaeae2 100644 --- a/docs/getting_started/porting-guide.rst +++ b/docs/getting_started/porting-guide.rst @@ -1130,6 +1130,7 @@ soc_version[30:24] = JEP-106 continuation code for the SiP soc_version[23:16] = JEP-106 identification code with parity bit for the SiP + soc_version[15:0] = Implementation defined SoC ID Function : plat_get_soc_revision() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1145,6 +1146,18 @@ soc_revision[0:30] = SOC revision of specific SOC +Function : plat_is_smccc_feature_available() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + Argument : u_register_t + Return : int32_t + +This function returns SMC_ARCH_CALL_SUCCESS if the platform supports +the SMCCC function specified in the argument; otherwise returns +SMC_ARCH_CALL_NOT_SUPPORTED. + Modifications specific to a Boot Loader stage --------------------------------------------- diff --git a/include/plat/common/platform.h b/include/plat/common/platform.h index 658b423..2c1a180 100644 --- a/include/plat/common/platform.h +++ b/include/plat/common/platform.h @@ -341,4 +341,9 @@ */ int32_t plat_get_soc_revision(void); +/* + * Optional function to check for SMCCC function availability for platform + */ +int32_t plat_is_smccc_feature_available(u_register_t fid); + #endif /* PLATFORM_H */ diff --git a/plat/common/plat_bl_common.c b/plat/common/plat_bl_common.c index d38fc6f..89b77ba 100644 --- a/plat/common/plat_bl_common.c +++ b/plat/common/plat_bl_common.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,7 @@ #pragma weak bl2_plat_handle_post_image_load #pragma weak plat_try_next_boot_source #pragma weak plat_get_enc_key_info +#pragma weak plat_is_smccc_feature_available #pragma weak plat_get_soc_version #pragma weak plat_get_soc_revision @@ -38,6 +40,11 @@ return SMC_ARCH_CALL_NOT_SUPPORTED; } +int32_t plat_is_smccc_feature_available(u_register_t fid __unused) +{ + return SMC_ARCH_CALL_NOT_SUPPORTED; +} + void bl2_el3_plat_prepare_exit(void) { } diff --git a/services/arm_arch_svc/arm_arch_svc_setup.c b/services/arm_arch_svc/arm_arch_svc_setup.c index 588656d..37bfc62 100644 --- a/services/arm_arch_svc/arm_arch_svc_setup.c +++ b/services/arm_arch_svc/arm_arch_svc_setup.c @@ -24,8 +24,9 @@ switch (arg1) { case SMCCC_VERSION: case SMCCC_ARCH_FEATURES: + return SMC_ARCH_CALL_SUCCESS; case SMCCC_ARCH_SOC_ID: - return SMC_OK; + return plat_is_smccc_feature_available(arg1); #if WORKAROUND_CVE_2017_5715 case SMCCC_ARCH_WORKAROUND_1: if (check_wa_cve_2017_5715() == ERRATA_NOT_APPLIES)