changeset 0731d632db76 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=0731d632db76
description:
        ARM: Add support for a dumb IDE controller

diffstat:

 configs/common/FSConfig.py |  10 ++++++++++
 src/dev/Ide.py             |   2 ++
 src/dev/arm/realview.cc    |   6 ++----
 src/dev/ide_ctrl.cc        |  16 +++++++++++++++-
 src/dev/ide_ctrl.hh        |   2 ++
 src/dev/pcidev.cc          |   3 ++-
 6 files changed, 33 insertions(+), 6 deletions(-)

diffs (119 lines):

diff -r 859e8bc1cdc2 -r 0731d632db76 configs/common/FSConfig.py
--- a/configs/common/FSConfig.py        Mon Nov 15 14:04:03 2010 -0600
+++ b/configs/common/FSConfig.py        Mon Nov 15 14:04:03 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 859e8bc1cdc2 -r 0731d632db76 src/dev/Ide.py
--- a/src/dev/Ide.py    Mon Nov 15 14:04:03 2010 -0600
+++ b/src/dev/Ide.py    Mon Nov 15 14:04:03 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 859e8bc1cdc2 -r 0731d632db76 src/dev/arm/realview.cc
--- a/src/dev/arm/realview.cc   Mon Nov 15 14:04:03 2010 -0600
+++ b/src/dev/arm/realview.cc   Mon Nov 15 14:04:03 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 859e8bc1cdc2 -r 0731d632db76 src/dev/ide_ctrl.cc
--- a/src/dev/ide_ctrl.cc       Mon Nov 15 14:04:03 2010 -0600
+++ b/src/dev/ide_ctrl.cc       Mon Nov 15 14:04:03 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 859e8bc1cdc2 -r 0731d632db76 src/dev/ide_ctrl.hh
--- a/src/dev/ide_ctrl.hh       Mon Nov 15 14:04:03 2010 -0600
+++ b/src/dev/ide_ctrl.hh       Mon Nov 15 14:04:03 2010 -0600
@@ -133,6 +133,8 @@
     bool ioEnabled;
     bool bmEnabled;
 
+    uint32_t ioShift, ctrlOffset;
+
     void dispatchAccess(PacketPtr pkt, bool read);
 
   public:
diff -r 859e8bc1cdc2 -r 0731d632db76 src/dev/pcidev.cc
--- a/src/dev/pcidev.cc Mon Nov 15 14:04:03 2010 -0600
+++ b/src/dev/pcidev.cc Mon Nov 15 14:04:03 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));
 }
 
 
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to