Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


imported SEABIOS source tree
[palacios.git] / bios / seabios / src / pic.h
1 // Helpers for working with i8259 interrupt controller.
2 //
3 // Copyright (C) 2008  Kevin O'Connor <kevin@koconnor.net>
4 // Copyright (C) 2002  MandrakeSoft S.A.
5 //
6 // This file may be distributed under the terms of the GNU LGPLv3 license.
7 #ifndef __PIC_H
8 #define __PIC_H
9
10 #include "ioport.h" // PORT_PIC*
11 #include "biosvar.h" // SET_IVT
12
13 // PORT_PIC1 bitdefs
14 #define PIC1_IRQ0  (1<<0)
15 #define PIC1_IRQ1  (1<<1)
16 #define PIC1_IRQ2  (1<<2)
17 #define PIC1_IRQ5  (1<<5)
18 #define PIC1_IRQ6  (1<<6)
19 // PORT_PIC2 bitdefs
20 #define PIC2_IRQ8  (1<<0)
21 #define PIC2_IRQ12 (1<<4)
22 #define PIC2_IRQ13 (1<<5)
23 #define PIC2_IRQ14 (1<<6)
24
25 static inline void
26 eoi_pic1(void)
27 {
28     // Send eoi (select OCW2 + eoi)
29     outb(0x20, PORT_PIC1_CMD);
30 }
31
32 static inline void
33 eoi_pic2(void)
34 {
35     // Send eoi (select OCW2 + eoi)
36     outb(0x20, PORT_PIC2_CMD);
37     eoi_pic1();
38 }
39
40 static inline void
41 unmask_pic1(u8 irq)
42 {
43     outb(inb(PORT_PIC1_DATA) & ~irq, PORT_PIC1_DATA);
44 }
45
46 static inline void
47 unmask_pic2(u8 irq)
48 {
49     outb(inb(PORT_PIC2_DATA) & ~irq, PORT_PIC2_DATA);
50 }
51
52 static inline void
53 mask_pic1(u8 irq)
54 {
55     outb(inb(PORT_PIC1_DATA) | irq, PORT_PIC1_DATA);
56 }
57
58 static inline void
59 mask_pic2(u8 irq)
60 {
61     outb(inb(PORT_PIC2_DATA) | irq, PORT_PIC2_DATA);
62 }
63
64 static inline u8
65 get_pic1_isr(void)
66 {
67     // 0x0b == select OCW1 + read ISR
68     outb(0x0b, PORT_PIC1_CMD);
69     return inb(PORT_PIC1_CMD);
70 }
71
72 static inline u8
73 get_pic2_isr(void)
74 {
75     // 0x0b == select OCW1 + read ISR
76     outb(0x0b, PORT_PIC2_CMD);
77     return inb(PORT_PIC2_CMD);
78 }
79
80 static inline void
81 enable_hwirq(int hwirq, struct segoff_s func)
82 {
83     int vector;
84     if (hwirq < 8) {
85         unmask_pic1(1 << hwirq);
86         vector = 0x08 + hwirq;
87     } else {
88         unmask_pic2(1 << (hwirq - 8));
89         vector = 0x70 + hwirq - 8;
90     }
91     SET_IVT(vector, func);
92 }
93
94 void set_pics(u8 irq0, u8 irq8);
95 void pic_setup(void);
96
97 #endif // pic.h