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