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>
diff --git a/Makefile b/Makefile
index 21d65cf..b54787d 100644
--- a/Makefile
+++ b/Makefile
@@ -1164,6 +1164,7 @@
         FEATURE_DETECTION \
 	TRNG_SUPPORT \
 	ERRATA_ABI_SUPPORT \
+	ERRATA_NON_ARM_INTERCONNECT \
 	CONDITIONAL_CMO \
 )))
 
@@ -1297,6 +1298,7 @@
         CRYPTO_SUPPORT \
         TRNG_SUPPORT \
         ERRATA_ABI_SUPPORT \
+	ERRATA_NON_ARM_INTERCONNECT \
         USE_COHERENT_MEM \
         USE_DEBUGFS \
         ARM_IO_IN_DTB \
diff --git a/make_helpers/defaults.mk b/make_helpers/defaults.mk
index 0916d1d..26fd68d 100644
--- a/make_helpers/defaults.mk
+++ b/make_helpers/defaults.mk
@@ -294,6 +294,9 @@
 # Check to see if Errata ABI is supported
 ERRATA_ABI_SUPPORT		:= 0
 
+# Check to enable Errata ABI for platforms with non-arm interconnect
+ERRATA_NON_ARM_INTERCONNECT	:= 0
+
 # SMCCC PCI support
 SMC_PCI_SUPPORT			:= 0
 
diff --git a/services/std_svc/errata_abi/cpu_errata_info.h b/services/std_svc/errata_abi/cpu_errata_info.h
index 168bc95..ad05724 100644
--- a/services/std_svc/errata_abi/cpu_errata_info.h
+++ b/services/std_svc/errata_abi/cpu_errata_info.h
@@ -58,6 +58,8 @@
 	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 */
 	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{
diff --git a/services/std_svc/errata_abi/errata_abi_main.c b/services/std_svc/errata_abi/errata_abi_main.c
index 80fc39a..d473df6 100644
--- a/services/std_svc/errata_abi/errata_abi_main.c
+++ b/services/std_svc/errata_abi/errata_abi_main.c
@@ -384,27 +384,38 @@
  * Function to do binary search and check for the specific errata ID
  * in the array of structures specific to the cpu identified.
  */
-int32_t binary_search(struct em_cpu_list *ptr, uint32_t erratum_id,
-			uint8_t rxpx_val)
+int32_t binary_search(struct em_cpu_list *ptr, uint32_t erratum_id, uint8_t rxpx_val)
 {
 	int low_index = 0U, mid_index = 0U;
 
 	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) {
 		mid_index = (low_index + high_index) / 2;
-		if (erratum_id < ptr->cpu_errata_list[mid_index].em_errata_id) {
+
+		erratum_ptr = &ptr->cpu_errata_list[mid_index];
+		assert(erratum_ptr != NULL);
+
+		if (erratum_id < erratum_ptr->em_errata_id) {
 			high_index = mid_index - 1;
-		} else if (erratum_id > ptr->cpu_errata_list[mid_index].em_errata_id) {
+		} else if (erratum_id > erratum_ptr->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, \
-				ptr->cpu_errata_list[mid_index].em_rxpx_hi)) {
-					if (ptr->cpu_errata_list[mid_index].errata_enabled) {
-						return EM_HIGHER_EL_MITIGATION;
-					}
-					return EM_AFFECTED;
+		} 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;
 		}