#ifndef __pci_h__ #define __pci_h__ #include "type.h" #include "io.h" template struct PciConfAccessor { Relative > addr; Relative > data; }; #define pciBsf(bus,slot,function) ((0x80<<24)|(bus<<16) | (slot<<11) | (function<<8)) template struct PciConfReg { type justForPointerArithmetic; #if 0 static PciConfAccessor * const pciConfAccessor=((PciConfAccessor* const)0xcf8); operator type() { pciConfAccessor->addr=(U32)this; return pciConfAccessor->data; } PciConfReg& operator =(type v) { pciConfAccessor->addr=(U32)this; pciConfAccessor->data=v; return *this; } #else operator type() { ((PciConfAccessor* const)0xcf8)->addr=(U32)this; return ((PciConfAccessor* const)0xcf8)->data; } PciConfReg& operator =(type v) { ((PciConfAccessor* const)0xcf8)->addr=(U32)this; ((PciConfAccessor* const)0xcf8)->data=v; return *this; } #endif }; struct PciConf { inline static PciConf* bsf(U32 bus,U32 slot,U32 function) { return (PciConf*) (pciBsf(bus,slot,function)); } RelativeRef ,0x00> regs; Relative > vendorDeviceId; Relative > vendorId; Relative > deviceId; Relative > commandStatus; Relative > command; Relative > status; Relative > revision; Relative > programmingIf; Relative > subclass; Relative > mainclass; Relative > cacheLineSize; Relative > latencyTimer; Relative > headerType; Relative > bist; RelativeRef ,0x10> baseAddresses; Relative > cis; Relative > subVendorId; Relative > systemId; Relative > expansionRom; Relative > reserved0; Relative > reserved1; Relative > intLine; Relative > intPin; Relative > minGrant; Relative > maxLatency; Relative > specialUse; Relative > mode; }; typedef struct OnDevice { U32 vendorDevice; void (*handle)(PciConf *pci); }OnDevice; extern void pciScan(const OnDevice *onDevices); #endif /* __pci_h__ */