1 | #include <bsp.h> |
---|
2 | |
---|
3 | #define PCI_Interrupt_Ack (*(volatile unsigned32 *) 0xFEFF0030) |
---|
4 | #define PIC1_OCW2 (*(volatile char *)IO_TO_LOCAL(0x0020)) |
---|
5 | #define PIC2_OCW2 (*(volatile char *)IO_TO_LOCAL(0x00A0)) |
---|
6 | #define NonspecificEOI 0x20 |
---|
7 | |
---|
8 | #define Master_PIC_Mask (*(unsigned8 *) IO_TO_LOCAL(0x0021)) |
---|
9 | #define Slave_PIC_Mask (*(unsigned8 *) IO_TO_LOCAL(0x00A1)) |
---|
10 | |
---|
11 | rtems_isr_entry isa_handlers[16] = {0, 0, 0, 0, 0, 0, 0, 0, |
---|
12 | 0, 0, 0, 0, 0, 0, 0, 0}; |
---|
13 | |
---|
14 | rtems_status_code isa_interrupt_enable(rtems_vector_number vector) { |
---|
15 | if (vector < 0 || vector > 15 || vector == 2) { |
---|
16 | return RTEMS_INVALID_NUMBER; |
---|
17 | } |
---|
18 | if (vector < 8) { |
---|
19 | Master_PIC_Mask &= ~ (1 << vector); |
---|
20 | } else { |
---|
21 | Slave_PIC_Mask &= ~ (1 << (vector - 8)); |
---|
22 | } |
---|
23 | return RTEMS_SUCCESSFUL; |
---|
24 | } |
---|
25 | |
---|
26 | rtems_status_code isa_interrupt_disable(rtems_vector_number vector) { |
---|
27 | if (vector < 0 || vector > 15 || vector == 2) { |
---|
28 | return RTEMS_INVALID_NUMBER; |
---|
29 | } |
---|
30 | if (vector < 8) { |
---|
31 | Master_PIC_Mask |= (1 << vector); |
---|
32 | } else { |
---|
33 | Slave_PIC_Mask |= (1 << (vector - 8)); |
---|
34 | } |
---|
35 | return RTEMS_SUCCESSFUL; |
---|
36 | } |
---|
37 | |
---|
38 | rtems_status_code isa_interrupt_catch(rtems_isr_entry new_isr_handler, |
---|
39 | rtems_vector_number vector, |
---|
40 | rtems_isr_entry *old_isr_handler) { |
---|
41 | if (vector < 0 || vector > 15 || vector == 2) { |
---|
42 | return RTEMS_INVALID_NUMBER; |
---|
43 | } |
---|
44 | if (!old_isr_handler || ((int)new_isr_handler & 3) != 0) { |
---|
45 | return RTEMS_INVALID_ADDRESS; |
---|
46 | } |
---|
47 | *old_isr_handler = isa_handlers[vector]; |
---|
48 | isa_handlers[vector] = new_isr_handler; |
---|
49 | return RTEMS_SUCCESSFUL; |
---|
50 | } |
---|
51 | |
---|
52 | rtems_isr isa_interrupt_handler(rtems_vector_number vector) { |
---|
53 | unsigned32 piack_image = PCI_Interrupt_Ack; |
---|
54 | int pic_id = piack_image >> 27; |
---|
55 | rtems_vector_number isa_vector = (piack_image >> 24) & 7; |
---|
56 | |
---|
57 | if (pic_id == 0x10) { |
---|
58 | isa_vector += 8; |
---|
59 | } else if (pic_id != 0x01) { |
---|
60 | printk("unrecognized PIACK value: %08x\n", piack_image); |
---|
61 | return; |
---|
62 | } |
---|
63 | if (isa_handlers[isa_vector] != 0) { |
---|
64 | isa_handlers[isa_vector](isa_vector); |
---|
65 | } |
---|
66 | PIC1_OCW2 = NonspecificEOI; |
---|
67 | if (isa_vector >= 8) { |
---|
68 | PIC2_OCW2 = NonspecificEOI; |
---|
69 | } |
---|
70 | } |
---|