| /* | 
 |  * This file is part of the UCB release of Plan 9. It is subject to the license | 
 |  * terms in the LICENSE file found in the top-level directory of this | 
 |  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No | 
 |  * part of the UCB release of Plan 9, including this file, may be copied, | 
 |  * modified, propagated, or distributed except according to the terms contained | 
 |  * in the LICENSE file. | 
 |  */ | 
 |  | 
 | #pragma once | 
 |  | 
 | enum { | 
 | 	BusCBUS = 0,				/* Corollary CBUS */ | 
 | 	BusCBUSII,	/* Corollary CBUS II */ | 
 | 	BusEISA,	/* Extended ISA */ | 
 | 	BusFUTURE,	/* IEEE Futurebus */ | 
 | 	BusINTERN,	/* Internal bus */ | 
 | 	BusISA,	/* Industry Standard Architecture */ | 
 | 	BusMBI,	/* Multibus I */ | 
 | 	BusMBII,	/* Multibus II */ | 
 | 	BusMCA,	/* Micro Channel Architecture */ | 
 | 	BusMPI,	/* MPI */ | 
 | 	BusMPSA,	/* MPSA */ | 
 | 	BusNUBUS,	/* Apple Macintosh NuBus */ | 
 | 	BusPCI,	/* Peripheral Component Interconnect */ | 
 | 	BusPCMCIA,	/* PC Memory Card International Association */ | 
 | 	BusTC,	/* DEC TurboChannel */ | 
 | 	BusVL,	/* VESA Local bus */ | 
 | 	BusVME,	/* VMEbus */ | 
 | 	BusXPRESS,	/* Express System Bus */ | 
 | 	BusLAPIC,	/* Local APIC, fake type */ | 
 | 	BusIPI,	/* IPIs, fake type like the LAPIC */ | 
 | }; | 
 |  | 
 | #define MKBUS(t,b,d,f)	(((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8)) | 
 | #define BUSFNO(tbdf)	(((tbdf)>>8)&0x07) | 
 | #define BUSDNO(tbdf)	(((tbdf)>>11)&0x1F) | 
 | #define BUSBNO(tbdf)	(((tbdf)>>16)&0xFF) | 
 | #define BUSTYPE(tbdf)	((tbdf)>>24) | 
 | #define BUSBDF(tbdf)	((tbdf)&0x00FFFF00) | 
 | #define BUSUNKNOWN	(-1) | 
 |  | 
 | enum { | 
 | 	MaxEISA = 16, | 
 | 	CfgEISA = 0xC80, | 
 | }; | 
 |  | 
 | /* IO Ports */ | 
 |  | 
 | #define CMOS_RAM_IDX			0x70 | 
 | #define CMOS_RAM_DATA			0x71 | 
 |  | 
 | /* | 
 |  * PCI support code. | 
 |  */ | 
 | enum {			/* type 0 and type 1 pre-defined header */ | 
 | 	PciVID = 0x00,	/* vendor ID */ | 
 | 	PciDID = 0x02,	/* device ID */ | 
 | 	PciPCR = 0x04,	/* command */ | 
 | 	PciPSR = 0x06,	/* status */ | 
 | 	PciRID = 0x08,	/* revision ID */ | 
 | 	PciCCRp = 0x09,	/* programming interface class code */ | 
 | 	PciCCRu = 0x0A,	/* sub-class code */ | 
 | 	PciCCRb = 0x0B,	/* base class code */ | 
 | 	PciCLS = 0x0C,	/* cache line size */ | 
 | 	PciLTR = 0x0D,	/* latency timer */ | 
 | 	PciHDT = 0x0E,	/* header type */ | 
 | 	PciBST = 0x0F,	/* BIST */ | 
 |  | 
 | 	PciBAR0 = 0x10,	/* base address */ | 
 | 	PciBAR1 = 0x14, | 
 |  | 
 | 	PciCP = 0x34,	/* capabilities pointer */ | 
 |  | 
 | 	PciINTL = 0x3C,	/* interrupt line */ | 
 | 	PciINTP = 0x3D,	/* interrupt pin */ | 
 | }; | 
 |  | 
 | /* ccrb (base class code) values; controller types */ | 
 | enum { | 
 | 	Pcibcpci1 = 0,		/* pci 1.0; no class codes defined */ | 
 | 	Pcibcstore = 1,		/* mass storage */ | 
 | 	Pcibcnet = 2,		/* network */ | 
 | 	Pcibcdisp = 3,		/* display */ | 
 | 	Pcibcmmedia = 4,	/* multimedia */ | 
 | 	Pcibcmem = 5,		/* memory */ | 
 | 	Pcibcbridge = 6,	/* bridge */ | 
 | 	Pcibccomm = 7,		/* simple comms (e.g., serial) */ | 
 | 	Pcibcbasesys = 8,	/* base system */ | 
 | 	Pcibcinput = 9,		/* input */ | 
 | 	Pcibcdock = 0xa,	/* docking stations */ | 
 | 	Pcibcproc = 0xb,	/* processors */ | 
 | 	Pcibcserial = 0xc,	/* serial bus (e.g., USB) */ | 
 | 	Pcibcwireless = 0xd,	/* wireless */ | 
 | 	Pcibcintell = 0xe,	/* intelligent i/o */ | 
 | 	Pcibcsatcom = 0xf,	/* satellite comms */ | 
 | 	Pcibccrypto = 0x10,	/* encryption/decryption */ | 
 | 	Pcibcdacq = 0x11,	/* data acquisition & signal proc. */ | 
 | }; | 
 |  | 
 | /* ccru (sub-class code) values; common cases only */ | 
 | enum { | 
 | 	/* mass storage */ | 
 | 	Pciscscsi = 0,		/* SCSI */ | 
 | 	Pciscide = 1,		/* IDE (ATA) */ | 
 | 	Pciscsata = 6,		/* SATA */ | 
 |  | 
 | 	/* network */ | 
 | 	Pciscether = 0,		/* Ethernet */ | 
 |  | 
 | 	/* display */ | 
 | 	Pciscvga = 0,		/* VGA */ | 
 | 	Pciscxga = 1,		/* XGA */ | 
 | 	Pcisc3d = 2,		/* 3D */ | 
 |  | 
 | 	/* bridges */ | 
 | 	Pcischostpci = 0,	/* host/pci */ | 
 | 	Pciscpcicpci = 1,	/* pci/pci */ | 
 |  | 
 | 	/* simple comms */ | 
 | 	Pciscserial = 0,	/* 16450, etc. */ | 
 | 	Pciscmultiser = 1,	/* multiport serial */ | 
 |  | 
 | 	/* serial bus */ | 
 | 	Pciscusb = 3,	/* USB */ | 
 | }; | 
 |  | 
 | enum {			/* type 0 pre-defined header */ | 
 | 	PciCIS = 0x28,	/* cardbus CIS pointer */ | 
 | 	PciSVID = 0x2C,	/* subsystem vendor ID */ | 
 | 	PciSID = 0x2E,	/* cardbus CIS pointer */ | 
 | 	PciEBAR0 = 0x30,/* expansion ROM base address */ | 
 | 	PciMGNT = 0x3E,	/* burst period length */ | 
 | 	PciMLT = 0x3F,	/* maximum latency between bursts */ | 
 | }; | 
 |  | 
 | enum {			/* type 1 pre-defined header */ | 
 | 	PciPBN = 0x18,	/* primary bus number */ | 
 | 	PciSBN = 0x19,	/* secondary bus number */ | 
 | 	PciUBN = 0x1A,	/* subordinate bus number */ | 
 | 	PciSLTR = 0x1B,	/* secondary latency timer */ | 
 | 	PciIBR = 0x1C,	/* I/O base */ | 
 | 	PciILR = 0x1D,	/* I/O limit */ | 
 | 	PciSPSR = 0x1E,	/* secondary status */ | 
 | 	PciMBR = 0x20,	/* memory base */ | 
 | 	PciMLR = 0x22,	/* memory limit */ | 
 | 	PciPMBR = 0x24,	/* prefetchable memory base */ | 
 | 	PciPMLR = 0x26,	/* prefetchable memory limit */ | 
 | 	PciPUBR = 0x28,	/* prefetchable base upper 32 bits */ | 
 | 	PciPULR = 0x2C,	/* prefetchable limit upper 32 bits */ | 
 | 	PciIUBR = 0x30,	/* I/O base upper 16 bits */ | 
 | 	PciIULR = 0x32,	/* I/O limit upper 16 bits */ | 
 | 	PciEBAR1 = 0x28,/* expansion ROM base address */ | 
 | 	PciBCR = 0x3E,	/* bridge control register */ | 
 | }; | 
 |  | 
 | enum {				/* type 2 pre-defined header */ | 
 | 	PciCBExCA = 0x10, | 
 | 	PciCBSPSR = 0x16, | 
 | 	PciCBPBN = 0x18,	/* primary bus number */ | 
 | 	PciCBSBN = 0x19,	/* secondary bus number */ | 
 | 	PciCBUBN = 0x1A,	/* subordinate bus number */ | 
 | 	PciCBSLTR = 0x1B,	/* secondary latency timer */ | 
 | 	PciCBMBR0 = 0x1C, | 
 | 	PciCBMLR0 = 0x20, | 
 | 	PciCBMBR1 = 0x24, | 
 | 	PciCBMLR1 = 0x28, | 
 | 	PciCBIBR0 = 0x2C,	/* I/O base */ | 
 | 	PciCBILR0 = 0x30,	/* I/O limit */ | 
 | 	PciCBIBR1 = 0x34,	/* I/O base */ | 
 | 	PciCBILR1 = 0x38,	/* I/O limit */ | 
 | 	PciCBSVID = 0x40,	/* subsystem vendor ID */ | 
 | 	PciCBSID = 0x42,	/* subsystem ID */ | 
 | 	PciCBLMBAR = 0x44,	/* legacy mode base address */ | 
 | }; | 
 |  | 
 | /* capabilities */ | 
 | enum { | 
 | 	PciCapPMG = 0x01,	/* power management */ | 
 | 	PciCapAGP = 0x02, | 
 | 	PciCapVPD = 0x03,	/* vital product data */ | 
 | 	PciCapSID = 0x04,	/* slot id */ | 
 | 	PciCapMSI = 0x05, | 
 | 	PciCapCHS = 0x06,	/* compact pci hot swap */ | 
 | 	PciCapPCIX = 0x07, | 
 | 	PciCapHTC = 0x08,	/* hypertransport irq conf */ | 
 | 	PciCapVND = 0x09,	/* vendor specific information */ | 
 | 	PciCapPCIe = 0x10, | 
 | 	PciCapMSIX = 0x11, | 
 | 	PciCapSATA = 0x12, | 
 | 	PciCapHSW = 0x0c,	/* hot swap */ | 
 | }; | 
 | #if 0 | 
 | struct Pcisiz { | 
 | //  Pcidev* dev; | 
 | 	int siz; | 
 | 	int bar; | 
 | }; | 
 |  | 
 | struct Pcidev { | 
 | 	int tbdf;					/* type+bus+device+function */ | 
 | 	ushort vid;					/* vendor ID */ | 
 | 	ushort did;					/* device ID */ | 
 |  | 
 | 	ushort pcr; | 
 |  | 
 | 	uchar rid; | 
 | 	uchar ccrp; | 
 | 	uchar ccru; | 
 | 	uchar ccrb; | 
 | 	uchar cls; | 
 | 	uchar ltr; | 
 |  | 
 | 	struct { | 
 | 		ulong bar;				/* base address */ | 
 | 		int size; | 
 | 	} mem[6]; | 
 |  | 
 | 	struct { | 
 | 		ulong bar; | 
 | 		int size; | 
 | 	} rom; | 
 | 	uchar intl;					/* interrupt line */ | 
 |  | 
 | 	Pcidev *list; | 
 | 	Pcidev *link;				/* next device on this bno */ | 
 |  | 
 | 	Pcidev *bridge;				/* down a bus */ | 
 | 	struct { | 
 | 		ulong bar; | 
 | 		int size; | 
 | 	} ioa, mema; | 
 | }; | 
 | #endif | 
 | #define PCIWINDOW	0 | 
 | #define PCIWADDR(va)	(PADDR(va)+PCIWINDOW) | 
 | #define ISAWINDOW	0 | 
 | #define ISAWADDR(va)	(PADDR(va)+ISAWINDOW) |