diff options
-rw-r--r-- | docs/getting_started/porting-guide.rst | 13 | ||||
-rw-r--r-- | include/plat/common/platform.h | 5 | ||||
-rw-r--r-- | plat/common/plat_bl_common.c | 7 | ||||
-rw-r--r-- | services/arm_arch_svc/arm_arch_svc_setup.c | 3 |
4 files changed, 27 insertions, 1 deletions
diff --git a/docs/getting_started/porting-guide.rst b/docs/getting_started/porting-guide.rst index c98f3cc041..7aaeae2f4e 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 658b423801..2c1a180c83 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 d38fc6f75b..89b77ba6ce 100644 --- a/plat/common/plat_bl_common.c +++ b/plat/common/plat_bl_common.c @@ -11,6 +11,7 @@ #include <common/debug.h> #include <lib/xlat_tables/xlat_tables_compat.h> #include <plat/common/platform.h> +#include <services/arm_arch_svc.h> #include <smccc_helpers.h> #include <tools_share/firmware_encrypted.h> @@ -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 588656d57f..37bfc62e2b 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) |