x86: IDT vector realignment (XCC)
[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
11 struct Vkey {
12         int tbdf;                                       /* pci: ioapic or msi sources */
13         int irq;                                        /* 8259-emulating sources */
14 };
15
16 typedef struct Vctl {
17         struct Vctl *next;                      /* handlers on this vector */
18
19         int isintr;                                     /* interrupt or fault/trap */
20
21         struct Vkey;                            /* source-specific key; tbdf for pci */
22         void (*f) (void *, void *);     /* handler to call */
23         void *a;                                        /* argument to call it with */
24         char name[KNAMELEN];            /* of driver */
25         char *type;
26
27         int (*isr) (int);                       /* get isr bit for this irq */
28         int (*eoi) (int);                       /* eoi */
29         int (*mask) (struct Vkey *, int);       /* interrupt enable returns masked vector */
30         int vno;
31 } Vctl;
32
33 struct ACVctl {
34         //char* (*f)(Ureg*,void*);
35         void *a;
36         int vno;
37         char name[KNAMELEN];            /* of driver */
38 };
39
40 enum {
41         BusCBUS = 0,                            /* Corollary CBUS */
42         BusCBUSII,      /* Corollary CBUS II */
43         BusEISA,        /* Extended ISA */
44         BusFUTURE,      /* IEEE Futurebus */
45         BusINTERN,      /* Internal bus */
46         BusISA, /* Industry Standard Architecture */
47         BusMBI, /* Multibus I */
48         BusMBII,        /* Multibus II */
49         BusMCA, /* Micro Channel Architecture */
50         BusMPI, /* MPI */
51         BusMPSA,        /* MPSA */
52         BusNUBUS,       /* Apple Macintosh NuBus */
53         BusPCI, /* Peripheral Component Interconnect */
54         BusPCMCIA,      /* PC Memory Card International Association */
55         BusTC,  /* DEC TurboChannel */
56         BusVL,  /* VESA Local bus */
57         BusVME, /* VMEbus */
58         BusXPRESS,      /* Express System Bus */
59 };
60
61 #define MKBUS(t,b,d,f)  (((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
62 #define BUSFNO(tbdf)    (((tbdf)>>8)&0x07)
63 #define BUSDNO(tbdf)    (((tbdf)>>11)&0x1F)
64 #define BUSBNO(tbdf)    (((tbdf)>>16)&0xFF)
65 #define BUSTYPE(tbdf)   ((tbdf)>>24)
66 #define BUSBDF(tbdf)    ((tbdf)&0x00FFFF00)
67 #define BUSUNKNOWN      (-1)
68
69 enum {
70         MaxEISA = 16,
71         CfgEISA = 0xC80,
72 };
73
74 /*
75  * PCI support code.
76  */
77 enum {                                                  /* type 0 and type 1 pre-defined header */
78         PciVID = 0x00,                          /* vendor ID */
79         PciDID = 0x02,  /* device ID */
80         PciPCR = 0x04,  /* command */
81         PciPSR = 0x06,  /* status */
82         PciRID = 0x08,  /* revision ID */
83         PciCCRp = 0x09, /* programming interface class code */
84         PciCCRu = 0x0A, /* sub-class code */
85         PciCCRb = 0x0B, /* base class code */
86         PciCLS = 0x0C,  /* cache line size */
87         PciLTR = 0x0D,  /* latency timer */
88         PciHDT = 0x0E,  /* header type */
89         PciBST = 0x0F,  /* BIST */
90
91         PciBAR0 = 0x10, /* base address */
92         PciBAR1 = 0x14,
93
94         PciCP = 0x34,   /* capabilities pointer */
95
96         PciINTL = 0x3C, /* interrupt line */
97         PciINTP = 0x3D, /* interrupt pin */
98 };
99
100 /* ccrb (base class code) values; controller types */
101 enum {
102         Pcibcpci1 = 0,                          /* pci 1.0; no class codes defined */
103         Pcibcstore = 1, /* mass storage */
104         Pcibcnet = 2,   /* network */
105         Pcibcdisp = 3,  /* display */
106         Pcibcmmedia = 4,        /* multimedia */
107         Pcibcmem = 5,   /* memory */
108         Pcibcbridge = 6,        /* bridge */
109         Pcibccomm = 7,  /* simple comms (e.g., serial) */
110         Pcibcbasesys = 8,       /* base system */
111         Pcibcinput = 9, /* input */
112         Pcibcdock = 0xa,        /* docking stations */
113         Pcibcproc = 0xb,        /* processors */
114         Pcibcserial = 0xc,      /* serial bus (e.g., USB) */
115         Pcibcwireless = 0xd,    /* wireless */
116         Pcibcintell = 0xe,      /* intelligent i/o */
117         Pcibcsatcom = 0xf,      /* satellite comms */
118         Pcibccrypto = 0x10,     /* encryption/decryption */
119         Pcibcdacq = 0x11,       /* data acquisition & signal proc. */
120 };
121
122 /* ccru (sub-class code) values; common cases only */
123 enum {
124         /* mass storage */
125         Pciscscsi = 0,                          /* SCSI */
126         Pciscide = 1,   /* IDE (ATA) */
127         Pciscsata = 6,  /* SATA */
128
129         /* network */
130         Pciscether = 0, /* Ethernet */
131
132         /* display */
133         Pciscvga = 0,   /* VGA */
134         Pciscxga = 1,   /* XGA */
135         Pcisc3d = 2,    /* 3D */
136
137         /* bridges */
138         Pcischostpci = 0,       /* host/pci */
139         Pciscpcicpci = 1,       /* pci/pci */
140
141         /* simple comms */
142         Pciscserial = 0,        /* 16450, etc. */
143         Pciscmultiser = 1,      /* multiport serial */
144
145         /* serial bus */
146         Pciscusb = 3,   /* USB */
147 };
148
149 enum {                                                  /* type 0 pre-defined header */
150         PciCIS = 0x28,                          /* cardbus CIS pointer */
151         PciSVID = 0x2C, /* subsystem vendor ID */
152         PciSID = 0x2E,  /* cardbus CIS pointer */
153         PciEBAR0 = 0x30,        /* expansion ROM base address */
154         PciMGNT = 0x3E, /* burst period length */
155         PciMLT = 0x3F,  /* maximum latency between bursts */
156 };
157
158 enum {                                                  /* type 1 pre-defined header */
159         PciPBN = 0x18,                          /* primary bus number */
160         PciSBN = 0x19,  /* secondary bus number */
161         PciUBN = 0x1A,  /* subordinate bus number */
162         PciSLTR = 0x1B, /* secondary latency timer */
163         PciIBR = 0x1C,  /* I/O base */
164         PciILR = 0x1D,  /* I/O limit */
165         PciSPSR = 0x1E, /* secondary status */
166         PciMBR = 0x20,  /* memory base */
167         PciMLR = 0x22,  /* memory limit */
168         PciPMBR = 0x24, /* prefetchable memory base */
169         PciPMLR = 0x26, /* prefetchable memory limit */
170         PciPUBR = 0x28, /* prefetchable base upper 32 bits */
171         PciPULR = 0x2C, /* prefetchable limit upper 32 bits */
172         PciIUBR = 0x30, /* I/O base upper 16 bits */
173         PciIULR = 0x32, /* I/O limit upper 16 bits */
174         PciEBAR1 = 0x28,        /* expansion ROM base address */
175         PciBCR = 0x3E,  /* bridge control register */
176 };
177
178 enum {                                                  /* type 2 pre-defined header */
179         PciCBExCA = 0x10,
180         PciCBSPSR = 0x16,
181         PciCBPBN = 0x18,        /* primary bus number */
182         PciCBSBN = 0x19,        /* secondary bus number */
183         PciCBUBN = 0x1A,        /* subordinate bus number */
184         PciCBSLTR = 0x1B,       /* secondary latency timer */
185         PciCBMBR0 = 0x1C,
186         PciCBMLR0 = 0x20,
187         PciCBMBR1 = 0x24,
188         PciCBMLR1 = 0x28,
189         PciCBIBR0 = 0x2C,       /* I/O base */
190         PciCBILR0 = 0x30,       /* I/O limit */
191         PciCBIBR1 = 0x34,       /* I/O base */
192         PciCBILR1 = 0x38,       /* I/O limit */
193         PciCBSVID = 0x40,       /* subsystem vendor ID */
194         PciCBSID = 0x42,        /* subsystem ID */
195         PciCBLMBAR = 0x44,      /* legacy mode base address */
196 };
197
198 /* capabilities */
199 enum {
200         PciCapPMG = 0x01,                       /* power management */
201         PciCapAGP = 0x02,
202         PciCapVPD = 0x03,       /* vital product data */
203         PciCapSID = 0x04,       /* slot id */
204         PciCapMSI = 0x05,
205         PciCapCHS = 0x06,       /* compact pci hot swap */
206         PciCapPCIX = 0x07,
207         PciCapHTC = 0x08,       /* hypertransport irq conf */
208         PciCapVND = 0x09,       /* vendor specific information */
209         PciCapPCIe = 0x10,
210         PciCapMSIX = 0x11,
211         PciCapSATA = 0x12,
212         PciCapHSW = 0x0c,       /* hot swap */
213 };
214 #if 0
215 struct Pcisiz {
216 //  Pcidev* dev;
217         int siz;
218         int bar;
219 };
220
221 struct Pcidev {
222         int tbdf;                                       /* type+bus+device+function */
223         ushort vid;                                     /* vendor ID */
224         ushort did;                                     /* device ID */
225
226         ushort pcr;
227
228         uchar rid;
229         uchar ccrp;
230         uchar ccru;
231         uchar ccrb;
232         uchar cls;
233         uchar ltr;
234
235         struct {
236                 ulong bar;                              /* base address */
237                 int size;
238         } mem[6];
239
240         struct {
241                 ulong bar;
242                 int size;
243         } rom;
244         uchar intl;                                     /* interrupt line */
245
246         Pcidev *list;
247         Pcidev *link;                           /* next device on this bno */
248
249         Pcidev *bridge;                         /* down a bus */
250         struct {
251                 ulong bar;
252                 int size;
253         } ioa, mema;
254 };
255 #endif
256 #define PCIWINDOW       0
257 #define PCIWADDR(va)    (PADDR(va)+PCIWINDOW)
258 #define ISAWINDOW       0
259 #define ISAWADDR(va)    (PADDR(va)+ISAWINDOW)