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