summaryrefslogtreecommitdiff
path: root/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_mtrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_mtrap.c')
-rw-r--r--FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_mtrap.c783
1 files changed, 783 insertions, 0 deletions
diff --git a/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_mtrap.c b/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_mtrap.c
new file mode 100644
index 000000000..2226d7bf0
--- /dev/null
+++ b/FreeRTOS/Demo/RISC-V_RV64_PolarFire_SoftConsole/polarfire_hal/platform/mpfs_hal/common/mss_mtrap.c
@@ -0,0 +1,783 @@
+/*******************************************************************************
+ * Copyright 2019-2021 Microchip FPGA Embedded Systems Solutions.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * MPFS HAL Embedded Software
+ *
+ */
+
+/***************************************************************************
+ *
+ * @file mss_mtrap.c
+ * @author Microchip-FPGA Embedded Systems Solutions
+ * @brief trap functions
+ *
+ */
+#include "mpfs_hal/mss_hal.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+void handle_local_interrupt(uint8_t interrupt_no);
+void handle_m_soft_interrupt(void);
+void handle_m_timer_interrupt(void);
+void illegal_insn_trap(uintptr_t * regs, uintptr_t mcause, uintptr_t mepc);
+void misaligned_store_trap(uintptr_t * regs, uintptr_t mcause, uintptr_t mepc);
+void misaligned_load_trap(uintptr_t * regs, uintptr_t mcause, uintptr_t mepc);
+void pmp_trap(uintptr_t * regs, uintptr_t mcause, uintptr_t mepc);
+void trap_from_machine_mode(uintptr_t * regs, uintptr_t dummy, uintptr_t mepc);
+void bad_trap(uintptr_t* regs, uintptr_t dummy, uintptr_t mepc);
+
+
+void bad_trap(uintptr_t* regs, uintptr_t dummy, uintptr_t mepc)
+{
+ (void)regs;
+ (void)dummy;
+ (void)mepc;
+ while(1)
+ {
+ }
+}
+
+void misaligned_store_trap(uintptr_t * regs, uintptr_t mcause, uintptr_t mepc)
+{
+ (void)regs;
+ (void)mcause;
+ (void)mepc;
+ while(1)
+ {
+ }
+}
+
+void misaligned_load_trap(uintptr_t * regs, uintptr_t mcause, uintptr_t mepc)
+{
+ (void)regs;
+ (void)mcause;
+ (void)mepc;
+ while(1)
+ {
+ }
+}
+
+void illegal_insn_trap(uintptr_t * regs, uintptr_t mcause, uintptr_t mepc)
+{
+ (void)regs;
+ (void)mcause;
+ (void)mepc;
+ while(1)
+ {
+ }
+}
+
+void pmp_trap(uintptr_t * regs, uintptr_t mcause, uintptr_t mepc)
+{
+ (void)regs;
+ (void)mcause;
+ (void)mepc;
+ while(1)
+ {
+ }
+}
+
+/*------------------------------------------------------------------------------
+ * RISC-V interrupt handler for external interrupts.
+ */
+#ifndef SIFIVE_HIFIVE_UNLEASHED
+uint8_t (*ext_irq_handler_table[PLIC_NUM_SOURCES])(void) =
+{
+ Invalid_IRQHandler,
+ l2_metadata_corr_IRQHandler,
+ l2_metadata_uncorr_IRQHandler,
+ l2_data_corr_IRQHandler,
+ l2_data_uncorr_IRQHandler,
+ dma_ch0_DONE_IRQHandler,
+ dma_ch0_ERR_IRQHandler,
+ dma_ch1_DONE_IRQHandler,
+ dma_ch1_ERR_IRQHandler,
+ dma_ch2_DONE_IRQHandler,
+ dma_ch2_ERR_IRQHandler,
+ dma_ch3_DONE_IRQHandler,
+ dma_ch3_ERR_IRQHandler,
+ gpio0_bit0_or_gpio2_bit13_plic_0_IRQHandler,
+ gpio0_bit1_or_gpio2_bit13_plic_1_IRQHandler,
+ gpio0_bit2_or_gpio2_bit13_plic_2_IRQHandler,
+ gpio0_bit3_or_gpio2_bit13_plic_3_IRQHandler,
+ gpio0_bit4_or_gpio2_bit13_plic_4_IRQHandler,
+ gpio0_bit5_or_gpio2_bit13_plic_5_IRQHandler,
+ gpio0_bit6_or_gpio2_bit13_plic_6_IRQHandler,
+ gpio0_bit7_or_gpio2_bit13_plic_7_IRQHandler,
+ gpio0_bit8_or_gpio2_bit13_plic_8_IRQHandler,
+ gpio0_bit9_or_gpio2_bit13_plic_9_IRQHandler,
+ gpio0_bit10_or_gpio2_bit13_plic_10_IRQHandler,
+ gpio0_bit11_or_gpio2_bit13_plic_11_IRQHandler,
+ gpio0_bit12_or_gpio2_bit13_plic_12_IRQHandler,
+
+ gpio0_bit13_or_gpio2_bit13_plic_13_IRQHandler,
+ gpio1_bit0_or_gpio2_bit14_plic_14_IRQHandler,
+ gpio1_bit1_or_gpio2_bit15_plic_15_IRQHandler,
+ gpio1_bit2_or_gpio2_bit16_plic_16_IRQHandler,
+ gpio1_bit3_or_gpio2_bit17_plic_17_IRQHandler,
+ gpio1_bit4_or_gpio2_bit18_plic_18_IRQHandler,
+ gpio1_bit5_or_gpio2_bit19_plic_19_IRQHandler,
+ gpio1_bit6_or_gpio2_bit20_plic_20_IRQHandler,
+ gpio1_bit7_or_gpio2_bit21_plic_21_IRQHandler,
+ gpio1_bit8_or_gpio2_bit22_plic_22_IRQHandler,
+ gpio1_bit9_or_gpio2_bit23_plic_23_IRQHandler,
+ gpio1_bit10_or_gpio2_bit24_plic_24_IRQHandler,
+ gpio1_bit11_or_gpio2_bit25_plic_25_IRQHandler,
+ gpio1_bit12_or_gpio2_bit26_plic_26_IRQHandler,
+ gpio1_bit13_or_gpio2_bit27_plic_27_IRQHandler,
+
+ gpio1_bit14_or_gpio2_bit28_plic_28_IRQHandler,
+ gpio1_bit15_or_gpio2_bit29_plic_29_IRQHandler,
+ gpio1_bit16_or_gpio2_bit30_plic_30_IRQHandler,
+ gpio1_bit17_or_gpio2_bit31_plic_31_IRQHandler,
+
+ gpio1_bit18_plic_32_IRQHandler,
+ gpio1_bit19_plic_33_IRQHandler,
+ gpio1_bit20_plic_34_IRQHandler,
+ gpio1_bit21_plic_35_IRQHandler,
+ gpio1_bit22_plic_36_IRQHandler,
+ gpio1_bit23_plic_37_IRQHandler,
+
+ gpio0_non_direct_plic_IRQHandler,
+ gpio1_non_direct_plic_IRQHandler,
+ gpio2_non_direct_plic_IRQHandler,
+
+ spi0_plic_IRQHandler,
+ spi1_plic_IRQHandler,
+ external_can0_plic_IRQHandler,
+ can1_IRQHandler,
+ External_i2c0_main_plic_IRQHandler,
+ External_i2c0_alert_plic_IRQHandler,
+ i2c0_sus_plic_IRQHandler,
+ i2c1_main_plic_IRQHandler,
+ i2c1_alert_plic_IRQHandler,
+ i2c1_sus_plic_IRQHandler,
+ mac0_int_plic_IRQHandler,
+ mac0_queue1_plic_IRQHandler,
+ mac0_queue2_plic_IRQHandler,
+ mac0_queue3_plic_IRQHandler,
+ mac0_emac_plic_IRQHandler,
+ mac0_mmsl_plic_IRQHandler,
+ mac1_int_plic_IRQHandler,
+ mac1_queue1_plic_IRQHandler,
+ mac1_queue2_plic_IRQHandler,
+ mac1_queue3_plic_IRQHandler,
+ mac1_emac_plic_IRQHandler,
+ mac1_mmsl_plic_IRQHandler,
+ ddrc_train_plic_IRQHandler,
+ scb_interrupt_plic_IRQHandler,
+ ecc_error_plic_IRQHandler,
+ ecc_correct_plic_IRQHandler,
+ rtc_wakeup_plic_IRQHandler,
+ rtc_match_plic_IRQHandler,
+ timer1_plic_IRQHandler,
+ timer2_plic_IRQHandler,
+ envm_plic_IRQHandler,
+ qspi_plic_IRQHandler,
+ usb_dma_plic_IRQHandler,
+ usb_mc_plic_IRQHandler,
+ mmc_main_plic_IRQHandler,
+ mmc_wakeup_plic_IRQHandler,
+ mmuart0_plic_77_IRQHandler,
+ mmuart1_plic_IRQHandler,
+ mmuart2_plic_IRQHandler,
+ mmuart3_plic_IRQHandler,
+ mmuart4_plic_IRQHandler,
+
+ g5c_devrst_plic_IRQHandler,
+ g5c_message_plic_IRQHandler,
+ usoc_vc_interrupt_plic_IRQHandler,
+ usoc_smb_interrupt_plic_IRQHandler,
+ e51_0_Maintence_plic_IRQHandler,
+
+ wdog0_mvrp_plic_IRQHandler,
+ wdog1_mvrp_plic_IRQHandler, /*100 contains multiple interrupts- */
+ wdog2_mvrp_plic_IRQHandler,
+ wdog3_mvrp_plic_IRQHandler,
+ wdog4_mvrp_plic_IRQHandler,
+ wdog0_tout_plic_IRQHandler,
+ wdog1_tout_plic_IRQHandler,
+ wdog2_tout_plic_IRQHandler,
+ wdog3_tout_plic_IRQHandler,
+ wdog4_tout_plic_IRQHandler,
+
+ g5c_mss_spi_plic_IRQHandler,
+ volt_temp_alarm_plic_IRQHandler,
+ athena_complete_plic_IRQHandler,
+ athena_alarm_plic_IRQHandler,
+ athena_bus_error_plic_IRQHandler,
+ usoc_axic_us_plic_IRQHandler,
+ usoc_axic_ds_plic_IRQHandler,
+
+ reserved_104_plic_IRQHandler,
+
+ fabric_f2h_0_plic_IRQHandler,
+ fabric_f2h_1_plic_IRQHandler,
+ fabric_f2h_2_plic_IRQHandler,
+ fabric_f2h_3_plic_IRQHandler,
+ fabric_f2h_4_plic_IRQHandler,
+ fabric_f2h_5_plic_IRQHandler,
+ fabric_f2h_6_plic_IRQHandler,
+ fabric_f2h_7_plic_IRQHandler,
+ fabric_f2h_8_plic_IRQHandler,
+ fabric_f2h_9_plic_IRQHandler,
+
+ fabric_f2h_10_plic_IRQHandler,
+ fabric_f2h_11_plic_IRQHandler,
+ fabric_f2h_12_plic_IRQHandler,
+ fabric_f2h_13_plic_IRQHandler,
+ fabric_f2h_14_plic_IRQHandler,
+ fabric_f2h_15_plic_IRQHandler,
+ fabric_f2h_16_plic_IRQHandler,
+ fabric_f2h_17_plic_IRQHandler,
+ fabric_f2h_18_plic_IRQHandler,
+ fabric_f2h_19_plic_IRQHandler,
+
+ fabric_f2h_20_plic_IRQHandler,
+ fabric_f2h_21_plic_IRQHandler,
+ fabric_f2h_22_plic_IRQHandler,
+ fabric_f2h_23_plic_IRQHandler,
+ fabric_f2h_24_plic_IRQHandler,
+ fabric_f2h_25_plic_IRQHandler,
+ fabric_f2h_26_plic_IRQHandler,
+ fabric_f2h_27_plic_IRQHandler,
+ fabric_f2h_28_plic_IRQHandler,
+ fabric_f2h_29_plic_IRQHandler,
+
+ fabric_f2h_30_plic_IRQHandler,
+ fabric_f2h_31_plic_IRQHandler,
+
+ fabric_f2h_32_plic_IRQHandler,
+ fabric_f2h_33_plic_IRQHandler,
+ fabric_f2h_34_plic_IRQHandler,
+ fabric_f2h_35_plic_IRQHandler,
+ fabric_f2h_36_plic_IRQHandler,
+ fabric_f2h_37_plic_IRQHandler,
+ fabric_f2h_38_plic_IRQHandler,
+ fabric_f2h_39_plic_IRQHandler,
+ fabric_f2h_40_plic_IRQHandler,
+ fabric_f2h_41_plic_IRQHandler,
+
+ fabric_f2h_42_plic_IRQHandler,
+ fabric_f2h_43_plic_IRQHandler,
+ fabric_f2h_44_plic_IRQHandler,
+ fabric_f2h_45_plic_IRQHandler,
+ fabric_f2h_46_plic_IRQHandler,
+ fabric_f2h_47_plic_IRQHandler,
+ fabric_f2h_48_plic_IRQHandler,
+ fabric_f2h_49_plic_IRQHandler,
+ fabric_f2h_50_plic_IRQHandler,
+ fabric_f2h_51_plic_IRQHandler,
+
+ fabric_f2h_52_plic_IRQHandler,
+ fabric_f2h_53_plic_IRQHandler,
+ fabric_f2h_54_plic_IRQHandler,
+ fabric_f2h_55_plic_IRQHandler,
+ fabric_f2h_56_plic_IRQHandler,
+ fabric_f2h_57_plic_IRQHandler,
+ fabric_f2h_58_plic_IRQHandler,
+ fabric_f2h_59_plic_IRQHandler,
+ fabric_f2h_60_plic_IRQHandler,
+ fabric_f2h_61_plic_IRQHandler,
+
+ fabric_f2h_62_plic_IRQHandler,
+ fabric_f2h_63_plic_IRQHandler,
+
+ bus_error_unit_hart_0_plic_IRQHandler,
+ bus_error_unit_hart_1_plic_IRQHandler,
+ bus_error_unit_hart_2_plic_IRQHandler,
+ bus_error_unit_hart_3_plic_IRQHandler,
+ bus_error_unit_hart_4_plic_IRQHandler
+};
+
+#define E51_LOCAL_NUM_SOURCES 48U
+
+
+void (*local_irq_handler_e51_table[E51_LOCAL_NUM_SOURCES])(void) =
+{
+ maintenance_e51_local_IRQHandler_0, /* reference multiple interrupts */
+ usoc_smb_interrupt_e51_local_IRQHandler_1,
+ usoc_vc_interrupt_e51_local_IRQHandler_2,
+ g5c_message_e51_local_IRQHandler_3,
+ g5c_devrst_e51_local_IRQHandler_4,
+ wdog4_tout_e51_local_IRQHandler_5,
+ wdog3_tout_e51_local_IRQHandler_6,
+ wdog2_tout_e51_local_IRQHandler_7,
+ wdog1_tout_e51_local_IRQHandler_8,
+ wdog0_tout_e51_local_IRQHandler_9,
+ wdog0_mvrp_e51_local_IRQHandler_10,
+ mmuart0_e51_local_IRQHandler_11,
+ envm_e51_local_IRQHandler_12,
+ ecc_correct_e51_local_IRQHandler_13,
+ ecc_error_e51_local_IRQHandler_14,
+ scb_interrupt_e51_local_IRQHandler_15,
+ fabric_f2h_32_e51_local_IRQHandler_16,
+ fabric_f2h_33_e51_local_IRQHandler_17,
+ fabric_f2h_34_e51_local_IRQHandler_18,
+ fabric_f2h_35_e51_local_IRQHandler_19,
+ fabric_f2h_36_e51_local_IRQHandler_20,
+ fabric_f2h_37_e51_local_IRQHandler_21,
+ fabric_f2h_38_e51_local_IRQHandler_22,
+ fabric_f2h_39_e51_local_IRQHandler_23,
+ fabric_f2h_40_e51_local_IRQHandler_24,
+ fabric_f2h_41_e51_local_IRQHandler_25,
+
+ fabric_f2h_42_e51_local_IRQHandler_26,
+ fabric_f2h_43_e51_local_IRQHandler_27,
+ fabric_f2h_44_e51_local_IRQHandler_28,
+ fabric_f2h_45_e51_local_IRQHandler_29,
+ fabric_f2h_46_e51_local_IRQHandler_30,
+ fabric_f2h_47_e51_local_IRQHandler_31,
+ fabric_f2h_48_e51_local_IRQHandler_32,
+ fabric_f2h_49_e51_local_IRQHandler_33,
+ fabric_f2h_50_e51_local_IRQHandler_34,
+ fabric_f2h_51_e51_local_IRQHandler_35,
+
+ fabric_f2h_52_e51_local_IRQHandler_36,
+ fabric_f2h_53_e51_local_IRQHandler_37,
+ fabric_f2h_54_e51_local_IRQHandler_38,
+ fabric_f2h_55_e51_local_IRQHandler_39,
+ fabric_f2h_56_e51_local_IRQHandler_40,
+ fabric_f2h_57_e51_local_IRQHandler_41,
+ fabric_f2h_58_e51_local_IRQHandler_42,
+ fabric_f2h_59_e51_local_IRQHandler_43,
+ fabric_f2h_60_e51_local_IRQHandler_44,
+ fabric_f2h_61_e51_local_IRQHandler_45,
+
+ fabric_f2h_62_e51_local_IRQHandler_46,
+ fabric_f2h_63_e51_local_IRQHandler_47
+};
+
+
+typedef void (*local_int_p_t)(void);
+
+/* U54 1 */
+local_int_p_t local_irq_handler_u54_1_table[E51_LOCAL_NUM_SOURCES] =
+{
+ /*reference multiple interrupts*/
+ spare_u54_local_IRQHandler_0,
+ spare_u54_local_IRQHandler_1,
+ spare_u54_local_IRQHandler_2,
+
+ /*parse hart ID to discover which mac is the source*/
+ mac_mmsl_u54_1_local_IRQHandler_3,
+ mac_emac_u54_1_local_IRQHandler_4,
+ mac_queue3_u54_1_local_IRQHandler_5,
+ mac_queue2_u54_1_local_IRQHandler_6,
+ mac_queue1_u54_1_local_IRQHandler_7,
+ mac_int_u54_1_local_IRQHandler_8,
+
+ /*parse hart ID to discover which wdog is the source*/
+ wdog_tout_u54_h1_local_IRQHandler_9,
+ mvrp_u54_local_IRQHandler_10,
+ mmuart_u54_h1_local_IRQHandler_11,
+
+ spare_u54_local_IRQHandler_12,
+ spare_u54_local_IRQHandler_13,
+ spare_u54_local_IRQHandler_14,
+ spare_u54_local_IRQHandler_15,
+
+ fabric_f2h_0_u54_local_IRQHandler_16,
+ fabric_f2h_1_u54_local_IRQHandler_17,
+ fabric_f2h_2_u54_local_IRQHandler_18,
+ fabric_f2h_3_u54_local_IRQHandler_19,
+ fabric_f2h_4_u54_local_IRQHandler_20,
+ fabric_f2h_5_u54_local_IRQHandler_21,
+ fabric_f2h_6_u54_local_IRQHandler_22,
+ fabric_f2h_7_u54_local_IRQHandler_23,
+ fabric_f2h_8_u54_local_IRQHandler_24,
+ fabric_f2h_9_u54_local_IRQHandler_25,
+
+ fabric_f2h_10_u54_local_IRQHandler_26,
+ fabric_f2h_11_u54_local_IRQHandler_27,
+ fabric_f2h_12_u54_local_IRQHandler_28,
+ fabric_f2h_13_u54_local_IRQHandler_29,
+ fabric_f2h_14_u54_local_IRQHandler_30,
+ fabric_f2h_15_u54_local_IRQHandler_31,
+ fabric_f2h_16_u54_local_IRQHandler_32,
+ fabric_f2h_17_u54_local_IRQHandler_33,
+ fabric_f2h_18_u54_local_IRQHandler_34,
+ fabric_f2h_19_u54_local_IRQHandler_35,
+
+ fabric_f2h_20_u54_local_IRQHandler_36,
+ fabric_f2h_21_u54_local_IRQHandler_37,
+ fabric_f2h_22_u54_local_IRQHandler_38,
+ fabric_f2h_23_u54_local_IRQHandler_39,
+ fabric_f2h_24_u54_local_IRQHandler_40,
+ fabric_f2h_25_u54_local_IRQHandler_41,
+ fabric_f2h_26_u54_local_IRQHandler_42,
+ fabric_f2h_27_u54_local_IRQHandler_43,
+ fabric_f2h_28_u54_local_IRQHandler_44,
+ fabric_f2h_29_u54_local_IRQHandler_45,
+
+ fabric_f2h_30_u54_local_IRQHandler_46,
+ fabric_f2h_31_u54_local_IRQHandler_47
+};
+
+/* U54 2 */
+local_int_p_t local_irq_handler_u54_2_table[E51_LOCAL_NUM_SOURCES] =
+{
+ /*reference multiple interrupts*/
+ spare_u54_local_IRQHandler_0,
+ spare_u54_local_IRQHandler_1,
+ spare_u54_local_IRQHandler_2,
+
+ /*parse hart ID to discover which mac is the source*/
+ mac_mmsl_u54_2_local_IRQHandler_3,
+ mac_emac_u54_2_local_IRQHandler_4,
+ mac_queue3_u54_2_local_IRQHandler_5,
+ mac_queue2_u54_2_local_IRQHandler_6,
+ mac_queue1_u54_2_local_IRQHandler_7,
+ mac_int_u54_2_local_IRQHandler_8,
+
+ /*parse hart ID to discover which wdog is the source*/
+ wdog_tout_u54_h2_local_IRQHandler_9,
+ mvrp_u54_local_IRQHandler_10,
+ mmuart_u54_h2_local_IRQHandler_11,
+
+ spare_u54_local_IRQHandler_12,
+ spare_u54_local_IRQHandler_13,
+ spare_u54_local_IRQHandler_14,
+ spare_u54_local_IRQHandler_15,
+
+ fabric_f2h_0_u54_local_IRQHandler_16,
+ fabric_f2h_1_u54_local_IRQHandler_17,
+ fabric_f2h_2_u54_local_IRQHandler_18,
+ fabric_f2h_3_u54_local_IRQHandler_19,
+ fabric_f2h_4_u54_local_IRQHandler_20,
+ fabric_f2h_5_u54_local_IRQHandler_21,
+ fabric_f2h_6_u54_local_IRQHandler_22,
+ fabric_f2h_7_u54_local_IRQHandler_23,
+ fabric_f2h_8_u54_local_IRQHandler_24,
+ fabric_f2h_9_u54_local_IRQHandler_25,
+
+ fabric_f2h_10_u54_local_IRQHandler_26,
+ fabric_f2h_11_u54_local_IRQHandler_27,
+ fabric_f2h_12_u54_local_IRQHandler_28,
+ fabric_f2h_13_u54_local_IRQHandler_29,
+ fabric_f2h_14_u54_local_IRQHandler_30,
+ fabric_f2h_15_u54_local_IRQHandler_31,
+ fabric_f2h_16_u54_local_IRQHandler_32,
+ fabric_f2h_17_u54_local_IRQHandler_33,
+ fabric_f2h_18_u54_local_IRQHandler_34,
+ fabric_f2h_19_u54_local_IRQHandler_35,
+
+ fabric_f2h_20_u54_local_IRQHandler_36,
+ fabric_f2h_21_u54_local_IRQHandler_37,
+ fabric_f2h_22_u54_local_IRQHandler_38,
+ fabric_f2h_23_u54_local_IRQHandler_39,
+ fabric_f2h_24_u54_local_IRQHandler_40,
+ fabric_f2h_25_u54_local_IRQHandler_41,
+ fabric_f2h_26_u54_local_IRQHandler_42,
+ fabric_f2h_27_u54_local_IRQHandler_43,
+ fabric_f2h_28_u54_local_IRQHandler_44,
+ fabric_f2h_29_u54_local_IRQHandler_45,
+
+ fabric_f2h_30_u54_local_IRQHandler_46,
+ fabric_f2h_31_u54_local_IRQHandler_47
+};
+
+/* U54 3 */
+local_int_p_t local_irq_handler_u54_3_table[E51_LOCAL_NUM_SOURCES] =
+{
+ /*reference multiple interrupts*/
+ spare_u54_local_IRQHandler_0,
+ spare_u54_local_IRQHandler_1,
+ spare_u54_local_IRQHandler_2,
+
+ /*parse hart ID to discover which mac is the source*/
+ mac_mmsl_u54_3_local_IRQHandler_3,
+ mac_emac_u54_3_local_IRQHandler_4,
+ mac_queue3_u54_3_local_IRQHandler_5,
+ mac_queue2_u54_3_local_IRQHandler_6,
+ mac_queue1_u54_3_local_IRQHandler_7,
+ mac_int_u54_3_local_IRQHandler_8,
+
+ /*parse hart ID to discover which wdog is the source*/
+ wdog_tout_u54_h3_local_IRQHandler_9,
+ mvrp_u54_local_IRQHandler_10,
+ mmuart_u54_h3_local_IRQHandler_11,
+
+ spare_u54_local_IRQHandler_12,
+ spare_u54_local_IRQHandler_13,
+ spare_u54_local_IRQHandler_14,
+ spare_u54_local_IRQHandler_15,
+
+ fabric_f2h_0_u54_local_IRQHandler_16,
+ fabric_f2h_1_u54_local_IRQHandler_17,
+ fabric_f2h_2_u54_local_IRQHandler_18,
+ fabric_f2h_3_u54_local_IRQHandler_19,
+ fabric_f2h_4_u54_local_IRQHandler_20,
+ fabric_f2h_5_u54_local_IRQHandler_21,
+ fabric_f2h_6_u54_local_IRQHandler_22,
+ fabric_f2h_7_u54_local_IRQHandler_23,
+ fabric_f2h_8_u54_local_IRQHandler_24,
+ fabric_f2h_9_u54_local_IRQHandler_25,
+
+ fabric_f2h_10_u54_local_IRQHandler_26,
+ fabric_f2h_11_u54_local_IRQHandler_27,
+ fabric_f2h_12_u54_local_IRQHandler_28,
+ fabric_f2h_13_u54_local_IRQHandler_29,
+ fabric_f2h_14_u54_local_IRQHandler_30,
+ fabric_f2h_15_u54_local_IRQHandler_31,
+ fabric_f2h_16_u54_local_IRQHandler_32,
+ fabric_f2h_17_u54_local_IRQHandler_33,
+ fabric_f2h_18_u54_local_IRQHandler_34,
+ fabric_f2h_19_u54_local_IRQHandler_35,
+
+ fabric_f2h_20_u54_local_IRQHandler_36,
+ fabric_f2h_21_u54_local_IRQHandler_37,
+ fabric_f2h_22_u54_local_IRQHandler_38,
+ fabric_f2h_23_u54_local_IRQHandler_39,
+ fabric_f2h_24_u54_local_IRQHandler_40,
+ fabric_f2h_25_u54_local_IRQHandler_41,
+ fabric_f2h_26_u54_local_IRQHandler_42,
+ fabric_f2h_27_u54_local_IRQHandler_43,
+ fabric_f2h_28_u54_local_IRQHandler_44,
+ fabric_f2h_29_u54_local_IRQHandler_45,
+
+ fabric_f2h_30_u54_local_IRQHandler_46,
+ fabric_f2h_31_u54_local_IRQHandler_47
+};
+
+/* U54 4 */
+local_int_p_t local_irq_handler_u54_4_table[E51_LOCAL_NUM_SOURCES] =
+{
+ /*reference multiple interrupts*/
+ spare_u54_local_IRQHandler_0,
+ spare_u54_local_IRQHandler_1,
+ spare_u54_local_IRQHandler_2,
+
+ /*parse hart ID to discover which mac is the source*/
+ mac_mmsl_u54_4_local_IRQHandler_3,
+ mac_emac_u54_4_local_IRQHandler_4,
+ mac_queue3_u54_4_local_IRQHandler_5,
+ mac_queue2_u54_4_local_IRQHandler_6,
+ mac_queue1_u54_4_local_IRQHandler_7,
+ mac_int_u54_4_local_IRQHandler_8,
+
+ /*parse hart ID to discover which wdog is the source*/
+ wdog_tout_u54_h4_local_IRQHandler_9,
+ mvrp_u54_local_IRQHandler_10,
+ mmuart_u54_h4_local_IRQHandler_11,
+
+ spare_u54_local_IRQHandler_12,
+ spare_u54_local_IRQHandler_13,
+ spare_u54_local_IRQHandler_14,
+ spare_u54_local_IRQHandler_15,
+
+ fabric_f2h_0_u54_local_IRQHandler_16,
+ fabric_f2h_1_u54_local_IRQHandler_17,
+ fabric_f2h_2_u54_local_IRQHandler_18,
+ fabric_f2h_3_u54_local_IRQHandler_19,
+ fabric_f2h_4_u54_local_IRQHandler_20,
+ fabric_f2h_5_u54_local_IRQHandler_21,
+ fabric_f2h_6_u54_local_IRQHandler_22,
+ fabric_f2h_7_u54_local_IRQHandler_23,
+ fabric_f2h_8_u54_local_IRQHandler_24,
+ fabric_f2h_9_u54_local_IRQHandler_25,
+
+ fabric_f2h_10_u54_local_IRQHandler_26,
+ fabric_f2h_11_u54_local_IRQHandler_27,
+ fabric_f2h_12_u54_local_IRQHandler_28,
+ fabric_f2h_13_u54_local_IRQHandler_29,
+ fabric_f2h_14_u54_local_IRQHandler_30,
+ fabric_f2h_15_u54_local_IRQHandler_31,
+ fabric_f2h_16_u54_local_IRQHandler_32,
+ fabric_f2h_17_u54_local_IRQHandler_33,
+ fabric_f2h_18_u54_local_IRQHandler_34,
+ fabric_f2h_19_u54_local_IRQHandler_35,
+
+ fabric_f2h_20_u54_local_IRQHandler_36,
+ fabric_f2h_21_u54_local_IRQHandler_37,
+ fabric_f2h_22_u54_local_IRQHandler_38,
+ fabric_f2h_23_u54_local_IRQHandler_39,
+ fabric_f2h_24_u54_local_IRQHandler_40,
+ fabric_f2h_25_u54_local_IRQHandler_41,
+ fabric_f2h_26_u54_local_IRQHandler_42,
+ fabric_f2h_27_u54_local_IRQHandler_43,
+ fabric_f2h_28_u54_local_IRQHandler_44,
+ fabric_f2h_29_u54_local_IRQHandler_45,
+
+ fabric_f2h_30_u54_local_IRQHandler_46,
+ fabric_f2h_31_u54_local_IRQHandler_47
+};
+
+local_int_p_t *local_int_mux[5] =
+{
+ local_irq_handler_e51_table,
+ local_irq_handler_u54_1_table,
+ local_irq_handler_u54_2_table,
+ local_irq_handler_u54_3_table,
+ local_irq_handler_u54_4_table
+};
+
+#else
+uint8_t (*ext_irq_handler_table[PLIC_NUM_SOURCES])(void) =
+{
+ Invalid_IRQHandler,
+ External_1_IRQHandler,
+ External_2_IRQHandler,
+ External_3_IRQHandler,
+ USART0_plic_4_IRQHandler,
+ External_5_IRQHandler,
+ External_6_IRQHandler,
+ External_7_IRQHandler,
+ External_8_IRQHandler,
+ External_9_IRQHandler,
+ External_10_IRQHandler,
+ External_11_IRQHandler,
+ External_12_IRQHandler,
+ External_13_IRQHandler,
+ External_14_IRQHandler,
+ External_15_IRQHandler,
+ External_16_IRQHandler,
+ External_17_IRQHandler,
+ External_18_IRQHandler,
+ External_19_IRQHandler,
+ External_20_IRQHandler,
+ External_21_IRQHandler,
+ External_22_IRQHandler,
+ dma_ch0_DONE_IRQHandler,
+ dma_ch0_ERR_IRQHandler,
+ dma_ch1_DONE_IRQHandler,
+ dma_ch1_ERR_IRQHandler,
+ dma_ch2_DONE_IRQHandler,
+ dma_ch2_ERR_IRQHandler,
+ dma_ch3_DONE_IRQHandler,
+ dma_ch3_ERR_IRQHandler,
+ External_31_IRQHandler,
+ External_32_IRQHandler,
+ External_33_IRQHandler,
+ External_34_IRQHandler,
+ External_35_IRQHandler,
+ External_36_IRQHandler,
+ External_37_IRQHandler,
+ External_38_IRQHandler,
+ External_39_IRQHandler,
+ External_40_IRQHandler,
+ External_41_IRQHandler,
+ External_42_IRQHandler,
+ External_43_IRQHandler,
+ External_44_IRQHandler,
+ External_45_IRQHandler,
+ External_46_IRQHandler,
+ External_47_IRQHandler,
+ External_48_IRQHandler,
+ External_49_IRQHandler,
+ External_50_IRQHandler,
+ External_51_IRQHandler,
+ External_52_IRQHandler,
+ MAC0_plic_53_IRQHandler
+
+};
+#endif
+/*------------------------------------------------------------------------------
+ *
+ */
+void handle_m_ext_interrupt(void)
+{
+
+ volatile uint32_t int_num = PLIC_ClaimIRQ();
+
+ if (INVALID_IRQn == int_num)
+ {
+ return;
+ }
+
+ uint8_t disable = EXT_IRQ_KEEP_ENABLED;
+#ifndef SIFIVE_HIFIVE_UNLEASHED
+ disable = ext_irq_handler_table[int_num /* + OFFSET_TO_MSS_GLOBAL_INTS Think this was required in early bitfile */]();
+#else
+ disable = ext_irq_handler_table[int_num]();
+#endif
+
+ PLIC_CompleteIRQ(int_num);
+
+ if(EXT_IRQ_DISABLE == disable)
+ {
+ PLIC_DisableIRQ((PLIC_IRQn_Type)int_num);
+ }
+
+}
+
+
+/*------------------------------------------------------------------------------
+ *
+ */
+void handle_local_interrupt(uint8_t interrupt_no)
+{
+#ifndef SIFIVE_HIFIVE_UNLEASHED /* no local interrupts on unleashed */
+ uint64_t mhart_id = read_csr(mhartid);
+ uint8_t local_interrupt_no = (uint8_t)(interrupt_no - 16U);
+ local_int_p_t *local_int_table = local_int_mux[mhart_id];
+
+ (*local_int_table[local_interrupt_no])();
+
+#endif
+}
+
+/*------------------------------------------------------------------------------
+ *
+ */
+void trap_from_machine_mode(uintptr_t * regs, uintptr_t dummy, uintptr_t mepc)
+{
+ volatile uintptr_t mcause = read_csr(mcause);
+
+ if (((mcause & MCAUSE_INT) == MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) > 15U)&& ((mcause & MCAUSE_CAUSE) < 64U))
+ {
+ handle_local_interrupt((uint8_t)(mcause & MCAUSE_CAUSE));
+ }
+ else if (((mcause & MCAUSE_INT) == MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT))
+ {
+ handle_m_ext_interrupt();
+ }
+ else if (((mcause & MCAUSE_INT) == MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_SOFT))
+ {
+ handle_m_soft_interrupt();
+ }
+ else if (((mcause & MCAUSE_INT) == MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER))
+ {
+ handle_m_timer_interrupt();
+ }
+ else
+ {
+ uint32_t i = 0U;
+ while(1)
+ {
+ /* wait for watchdog */
+ i++; /* added some code as SC debugger hangs if in loop doing nothing */
+ if(i == 0x1000U)
+ {
+ i = mcause; /* so mcause is not optimised out */
+ }
+ }
+ switch(mcause)
+ {
+
+ case CAUSE_LOAD_PAGE_FAULT:
+ break;
+ case CAUSE_STORE_PAGE_FAULT:
+ break;
+ case CAUSE_FETCH_ACCESS:
+ break;
+ case CAUSE_LOAD_ACCESS:
+ break;
+ case CAUSE_STORE_ACCESS:
+ break;
+ default:
+ bad_trap(regs, dummy, mepc);
+ break;
+ }
+ }
+}
+
+#ifdef __cplusplus
+}
+#endif