File indexing completed on 2025-05-11 08:23:59
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #include <rtems.h>
0022 #include <mpc5xx.h>
0023 #include <libcpu/vectors.h>
0024 #include <libcpu/raw_exception.h>
0025 #include <bsp/irq.h>
0026
0027 extern rtems_exception_handler_t dispatch_irq_handler;
0028
0029 volatile unsigned int ppc_cached_irq_mask;
0030
0031
0032
0033
0034 static void nop_hdl(rtems_irq_hdl_param ignored)
0035 {
0036 }
0037
0038 static void nop_irq_enable(const struct __rtems_irq_connect_data__*ignored)
0039 {
0040 }
0041
0042 static void nop_raw_enable(
0043 const struct __rtems_raw_except_connect_data__*ignored
0044 )
0045 {
0046 }
0047
0048 static int irq_is_connected(const struct __rtems_irq_connect_data__*ignored)
0049 {
0050 return 0;
0051 }
0052
0053 static int raw_is_connected(const struct __rtems_raw_except_connect_data__*ignored)
0054 {
0055 return 0;
0056 }
0057
0058 static rtems_irq_connect_data rtemsIrq[CPU_IRQ_COUNT];
0059 static rtems_irq_global_settings initial_config;
0060 static rtems_irq_connect_data defaultIrq = {
0061 0,
0062 nop_hdl,
0063 NULL,
0064 nop_irq_enable,
0065 nop_irq_enable,
0066 irq_is_connected
0067 };
0068
0069 static rtems_irq_prio irqPrioTable[CPU_IRQ_COUNT]={
0070
0071
0072
0073
0074
0075
0076
0077
0078 7,7, 6,6, 5,5, 4,4, 3,3, 2,2, 1,1, 0,0,
0079
0080
0081
0082
0083
0084
0085 0, 0, 0, 0, 0, 0, 0, 0,
0086 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0087
0088
0089
0090 0
0091 };
0092
0093 static void CPU_USIU_irq_init(void)
0094 {
0095
0096
0097
0098
0099
0100
0101 ppc_cached_irq_mask = 0;
0102 usiu.simask = ppc_cached_irq_mask;
0103 usiu.sipend = 0xffff0000;
0104 usiu.siel = usiu.siel;
0105 }
0106
0107
0108
0109
0110 static void CPU_UIMB_irq_init(void)
0111 {
0112 }
0113
0114 void CPU_rtems_irq_mng_init(unsigned cpuId)
0115 {
0116 rtems_raw_except_connect_data vectorDesc;
0117 int i;
0118
0119 CPU_USIU_irq_init();
0120 CPU_UIMB_irq_init();
0121
0122
0123
0124
0125
0126
0127 for (i = 0; i < CPU_IRQ_COUNT; i++) {
0128 rtemsIrq[i] = defaultIrq;
0129 rtemsIrq[i].name = i;
0130 }
0131
0132
0133
0134 initial_config.irqNb = CPU_IRQ_COUNT;
0135 initial_config.defaultEntry = defaultIrq;
0136 initial_config.irqHdlTbl = rtemsIrq;
0137 initial_config.irqBase = CPU_ASM_IRQ_VECTOR_BASE;
0138 initial_config.irqPrioTbl = irqPrioTable;
0139
0140 if (!CPU_rtems_irq_mngt_set(&initial_config)) {
0141
0142
0143
0144 rtems_panic("Unable to initialize RTEMS interrupt Management\n");
0145 }
0146
0147
0148
0149
0150
0151 vectorDesc.exceptIndex = ASM_DEC_VECTOR;
0152 vectorDesc.hdl.vector = ASM_DEC_VECTOR;
0153 vectorDesc.hdl.raw_hdl = dispatch_irq_handler;
0154 vectorDesc.on = nop_raw_enable;
0155 vectorDesc.off = nop_raw_enable;
0156 vectorDesc.isOn = raw_is_connected;
0157 if (!mpc5xx_set_exception (&vectorDesc)) {
0158 rtems_panic("Unable to initialize RTEMS decrementer raw exception\n");
0159 }
0160 vectorDesc.exceptIndex = ASM_EXT_VECTOR;
0161 vectorDesc.hdl.vector = ASM_EXT_VECTOR;
0162 if (!mpc5xx_set_exception (&vectorDesc)) {
0163 rtems_panic("Unable to initialize RTEMS external raw exception\n");
0164 }
0165 }