mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 10:04:26 +00:00
refactor(errata_abi): factor in non-arm interconnect
Workaround to help enable the kernel to query errata status using the errata abi feature for platforms with a non-arm interconnect. Change-Id: I47b03eaee5a0a763056ae71883fa30dfacb9b3f7 Signed-off-by: Sona Mathew <SonaRebecca.Mathew@arm.com>
This commit is contained in:
parent
ffea3844c0
commit
ef63f5be6d
4 changed files with 31 additions and 13 deletions
2
Makefile
2
Makefile
|
@ -1164,6 +1164,7 @@ $(eval $(call assert_booleans,\
|
||||||
FEATURE_DETECTION \
|
FEATURE_DETECTION \
|
||||||
TRNG_SUPPORT \
|
TRNG_SUPPORT \
|
||||||
ERRATA_ABI_SUPPORT \
|
ERRATA_ABI_SUPPORT \
|
||||||
|
ERRATA_NON_ARM_INTERCONNECT \
|
||||||
CONDITIONAL_CMO \
|
CONDITIONAL_CMO \
|
||||||
)))
|
)))
|
||||||
|
|
||||||
|
@ -1297,6 +1298,7 @@ $(eval $(call add_defines,\
|
||||||
CRYPTO_SUPPORT \
|
CRYPTO_SUPPORT \
|
||||||
TRNG_SUPPORT \
|
TRNG_SUPPORT \
|
||||||
ERRATA_ABI_SUPPORT \
|
ERRATA_ABI_SUPPORT \
|
||||||
|
ERRATA_NON_ARM_INTERCONNECT \
|
||||||
USE_COHERENT_MEM \
|
USE_COHERENT_MEM \
|
||||||
USE_DEBUGFS \
|
USE_DEBUGFS \
|
||||||
ARM_IO_IN_DTB \
|
ARM_IO_IN_DTB \
|
||||||
|
|
|
@ -294,6 +294,9 @@ TRNG_SUPPORT := 0
|
||||||
# Check to see if Errata ABI is supported
|
# Check to see if Errata ABI is supported
|
||||||
ERRATA_ABI_SUPPORT := 0
|
ERRATA_ABI_SUPPORT := 0
|
||||||
|
|
||||||
|
# Check to enable Errata ABI for platforms with non-arm interconnect
|
||||||
|
ERRATA_NON_ARM_INTERCONNECT := 0
|
||||||
|
|
||||||
# SMCCC PCI support
|
# SMCCC PCI support
|
||||||
SMC_PCI_SUPPORT := 0
|
SMC_PCI_SUPPORT := 0
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,8 @@ struct em_cpu{
|
||||||
unsigned char em_rxpx_lo; /* lowest revision of errata applicable for the cpu */
|
unsigned char em_rxpx_lo; /* lowest revision of errata applicable for the cpu */
|
||||||
unsigned char em_rxpx_hi; /* highest revision of errata applicable for the cpu */
|
unsigned char em_rxpx_hi; /* highest revision of errata applicable for the cpu */
|
||||||
bool errata_enabled; /* indicate if errata enabled */
|
bool errata_enabled; /* indicate if errata enabled */
|
||||||
|
/* flag to indicate if errata query is based out of non-arm interconnect */
|
||||||
|
bool non_arm_interconnect;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct em_cpu_list{
|
struct em_cpu_list{
|
||||||
|
|
|
@ -384,27 +384,38 @@ struct em_cpu_list cpu_list[] = {
|
||||||
* Function to do binary search and check for the specific errata ID
|
* Function to do binary search and check for the specific errata ID
|
||||||
* in the array of structures specific to the cpu identified.
|
* in the array of structures specific to the cpu identified.
|
||||||
*/
|
*/
|
||||||
int32_t binary_search(struct em_cpu_list *ptr, uint32_t erratum_id,
|
int32_t binary_search(struct em_cpu_list *ptr, uint32_t erratum_id, uint8_t rxpx_val)
|
||||||
uint8_t rxpx_val)
|
|
||||||
{
|
{
|
||||||
int low_index = 0U, mid_index = 0U;
|
int low_index = 0U, mid_index = 0U;
|
||||||
|
|
||||||
int high_index = MAX_ERRATA_ENTRIES - 1;
|
int high_index = MAX_ERRATA_ENTRIES - 1;
|
||||||
|
|
||||||
|
assert(ptr != NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pointer to the errata list of the cpu that matches
|
||||||
|
* extracted partnumber in the cpu list
|
||||||
|
*/
|
||||||
|
struct em_cpu *erratum_ptr = NULL;
|
||||||
|
|
||||||
while (low_index <= high_index) {
|
while (low_index <= high_index) {
|
||||||
mid_index = (low_index + high_index) / 2;
|
mid_index = (low_index + high_index) / 2;
|
||||||
if (erratum_id < ptr->cpu_errata_list[mid_index].em_errata_id) {
|
|
||||||
high_index = mid_index - 1;
|
|
||||||
} else if (erratum_id > ptr->cpu_errata_list[mid_index].em_errata_id) {
|
|
||||||
low_index = mid_index + 1;
|
|
||||||
} else if (erratum_id == ptr->cpu_errata_list[mid_index].em_errata_id) {
|
|
||||||
|
|
||||||
if (RXPX_RANGE(rxpx_val, ptr->cpu_errata_list[mid_index].em_rxpx_lo, \
|
erratum_ptr = &ptr->cpu_errata_list[mid_index];
|
||||||
ptr->cpu_errata_list[mid_index].em_rxpx_hi)) {
|
assert(erratum_ptr != NULL);
|
||||||
if (ptr->cpu_errata_list[mid_index].errata_enabled) {
|
|
||||||
return EM_HIGHER_EL_MITIGATION;
|
if (erratum_id < erratum_ptr->em_errata_id) {
|
||||||
}
|
high_index = mid_index - 1;
|
||||||
return EM_AFFECTED;
|
} else if (erratum_id > erratum_ptr->em_errata_id) {
|
||||||
|
low_index = mid_index + 1;
|
||||||
|
} else if (erratum_id == erratum_ptr->em_errata_id) {
|
||||||
|
if (RXPX_RANGE(rxpx_val, erratum_ptr->em_rxpx_lo, \
|
||||||
|
erratum_ptr->em_rxpx_hi)) {
|
||||||
|
if ((erratum_ptr->errata_enabled) && \
|
||||||
|
(!(erratum_ptr->non_arm_interconnect))) {
|
||||||
|
return EM_HIGHER_EL_MITIGATION;
|
||||||
|
}
|
||||||
|
return EM_AFFECTED;
|
||||||
}
|
}
|
||||||
return EM_NOT_AFFECTED;
|
return EM_NOT_AFFECTED;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue