More set up for using ioapics
[akaros.git] / kern / arch / x86 / io.h
1 /* 
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9
10 enum {
11         VectorNMI       = 2,            /* non-maskable interrupt */
12         VectorBPT       = 3,            /* breakpoint */
13         VectorUD        = 6,            /* invalid opcode exception */
14         VectorCNA       = 7,            /* coprocessor not available */
15         Vector2F        = 8,            /* double fault */
16         VectorCSO       = 9,            /* coprocessor segment overrun */
17         VectorPF        = 14,           /* page fault */
18         Vector15        = 15,           /* reserved */
19         VectorCERR      = 16,           /* coprocessor error */
20
21         VectorPIC       = 32,           /* external i8259 interrupts */
22         IrqCLOCK        = 0,
23         IrqKBD          = 1,
24         IrqUART1        = 3,
25         IrqUART0        = 4,
26         IrqPCMCIA       = 5,
27         IrqFLOPPY       = 6,
28         IrqLPT          = 7,
29         IrqIRQ7         = 7,
30         IrqAUX          = 12,           /* PS/2 port */
31         IrqIRQ13        = 13,           /* coprocessor on 386 */
32         IrqATA0         = 14,
33         IrqATA1         = 15,
34         MaxIrqPIC       = 15,
35
36         VectorLAPIC     = VectorPIC+16, /* local APIC interrupts */
37         IrqLINT0        = VectorLAPIC+0,
38         IrqLINT1        = VectorLAPIC+1,
39         IrqTIMER        = VectorLAPIC+2,
40         IrqERROR        = VectorLAPIC+3,
41         IrqPCINT        = VectorLAPIC+4,
42         IrqSPURIOUS     = VectorLAPIC+15,
43         MaxIrqLAPIC     = VectorLAPIC+15,
44
45         VectorSYSCALL   = 64,
46
47         VectorAPIC      = 65,           /* external APIC interrupts */
48         MaxVectorAPIC   = 255,
49 };
50
51 enum {
52         IdtPIC          = 32,                   /* external i8259 interrupts */
53
54         IdtLINT0        = 48,                   /* local APIC interrupts */
55         IdtLINT1        = 49,
56         IdtTIMER        = 50,
57         IdtERROR        = 51,
58         IdtPCINT        = 52,
59
60         IdtIPI          = 62,
61         IdtSPURIOUS     = 63,
62
63         IdtSYSCALL      = 64,
64
65         IdtIOAPIC       = 65,                   /* external APIC interrupts */
66
67         IdtMAX          = 255,
68 };
69
70 struct Vkey {
71         int     tbdf;                   /* pci: ioapic or msi sources */
72         int     irq;                    /* 8259-emulating sources */
73 };
74
75 typedef struct Vctl {
76         struct Vctl*    next;                   /* handlers on this vector */
77
78         int     isintr;                 /* interrupt or fault/trap */
79
80         struct Vkey;                            /* source-specific key; tbdf for pci */
81         void    (*f)(void*, void*);     /* handler to call */
82         void*   a;                      /* argument to call it with */
83         char    name[KNAMELEN];         /* of driver */
84         char    *type;
85
86         int     (*isr)(int);            /* get isr bit for this irq */
87         int     (*eoi)(int);            /* eoi */
88         int     (*mask)(struct Vkey*, int);     /* interrupt enable returns masked vector */
89         int     vno;
90 } Vctl;
91
92 struct ACVctl {
93         //char* (*f)(Ureg*,void*);
94         void*   a;
95         int     vno;
96         char    name[KNAMELEN];         /* of driver */
97 };
98
99 enum {
100         BusCBUS         = 0,            /* Corollary CBUS */
101         BusCBUSII,                      /* Corollary CBUS II */
102         BusEISA,                        /* Extended ISA */
103         BusFUTURE,                      /* IEEE Futurebus */
104         BusINTERN,                      /* Internal bus */
105         BusISA,                         /* Industry Standard Architecture */
106         BusMBI,                         /* Multibus I */
107         BusMBII,                        /* Multibus II */
108         BusMCA,                         /* Micro Channel Architecture */
109         BusMPI,                         /* MPI */
110         BusMPSA,                        /* MPSA */
111         BusNUBUS,                       /* Apple Macintosh NuBus */
112         BusPCI,                         /* Peripheral Component Interconnect */
113         BusPCMCIA,                      /* PC Memory Card International Association */
114         BusTC,                          /* DEC TurboChannel */
115         BusVL,                          /* VESA Local bus */
116         BusVME,                         /* VMEbus */
117         BusXPRESS,                      /* Express System Bus */
118 };
119
120 #define MKBUS(t,b,d,f)  (((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
121 #define BUSFNO(tbdf)    (((tbdf)>>8)&0x07)
122 #define BUSDNO(tbdf)    (((tbdf)>>11)&0x1F)
123 #define BUSBNO(tbdf)    (((tbdf)>>16)&0xFF)
124 #define BUSTYPE(tbdf)   ((tbdf)>>24)
125 #define BUSBDF(tbdf)    ((tbdf)&0x00FFFF00)
126 #define BUSUNKNOWN      (-1)
127
128 enum {
129         MaxEISA         = 16,
130         CfgEISA         = 0xC80,
131 };
132
133 /*
134  * PCI support code.
135  */
136 enum {                                  /* type 0 and type 1 pre-defined header */
137         PciVID          = 0x00,         /* vendor ID */
138         PciDID          = 0x02,         /* device ID */
139         PciPCR          = 0x04,         /* command */
140         PciPSR          = 0x06,         /* status */
141         PciRID          = 0x08,         /* revision ID */
142         PciCCRp         = 0x09,         /* programming interface class code */
143         PciCCRu         = 0x0A,         /* sub-class code */
144         PciCCRb         = 0x0B,         /* base class code */
145         PciCLS          = 0x0C,         /* cache line size */
146         PciLTR          = 0x0D,         /* latency timer */
147         PciHDT          = 0x0E,         /* header type */
148         PciBST          = 0x0F,         /* BIST */
149
150         PciBAR0         = 0x10,         /* base address */
151         PciBAR1         = 0x14,
152
153         PciCP           = 0x34,         /* capabilities pointer */
154
155         PciINTL         = 0x3C,         /* interrupt line */
156         PciINTP         = 0x3D,         /* interrupt pin */
157 };
158
159 /* ccrb (base class code) values; controller types */
160 enum {
161         Pcibcpci1       = 0,            /* pci 1.0; no class codes defined */
162         Pcibcstore      = 1,            /* mass storage */
163         Pcibcnet        = 2,            /* network */
164         Pcibcdisp       = 3,            /* display */
165         Pcibcmmedia     = 4,            /* multimedia */
166         Pcibcmem        = 5,            /* memory */
167         Pcibcbridge     = 6,            /* bridge */
168         Pcibccomm       = 7,            /* simple comms (e.g., serial) */
169         Pcibcbasesys    = 8,            /* base system */
170         Pcibcinput      = 9,            /* input */
171         Pcibcdock       = 0xa,          /* docking stations */
172         Pcibcproc       = 0xb,          /* processors */
173         Pcibcserial     = 0xc,          /* serial bus (e.g., USB) */
174         Pcibcwireless   = 0xd,          /* wireless */
175         Pcibcintell     = 0xe,          /* intelligent i/o */
176         Pcibcsatcom     = 0xf,          /* satellite comms */
177         Pcibccrypto     = 0x10,         /* encryption/decryption */
178         Pcibcdacq       = 0x11,         /* data acquisition & signal proc. */
179 };
180
181 /* ccru (sub-class code) values; common cases only */
182 enum {
183         /* mass storage */
184         Pciscscsi       = 0,            /* SCSI */
185         Pciscide        = 1,            /* IDE (ATA) */
186         Pciscsata       = 6,            /* SATA */
187
188         /* network */
189         Pciscether      = 0,            /* Ethernet */
190
191         /* display */
192         Pciscvga        = 0,            /* VGA */
193         Pciscxga        = 1,            /* XGA */
194         Pcisc3d         = 2,            /* 3D */
195
196         /* bridges */
197         Pcischostpci    = 0,            /* host/pci */
198         Pciscpcicpci    = 1,            /* pci/pci */
199
200         /* simple comms */
201         Pciscserial     = 0,            /* 16450, etc. */
202         Pciscmultiser   = 1,            /* multiport serial */
203
204         /* serial bus */
205         Pciscusb        = 3,            /* USB */
206 };
207
208 enum {                                  /* type 0 pre-defined header */
209         PciCIS          = 0x28,         /* cardbus CIS pointer */
210         PciSVID         = 0x2C,         /* subsystem vendor ID */
211         PciSID          = 0x2E,         /* cardbus CIS pointer */
212         PciEBAR0        = 0x30,         /* expansion ROM base address */
213         PciMGNT         = 0x3E,         /* burst period length */
214         PciMLT          = 0x3F,         /* maximum latency between bursts */
215 };
216
217 enum {                                  /* type 1 pre-defined header */
218         PciPBN          = 0x18,         /* primary bus number */
219         PciSBN          = 0x19,         /* secondary bus number */
220         PciUBN          = 0x1A,         /* subordinate bus number */
221         PciSLTR         = 0x1B,         /* secondary latency timer */
222         PciIBR          = 0x1C,         /* I/O base */
223         PciILR          = 0x1D,         /* I/O limit */
224         PciSPSR         = 0x1E,         /* secondary status */
225         PciMBR          = 0x20,         /* memory base */
226         PciMLR          = 0x22,         /* memory limit */
227         PciPMBR         = 0x24,         /* prefetchable memory base */
228         PciPMLR         = 0x26,         /* prefetchable memory limit */
229         PciPUBR         = 0x28,         /* prefetchable base upper 32 bits */
230         PciPULR         = 0x2C,         /* prefetchable limit upper 32 bits */
231         PciIUBR         = 0x30,         /* I/O base upper 16 bits */
232         PciIULR         = 0x32,         /* I/O limit upper 16 bits */
233         PciEBAR1        = 0x28,         /* expansion ROM base address */
234         PciBCR          = 0x3E,         /* bridge control register */
235 };
236
237 enum {                                  /* type 2 pre-defined header */
238         PciCBExCA       = 0x10,
239         PciCBSPSR       = 0x16,
240         PciCBPBN        = 0x18,         /* primary bus number */
241         PciCBSBN        = 0x19,         /* secondary bus number */
242         PciCBUBN        = 0x1A,         /* subordinate bus number */
243         PciCBSLTR       = 0x1B,         /* secondary latency timer */
244         PciCBMBR0       = 0x1C,
245         PciCBMLR0       = 0x20,
246         PciCBMBR1       = 0x24,
247         PciCBMLR1       = 0x28,
248         PciCBIBR0       = 0x2C,         /* I/O base */
249         PciCBILR0       = 0x30,         /* I/O limit */
250         PciCBIBR1       = 0x34,         /* I/O base */
251         PciCBILR1       = 0x38,         /* I/O limit */
252         PciCBSVID       = 0x40,         /* subsystem vendor ID */
253         PciCBSID        = 0x42,         /* subsystem ID */
254         PciCBLMBAR      = 0x44,         /* legacy mode base address */
255 };
256
257 /* capabilities */
258 enum {
259         PciCapPMG       = 0x01,         /* power management */
260         PciCapAGP       = 0x02,
261         PciCapVPD       = 0x03,         /* vital product data */
262         PciCapSID       = 0x04,         /* slot id */
263         PciCapMSI       = 0x05,
264         PciCapCHS       = 0x06,         /* compact pci hot swap */
265         PciCapPCIX      = 0x07,
266         PciCapHTC       = 0x08,         /* hypertransport irq conf */
267         PciCapVND       = 0x09,         /* vendor specific information */
268         PciCapPCIe      = 0x10,
269         PciCapMSIX      = 0x11,
270         PciCapSATA      = 0x12,
271         PciCapHSW       = 0x0c,         /* hot swap */
272 };
273 #if 0
274 struct Pcisiz
275 {
276 //      Pcidev* dev;
277         int     siz;
278         int     bar;
279 };
280
281 struct Pcidev
282 {
283         int     tbdf;                   /* type+bus+device+function */
284         ushort  vid;                    /* vendor ID */
285         ushort  did;                    /* device ID */
286
287         ushort  pcr;
288
289         uchar   rid;
290         uchar   ccrp;
291         uchar   ccru;
292         uchar   ccrb;
293         uchar   cls;
294         uchar   ltr;
295
296         struct {
297                 ulong   bar;            /* base address */
298                 int     size;
299         } mem[6];
300
301         struct {
302                 ulong   bar;
303                 int     size;
304         } rom;
305         uchar   intl;                   /* interrupt line */
306
307         Pcidev* list;
308         Pcidev* link;                   /* next device on this bno */
309
310         Pcidev* bridge;                 /* down a bus */
311         struct {
312                 ulong   bar;
313                 int     size;
314         } ioa, mema;
315 };
316 #endif
317 #define PCIWINDOW       0
318 #define PCIWADDR(va)    (PADDR(va)+PCIWINDOW)
319 #define ISAWINDOW       0
320 #define ISAWADDR(va)    (PADDR(va)+ISAWINDOW)
321