xref: /plan9/sys/src/9/pc/io.h (revision 75cb58dbb29a66e75e2e3ad617d2dea92d2b0dbe)
17dd7cddfSDavid du Colombier #define X86STEPPING(x)	((x) & 0x0F)
2c39c2eb3SDavid du Colombier /* incorporates extended-model and -family bits */
330f69380SDavid du Colombier #define X86MODEL(x)	((((x)>>4) & 0x0F) | (((x)>>16) & 0x0F)<<4)
4c39c2eb3SDavid du Colombier #define X86FAMILY(x)	((((x)>>8) & 0x0F) | (((x)>>20) & 0xFF)<<4)
53e12c5d1SDavid du Colombier 
67dd7cddfSDavid du Colombier enum {
77dd7cddfSDavid du Colombier 	VectorNMI	= 2,		/* non-maskable interrupt */
87dd7cddfSDavid du Colombier 	VectorBPT	= 3,		/* breakpoint */
97dd7cddfSDavid du Colombier 	VectorUD	= 6,		/* invalid opcode exception */
107dd7cddfSDavid du Colombier 	VectorCNA	= 7,		/* coprocessor not available */
11e288d156SDavid du Colombier 	Vector2F	= 8,		/* double fault */
127dd7cddfSDavid du Colombier 	VectorCSO	= 9,		/* coprocessor segment overrun */
137dd7cddfSDavid du Colombier 	VectorPF	= 14,		/* page fault */
14a3b78ba5SDavid du Colombier 	Vector15	= 15,		/* reserved */
157dd7cddfSDavid du Colombier 	VectorCERR	= 16,		/* coprocessor error */
163e12c5d1SDavid du Colombier 
177dd7cddfSDavid du Colombier 	VectorPIC	= 32,		/* external i8259 interrupts */
187dd7cddfSDavid du Colombier 	IrqCLOCK	= 0,
197dd7cddfSDavid du Colombier 	IrqKBD		= 1,
207dd7cddfSDavid du Colombier 	IrqUART1	= 3,
217dd7cddfSDavid du Colombier 	IrqUART0	= 4,
227dd7cddfSDavid du Colombier 	IrqPCMCIA	= 5,
237dd7cddfSDavid du Colombier 	IrqFLOPPY	= 6,
247dd7cddfSDavid du Colombier 	IrqLPT		= 7,
257dd7cddfSDavid du Colombier 	IrqIRQ7		= 7,
267dd7cddfSDavid du Colombier 	IrqAUX		= 12,		/* PS/2 port */
277dd7cddfSDavid du Colombier 	IrqIRQ13	= 13,		/* coprocessor on 386 */
287dd7cddfSDavid du Colombier 	IrqATA0		= 14,
297dd7cddfSDavid du Colombier 	IrqATA1		= 15,
307dd7cddfSDavid du Colombier 	MaxIrqPIC	= 15,
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier 	VectorLAPIC	= VectorPIC+16,	/* local APIC interrupts */
337dd7cddfSDavid du Colombier 	IrqLINT0	= 16,		/* LINT[01] must be offsets 0 and 1 */
347dd7cddfSDavid du Colombier 	IrqLINT1	= 17,
357dd7cddfSDavid du Colombier 	IrqTIMER	= 18,
367dd7cddfSDavid du Colombier 	IrqERROR	= 19,
377dd7cddfSDavid du Colombier 	IrqPCINT	= 20,
387dd7cddfSDavid du Colombier 	IrqSPURIOUS	= 31,		/* must have bits [3-0] == 0x0F */
397dd7cddfSDavid du Colombier 	MaxIrqLAPIC	= 31,
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier 	VectorSYSCALL	= 64,
427dd7cddfSDavid du Colombier 
437dd7cddfSDavid du Colombier 	VectorAPIC	= 65,		/* external APIC interrupts */
447dd7cddfSDavid du Colombier 	MaxVectorAPIC	= 255,
457dd7cddfSDavid du Colombier };
467dd7cddfSDavid du Colombier 
477dd7cddfSDavid du Colombier typedef struct Vctl {
487dd7cddfSDavid du Colombier 	Vctl*	next;			/* handlers on this vector */
497dd7cddfSDavid du Colombier 
509a747e4fSDavid du Colombier 	char	name[KNAMELEN];		/* of driver */
517dd7cddfSDavid du Colombier 	int	isintr;			/* interrupt or fault/trap */
527dd7cddfSDavid du Colombier 	int	irq;
537dd7cddfSDavid du Colombier 	int	tbdf;
547dd7cddfSDavid du Colombier 	int	(*isr)(int);		/* get isr bit for this irq */
557dd7cddfSDavid du Colombier 	int	(*eoi)(int);		/* eoi */
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier 	void	(*f)(Ureg*, void*);	/* handler to call */
587dd7cddfSDavid du Colombier 	void*	a;			/* argument to call it with */
597dd7cddfSDavid du Colombier } Vctl;
607dd7cddfSDavid du Colombier 
617dd7cddfSDavid du Colombier enum {
627dd7cddfSDavid du Colombier 	BusCBUS		= 0,		/* Corollary CBUS */
637dd7cddfSDavid du Colombier 	BusCBUSII,			/* Corollary CBUS II */
647dd7cddfSDavid du Colombier 	BusEISA,			/* Extended ISA */
657dd7cddfSDavid du Colombier 	BusFUTURE,			/* IEEE Futurebus */
667dd7cddfSDavid du Colombier 	BusINTERN,			/* Internal bus */
677dd7cddfSDavid du Colombier 	BusISA,				/* Industry Standard Architecture */
687dd7cddfSDavid du Colombier 	BusMBI,				/* Multibus I */
697dd7cddfSDavid du Colombier 	BusMBII,			/* Multibus II */
707dd7cddfSDavid du Colombier 	BusMCA,				/* Micro Channel Architecture */
717dd7cddfSDavid du Colombier 	BusMPI,				/* MPI */
727dd7cddfSDavid du Colombier 	BusMPSA,			/* MPSA */
737dd7cddfSDavid du Colombier 	BusNUBUS,			/* Apple Macintosh NuBus */
747dd7cddfSDavid du Colombier 	BusPCI,				/* Peripheral Component Interconnect */
757dd7cddfSDavid du Colombier 	BusPCMCIA,			/* PC Memory Card International Association */
767dd7cddfSDavid du Colombier 	BusTC,				/* DEC TurboChannel */
777dd7cddfSDavid du Colombier 	BusVL,				/* VESA Local bus */
787dd7cddfSDavid du Colombier 	BusVME,				/* VMEbus */
797dd7cddfSDavid du Colombier 	BusXPRESS,			/* Express System Bus */
807dd7cddfSDavid du Colombier };
817dd7cddfSDavid du Colombier 
827dd7cddfSDavid du Colombier #define MKBUS(t,b,d,f)	(((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
837dd7cddfSDavid du Colombier #define BUSFNO(tbdf)	(((tbdf)>>8)&0x07)
847dd7cddfSDavid du Colombier #define BUSDNO(tbdf)	(((tbdf)>>11)&0x1F)
857dd7cddfSDavid du Colombier #define BUSBNO(tbdf)	(((tbdf)>>16)&0xFF)
867dd7cddfSDavid du Colombier #define BUSTYPE(tbdf)	((tbdf)>>24)
877dd7cddfSDavid du Colombier #define BUSBDF(tbdf)	((tbdf)&0x00FFFF00)
887dd7cddfSDavid du Colombier #define BUSUNKNOWN	(-1)
897dd7cddfSDavid du Colombier 
907dd7cddfSDavid du Colombier enum {
917dd7cddfSDavid du Colombier 	MaxEISA		= 16,
927dd7cddfSDavid du Colombier 	CfgEISA		= 0xC80,
933e12c5d1SDavid du Colombier };
94219b2ee8SDavid du Colombier 
95219b2ee8SDavid du Colombier /*
967dd7cddfSDavid du Colombier  * PCI support code.
97219b2ee8SDavid du Colombier  */
98ade43d10SDavid du Colombier enum {					/* type 0 & type 1 pre-defined header */
997dd7cddfSDavid du Colombier 	PciVID		= 0x00,		/* vendor ID */
1007dd7cddfSDavid du Colombier 	PciDID		= 0x02,		/* device ID */
1017dd7cddfSDavid du Colombier 	PciPCR		= 0x04,		/* command */
1027dd7cddfSDavid du Colombier 	PciPSR		= 0x06,		/* status */
1037dd7cddfSDavid du Colombier 	PciRID		= 0x08,		/* revision ID */
1047dd7cddfSDavid du Colombier 	PciCCRp		= 0x09,		/* programming interface class code */
1057dd7cddfSDavid du Colombier 	PciCCRu		= 0x0A,		/* sub-class code */
1067dd7cddfSDavid du Colombier 	PciCCRb		= 0x0B,		/* base class code */
1077dd7cddfSDavid du Colombier 	PciCLS		= 0x0C,		/* cache line size */
1087dd7cddfSDavid du Colombier 	PciLTR		= 0x0D,		/* latency timer */
1097dd7cddfSDavid du Colombier 	PciHDT		= 0x0E,		/* header type */
1107dd7cddfSDavid du Colombier 	PciBST		= 0x0F,		/* BIST */
111219b2ee8SDavid du Colombier 
1127dd7cddfSDavid du Colombier 	PciBAR0		= 0x10,		/* base address */
1137dd7cddfSDavid du Colombier 	PciBAR1		= 0x14,
114219b2ee8SDavid du Colombier 
1157dd7cddfSDavid du Colombier 	PciINTL		= 0x3C,		/* interrupt line */
1167dd7cddfSDavid du Colombier 	PciINTP		= 0x3D,		/* interrupt pin */
117219b2ee8SDavid du Colombier };
118219b2ee8SDavid du Colombier 
119ade43d10SDavid du Colombier /* ccrb (base class code) values; controller types */
120ade43d10SDavid du Colombier enum {
121ade43d10SDavid du Colombier 	Pcibcpci1	= 0,		/* pci 1.0; no class codes defined */
122ade43d10SDavid du Colombier 	Pcibcstore	= 1,		/* mass storage */
123ade43d10SDavid du Colombier 	Pcibcnet	= 2,		/* network */
124ade43d10SDavid du Colombier 	Pcibcdisp	= 3,		/* display */
125ade43d10SDavid du Colombier 	Pcibcmmedia	= 4,		/* multimedia */
126ade43d10SDavid du Colombier 	Pcibcmem	= 5,		/* memory */
127ade43d10SDavid du Colombier 	Pcibcbridge	= 6,		/* bridge */
128ade43d10SDavid du Colombier 	Pcibccomm	= 7,		/* simple comms (e.g., serial) */
129ade43d10SDavid du Colombier 	Pcibcbasesys	= 8,		/* base system */
130ade43d10SDavid du Colombier 	Pcibcinput	= 9,		/* input */
131ade43d10SDavid du Colombier 	Pcibcdock	= 0xa,		/* docking stations */
132ade43d10SDavid du Colombier 	Pcibcproc	= 0xb,		/* processors */
133ade43d10SDavid du Colombier 	Pcibcserial	= 0xc,		/* serial bus (e.g., USB) */
134ade43d10SDavid du Colombier 	Pcibcwireless	= 0xd,		/* wireless */
135ade43d10SDavid du Colombier 	Pcibcintell	= 0xe,		/* intelligent i/o */
136ade43d10SDavid du Colombier 	Pcibcsatcom	= 0xf,		/* satellite comms */
137ade43d10SDavid du Colombier 	Pcibccrypto	= 0x10,		/* encryption/decryption */
138ade43d10SDavid du Colombier 	Pcibcdacq	= 0x11,		/* data acquisition & signal proc. */
139ade43d10SDavid du Colombier };
140ade43d10SDavid du Colombier 
141ade43d10SDavid du Colombier /* ccru (sub-class code) values; common cases only */
142ade43d10SDavid du Colombier enum {
143ade43d10SDavid du Colombier 	/* mass storage */
144ade43d10SDavid du Colombier 	Pciscscsi	= 0,		/* SCSI */
145ade43d10SDavid du Colombier 	Pciscide	= 1,		/* IDE (ATA) */
146*75cb58dbSDavid du Colombier 	Pciscsata	= 6,		/* SATA */
147ade43d10SDavid du Colombier 
148ade43d10SDavid du Colombier 	/* network */
149ade43d10SDavid du Colombier 	Pciscether	= 0,		/* Ethernet */
150ade43d10SDavid du Colombier 
151ade43d10SDavid du Colombier 	/* display */
152ade43d10SDavid du Colombier 	Pciscvga	= 0,		/* VGA */
153ade43d10SDavid du Colombier 	Pciscxga	= 1,		/* XGA */
154ade43d10SDavid du Colombier 	Pcisc3d		= 2,		/* 3D */
155ade43d10SDavid du Colombier 
156ade43d10SDavid du Colombier 	/* bridges */
157ade43d10SDavid du Colombier 	Pcischostpci	= 0,		/* host/pci */
158ade43d10SDavid du Colombier 	Pciscpcicpci	= 1,		/* pci/pci */
159ade43d10SDavid du Colombier 
160ade43d10SDavid du Colombier 	/* simple comms */
161ade43d10SDavid du Colombier 	Pciscserial	= 0,		/* 16450, etc. */
162ade43d10SDavid du Colombier 	Pciscmultiser	= 1,		/* multiport serial */
163ade43d10SDavid du Colombier 
164ade43d10SDavid du Colombier 	/* serial bus */
165ade43d10SDavid du Colombier 	Pciscusb	= 3,		/* USB */
166ade43d10SDavid du Colombier };
167ade43d10SDavid du Colombier 
1687dd7cddfSDavid du Colombier enum {					/* type 0 pre-defined header */
1697dd7cddfSDavid du Colombier 	PciCIS		= 0x28,		/* cardbus CIS pointer */
1707dd7cddfSDavid du Colombier 	PciSVID		= 0x2C,		/* subsystem vendor ID */
1717dd7cddfSDavid du Colombier 	PciSID		= 0x2E,		/* cardbus CIS pointer */
1727dd7cddfSDavid du Colombier 	PciEBAR0	= 0x30,		/* expansion ROM base address */
1737dd7cddfSDavid du Colombier 	PciMGNT		= 0x3E,		/* burst period length */
1747dd7cddfSDavid du Colombier 	PciMLT		= 0x3F,		/* maximum latency between bursts */
1757dd7cddfSDavid du Colombier };
1767dd7cddfSDavid du Colombier 
1777dd7cddfSDavid du Colombier enum {					/* type 1 pre-defined header */
1787dd7cddfSDavid du Colombier 	PciPBN		= 0x18,		/* primary bus number */
1797dd7cddfSDavid du Colombier 	PciSBN		= 0x19,		/* secondary bus number */
1807dd7cddfSDavid du Colombier 	PciUBN		= 0x1A,		/* subordinate bus number */
1817dd7cddfSDavid du Colombier 	PciSLTR		= 0x1B,		/* secondary latency timer */
1827dd7cddfSDavid du Colombier 	PciIBR		= 0x1C,		/* I/O base */
1837dd7cddfSDavid du Colombier 	PciILR		= 0x1D,		/* I/O limit */
1847dd7cddfSDavid du Colombier 	PciSPSR		= 0x1E,		/* secondary status */
1857dd7cddfSDavid du Colombier 	PciMBR		= 0x20,		/* memory base */
1867dd7cddfSDavid du Colombier 	PciMLR		= 0x22,		/* memory limit */
1877dd7cddfSDavid du Colombier 	PciPMBR		= 0x24,		/* prefetchable memory base */
1887dd7cddfSDavid du Colombier 	PciPMLR		= 0x26,		/* prefetchable memory limit */
1897dd7cddfSDavid du Colombier 	PciPUBR		= 0x28,		/* prefetchable base upper 32 bits */
1907dd7cddfSDavid du Colombier 	PciPULR		= 0x2C,		/* prefetchable limit upper 32 bits */
1917dd7cddfSDavid du Colombier 	PciIUBR		= 0x30,		/* I/O base upper 16 bits */
1927dd7cddfSDavid du Colombier 	PciIULR		= 0x32,		/* I/O limit upper 16 bits */
1937dd7cddfSDavid du Colombier 	PciEBAR1	= 0x28,		/* expansion ROM base address */
1947dd7cddfSDavid du Colombier 	PciBCR		= 0x3E,		/* bridge control register */
1957dd7cddfSDavid du Colombier };
1967dd7cddfSDavid du Colombier 
1977dd7cddfSDavid du Colombier enum {					/* type 2 pre-defined header */
1987dd7cddfSDavid du Colombier 	PciCBExCA	= 0x10,
1997dd7cddfSDavid du Colombier 	PciCBSPSR	= 0x16,
2007dd7cddfSDavid du Colombier 	PciCBPBN	= 0x18,		/* primary bus number */
2017dd7cddfSDavid du Colombier 	PciCBSBN	= 0x19,		/* secondary bus number */
2027dd7cddfSDavid du Colombier 	PciCBUBN	= 0x1A,		/* subordinate bus number */
2037dd7cddfSDavid du Colombier 	PciCBSLTR	= 0x1B,		/* secondary latency timer */
2047dd7cddfSDavid du Colombier 	PciCBMBR0	= 0x1C,
2057dd7cddfSDavid du Colombier 	PciCBMLR0	= 0x20,
2067dd7cddfSDavid du Colombier 	PciCBMBR1	= 0x24,
2077dd7cddfSDavid du Colombier 	PciCBMLR1	= 0x28,
2087dd7cddfSDavid du Colombier 	PciCBIBR0	= 0x2C,		/* I/O base */
2097dd7cddfSDavid du Colombier 	PciCBILR0	= 0x30,		/* I/O limit */
2107dd7cddfSDavid du Colombier 	PciCBIBR1	= 0x34,		/* I/O base */
2117dd7cddfSDavid du Colombier 	PciCBILR1	= 0x38,		/* I/O limit */
2127dd7cddfSDavid du Colombier 	PciCBSVID	= 0x40,		/* subsystem vendor ID */
2137dd7cddfSDavid du Colombier 	PciCBSID	= 0x42,		/* subsystem ID */
2147dd7cddfSDavid du Colombier 	PciCBLMBAR	= 0x44,		/* legacy mode base address */
2157dd7cddfSDavid du Colombier };
2167dd7cddfSDavid du Colombier 
2177dd7cddfSDavid du Colombier typedef struct Pcisiz Pcisiz;
2187dd7cddfSDavid du Colombier struct Pcisiz
2197dd7cddfSDavid du Colombier {
2207dd7cddfSDavid du Colombier 	Pcidev*	dev;
2217dd7cddfSDavid du Colombier 	int	siz;
2227dd7cddfSDavid du Colombier 	int	bar;
2237dd7cddfSDavid du Colombier };
2247dd7cddfSDavid du Colombier 
2257dd7cddfSDavid du Colombier typedef struct Pcidev Pcidev;
2267dd7cddfSDavid du Colombier struct Pcidev
2277dd7cddfSDavid du Colombier {
2287dd7cddfSDavid du Colombier 	int	tbdf;			/* type+bus+device+function */
2297dd7cddfSDavid du Colombier 	ushort	vid;			/* vendor ID */
2307dd7cddfSDavid du Colombier 	ushort	did;			/* device ID */
2317dd7cddfSDavid du Colombier 
232e569ccb5SDavid du Colombier 	ushort	pcr;
233e569ccb5SDavid du Colombier 
2347dd7cddfSDavid du Colombier 	uchar	rid;
2357dd7cddfSDavid du Colombier 	uchar	ccrp;
2367dd7cddfSDavid du Colombier 	uchar	ccru;
2377dd7cddfSDavid du Colombier 	uchar	ccrb;
238e569ccb5SDavid du Colombier 	uchar	cls;
239e569ccb5SDavid du Colombier 	uchar	ltr;
2407dd7cddfSDavid du Colombier 
2417dd7cddfSDavid du Colombier 	struct {
2427dd7cddfSDavid du Colombier 		ulong	bar;		/* base address */
2437dd7cddfSDavid du Colombier 		int	size;
2447dd7cddfSDavid du Colombier 	} mem[6];
2457dd7cddfSDavid du Colombier 
2469a747e4fSDavid du Colombier 	struct {
2479a747e4fSDavid du Colombier 		ulong	bar;
2489a747e4fSDavid du Colombier 		int	size;
2499a747e4fSDavid du Colombier 	} rom;
2507dd7cddfSDavid du Colombier 	uchar	intl;			/* interrupt line */
2517dd7cddfSDavid du Colombier 
2527dd7cddfSDavid du Colombier 	Pcidev*	list;
2537dd7cddfSDavid du Colombier 	Pcidev*	link;			/* next device on this bno */
2547dd7cddfSDavid du Colombier 
2557dd7cddfSDavid du Colombier 	Pcidev*	bridge;			/* down a bus */
2567dd7cddfSDavid du Colombier 	struct {
2577dd7cddfSDavid du Colombier 		ulong	bar;
2587dd7cddfSDavid du Colombier 		int	size;
2597dd7cddfSDavid du Colombier 	} ioa, mema;
260e569ccb5SDavid du Colombier 
261e569ccb5SDavid du Colombier 	int	pmrb;			/* power management register block */
2627dd7cddfSDavid du Colombier };
2637dd7cddfSDavid du Colombier 
264d5789509SDavid du Colombier enum {
265d5789509SDavid du Colombier 	/* vendor ids */
266*75cb58dbSDavid du Colombier 	Vatiamd	= 0x1002,
267d5789509SDavid du Colombier 	Vintel	= 0x8086,
268*75cb58dbSDavid du Colombier 	Vjmicron= 0x197b,
269*75cb58dbSDavid du Colombier 	Vmarvell= 0x1b4b,
270d5789509SDavid du Colombier 	Vmyricom= 0x14c1,
271d5789509SDavid du Colombier };
272d5789509SDavid du Colombier 
2737dd7cddfSDavid du Colombier #define PCIWINDOW	0
2747dd7cddfSDavid du Colombier #define PCIWADDR(va)	(PADDR(va)+PCIWINDOW)
2757dd7cddfSDavid du Colombier #define ISAWINDOW	0
2767dd7cddfSDavid du Colombier #define ISAWADDR(va)	(PADDR(va)+ISAWINDOW)
2777dd7cddfSDavid du Colombier 
2787dd7cddfSDavid du Colombier /* SMBus transactions */
2797dd7cddfSDavid du Colombier enum
2807dd7cddfSDavid du Colombier {
2817dd7cddfSDavid du Colombier 	SMBquick,		/* sends address only */
2827dd7cddfSDavid du Colombier 
2837dd7cddfSDavid du Colombier 	/* write */
2847dd7cddfSDavid du Colombier 	SMBsend,		/* sends address and cmd */
2857dd7cddfSDavid du Colombier 	SMBbytewrite,		/* sends address and cmd and 1 byte */
2867dd7cddfSDavid du Colombier 	SMBwordwrite,		/* sends address and cmd and 2 bytes */
2877dd7cddfSDavid du Colombier 
2887dd7cddfSDavid du Colombier 	/* read */
2897dd7cddfSDavid du Colombier 	SMBrecv,		/* sends address, recvs 1 byte */
2907dd7cddfSDavid du Colombier 	SMBbyteread,		/* sends address and cmd, recv's byte */
2917dd7cddfSDavid du Colombier 	SMBwordread,		/* sends address and cmd, recv's 2 bytes */
2927dd7cddfSDavid du Colombier };
2937dd7cddfSDavid du Colombier 
2947dd7cddfSDavid du Colombier typedef struct SMBus SMBus;
2957dd7cddfSDavid du Colombier struct SMBus {
2967dd7cddfSDavid du Colombier 	QLock;		/* mutex */
2977dd7cddfSDavid du Colombier 	Rendez	r;	/* rendezvous point for completion interrupts */
2987dd7cddfSDavid du Colombier 	void	*arg;	/* implementation dependent */
2997dd7cddfSDavid du Colombier 	ulong	base;	/* port or memory base of smbus */
3007dd7cddfSDavid du Colombier 	int	busy;
3017dd7cddfSDavid du Colombier 	void	(*transact)(SMBus*, int, int, int, uchar*);
3027dd7cddfSDavid du Colombier };
30380ee5cbfSDavid du Colombier 
30480ee5cbfSDavid du Colombier /*
30580ee5cbfSDavid du Colombier  * PCMCIA support code.
30680ee5cbfSDavid du Colombier  */
30780ee5cbfSDavid du Colombier 
30880ee5cbfSDavid du Colombier typedef struct PCMslot		PCMslot;
30980ee5cbfSDavid du Colombier typedef struct PCMconftab	PCMconftab;
31080ee5cbfSDavid du Colombier 
31180ee5cbfSDavid du Colombier /*
31280ee5cbfSDavid du Colombier  * Map between ISA memory space and PCMCIA card memory space.
31380ee5cbfSDavid du Colombier  */
31480ee5cbfSDavid du Colombier struct PCMmap {
31580ee5cbfSDavid du Colombier 	ulong	ca;			/* card address */
31680ee5cbfSDavid du Colombier 	ulong	cea;			/* card end address */
31780ee5cbfSDavid du Colombier 	ulong	isa;			/* ISA address */
31880ee5cbfSDavid du Colombier 	int	len;			/* length of the ISA area */
31980ee5cbfSDavid du Colombier 	int	attr;			/* attribute memory */
32080ee5cbfSDavid du Colombier 	int	ref;
32180ee5cbfSDavid du Colombier };
32280ee5cbfSDavid du Colombier 
32380ee5cbfSDavid du Colombier /* configuration table entry */
32480ee5cbfSDavid du Colombier struct PCMconftab
32580ee5cbfSDavid du Colombier {
32680ee5cbfSDavid du Colombier 	int	index;
32780ee5cbfSDavid du Colombier 	ushort	irqs;		/* legal irqs */
32880ee5cbfSDavid du Colombier 	uchar	irqtype;
32980ee5cbfSDavid du Colombier 	uchar	bit16;		/* true for 16 bit access */
33080ee5cbfSDavid du Colombier 	struct {
33180ee5cbfSDavid du Colombier 		ulong	start;
33280ee5cbfSDavid du Colombier 		ulong	len;
33380ee5cbfSDavid du Colombier 	} io[16];
33480ee5cbfSDavid du Colombier 	int	nio;
33580ee5cbfSDavid du Colombier 	uchar	vpp1;
33680ee5cbfSDavid du Colombier 	uchar	vpp2;
33780ee5cbfSDavid du Colombier 	uchar	memwait;
33880ee5cbfSDavid du Colombier 	ulong	maxwait;
33980ee5cbfSDavid du Colombier 	ulong	readywait;
34080ee5cbfSDavid du Colombier 	ulong	otherwait;
34180ee5cbfSDavid du Colombier };
34280ee5cbfSDavid du Colombier 
34380ee5cbfSDavid du Colombier /* a card slot */
34480ee5cbfSDavid du Colombier struct PCMslot
34580ee5cbfSDavid du Colombier {
34680ee5cbfSDavid du Colombier 	Lock;
34780ee5cbfSDavid du Colombier 	int	ref;
34880ee5cbfSDavid du Colombier 
34980ee5cbfSDavid du Colombier 	void	*cp;		/* controller for this slot */
35080ee5cbfSDavid du Colombier 	long	memlen;		/* memory length */
35180ee5cbfSDavid du Colombier 	uchar	base;		/* index register base */
35280ee5cbfSDavid du Colombier 	uchar	slotno;		/* slot number */
35380ee5cbfSDavid du Colombier 
35480ee5cbfSDavid du Colombier 	/* status */
35580ee5cbfSDavid du Colombier 	uchar	special;	/* in use for a special device */
35680ee5cbfSDavid du Colombier 	uchar	already;	/* already inited */
35780ee5cbfSDavid du Colombier 	uchar	occupied;
35880ee5cbfSDavid du Colombier 	uchar	battery;
35980ee5cbfSDavid du Colombier 	uchar	wrprot;
36080ee5cbfSDavid du Colombier 	uchar	powered;
36180ee5cbfSDavid du Colombier 	uchar	configed;
36280ee5cbfSDavid du Colombier 	uchar	enabled;
36380ee5cbfSDavid du Colombier 	uchar	busy;
36480ee5cbfSDavid du Colombier 
36580ee5cbfSDavid du Colombier 	/* cis info */
36680ee5cbfSDavid du Colombier 	ulong	msec;		/* time of last slotinfo call */
36780ee5cbfSDavid du Colombier 	char	verstr[512];	/* version string */
36815174232SDavid du Colombier 	int	ncfg;		/* number of configurations */
36915174232SDavid du Colombier 	struct {
37015174232SDavid du Colombier 		ushort	cpresent;	/* config registers present */
37180ee5cbfSDavid du Colombier 		ulong	caddr;		/* relative address of config registers */
37215174232SDavid du Colombier 	} cfg[8];
37380ee5cbfSDavid du Colombier 	int	nctab;		/* number of config table entries */
37480ee5cbfSDavid du Colombier 	PCMconftab	ctab[8];
37580ee5cbfSDavid du Colombier 	PCMconftab	*def;	/* default conftab */
37680ee5cbfSDavid du Colombier 
37780ee5cbfSDavid du Colombier 	/* memory maps */
37880ee5cbfSDavid du Colombier 	Lock	mlock;		/* lock down the maps */
37980ee5cbfSDavid du Colombier 	int	time;
38080ee5cbfSDavid du Colombier 	PCMmap	mmap[4];	/* maps, last is always for the kernel */
38180ee5cbfSDavid du Colombier };
38225fc6993SDavid du Colombier 
38325fc6993SDavid du Colombier #pragma varargck	type	"T"	int
38425fc6993SDavid du Colombier #pragma varargck	type	"T"	uint
385