diff --git a/docs/getting_started/porting-guide.rst b/docs/getting_started/porting-guide.rst index c98f3cc04..7aaeae2f4 100644 --- a/docs/getting_started/porting-guide.rst +++ b/docs/getting_started/porting-guide.rst @@ -1130,6 +1130,7 @@ This function returns soc version which mainly consist of below fields 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 @@ This function returns soc revision in below format 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 658b42380..2c1a180c8 100644 --- a/include/plat/common/platform.h +++ b/include/plat/common/platform.h @@ -341,4 +341,9 @@ int32_t plat_get_soc_version(void); */ 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 d38fc6f75..89b77ba6c 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 @@ int32_t plat_get_soc_revision(void) 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 588656d57..37bfc62e2 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 @@ static int32_t smccc_arch_features(u_register_t arg1) 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)