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