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 */
BUSUNKNOWN = -1
};
#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)
/*
* PCI support code.
*/
enum { /* type 0 & 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 */
};
/* 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) */
/* 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 */
};
typedef struct Pcisiz Pcisiz;
struct Pcisiz
{
Pcidev* dev;
int siz;
int bar;
};
typedef struct Pcidev Pcidev;
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;
int pmrb; /* power management register block */
};
#define PCIWINDOW 0
#define PCIWADDR(va) (PADDR(va)+PCIWINDOW)
/*
* Kirkwood stuff
*/
enum {
AddrEfuse = PHYSIO+0x1008c,
Addrpci = PHYSIO+0x40000, /* for registers below */
Addrpcibase = PHYSIO+0x41800, /* for registers below */
AddrMpp = PHYSIO+0x10000,
AddrSdio = PHYSIO+0x90000,
};
enum {
Socrevz0,
Socreva0 = 2,
Socreva1,
};
enum {
/* registers; if we actually use these, change to soc.pci(base)->reg */
PciBAR0 = Addrpcibase + 4, /* base address */
PciBAR1 = Addrpcibase + 8,
PciCP = Addrpci + 0x64, /* capabilities pointer */
PciINTL = Addrpci + 0x3c, /* interrupt line */
PciINTP = PciINTL + 1, /* interrupt pin */
};
/*
* interrupt stuff
*/
enum {
Irqlo, Irqhi, Irqbridge,
};
enum {
/* main interrupt cause low register bit #s (LE) */
IRQ0hisum, /* summary of main intr high cause reg */
IRQ0bridge,
IRQ0h2cdoorbell,
IRQ0c2hdoorbell,
_IRQ0reserved0,
IRQ0xor0chan0,
IRQ0xor0chan1,
IRQ0xor1chan0,
IRQ0xor1chan1,
IRQ0pex0int, /* pex = pci-express */
_IRQ0reserved1,
IRQ0gbe0sum,
IRQ0gbe0rx,
IRQ0gbe0tx,
IRQ0gbe0misc,
IRQ0gbe1sum,
IRQ0gbe1rx,
IRQ0gbe1tx,
IRQ0gbe1misc,
IRQ0usb0,
_IRQ0reserved2,
IRQ0sata,
IRQ0crypto,
IRQ0spi,
IRQ0audio,
_IRQ0reserved3,
IRQ0ts0,
_IRQ0reserved4,
IRQ0sdio,
IRQ0twsi,
IRQ0avb,
IRQ0tdm,
/* main interrupt cause high register bit #s (LE) */
_IRQ1reserved0 = 0,
IRQ1uart0,
IRQ1uart1,
IRQ1gpiolo0,
IRQ1gpiolo1,
IRQ1gpiolo2,
IRQ1gpiolo3,
IRQ1gpiohi0,
IRQ1gpiohi1,
IRQ1gpiohi2,
IRQ1gpiohi3,
IRQ1xor0err,
IRQ1xor1err,
IRQ1pex0err,
_IRQ1reserved1,
IRQ1gbe0err,
IRQ1gbe1err,
IRQ1usberr,
IRQ1cryptoerr,
IRQ1audioerr,
_IRQ1reserved2,
_IRQ1reserved3,
IRQ1rtc,
/* bridged-interrupt causes */
IRQcpuself = 0,
IRQcputimer0,
IRQcputimer1,
IRQcputimerwd,
IRQaccesserr,
};
/*
* interrupt controller
*/
typedef struct IntrReg IntrReg;
struct IntrReg
{
struct {
ulong irq; /* main intr cause reg (ro) */
ulong irqmask;
ulong fiqmask;
ulong epmask;
} lo, hi;
};
/*
* CPU control & status (archkw.c and trap.c)
*/
typedef struct CpucsReg CpucsReg;
struct CpucsReg
{
ulong cpucfg;
ulong cpucsr;
ulong rstout;
ulong softreset;
ulong irq; /* mbus(-l) bridge interrupt cause */
ulong irqmask; /* ⋯ mask */
ulong mempm; /* memory power mgmt. control */
ulong clockgate; /* clock enable bits */
ulong biu;
ulong pad0;
ulong l2cfg; /* turn l2 cache on or off, set coherency */
ulong pad1[2];
ulong l2tm0;
ulong l2tm1;
ulong pad2[2];
ulong l2pm;
ulong ram0;
ulong ram1;
ulong ram2;
ulong ram3;
};
enum {
/* cpucfg bits */
Cfgvecinithi = 1<<1, /* boot at 0xffff0000, not 0; default 1 */
Cfgbigendreset = 3<<1, /* init. as big-endian at reset; default 0 */
Cfgiprefetch = 1<<16, /* instruction prefetch enable */
Cfgdprefetch = 1<<17, /* data prefetch enable */
/* cpucsr bits */
Reset = 1<<1, /* reset cpu core */
/* rstout bits */
RstoutPex = 1<<0, /* assert RSTOUTn at pci-e reset */
RstoutWatchdog = 1<<1, /* assert RSTOUTn at watchdog timeout */
RstoutSoft = 1<<2, /* assert RSTOUTn at sw reset */
/* softreset bits */
ResetSystem = 1<<0, /* assert RSTOUTn pin on SoftRstOutEn */
/* l2cfg bits */
L2ecc = 1<<2,
L2exists = 1<<3, /* l2 cache doesn't ignore cpu */
L2writethru = 1<<4, /* always WT, else see PTE C & B */
};
enum {
/* from 88f6281 func'l specs (MV-S104860-00), tables 2 & 3, chapter 2 */
Targdram = 0, /* ddr sdram */
Targflash = 1,
Targcesasram = 3, /* security accelerator sram */
/* attributes */
Attrcs0 = 0xe, /* chip select 0 (low dram) */
Attrcs1 = 0xd, /* chip select 1 (high dram) */
Attrbootrom = 0x1d,
Attrspi = 0x1e,
Attrnand = 0x2f,
Winenable = 1<<0,
};
typedef struct Pciex Pciex;
struct Pciex {
ushort venid; /* 0x11ab means Marvell */
ushort devid; /* 0x6281 means 6281 */
ulong csr;
ulong revid;
ulong bistcache; /* bist hdr type & cache-line size */
ulong bar0;
ulong bar0hi;
ulong bar1;
ulong bar1hi;
ulong bar2;
ulong bar2hi;
ulong _pad0;
ushort ssvenid; /* 0x11ab means Marvell */
ushort ssdevid; /* 0x11ab means Marvell */
ulong rombar;
ulong caplist;
ulong _pad1;
ulong intrpinline; /* interrupt pin & line */
ulong pmcap; /* power mgmt. capability header */
ulong pmcsr; /* power mgmt. control & status */
ulong _pad2[2];
ulong msictl; /* msi message control */
ulong msiaddr;
ulong msiaddrhi;
ulong msidata;
ulong cap;
ulong devcap;
ulong devcsr;
ulong linkcap;
ulong linkcsr;
uchar _pad[0x40100-0x40074];
ulong errrep; /* advanced error report header */
ulong uncorrerr; /* uncorrectable error status */
ulong uncorrerrmask; /* uncorrectable error mask */
ulong uncorrerrsev; /* uncorrectable error severity */
ulong correrr; /* correctable error status */
ulong correrrmask; /* correctable error mask */
ulong errcap; /* advanced error capability & ctl. */
ulong hdrlog[4]; /* header log */
/* continues with more rubbish at 0x41a00. some day... */
};
|