Implement SMCCC_ARCH_SOC_ID SMC call

Implemented SMCCC_ARCH_SOC_ID call in order to get below
SOC information:

1. SOC revision
2. SOC version

Implementation done using below SMCCC specification document:
https://developer.arm.com/docs/den0028/c

Signed-off-by: Manish V Badarkhe <Manish.Badarkhe@arm.com>
Change-Id: Ie0595f1c345a6429a6fb4a7f05534a0ca9c9a48b
This commit is contained in:
Manish V Badarkhe 2020-02-22 08:43:00 +00:00
parent bb37363bd3
commit 0e753437e7
7 changed files with 101 additions and 5 deletions

View File

@ -1116,6 +1116,35 @@ can override the common implementation to define a different prefix string for
the log output. The implementation should be robust to future changes that the log output. The implementation should be robust to future changes that
increase the number of log levels. increase the number of log levels.
Function : plat_get_soc_version()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
::
Argument : void
Return : int32_t
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
Function : plat_get_soc_revision()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
::
Argument : void
Return : int32_t
This function returns soc revision in below format
::
soc_revision[0:30] = SOC revision of specific SOC
Modifications specific to a Boot Loader stage Modifications specific to a Boot Loader stage
--------------------------------------------- ---------------------------------------------

View File

@ -148,6 +148,12 @@ void arm_setup_romlib(void);
#define ARM_ROTPK_DEVEL_RSA_ID 2 #define ARM_ROTPK_DEVEL_RSA_ID 2
#define ARM_ROTPK_DEVEL_ECDSA_ID 3 #define ARM_ROTPK_DEVEL_ECDSA_ID 3
/* Defines used to retrieve ARM SOC revision */
#define ARM_SOC_CONTINUATION_CODE U(0x4)
#define ARM_SOC_IDENTIFICATION_CODE U(0x3B)
#define ARM_SOC_CONTINUATION_SHIFT U(24)
#define ARM_SOC_IDENTIFICATION_SHIFT U(16)
/* IO storage utility functions */ /* IO storage utility functions */
int arm_io_setup(void); int arm_io_setup(void);
@ -323,4 +329,7 @@ extern const unsigned int arm_pm_idle_states[];
void plat_arm_secure_wdt_start(void); void plat_arm_secure_wdt_start(void);
void plat_arm_secure_wdt_stop(void); void plat_arm_secure_wdt_stop(void);
/* Get SOC-ID of ARM platform */
uint32_t plat_arm_get_soc_id(void);
#endif /* PLAT_ARM_H */ #endif /* PLAT_ARM_H */

View File

@ -322,4 +322,14 @@ void plat_flush_next_bl_params(void);
*/ */
unsigned int platform_core_pos_helper(unsigned long mpidr); unsigned int platform_core_pos_helper(unsigned long mpidr);
/*
* Optional function to get SOC version
*/
int32_t plat_get_soc_version(void);
/*
* Optional function to get SOC revision
*/
int32_t plat_get_soc_revision(void);
#endif /* PLATFORM_H */ #endif /* PLATFORM_H */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
@ -9,7 +9,11 @@
#define SMCCC_VERSION U(0x80000000) #define SMCCC_VERSION U(0x80000000)
#define SMCCC_ARCH_FEATURES U(0x80000001) #define SMCCC_ARCH_FEATURES U(0x80000001)
#define SMCCC_ARCH_SOC_ID U(0x80000002)
#define SMCCC_ARCH_WORKAROUND_1 U(0x80008000) #define SMCCC_ARCH_WORKAROUND_1 U(0x80008000)
#define SMCCC_ARCH_WORKAROUND_2 U(0x80007FFF) #define SMCCC_ARCH_WORKAROUND_2 U(0x80007FFF)
#define SMCCC_GET_SOC_VERSION U(0)
#define SMCCC_GET_SOC_REVISION U(1)
#endif /* ARM_ARCH_SVC_H */ #endif /* ARM_ARCH_SVC_H */

View File

@ -25,6 +25,9 @@
* conflicts with the definition in plat/common. */ * conflicts with the definition in plat/common. */
#pragma weak plat_get_syscnt_freq2 #pragma weak plat_get_syscnt_freq2
/* Get ARM SOC-ID */
#pragma weak plat_arm_get_soc_id
/******************************************************************************* /*******************************************************************************
* Changes the memory attributes for the region of mapped memory where the BL * Changes the memory attributes for the region of mapped memory where the BL
* image's translation tables are located such that the tables will have * image's translation tables are located such that the tables will have
@ -231,3 +234,22 @@ int plat_sdei_validate_entry_point(uintptr_t ep, unsigned int client_mode)
return arm_validate_ns_entrypoint(pa); return arm_validate_ns_entrypoint(pa);
} }
#endif #endif
/*
* Weak function to get ARM platform SOC-ID, Always return SOC-ID=0
* ToDo: Get proper SOC-ID for every ARM platform and define this
* function separately for every ARM platform.
*/
uint32_t plat_arm_get_soc_id(void)
{
return 0U;
}
/* Get SOC version */
int32_t plat_get_soc_version(void)
{
return (int32_t)
((ARM_SOC_IDENTIFICATION_CODE << ARM_SOC_IDENTIFICATION_SHIFT)
| (ARM_SOC_CONTINUATION_CODE << ARM_SOC_CONTINUATION_SHIFT)
| plat_arm_get_soc_id());
}

View File

@ -11,6 +11,7 @@
#include <common/debug.h> #include <common/debug.h>
#include <lib/xlat_tables/xlat_tables_compat.h> #include <lib/xlat_tables/xlat_tables_compat.h>
#include <plat/common/platform.h> #include <plat/common/platform.h>
#include <smccc_helpers.h>
#include <tools_share/firmware_encrypted.h> #include <tools_share/firmware_encrypted.h>
/* /*
@ -24,6 +25,18 @@
#pragma weak bl2_plat_handle_post_image_load #pragma weak bl2_plat_handle_post_image_load
#pragma weak plat_try_next_boot_source #pragma weak plat_try_next_boot_source
#pragma weak plat_get_enc_key_info #pragma weak plat_get_enc_key_info
#pragma weak plat_get_soc_version
#pragma weak plat_get_soc_revision
int32_t plat_get_soc_version(void)
{
return SMC_ARCH_CALL_NOT_SUPPORTED;
}
int32_t plat_get_soc_revision(void)
{
return SMC_ARCH_CALL_NOT_SUPPORTED;
}
void bl2_el3_plat_prepare_exit(void) void bl2_el3_plat_prepare_exit(void)
{ {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
@ -12,18 +12,27 @@
#include <lib/smccc.h> #include <lib/smccc.h>
#include <services/arm_arch_svc.h> #include <services/arm_arch_svc.h>
#include <smccc_helpers.h> #include <smccc_helpers.h>
#include <plat/common/platform.h>
static int32_t smccc_version(void) static int32_t smccc_version(void)
{ {
return MAKE_SMCCC_VERSION(SMCCC_MAJOR_VERSION, SMCCC_MINOR_VERSION); return MAKE_SMCCC_VERSION(SMCCC_MAJOR_VERSION, SMCCC_MINOR_VERSION);
} }
static int32_t smccc_arch_features(u_register_t arg) static int32_t smccc_arch_features(u_register_t arg1, u_register_t arg2)
{ {
switch (arg) { switch (arg1) {
case SMCCC_VERSION: case SMCCC_VERSION:
case SMCCC_ARCH_FEATURES: case SMCCC_ARCH_FEATURES:
return SMC_OK; return SMC_OK;
case SMCCC_ARCH_SOC_ID:
if (arg2 == SMCCC_GET_SOC_REVISION) {
return plat_get_soc_revision();
}
if (arg2 == SMCCC_GET_SOC_VERSION) {
return plat_get_soc_version();
}
return SMC_ARCH_CALL_INVAL_PARAM;
#if WORKAROUND_CVE_2017_5715 #if WORKAROUND_CVE_2017_5715
case SMCCC_ARCH_WORKAROUND_1: case SMCCC_ARCH_WORKAROUND_1:
if (check_wa_cve_2017_5715() == ERRATA_NOT_APPLIES) if (check_wa_cve_2017_5715() == ERRATA_NOT_APPLIES)
@ -94,7 +103,7 @@ static uintptr_t arm_arch_svc_smc_handler(uint32_t smc_fid,
case SMCCC_VERSION: case SMCCC_VERSION:
SMC_RET1(handle, smccc_version()); SMC_RET1(handle, smccc_version());
case SMCCC_ARCH_FEATURES: case SMCCC_ARCH_FEATURES:
SMC_RET1(handle, smccc_arch_features(x1)); SMC_RET1(handle, smccc_arch_features(x1, x2));
#if WORKAROUND_CVE_2017_5715 #if WORKAROUND_CVE_2017_5715
case SMCCC_ARCH_WORKAROUND_1: case SMCCC_ARCH_WORKAROUND_1:
/* /*