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