arch: arm: Adding fault description for the cortex A7

Add support for processing the Fault Status Registers and recoverable
data abort for the cortex A7.

Based on Cortex-A7 MPCore Technical Reference Manual (ARM DDI 0406).
(see https://developer.arm.com/documentation/ddi0406)

Signed-off-by: Julien Racki <julien.racki@st.com>
diff --git a/arch/arm/core/cortex_a_r/fault.c b/arch/arm/core/cortex_a_r/fault.c
index daf1d23..eac07cb 100644
--- a/arch/arm/core/cortex_a_r/fault.c
+++ b/arch/arm/core/cortex_a_r/fault.c
@@ -100,6 +100,59 @@
 		reason = K_ERR_ARM_UNSUPPORTED_EXCLUSIVE_ACCESS_FAULT;
 		LOG_ERR("Unsupported Exclusive Access Fault @ 0x%08x", addr);
 		break;
+#elif defined(CONFIG_ARMV7_A)
+	case FSR_FS_PERMISSION_FAULT_2ND_LEVEL:
+		reason = K_ERR_ARM_PERMISSION_FAULT_2ND_LEVEL;
+		LOG_ERR("2nd Level Permission Fault @ 0x%08x", addr);
+		break;
+	case FSR_FS_ACCESS_FLAG_FAULT_1ST_LEVEL:
+		reason = K_ERR_ARM_ACCESS_FLAG_FAULT_1ST_LEVEL;
+		LOG_ERR("1st Level Access Flag Fault @ 0x%08x", addr);
+		break;
+	case FSR_FS_ACCESS_FLAG_FAULT_2ND_LEVEL:
+		reason = K_ERR_ARM_ACCESS_FLAG_FAULT_2ND_LEVEL;
+		LOG_ERR("2nd Level Access Flag Fault @ 0x%08x", addr);
+		break;
+	case FSR_FS_CACHE_MAINTENANCE_INSTRUCTION_FAULT:
+		reason = K_ERR_ARM_CACHE_MAINTENANCE_INSTRUCTION_FAULT;
+		LOG_ERR("Cache Maintenance Instruction Fault @ 0x%08x", addr);
+		break;
+	case FSR_FS_TRANSLATION_FAULT:
+		reason = K_ERR_ARM_TRANSLATION_FAULT;
+		LOG_ERR("1st Level Translation Fault @ 0x%08x", addr);
+		break;
+	case FSR_FS_TRANSLATION_FAULT_2ND_LEVEL:
+		reason = K_ERR_ARM_TRANSLATION_FAULT_2ND_LEVEL;
+		LOG_ERR("2nd Level Translation Fault @ 0x%08x", addr);
+		break;
+	case FSR_FS_DOMAIN_FAULT_1ST_LEVEL:
+		reason = K_ERR_ARM_DOMAIN_FAULT_1ST_LEVEL;
+		LOG_ERR("1st Level Domain Fault @ 0x%08x", addr);
+		break;
+	case FSR_FS_DOMAIN_FAULT_2ND_LEVEL:
+		reason = K_ERR_ARM_DOMAIN_FAULT_2ND_LEVEL;
+		LOG_ERR("2nd Level Domain Fault @ 0x%08x", addr);
+		break;
+	case FSR_FS_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_1ST_LEVEL:
+		reason = K_ERR_ARM_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_1ST_LEVEL;
+		LOG_ERR("1st Level Synchronous External Abort Translation Table @ 0x%08x", addr);
+		break;
+	case FSR_FS_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_2ND_LEVEL:
+		reason = K_ERR_ARM_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_2ND_LEVEL;
+		LOG_ERR("2nd Level Synchronous External Abort Translation Table @ 0x%08x", addr);
+		break;
+	case FSR_FS_TLB_CONFLICT_FAULT:
+		reason = K_ERR_ARM_TLB_CONFLICT_FAULT;
+		LOG_ERR("Table Conflict Fault @ 0x%08x", addr);
+		break;
+	case FSR_FS_SYNC_PARITY_ERROR_TRANSLATION_TABLE_1ST_LEVEL:
+		reason = K_ERR_ARM_SYNC_PARITY_ERROR_TRANSLATION_TABLE_1ST_LEVEL;
+		LOG_ERR("1st Level Synchronous Parity Error Translation Table @ 0x%08x", addr);
+		break;
+	case FSR_FS_SYNC_PARITY_ERROR_TRANSLATION_TABLE_2ND_LEVEL:
+		reason = K_ERR_ARM_SYNC_PARITY_ERROR_TRANSLATION_TABLE_2ND_LEVEL;
+		LOG_ERR("2nd Level Synchronous Parity Error Translation Table @ 0x%08x", addr);
+		break;
 #else
 	case FSR_FS_BACKGROUND_FAULT:
 		reason = K_ERR_ARM_BACKGROUND_FAULT;
diff --git a/include/zephyr/arch/arm/arch.h b/include/zephyr/arch/arm/arch.h
index aa80426..1a33196 100644
--- a/include/zephyr/arch/arm/arch.h
+++ b/include/zephyr/arch/arm/arch.h
@@ -99,13 +99,25 @@
 	K_ERR_ARM_ALIGNMENT_FAULT,
 	K_ERR_ARM_BACKGROUND_FAULT,
 	K_ERR_ARM_PERMISSION_FAULT,
+	K_ERR_ARM_PERMISSION_FAULT_2ND_LEVEL,
 	K_ERR_ARM_SYNC_EXTERNAL_ABORT,
 	K_ERR_ARM_ASYNC_EXTERNAL_ABORT,
 	K_ERR_ARM_SYNC_PARITY_ERROR,
 	K_ERR_ARM_ASYNC_PARITY_ERROR,
 	K_ERR_ARM_DEBUG_EVENT,
 	K_ERR_ARM_TRANSLATION_FAULT,
-	K_ERR_ARM_UNSUPPORTED_EXCLUSIVE_ACCESS_FAULT
+	K_ERR_ARM_TRANSLATION_FAULT_2ND_LEVEL,
+	K_ERR_ARM_UNSUPPORTED_EXCLUSIVE_ACCESS_FAULT,
+	K_ERR_ARM_ACCESS_FLAG_FAULT_1ST_LEVEL,
+	K_ERR_ARM_ACCESS_FLAG_FAULT_2ND_LEVEL,
+	K_ERR_ARM_CACHE_MAINTENANCE_INSTRUCTION_FAULT,
+	K_ERR_ARM_DOMAIN_FAULT_1ST_LEVEL,
+	K_ERR_ARM_DOMAIN_FAULT_2ND_LEVEL,
+	K_ERR_ARM_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_1ST_LEVEL,
+	K_ERR_ARM_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_2ND_LEVEL,
+	K_ERR_ARM_TLB_CONFLICT_FAULT,
+	K_ERR_ARM_SYNC_PARITY_ERROR_TRANSLATION_TABLE_1ST_LEVEL,
+	K_ERR_ARM_SYNC_PARITY_ERROR_TRANSLATION_TABLE_2ND_LEVEL,
 };
 
 #endif /* _ASMLANGUAGE */
diff --git a/modules/cmsis/cmsis_core_a_r_ext.h b/modules/cmsis/cmsis_core_a_r_ext.h
index 0752b14..e1ddce4 100644
--- a/modules/cmsis/cmsis_core_a_r_ext.h
+++ b/modules/cmsis/cmsis_core_a_r_ext.h
@@ -29,6 +29,33 @@
 #define FSR_FS_ALIGNMENT_FAULT				(33)
 #define FSR_FS_DEBUG_EVENT				(34)
 #define FSR_FS_UNSUPPORTED_EXCLUSIVE_ACCESS_FAULT	(53)
+#elif defined(CONFIG_ARMV7_A)
+
+/**
+ * N.B.: these FSR encodings are only valid when the
+ * Short-descriptor translation table format is used
+ */
+
+#define FSR_FS_ALIGNMENT_FAULT					(1)
+#define FSR_FS_DEBUG_EVENT					(2)
+#define FSR_FS_ACCESS_FLAG_FAULT_1ST_LEVEL			(3)
+#define FSR_FS_CACHE_MAINTENANCE_INSTRUCTION_FAULT		(4)
+#define FSR_FS_TRANSLATION_FAULT				(5)
+#define FSR_FS_ACCESS_FLAG_FAULT_2ND_LEVEL			(6)
+#define FSR_FS_TRANSLATION_FAULT_2ND_LEVEL			(7)
+#define FSR_FS_SYNC_EXTERNAL_ABORT				(8)
+#define FSR_FS_DOMAIN_FAULT_1ST_LEVEL				(9)
+#define FSR_FS_DOMAIN_FAULT_2ND_LEVEL				(11)
+#define FSR_FS_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_1ST_LEVEL	(12)
+#define FSR_FS_PERMISSION_FAULT					(13)
+#define FSR_FS_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_2ND_LEVEL	(14)
+#define FSR_FS_PERMISSION_FAULT_2ND_LEVEL			(15)
+#define FSR_FS_TLB_CONFLICT_FAULT				(16)
+#define FSR_FS_ASYNC_EXTERNAL_ABORT				(22)
+#define FSR_FS_ASYNC_PARITY_ERROR				(24)
+#define FSR_FS_SYNC_PARITY_ERROR				(25)
+#define FSR_FS_SYNC_PARITY_ERROR_TRANSLATION_TABLE_1ST_LEVEL	(28)
+#define FSR_FS_SYNC_PARITY_ERROR_TRANSLATION_TABLE_2ND_LEVEL	(30)
 #else
 #define FSR_FS_BACKGROUND_FAULT		(0)
 #define FSR_FS_ALIGNMENT_FAULT		(1)