File indexing completed on 2025-05-11 08:24:00
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <bsp.h>
0010 #include <bsp/fatal.h>
0011 #include <amba.h>
0012
0013 rtems_interrupt_lock GRLIB_IrqCtrl_Lock =
0014 RTEMS_INTERRUPT_LOCK_INITIALIZER("GRLIB IrqCtrl");
0015
0016
0017 volatile struct irqmp_regs *GRLIB_IrqCtrl_Regs;
0018 struct ambapp_dev *GRLIB_IrqCtrl_Adev;
0019
0020
0021 int GRLIB_IrqCtrl_EIrq = -1;
0022
0023
0024 static void grlib_ext_irq_init(void)
0025 {
0026 if ( (GRLIB_IrqCtrl_Regs->mpstat >> 16) & 0xf ) {
0027
0028 GRLIB_IrqCtrl_EIrq = (GRLIB_IrqCtrl_Regs->mpstat >> 16) & 0xf;
0029 }
0030 }
0031
0032
0033
0034
0035
0036
0037
0038
0039 void irqmp_initialize(void)
0040 {
0041 int icsel;
0042 struct ambapp_dev *adev;
0043
0044
0045 adev = (void *)ambapp_for_each(ambapp_plb(), (OPTIONS_ALL|OPTIONS_APB_SLVS),
0046 VENDOR_GAISLER, GAISLER_IRQMP,
0047 ambapp_find_by_idx, NULL);
0048 if (adev != NULL) {
0049
0050 GRLIB_IrqCtrl_Regs = (volatile struct irqmp_regs *)DEV_TO_APB(adev)->start;
0051 GRLIB_IrqCtrl_Adev = adev;
0052 if ((GRLIB_IrqCtrl_Regs->ampctrl >> 28) > 0) {
0053
0054
0055
0056
0057
0058 icsel = GRLIB_IrqCtrl_Regs->icsel[GRLIB_Cpu_Index/8];
0059 icsel = (icsel >> ((7 - (GRLIB_Cpu_Index & 0x7)) * 4)) & 0xf;
0060 GRLIB_IrqCtrl_Regs += icsel;
0061 }
0062 GRLIB_IrqCtrl_Regs->mask[GRLIB_Cpu_Index] = 0;
0063 GRLIB_IrqCtrl_Regs->force[GRLIB_Cpu_Index] = 0;
0064 GRLIB_IrqCtrl_Regs->iclear = 0xffffffff;
0065
0066
0067 grlib_ext_irq_init();
0068
0069 }
0070
0071 }
0072
0073
0074
0075
0076 unsigned int grlib_timer_prescaler __attribute__((weak)) = 0;
0077 int grlib_timer_core_index __attribute__((weak)) = 0;
0078
0079 volatile struct gptimer_regs *GRLIB_Timer_Regs;
0080 struct ambapp_dev *GRLIB_Timer_Adev;
0081
0082
0083
0084
0085
0086
0087 void gptimer_initialize(void)
0088 {
0089 struct ambapp_dev *adev;
0090
0091
0092 adev = (void *)ambapp_for_each(ambapp_plb(), (OPTIONS_ALL|OPTIONS_APB_SLVS),
0093 VENDOR_GAISLER, GAISLER_GPTIMER,
0094 ambapp_find_by_idx, &grlib_timer_core_index);
0095 if (adev) {
0096 GRLIB_Timer_Regs = (volatile struct gptimer_regs *)DEV_TO_APB(adev)->start;
0097 GRLIB_Timer_Adev = adev;
0098
0099
0100 ambapp_freq_init(
0101 ambapp_plb(),
0102 GRLIB_Timer_Adev,
0103 (GRLIB_Timer_Regs->scaler_reload + 1)
0104 * GRLIB_GPTIMER_0_FREQUENCY_SET_BY_BOOT_LOADER
0105 );
0106
0107
0108
0109
0110
0111 if (grlib_timer_prescaler)
0112 GRLIB_Timer_Regs->scaler_reload = grlib_timer_prescaler;
0113 }
0114
0115 }