Lindent on the new APIC/ACPI files
[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 //  Pcidev* dev;
276         int siz;
277         int bar;
278 };
279
280 struct Pcidev {
281         int tbdf;                                       /* type+bus+device+function */
282         ushort vid;                                     /* vendor ID */
283         ushort did;                                     /* device ID */
284
285         ushort pcr;
286
287         uchar rid;
288         uchar ccrp;
289         uchar ccru;
290         uchar ccrb;
291         uchar cls;
292         uchar ltr;
293
294         struct {
295                 ulong bar;                              /* base address */
296                 int size;
297         } mem[6];
298
299         struct {
300                 ulong bar;
301                 int size;
302         } rom;
303         uchar intl;                                     /* interrupt line */
304
305         Pcidev *list;
306         Pcidev *link;                           /* next device on this bno */
307
308         Pcidev *bridge;                         /* down a bus */
309         struct {
310                 ulong bar;
311                 int size;
312         } ioa, mema;
313 };
314 #endif
315 #define PCIWINDOW       0
316 #define PCIWADDR(va)    (PADDR(va)+PCIWINDOW)
317 #define ISAWINDOW       0
318 #define ISAWADDR(va)    (PADDR(va)+ISAWINDOW)