xref: /plan9/sys/src/9/rb/io.h (revision f43f8ee646e2cb29aea7fd7bb5fc7318a3f4921f)
1*f43f8ee6SDavid du Colombier enum {
2*f43f8ee6SDavid du Colombier 	Mhz		= 1000*1000,
3*f43f8ee6SDavid du Colombier };
4*f43f8ee6SDavid du Colombier 
5*f43f8ee6SDavid du Colombier /*
6*f43f8ee6SDavid du Colombier  *  duarts, frequency and registers
7*f43f8ee6SDavid du Colombier  */
8*f43f8ee6SDavid du Colombier #define DUARTFREQ	3672000
9*f43f8ee6SDavid du Colombier 
10*f43f8ee6SDavid du Colombier /*
11*f43f8ee6SDavid du Colombier  *  interrupt levels on CPU boards.
12*f43f8ee6SDavid du Colombier  */
13*f43f8ee6SDavid du Colombier enum
14*f43f8ee6SDavid du Colombier {
15*f43f8ee6SDavid du Colombier 	ILmin		= 2,
16*f43f8ee6SDavid du Colombier 	ILpci		= 2,
17*f43f8ee6SDavid du Colombier 	ILehci		= 3,
18*f43f8ee6SDavid du Colombier 	ILenet1		= 4,		/* arge1 @ 0x19:: w switch */
19*f43f8ee6SDavid du Colombier 	ILenet0		= 5,		/* arge0 @ 0x1a:: */
20*f43f8ee6SDavid du Colombier 	ILduart0	= 6,		/* actually APB, uart is subintr 3 */
21*f43f8ee6SDavid du Colombier 	ILclock		= 7,
22*f43f8ee6SDavid du Colombier 	ILmax		= 7,
23*f43f8ee6SDavid du Colombier 
24*f43f8ee6SDavid du Colombier 	ILshift		= 8,
25*f43f8ee6SDavid du Colombier };
26*f43f8ee6SDavid du Colombier 
27*f43f8ee6SDavid du Colombier #define	Rstblockbase	(ulong *)KSEG1ADDR(0x18060000)
28*f43f8ee6SDavid du Colombier 
29*f43f8ee6SDavid du Colombier #define Rstwdogctl	(ulong *)KSEG1ADDR(0x18060008)
30*f43f8ee6SDavid du Colombier #define		Wdoglast	(1 << 31)
31*f43f8ee6SDavid du Colombier #define		Wdogmask	3
32*f43f8ee6SDavid du Colombier #define		Wdognoaction	0
33*f43f8ee6SDavid du Colombier #define		Wdoggpintr	1
34*f43f8ee6SDavid du Colombier #define		Wdognmi		2
35*f43f8ee6SDavid du Colombier #define		Wdogreset	3
36*f43f8ee6SDavid du Colombier #define Rstwdogtimer	(ulong *)KSEG1ADDR(0x1806000c)
37*f43f8ee6SDavid du Colombier 
38*f43f8ee6SDavid du Colombier /*
39*f43f8ee6SDavid du Colombier  * APB interrupt status and mask register and interrupt bits
40*f43f8ee6SDavid du Colombier  */
41*f43f8ee6SDavid du Colombier #define Apbintrsts	(ulong *)KSEG1ADDR(0x18060010)
42*f43f8ee6SDavid du Colombier #define Apbintrmask	(ulong *)KSEG1ADDR(0x18060014)
43*f43f8ee6SDavid du Colombier #define		Apbintrtimer		0
44*f43f8ee6SDavid du Colombier #define		Apbintrerror		1
45*f43f8ee6SDavid du Colombier #define		Apbintrgpio		2
46*f43f8ee6SDavid du Colombier #define		Apbintruart		3
47*f43f8ee6SDavid du Colombier #define		Apbintrwatchdog		4
48*f43f8ee6SDavid du Colombier #define		Apbintrperf		5
49*f43f8ee6SDavid du Colombier #define		Apbintrohci		6
50*f43f8ee6SDavid du Colombier #define		Apbintrdma		7
51*f43f8ee6SDavid du Colombier 
52*f43f8ee6SDavid du Colombier #define Pciintrsts	(ulong *)KSEG1ADDR(0x18060018)
53*f43f8ee6SDavid du Colombier #define Pciintrmask	(ulong *)KSEG1ADDR(0x1806001C)
54*f43f8ee6SDavid du Colombier #define		PCI_INTR_CORE		(1 << 4)
55*f43f8ee6SDavid du Colombier 
56*f43f8ee6SDavid du Colombier #define Reset	(ulong *)KSEG1ADDR(0x18060024)
57*f43f8ee6SDavid du Colombier #define		Rstfullchip	(1 << 24) /* same as pulling the reset pin */
58*f43f8ee6SDavid du Colombier #define		Rstcpucold	(1 << 20) /* cold reset */
59*f43f8ee6SDavid du Colombier #define		Rstge1mac	(1 << 13)
60*f43f8ee6SDavid du Colombier #define		Rstge1phy	(1 << 12)
61*f43f8ee6SDavid du Colombier #define		Rstge0mac	(1 <<  9)
62*f43f8ee6SDavid du Colombier #define		Rstge0phy	(1 <<  8)
63*f43f8ee6SDavid du Colombier #define		Rstusbohcidll	(1 <<  6)
64*f43f8ee6SDavid du Colombier #define		Rstusbhost	(1 <<  5)
65*f43f8ee6SDavid du Colombier #define		Rstusbphy	(1 <<  4)
66*f43f8ee6SDavid du Colombier #define		Rstpcibus	(1 <<  1)
67*f43f8ee6SDavid du Colombier #define		Rstpcicore	(1 <<  0)
68*f43f8ee6SDavid du Colombier 
69*f43f8ee6SDavid du Colombier /*
70*f43f8ee6SDavid du Colombier  * mostly PCI from here on
71*f43f8ee6SDavid du Colombier  */
72*f43f8ee6SDavid du Colombier 
73*f43f8ee6SDavid du Colombier typedef struct Pcisiz Pcisiz;
74*f43f8ee6SDavid du Colombier typedef struct Pcidev Pcidev;
75*f43f8ee6SDavid du Colombier typedef struct Vctl Vctl;
76*f43f8ee6SDavid du Colombier 
77*f43f8ee6SDavid du Colombier struct Vctl {
78*f43f8ee6SDavid du Colombier 	Vctl*	next;			/* handlers on this vector */
79*f43f8ee6SDavid du Colombier 
80*f43f8ee6SDavid du Colombier 	char	name[KNAMELEN];		/* of driver */
81*f43f8ee6SDavid du Colombier 	int	isintr;			/* interrupt or fault/trap */
82*f43f8ee6SDavid du Colombier 	int	irq;
83*f43f8ee6SDavid du Colombier 	int	tbdf;
84*f43f8ee6SDavid du Colombier 	int	(*isr)(int);		/* get isr bit for this irq */
85*f43f8ee6SDavid du Colombier 	int	(*eoi)(int);		/* eoi */
86*f43f8ee6SDavid du Colombier 
87*f43f8ee6SDavid du Colombier 	void	(*f)(Ureg*, void*);	/* handler to call */
88*f43f8ee6SDavid du Colombier 	void*	a;			/* argument to call it with */
89*f43f8ee6SDavid du Colombier };
90*f43f8ee6SDavid du Colombier 
91*f43f8ee6SDavid du Colombier enum {
92*f43f8ee6SDavid du Colombier 	BusCBUS		= 0,		/* Corollary CBUS */
93*f43f8ee6SDavid du Colombier 	BusCBUSII,			/* Corollary CBUS II */
94*f43f8ee6SDavid du Colombier 	BusEISA,			/* Extended ISA */
95*f43f8ee6SDavid du Colombier 	BusFUTURE,			/* IEEE Futurebus */
96*f43f8ee6SDavid du Colombier 	BusINTERN,			/* Internal bus */
97*f43f8ee6SDavid du Colombier 	BusISA,				/* Industry Standard Architecture */
98*f43f8ee6SDavid du Colombier 	BusMBI,				/* Multibus I */
99*f43f8ee6SDavid du Colombier 	BusMBII,			/* Multibus II */
100*f43f8ee6SDavid du Colombier 	BusMCA,				/* Micro Channel Architecture */
101*f43f8ee6SDavid du Colombier 	BusMPI,				/* MPI */
102*f43f8ee6SDavid du Colombier 	BusMPSA,			/* MPSA */
103*f43f8ee6SDavid du Colombier 	BusNUBUS,			/* Apple Macintosh NuBus */
104*f43f8ee6SDavid du Colombier 	BusPCI,				/* Peripheral Component Interconnect */
105*f43f8ee6SDavid du Colombier 	BusPCMCIA,			/* PC Memory Card International Association */
106*f43f8ee6SDavid du Colombier 	BusTC,				/* DEC TurboChannel */
107*f43f8ee6SDavid du Colombier 	BusVL,				/* VESA Local bus */
108*f43f8ee6SDavid du Colombier 	BusVME,				/* VMEbus */
109*f43f8ee6SDavid du Colombier 	BusXPRESS,			/* Express System Bus */
110*f43f8ee6SDavid du Colombier };
111*f43f8ee6SDavid du Colombier 
112*f43f8ee6SDavid du Colombier #define MKBUS(t,b,d,f)	(((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
113*f43f8ee6SDavid du Colombier #define BUSFNO(tbdf)	(((tbdf)>>8)&0x07)
114*f43f8ee6SDavid du Colombier #define BUSDNO(tbdf)	(((tbdf)>>11)&0x1F)
115*f43f8ee6SDavid du Colombier #define BUSBNO(tbdf)	(((tbdf)>>16)&0xFF)
116*f43f8ee6SDavid du Colombier #define BUSTYPE(tbdf)	((tbdf)>>24)
117*f43f8ee6SDavid du Colombier #define BUSBDF(tbdf)	((tbdf)&0x00FFFF00)
118*f43f8ee6SDavid du Colombier #define BUSUNKNOWN	(-1)
119*f43f8ee6SDavid du Colombier 
120*f43f8ee6SDavid du Colombier enum {
121*f43f8ee6SDavid du Colombier 	MaxEISA		= 16,
122*f43f8ee6SDavid du Colombier 	CfgEISA		= 0xC80,
123*f43f8ee6SDavid du Colombier };
124*f43f8ee6SDavid du Colombier 
125*f43f8ee6SDavid du Colombier /*
126*f43f8ee6SDavid du Colombier  * PCI support code.
127*f43f8ee6SDavid du Colombier  */
128*f43f8ee6SDavid du Colombier enum {					/* type 0 & type 1 pre-defined header */
129*f43f8ee6SDavid du Colombier 	PciVID		= 0x00,		/* vendor ID */
130*f43f8ee6SDavid du Colombier 	PciDID		= 0x02,		/* device ID */
131*f43f8ee6SDavid du Colombier 	PciPCR		= 0x04,		/* command */
132*f43f8ee6SDavid du Colombier 	PciPSR		= 0x06,		/* status */
133*f43f8ee6SDavid du Colombier 	PciRID		= 0x08,		/* revision ID */
134*f43f8ee6SDavid du Colombier 	PciCCRp		= 0x09,		/* programming interface class code */
135*f43f8ee6SDavid du Colombier 	PciCCRu		= 0x0A,		/* sub-class code */
136*f43f8ee6SDavid du Colombier 	PciCCRb		= 0x0B,		/* base class code */
137*f43f8ee6SDavid du Colombier 	PciCLS		= 0x0C,		/* cache line size */
138*f43f8ee6SDavid du Colombier 	PciLTR		= 0x0D,		/* latency timer */
139*f43f8ee6SDavid du Colombier 	PciHDT		= 0x0E,		/* header type */
140*f43f8ee6SDavid du Colombier 	PciBST		= 0x0F,		/* BIST */
141*f43f8ee6SDavid du Colombier 
142*f43f8ee6SDavid du Colombier 	PciBAR0		= 0x10,		/* base address */
143*f43f8ee6SDavid du Colombier 	PciBAR1		= 0x14,
144*f43f8ee6SDavid du Colombier 
145*f43f8ee6SDavid du Colombier 	PciINTL		= 0x3C,		/* interrupt line */
146*f43f8ee6SDavid du Colombier 	PciINTP		= 0x3D,		/* interrupt pin */
147*f43f8ee6SDavid du Colombier };
148*f43f8ee6SDavid du Colombier 
149*f43f8ee6SDavid du Colombier /* ccrb (base class code) values; controller types */
150*f43f8ee6SDavid du Colombier enum {
151*f43f8ee6SDavid du Colombier 	Pcibcpci1	= 0,		/* pci 1.0; no class codes defined */
152*f43f8ee6SDavid du Colombier 	Pcibcstore	= 1,		/* mass storage */
153*f43f8ee6SDavid du Colombier 	Pcibcnet	= 2,		/* network */
154*f43f8ee6SDavid du Colombier 	Pcibcdisp	= 3,		/* display */
155*f43f8ee6SDavid du Colombier 	Pcibcmmedia	= 4,		/* multimedia */
156*f43f8ee6SDavid du Colombier 	Pcibcmem	= 5,		/* memory */
157*f43f8ee6SDavid du Colombier 	Pcibcbridge	= 6,		/* bridge */
158*f43f8ee6SDavid du Colombier 	Pcibccomm	= 7,		/* simple comms (e.g., serial) */
159*f43f8ee6SDavid du Colombier 	Pcibcbasesys	= 8,		/* base system */
160*f43f8ee6SDavid du Colombier 	Pcibcinput	= 9,		/* input */
161*f43f8ee6SDavid du Colombier 	Pcibcdock	= 0xa,		/* docking stations */
162*f43f8ee6SDavid du Colombier 	Pcibcproc	= 0xb,		/* processors */
163*f43f8ee6SDavid du Colombier 	Pcibcserial	= 0xc,		/* serial bus (e.g., USB) */
164*f43f8ee6SDavid du Colombier 	Pcibcwireless	= 0xd,		/* wireless */
165*f43f8ee6SDavid du Colombier 	Pcibcintell	= 0xe,		/* intelligent i/o */
166*f43f8ee6SDavid du Colombier 	Pcibcsatcom	= 0xf,		/* satellite comms */
167*f43f8ee6SDavid du Colombier 	Pcibccrypto	= 0x10,		/* encryption/decryption */
168*f43f8ee6SDavid du Colombier 	Pcibcdacq	= 0x11,		/* data acquisition & signal proc. */
169*f43f8ee6SDavid du Colombier };
170*f43f8ee6SDavid du Colombier 
171*f43f8ee6SDavid du Colombier /* ccru (sub-class code) values; common cases only */
172*f43f8ee6SDavid du Colombier enum {
173*f43f8ee6SDavid du Colombier 	/* mass storage */
174*f43f8ee6SDavid du Colombier 	Pciscscsi	= 0,		/* SCSI */
175*f43f8ee6SDavid du Colombier 	Pciscide	= 1,		/* IDE (ATA) */
176*f43f8ee6SDavid du Colombier 	Pciscsata	= 6,		/* SATA */
177*f43f8ee6SDavid du Colombier 
178*f43f8ee6SDavid du Colombier 	/* network */
179*f43f8ee6SDavid du Colombier 	Pciscether	= 0,		/* Ethernet */
180*f43f8ee6SDavid du Colombier 
181*f43f8ee6SDavid du Colombier 	/* display */
182*f43f8ee6SDavid du Colombier 	Pciscvga	= 0,		/* VGA */
183*f43f8ee6SDavid du Colombier 	Pciscxga	= 1,		/* XGA */
184*f43f8ee6SDavid du Colombier 	Pcisc3d		= 2,		/* 3D */
185*f43f8ee6SDavid du Colombier 
186*f43f8ee6SDavid du Colombier 	/* bridges */
187*f43f8ee6SDavid du Colombier 	Pcischostpci	= 0,		/* host/pci */
188*f43f8ee6SDavid du Colombier 	Pciscpcicpci	= 1,		/* pci/pci */
189*f43f8ee6SDavid du Colombier 
190*f43f8ee6SDavid du Colombier 	/* simple comms */
191*f43f8ee6SDavid du Colombier 	Pciscserial	= 0,		/* 16450, etc. */
192*f43f8ee6SDavid du Colombier 	Pciscmultiser	= 1,		/* multiport serial */
193*f43f8ee6SDavid du Colombier 
194*f43f8ee6SDavid du Colombier 	/* serial bus */
195*f43f8ee6SDavid du Colombier 	Pciscusb	= 3,		/* USB */
196*f43f8ee6SDavid du Colombier };
197*f43f8ee6SDavid du Colombier 
198*f43f8ee6SDavid du Colombier enum {					/* type 0 pre-defined header */
199*f43f8ee6SDavid du Colombier 	PciCIS		= 0x28,		/* cardbus CIS pointer */
200*f43f8ee6SDavid du Colombier 	PciSVID		= 0x2C,		/* subsystem vendor ID */
201*f43f8ee6SDavid du Colombier 	PciSID		= 0x2E,		/* cardbus CIS pointer */
202*f43f8ee6SDavid du Colombier 	PciEBAR0	= 0x30,		/* expansion ROM base address */
203*f43f8ee6SDavid du Colombier 	PciMGNT		= 0x3E,		/* burst period length */
204*f43f8ee6SDavid du Colombier 	PciMLT		= 0x3F,		/* maximum latency between bursts */
205*f43f8ee6SDavid du Colombier };
206*f43f8ee6SDavid du Colombier 
207*f43f8ee6SDavid du Colombier enum {					/* type 1 pre-defined header */
208*f43f8ee6SDavid du Colombier 	PciPBN		= 0x18,		/* primary bus number */
209*f43f8ee6SDavid du Colombier 	PciSBN		= 0x19,		/* secondary bus number */
210*f43f8ee6SDavid du Colombier 	PciUBN		= 0x1A,		/* subordinate bus number */
211*f43f8ee6SDavid du Colombier 	PciSLTR		= 0x1B,		/* secondary latency timer */
212*f43f8ee6SDavid du Colombier 	PciIBR		= 0x1C,		/* I/O base */
213*f43f8ee6SDavid du Colombier 	PciILR		= 0x1D,		/* I/O limit */
214*f43f8ee6SDavid du Colombier 	PciSPSR		= 0x1E,		/* secondary status */
215*f43f8ee6SDavid du Colombier 	PciMBR		= 0x20,		/* memory base */
216*f43f8ee6SDavid du Colombier 	PciMLR		= 0x22,		/* memory limit */
217*f43f8ee6SDavid du Colombier 	PciPMBR		= 0x24,		/* prefetchable memory base */
218*f43f8ee6SDavid du Colombier 	PciPMLR		= 0x26,		/* prefetchable memory limit */
219*f43f8ee6SDavid du Colombier 	PciPUBR		= 0x28,		/* prefetchable base upper 32 bits */
220*f43f8ee6SDavid du Colombier 	PciPULR		= 0x2C,		/* prefetchable limit upper 32 bits */
221*f43f8ee6SDavid du Colombier 	PciIUBR		= 0x30,		/* I/O base upper 16 bits */
222*f43f8ee6SDavid du Colombier 	PciIULR		= 0x32,		/* I/O limit upper 16 bits */
223*f43f8ee6SDavid du Colombier 	PciEBAR1	= 0x28,		/* expansion ROM base address */
224*f43f8ee6SDavid du Colombier 	PciBCR		= 0x3E,		/* bridge control register */
225*f43f8ee6SDavid du Colombier };
226*f43f8ee6SDavid du Colombier 
227*f43f8ee6SDavid du Colombier enum {					/* type 2 pre-defined header */
228*f43f8ee6SDavid du Colombier 	PciCBExCA	= 0x10,
229*f43f8ee6SDavid du Colombier 	PciCBSPSR	= 0x16,
230*f43f8ee6SDavid du Colombier 	PciCBPBN	= 0x18,		/* primary bus number */
231*f43f8ee6SDavid du Colombier 	PciCBSBN	= 0x19,		/* secondary bus number */
232*f43f8ee6SDavid du Colombier 	PciCBUBN	= 0x1A,		/* subordinate bus number */
233*f43f8ee6SDavid du Colombier 	PciCBSLTR	= 0x1B,		/* secondary latency timer */
234*f43f8ee6SDavid du Colombier 	PciCBMBR0	= 0x1C,
235*f43f8ee6SDavid du Colombier 	PciCBMLR0	= 0x20,
236*f43f8ee6SDavid du Colombier 	PciCBMBR1	= 0x24,
237*f43f8ee6SDavid du Colombier 	PciCBMLR1	= 0x28,
238*f43f8ee6SDavid du Colombier 	PciCBIBR0	= 0x2C,		/* I/O base */
239*f43f8ee6SDavid du Colombier 	PciCBILR0	= 0x30,		/* I/O limit */
240*f43f8ee6SDavid du Colombier 	PciCBIBR1	= 0x34,		/* I/O base */
241*f43f8ee6SDavid du Colombier 	PciCBILR1	= 0x38,		/* I/O limit */
242*f43f8ee6SDavid du Colombier 	PciCBSVID	= 0x40,		/* subsystem vendor ID */
243*f43f8ee6SDavid du Colombier 	PciCBSID	= 0x42,		/* subsystem ID */
244*f43f8ee6SDavid du Colombier 	PciCBLMBAR	= 0x44,		/* legacy mode base address */
245*f43f8ee6SDavid du Colombier };
246*f43f8ee6SDavid du Colombier 
247*f43f8ee6SDavid du Colombier struct Pcisiz
248*f43f8ee6SDavid du Colombier {
249*f43f8ee6SDavid du Colombier 	Pcidev*	dev;
250*f43f8ee6SDavid du Colombier 	int	siz;
251*f43f8ee6SDavid du Colombier 	int	bar;
252*f43f8ee6SDavid du Colombier };
253*f43f8ee6SDavid du Colombier 
254*f43f8ee6SDavid du Colombier struct Pcidev
255*f43f8ee6SDavid du Colombier {
256*f43f8ee6SDavid du Colombier 	int	tbdf;			/* type+bus+device+function */
257*f43f8ee6SDavid du Colombier 	ushort	vid;			/* vendor ID */
258*f43f8ee6SDavid du Colombier 	ushort	did;			/* device ID */
259*f43f8ee6SDavid du Colombier 
260*f43f8ee6SDavid du Colombier 	ushort	pcr;
261*f43f8ee6SDavid du Colombier 
262*f43f8ee6SDavid du Colombier 	uchar	rid;
263*f43f8ee6SDavid du Colombier 	uchar	ccrp;
264*f43f8ee6SDavid du Colombier 	uchar	ccru;
265*f43f8ee6SDavid du Colombier 	uchar	ccrb;
266*f43f8ee6SDavid du Colombier 	uchar	cls;
267*f43f8ee6SDavid du Colombier 	uchar	ltr;
268*f43f8ee6SDavid du Colombier 
269*f43f8ee6SDavid du Colombier 	struct {
270*f43f8ee6SDavid du Colombier 		ulong	bar;		/* base address */
271*f43f8ee6SDavid du Colombier 		int	size;
272*f43f8ee6SDavid du Colombier 	} mem[6];
273*f43f8ee6SDavid du Colombier 
274*f43f8ee6SDavid du Colombier 	struct {
275*f43f8ee6SDavid du Colombier 		ulong	bar;
276*f43f8ee6SDavid du Colombier 		int	size;
277*f43f8ee6SDavid du Colombier 	} rom;
278*f43f8ee6SDavid du Colombier 	uchar	intl;			/* interrupt line */
279*f43f8ee6SDavid du Colombier 
280*f43f8ee6SDavid du Colombier 	Pcidev*	list;
281*f43f8ee6SDavid du Colombier 	Pcidev*	link;			/* next device on this bno */
282*f43f8ee6SDavid du Colombier 
283*f43f8ee6SDavid du Colombier 	Pcidev*	bridge;			/* down a bus */
284*f43f8ee6SDavid du Colombier 	struct {
285*f43f8ee6SDavid du Colombier 		ulong	bar;
286*f43f8ee6SDavid du Colombier 		int	size;
287*f43f8ee6SDavid du Colombier 	} ioa, mema;
288*f43f8ee6SDavid du Colombier 
289*f43f8ee6SDavid du Colombier 	int	pmrb;			/* power management register block */
290*f43f8ee6SDavid du Colombier };
291*f43f8ee6SDavid du Colombier 
292*f43f8ee6SDavid du Colombier enum {
293*f43f8ee6SDavid du Colombier 	/* vendor ids */
294*f43f8ee6SDavid du Colombier 	Vatiamd	= 0x1002,
295*f43f8ee6SDavid du Colombier 	Vintel	= 0x8086,
296*f43f8ee6SDavid du Colombier 	Vjmicron= 0x197b,
297*f43f8ee6SDavid du Colombier 	Vmarvell= 0x1b4b,
298*f43f8ee6SDavid du Colombier 	Vmyricom= 0x14c1,
299*f43f8ee6SDavid du Colombier };
300*f43f8ee6SDavid du Colombier 
301*f43f8ee6SDavid du Colombier #define PCIWINDOW	0
302*f43f8ee6SDavid du Colombier #define PCIWADDR(va)	(PADDR(va)+PCIWINDOW)
303*f43f8ee6SDavid du Colombier #define ISAWINDOW	0
304*f43f8ee6SDavid du Colombier #define ISAWADDR(va)	(PADDR(va)+ISAWINDOW)
305*f43f8ee6SDavid du Colombier 
306*f43f8ee6SDavid du Colombier /* SMBus transactions */
307*f43f8ee6SDavid du Colombier enum
308*f43f8ee6SDavid du Colombier {
309*f43f8ee6SDavid du Colombier 	SMBquick,		/* sends address only */
310*f43f8ee6SDavid du Colombier 
311*f43f8ee6SDavid du Colombier 	/* write */
312*f43f8ee6SDavid du Colombier 	SMBsend,		/* sends address and cmd */
313*f43f8ee6SDavid du Colombier 	SMBbytewrite,		/* sends address and cmd and 1 byte */
314*f43f8ee6SDavid du Colombier 	SMBwordwrite,		/* sends address and cmd and 2 bytes */
315*f43f8ee6SDavid du Colombier 
316*f43f8ee6SDavid du Colombier 	/* read */
317*f43f8ee6SDavid du Colombier 	SMBrecv,		/* sends address, recvs 1 byte */
318*f43f8ee6SDavid du Colombier 	SMBbyteread,		/* sends address and cmd, recv's byte */
319*f43f8ee6SDavid du Colombier 	SMBwordread,		/* sends address and cmd, recv's 2 bytes */
320*f43f8ee6SDavid du Colombier };
321*f43f8ee6SDavid du Colombier 
322*f43f8ee6SDavid du Colombier typedef struct SMBus SMBus;
323*f43f8ee6SDavid du Colombier struct SMBus {
324*f43f8ee6SDavid du Colombier 	QLock;		/* mutex */
325*f43f8ee6SDavid du Colombier 	Rendez	r;	/* rendezvous point for completion interrupts */
326*f43f8ee6SDavid du Colombier 	void	*arg;	/* implementation dependent */
327*f43f8ee6SDavid du Colombier 	ulong	base;	/* port or memory base of smbus */
328*f43f8ee6SDavid du Colombier 	int	busy;
329*f43f8ee6SDavid du Colombier 	void	(*transact)(SMBus*, int, int, int, uchar*);
330*f43f8ee6SDavid du Colombier };
331*f43f8ee6SDavid du Colombier 
332*f43f8ee6SDavid du Colombier #pragma varargck	type	"T"	int
333*f43f8ee6SDavid du Colombier #pragma varargck	type	"T"	uint
334