diff -r 0c974db38349 -r f38309a765f4 configs/common/FSConfig.py --- a/configs/common/FSConfig.py Mon Nov 08 17:29:54 2010 -0600 +++ b/configs/common/FSConfig.py Mon Nov 08 17:31:12 2010 -0600 @@ -209,6 +209,16 @@ self.mem_mode = mem_mode + self.cf0 = CowIdeDisk(driveID='master') + self.cf0.childImage(mdesc.disk()) + self.cf_ctrl = IdeController(disks=[self.cf0], + pci_func = 0, pci_dev = 0, pci_bus = 0, + io_shift = 1, ctrl_offset = 2, Command = 0x1, + BAR0 = 0x18000000, BAR0Size = '16B', + BAR1 = 0x18000100, BAR1Size = '1B', + BAR0LegacyIO = True, BAR1LegacyIO = True,) + self.cf_ctrl.pio = self.iobus.port + if machine_type == "RealView_PBX": self.realview = RealViewPBX() elif machine_type == "RealView_EB": diff -r 0c974db38349 -r f38309a765f4 src/dev/Ide.py --- a/src/dev/Ide.py Mon Nov 08 17:29:54 2010 -0600 +++ b/src/dev/Ide.py Mon Nov 08 17:31:12 2010 -0600 @@ -64,3 +64,5 @@ BAR3Size = '4B' BAR4Size = '16B' + io_shift = Param.UInt32(0x0, "IO port shift"); + ctrl_offset = Param.UInt32(0x0, "IDE disk control offset") diff -r 0c974db38349 -r f38309a765f4 src/dev/arm/realview.cc --- a/src/dev/arm/realview.cc Mon Nov 08 17:29:54 2010 -0600 +++ b/src/dev/arm/realview.cc Mon Nov 08 17:31:12 2010 -0600 @@ -108,15 +108,13 @@ Addr RealView::calcPciConfigAddr(int bus, int dev, int func) { - panic("Need implementation\n"); - M5_DUMMY_RETURN + return ULL(-1); } Addr RealView::calcPciIOAddr(Addr addr) { - panic("Need implementation\n"); - M5_DUMMY_RETURN + return addr; } Addr diff -r 0c974db38349 -r f38309a765f4 src/dev/ide_ctrl.hh --- a/src/dev/ide_ctrl.hh Mon Nov 08 17:29:54 2010 -0600 +++ b/src/dev/ide_ctrl.hh Mon Nov 08 17:31:12 2010 -0600 @@ -133,6 +133,8 @@ bool ioEnabled; bool bmEnabled; + uint32_t ioShift, ctrlOffset; + void dispatchAccess(PacketPtr pkt, bool read); public: diff -r 0c974db38349 -r f38309a765f4 src/dev/ide_ctrl.cc --- a/src/dev/ide_ctrl.cc Mon Nov 08 17:29:54 2010 -0600 +++ b/src/dev/ide_ctrl.cc Mon Nov 08 17:31:12 2010 -0600 @@ -84,7 +84,8 @@ primaryTiming(htole(timeRegWithDecodeEn)), secondaryTiming(htole(timeRegWithDecodeEn)), deviceTiming(0), udmaControl(0), udmaTiming(0), ideConfig(0), - ioEnabled(false), bmEnabled(false) + ioEnabled(false), bmEnabled(false), + ioShift(p->io_shift), ctrlOffset(p->ctrl_offset) { if (params()->disks.size() > 3) panic("IDE controllers support a maximum of 4 devices attached!\n"); @@ -106,6 +107,15 @@ primary.select(false); secondary.select(false); + if ((BARAddrs[0] & ~BAR_IO_MASK) != 0){ + primary.cmdAddr = BARAddrs[0]; primary.cmdSize = BARSize[0]; + primary.ctrlAddr = BARAddrs[1]; primary.ctrlSize = BARAddrs[1]; + } + if ((BARAddrs[2] & ~BAR_IO_MASK) != 0){ + secondary.cmdAddr = BARAddrs[2]; secondary.cmdSize = BARSize[2]; + secondary.ctrlAddr = BARAddrs[3]; secondary.ctrlSize = BARAddrs[3]; + } + ioEnabled = (config.command & htole(PCI_CMD_IOSE)); bmEnabled = (config.command & htole(PCI_CMD_BME)); } @@ -441,10 +451,14 @@ if (addr >= primary.cmdAddr && addr < (primary.cmdAddr + primary.cmdSize)) { addr -= primary.cmdAddr; + // linux may have shifted the address by ioShift, + // here we shift it back, similarly for ctrlOffset. + addr >>= ioShift; primary.accessCommand(addr, size, dataPtr, read); } else if (addr >= primary.ctrlAddr && addr < (primary.ctrlAddr + primary.ctrlSize)) { addr -= primary.ctrlAddr; + addr += ctrlOffset; primary.accessControl(addr, size, dataPtr, read); } else if (addr >= secondary.cmdAddr && addr < (secondary.cmdAddr + secondary.cmdSize)) { diff -r 0c974db38349 -r f38309a765f4 src/dev/pcidev.cc --- a/src/dev/pcidev.cc Mon Nov 08 17:29:54 2010 -0600 +++ b/src/dev/pcidev.cc Mon Nov 08 17:31:12 2010 -0600 @@ -76,7 +76,8 @@ bool &snoop) { snoop = false;; - resp.push_back(RangeSize(configAddr, PCI_CONFIG_SIZE+1)); + if (configAddr != ULL(-1)) + resp.push_back(RangeSize(configAddr, PCI_CONFIG_SIZE+1)); }