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