00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __pc_pci_h
00009 #define __pc_pci_h
00010
00011 #include <pci.h>
00012
00013 __BEGIN_SYS
00014
00015 class PC_PCI: public PCI_Common
00016 {
00017 private:
00018 typedef Traits<PC_PCI> _Traits;
00019
00020
00021 static const int MAX_BUS = _Traits::MAX_BUS;
00022 static const int MAX_DEV_FN = _Traits::MAX_DEV_FN;
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 static const int CONFADDR = 0xcf8;
00037
00038
00039
00040
00041 static const int CONFDATA = 0xcfc;
00042
00043 public:
00044 PC_PCI() {}
00045 ~PC_PCI() {}
00046
00047 void header(const Locator & l, Header * h);
00048 Locator scan(const Class_Id & c, int order);
00049 Locator scan(const Vendor_Id & v, const Device_Id & d, int order);
00050
00051 static int init(System_Info * si);
00052
00053 private:
00054 int cmd(CPU::Reg8 bus, CPU::Reg8 dev_fn, CPU::Reg8 addr) {
00055 return 0x80000000 | (bus << 16) | (dev_fn << 8) | (addr & ~3);
00056 }
00057
00058 CPU::Reg8 cfg8(CPU::Reg8 bus, CPU::Reg8 dev_fn, CPU::Reg8 addr) {
00059 IA32::out32(CONFADDR, cmd(bus, dev_fn, addr));
00060 return IA32::in8(CONFDATA + (addr & 3));
00061 }
00062 CPU::Reg16 cfg16(CPU::Reg8 bus, CPU::Reg8 dev_fn, CPU::Reg8 addr) {
00063 IA32::out32(CONFADDR, cmd(bus, dev_fn, addr));
00064 return IA32::in16(CONFDATA + (addr & 2));
00065 }
00066 CPU::Reg32 cfg32(CPU::Reg8 bus, CPU::Reg8 dev_fn, CPU::Reg8 addr) {
00067 IA32::out32(CONFADDR, cmd(bus, dev_fn, addr));
00068 return IA32::in32(CONFDATA);
00069 }
00070 void cfg8(CPU::Reg8 bus, CPU::Reg8 dev_fn, CPU::Reg8 addr, CPU::Reg8 value) {
00071 IA32::out32(CONFADDR, cmd(bus, dev_fn, addr));
00072 IA32::out8(CONFDATA + (addr & 3), value);
00073 }
00074 void cfg16(CPU::Reg8 bus, CPU::Reg8 dev_fn, CPU::Reg8 addr, CPU::Reg16 value) {
00075 IA32::out32(CONFADDR, cmd(bus,dev_fn,addr));
00076 IA32::out16(CONFDATA + (addr & 2), value);
00077 }
00078 void cfg32(CPU::Reg8 bus, CPU::Reg8 dev_fn, CPU::Reg8 addr, CPU::Reg32 value) {
00079 IA32::out32(CONFADDR, cmd(bus, dev_fn, addr));
00080 IA32::out32(CONFDATA, value);
00081 }
00082
00083 CPU::Reg16 vendor_id(CPU::Reg8 bus, CPU::Reg8 dev_fn) {
00084 return cfg16(bus, dev_fn, VENDOR_ID);
00085 }
00086 CPU::Reg16 device_id(CPU::Reg8 bus, CPU::Reg8 dev_fn) {
00087 return cfg16(bus, dev_fn, DEVICE_ID);
00088 }
00089 CPU::Reg16 class_id(CPU::Reg8 bus, CPU::Reg8 dev_fn) {
00090 return cfg16(bus, dev_fn, CLASS_ID);
00091 }
00092
00093 private:
00094 static CPU::Reg32 base_address[Region::N];
00095 };
00096
00097 __END_SYS
00098
00099 #endif