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:
Sona Mathew 2023-03-14 14:02:03 -05:00
parent ffea3844c0
commit ef63f5be6d
4 changed files with 31 additions and 13 deletions

View file

@ -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 \

View file

@ -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

View file

@ -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{

View file

@ -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;
} }