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