# HG changeset patch
# User Brad Beckmann <brad.beckm...@amd.com>
# Date 1263536245 28800
# Node ID ede19abf2fa6f359994660129a0a36d3020116f5
# Parent  78be42cd81cd9aa96c3f8044af8ae7435e7ca5a6
ruby: FS support using the new configuration system

diff -r 78be42cd81cd -r ede19abf2fa6 configs/common/FSConfig.py
--- a/configs/common/FSConfig.py        Thu Jan 14 22:17:25 2010 -0800
+++ b/configs/common/FSConfig.py        Thu Jan 14 22:17:25 2010 -0800
@@ -79,14 +79,14 @@
 
     return self
 
-def makeLinuxAlphaRubySystem(mem_mode, rubymem, mdesc = None):
+def makeLinuxAlphaRubySystem(mem_mode, phys_mem, mdesc = None):
     class BaseTsunami(Tsunami):
         ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
         ide = IdeController(disks=[Parent.disk0, Parent.disk2],
                             pci_func=0, pci_dev=0, pci_bus=0)
         
 
-    self = LinuxAlphaSystem(physmem = rubymem)
+    self = LinuxAlphaSystem(physmem = phys_mem)
     if not mdesc:
         # generic system
         mdesc = SysConfig()
@@ -94,7 +94,14 @@
 
     # Create pio bus to connect all device pio ports to rubymem's pio port
     self.piobus = Bus(bus_id=0)
-    
+
+    #
+    # Pio functional accesses from devices need direct access to memory
+    # RubyPort currently does support functional accesses.  Therefore provide
+    # the piobus a direct connection to physical memory
+    #
+    self.piobus.port = phys_mem.port
+
     self.disk0 = CowIdeDisk(driveID='master')
     self.disk2 = CowIdeDisk(driveID='master')
     self.disk0.childImage(mdesc.disk())
@@ -104,13 +111,11 @@
     self.tsunami.ide.pio = self.piobus.port
     self.tsunami.ethernet.pio = self.piobus.port
 
-    # connect the dma ports directly to ruby dma ports
-    self.tsunami.ide.dma = self.physmem.dma_port
-    self.tsunami.ethernet.dma = self.physmem.dma_port
+    #
+    # store the dma devices for later connection to dma ruby ports
+    #
+    self.dma_devices = [self.tsunami.ide, self.tsunami.ethernet]
 
-    # connect the pio bus to rubymem
-    self.physmem.pio_port = self.piobus.port
-    
     self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
                                                read_only = True))
     self.intrctrl = IntrControl()
diff -r 78be42cd81cd -r ede19abf2fa6 configs/common/Options.py
--- a/configs/common/Options.py Thu Jan 14 22:17:25 2010 -0800
+++ b/configs/common/Options.py Thu Jan 14 22:17:25 2010 -0800
@@ -34,7 +34,9 @@
 parser.add_option("--caches", action="store_true")
 parser.add_option("--l2cache", action="store_true")
 parser.add_option("--fastmem", action="store_true")
-
+parser.add_option("--clock", action="store", type="string", default='1GHz')
+parser.add_option("--num-dirs", type="int", default=1)
+      
 # Run duration options
 parser.add_option("-m", "--maxtick", type="int", default=m5.MaxTick,
                   metavar="T",
diff -r 78be42cd81cd -r ede19abf2fa6 configs/example/ruby_fs.py
--- a/configs/example/ruby_fs.py        Thu Jan 14 22:17:25 2010 -0800
+++ b/configs/example/ruby_fs.py        Thu Jan 14 22:17:25 2010 -0800
@@ -43,10 +43,10 @@
 if not buildEnv['FULL_SYSTEM']:
     panic("This script requires full-system mode (*_FS).")
 
-addToPath('../../tests/configs/')
 addToPath('../common')
+addToPath('../ruby')
 
-import ruby_config
+import Ruby
 
 from FSConfig import *
 from SysPaths import *
@@ -114,87 +114,25 @@
 test_mem_mode = 'timing'
 FutureClass = None
 
-CPUClass.clock = '1GHz'
+CPUClass.clock = options.clock
 
-#
-# Since we are running in timing mode, set the number of M5 ticks to ruby ticks
-# to the cpu clock frequency
-#
-M5_to_ruby_tick = '1000t'
+physmem = PhysicalMemory()
 
-np = options.num_cpus
+system = makeLinuxAlphaRubySystem(test_mem_mode, physmem, bm[0])
 
-# check for max instruction count
-if options.max_inst:
-    max_inst = options.max_inst
-else:
-    max_inst = 0
-    
-# set cache size
-if options.cache_size:
-    cache_size = options.cache_size
-else:
-    cache_size = 32768 # 32 kB is default
-    
-# set cache assoc
-if options.cache_assoc:
-    cache_assoc = options.cache_assoc
-else:
-    cache_assoc = 8 # 8 is default
-    
-# set map levels
-if options.map_levels:
-    map_levels = options.map_levels
-else:
-    map_levels = 4 # 4 levels is the default
+system.ruby = Ruby.create_system(options,
+                                 physmem,
+                                 system.piobus,
+                                 system.dma_devices)
 
-if options.protocol == "MOESI_hammer":
-    ruby_config_file = "MOESI_hammer-homogeneous.rb"
-elif options.protocol == "MOESI_CMP_token":
-    ruby_config_file = "TwoLevel_SplitL1UnifiedL2.rb"
-elif options.protocol == "MI_example":
-    ruby_config_file = "MI_example-homogeneous.rb"
-else:
-    print "Error: unsupported ruby protocol"
-    sys.exit(1)
+system.cpu = [CPUClass(cpu_id=i) for i in xrange(options.num_cpus)]
 
-#
-# Currently, since ruby configuraiton is separate from m5, we need to manually
-# tell ruby that two dma ports are created by makeLinuxAlphaRubySystem().
-# Eventually, this will be fix with a unified configuration system.
-#
-rubymem = ruby_config.generate(ruby_config_file,
-                               np,
-                               np,
-                               128,
-                               False,
-                               cache_size,
-                               cache_assoc,
-                               map_levels,
-                               2,
-                               M5_to_ruby_tick)
-
-if options.ruby_debug == True:
-  rubymem.debug = True
-  rubymem.debug_file = options.ruby_debug_file
-
-system = makeLinuxAlphaRubySystem(test_mem_mode, rubymem, bm[0])
-
-system.cpu = [CPUClass(cpu_id=i) for i in xrange(np)]
-
-if options.l2cache:
-    print "Error: -l2cache incompatible with ruby, must configure it 
ruby-style"
-    sys.exit(1)
-
-if options.caches:
-    print "Error: -caches incompatible with ruby, must configure it ruby-style"
-    sys.exit(1)
-
-for i in xrange(np):
-    system.cpu[i].connectMemPorts(system.physmem)
-
-    if options.fastmem:
-        system.cpu[i].physmem_port = system.physmem.port
+for (i, cpu) in enumerate(system.cpu):
+    #
+    # Tie the cpu ports to the correct ruby system ports
+    #
+    cpu.icache_port = system.ruby.cpu_ruby_ports[i].port
+    cpu.dcache_port = system.ruby.cpu_ruby_ports[i].port
 
 root = Root(system = system)
 
diff -r 78be42cd81cd -r ede19abf2fa6 configs/ruby/MOESI_hammer.py
--- a/configs/ruby/MOESI_hammer.py      Thu Jan 14 22:17:25 2010 -0800
+++ b/configs/ruby/MOESI_hammer.py      Thu Jan 14 22:17:25 2010 -0800
@@ -49,12 +49,13 @@
     latency = 15
     size = 1048576
 
-def create_system(options, physmem):
+def create_system(options, phys_mem, piobus, dma_devices):
     
     if buildEnv['PROTOCOL'] != 'MOESI_hammer':
         panic("This script requires the MOESI_hammer protocol to be built.")
 
-    sequencers = []
+    cpu_sequencers = []
+    
     #
     # The ruby network creation expects the list of nodes in the system to be
     # consistent with the NetDest list.  Therefore the l1 controller nodes 
must be
@@ -68,11 +69,10 @@
     # Must create the individual controllers before the network to ensure the
     # controller constructors are called before the network constructor
     #
-    for i in range(options.num_cpus):
+    
+    for i in xrange(options.num_cpus):
         #
         # First create the Ruby objects associated with this cpu
-        # Eventually this code should go in a python file specific to the
-        # MOESI_hammer protocol
         #
         l1i_profiler = CacheProfiler(description = ("l1i_%s_profiler" % i))
         l1i_cache = L1Cache(cache_profiler = l1i_profiler)
@@ -85,13 +85,27 @@
 
         cpu_seq = RubySequencer(icache = l1i_cache,
                                 dcache = l1d_cache,
-                                funcmem_port = physmem.port)
+                                physMemPort = phys_mem.port,
+                                physmem = phys_mem)
+
+        if piobus != None:
+            cpu_seq.pio_port = piobus.port
 
         l1_cntrl = L1Cache_Controller(version = i,
                                       sequencer = cpu_seq,
                                       L1IcacheMemory = l1i_cache,
                                       L1DcacheMemory = l1d_cache,
                                       L2cacheMemory = l2_cache)
+        #
+        # Add controllers and sequencers to the appropriate lists
+        #
+        cpu_sequencers.append(cpu_seq)
+        l1_cntrl_nodes.append(l1_cntrl)
+
+    for i in xrange(options.num_dirs):
+        #
+        # Create the Ruby objects associated with the directory controller
+        #
 
         mem_cntrl = RubyMemoryControl(version = i)
 
@@ -99,19 +113,22 @@
                                          directory = RubyDirectoryMemory(),
                                          memBuffer = mem_cntrl)
 
+        dir_cntrl_nodes.append(dir_cntrl)
+
+    for i, dma_device in enumerate(dma_devices):
+        #
+        # Create the Ruby objects associated with the dma controller
+        #
+        dma_seq = DMASequencer(version = i,
+                               physMemPort = phys_mem.port,
+                               physmem = phys_mem)
+        
         dma_cntrl = DMA_Controller(version = i,
-                                   dma_sequencer = DMASequencer())
+                                   dma_sequencer = dma_seq)
 
-        #
-        # Add controllers and sequencers to the appropriate lists
-        # As noted above: Independent list are track to maintain the order of
-        # nodes/controllers assumed by the ruby network
-        #
-        sequencers.append(cpu_seq)
-        l1_cntrl_nodes.append(l1_cntrl)
-        dir_cntrl_nodes.append(dir_cntrl)
+        dma_cntrl.dma_sequencer.port = dma_device.dma
         dma_cntrl_nodes.append(dma_cntrl)
 
     all_cntrls = l1_cntrl_nodes + dir_cntrl_nodes + dma_cntrl_nodes
 
-    return (sequencers, dir_cntrl_nodes, all_cntrls)
+    return (cpu_sequencers, dir_cntrl_nodes, all_cntrls)
diff -r 78be42cd81cd -r ede19abf2fa6 configs/ruby/Ruby.py
--- a/configs/ruby/Ruby.py      Thu Jan 14 22:17:25 2010 -0800
+++ b/configs/ruby/Ruby.py      Thu Jan 14 22:17:25 2010 -0800
@@ -34,13 +34,16 @@
 
 import MOESI_hammer
 
-def create_system(options, physmem):
+def create_system(options, physmem, piobus = None, dma_devices = []):
 
     protocol = buildEnv['PROTOCOL']
 
     if protocol == "MOESI_hammer":
-        (sequencers, dir_cntrls, all_cntrls) = MOESI_hammer.create_system( \
-                                                options, physmem)
+        (cpu_sequencers, dir_cntrls, all_cntrls) = \
+            MOESI_hammer.create_system(options, \
+                                       physmem, \
+                                       piobus, \
+                                       dma_devices)
     else:
          print "Error: unsupported ruby protocol"
          sys.exit(1)
@@ -68,7 +71,7 @@
                                  ranks_per_dimm = ranksPerDimm,
                                  dimms_per_channel = dimmsPerChannel)
     
-    ruby = RubySystem(clock = '1GHz',
+    ruby = RubySystem(clock = options.clock,
                       network = network,
                       profiler = ruby_profiler,
                       tracer = RubyTracer(),
@@ -77,6 +80,6 @@
                                         protocol_trace = False),
                       mem_size_mb = mem_size_mb)
 
-    ruby.cpu_ruby_ports = sequencers
+    ruby.cpu_ruby_ports = cpu_sequencers
 
     return ruby
diff -r 78be42cd81cd -r ede19abf2fa6 src/mem/ruby/system/RubyPort.cc
--- a/src/mem/ruby/system/RubyPort.cc   Thu Jan 14 22:17:25 2010 -0800
+++ b/src/mem/ruby/system/RubyPort.cc   Thu Jan 14 22:17:25 2010 -0800
@@ -7,12 +7,13 @@
 RubyPort::RequestMap RubyPort::pending_cpu_requests;
 
 RubyPort::RubyPort(const Params *p)
-    : MemObject(p),
-      funcMemPort(csprintf("%s-funcmem_port", name()), this)
+    : MemObject(p)
 {
     m_version = p->version;
     assert(m_version != -1);
 
+    physmem = p->physmem;
+    
     m_controller = NULL;
     m_mandatory_q_ptr = NULL;
 
@@ -20,6 +21,7 @@
     m_request_cnt = 0;
     m_hit_callback = ruby_hit_callback;
     pio_port = NULL;
+    physMemPort = NULL;
     assert(m_num_ports <= 2048); // see below for reason
 }
 
@@ -44,8 +46,23 @@
                                      this);
 
         return pio_port;
-    } else if (if_name == "funcmem_port") {
-        return &funcMemPort;
+    } else if (if_name == "physMemPort") {
+        //
+        // RubyPort should only have one port to physical memory
+        //
+        assert (physMemPort == NULL);
+
+        physMemPort = new M5Port(csprintf("%s-physMemPort", name()), 
+                                 this);
+        
+        return physMemPort;
+    } else if (if_name == "functional") {
+        //
+        // Calls for the functional port only want to access functional memory.
+        // Therefore, directly pass these calls ports to physmem.
+        //
+        assert(physmem != NULL);
+        return physmem->getPort(if_name, idx);
     }
     return NULL;
 }
@@ -219,11 +236,11 @@
     DPRINTF(MemoryAccess, "Hit callback needs response %d\n",
             needsResponse);
 
-    ruby_port->funcMemPort.sendFunctional(pkt);
+    ruby_port->physMemPort->sendAtomic(pkt);
 
     // turn packet around to go back to requester if response expected
     if (needsResponse) {
-        // recvAtomic() should already have turned packet into
+        // sendAtomic() should already have turned packet into
         // atomic response
         assert(pkt->isResponse());
         DPRINTF(MemoryAccess, "Sending packet back over port\n");
@@ -253,7 +270,7 @@
 {
     AddrRangeList physMemAddrList;
     bool snoop = false;
-    ruby_port->funcMemPort.getPeerAddressRanges(physMemAddrList, snoop);
+    ruby_port->physMemPort->getPeerAddressRanges(physMemAddrList, snoop);
     for(AddrRangeIter iter = physMemAddrList.begin(); 
         iter != physMemAddrList.end(); 
         iter++) {
@@ -263,29 +280,5 @@
             return true;
         }
     }
-    assert(isPioAddress(addr));
     return false;
 }
-
-bool
-RubyPort::M5Port::isPioAddress(Addr addr)
-{
-    AddrRangeList pioAddrList;
-    bool snoop = false;
-    if (ruby_port->pio_port == NULL) {
-        return false;
-    }
-  
-    ruby_port->pio_port->getPeerAddressRanges(pioAddrList, snoop);
-    for(AddrRangeIter iter = pioAddrList.begin(); 
-        iter != pioAddrList.end(); 
-        iter++) {
-        if (addr >= iter->start && addr <= iter->end) {
-            DPRINTF(MemoryAccess, "Pio request found in %#llx - %#llx range\n",
-                    iter->start, iter->end);
-            return true;
-        }
-    }
-    return false;
-}
-
diff -r 78be42cd81cd -r ede19abf2fa6 src/mem/ruby/system/RubyPort.hh
--- a/src/mem/ruby/system/RubyPort.hh   Thu Jan 14 22:17:25 2010 -0800
+++ b/src/mem/ruby/system/RubyPort.hh   Thu Jan 14 22:17:25 2010 -0800
@@ -7,6 +7,7 @@
 
 #include "mem/mem_object.hh"
 #include "mem/tport.hh"
+#include "mem/physical.hh"
 
 #include "params/RubyPort.hh"
 
@@ -34,7 +35,6 @@
         virtual Tick recvAtomic(PacketPtr pkt);
 
       private:
-        bool isPioAddress(Addr addr);
         bool isPhysMemAddress(Addr addr);
     };
 
@@ -140,7 +140,9 @@
     static RequestMap pending_cpu_requests;
     static void ruby_hit_callback(int64_t req_id);
 
-    FunctionalPort funcMemPort;
+    M5Port* physMemPort;
+
+    PhysicalMemory* physmem;
 };
 
 #endif
diff -r 78be42cd81cd -r ede19abf2fa6 src/mem/ruby/system/Sequencer.cc
--- a/src/mem/ruby/system/Sequencer.cc  Thu Jan 14 22:17:25 2010 -0800
+++ b/src/mem/ruby/system/Sequencer.cc  Thu Jan 14 22:17:25 2010 -0800
@@ -189,7 +189,7 @@
 
   // See if we should schedule a deadlock check
   if (deadlockCheckEvent.scheduled() == false) {
-    schedule(deadlockCheckEvent, m_deadlock_threshold);
+    schedule(deadlockCheckEvent, m_deadlock_threshold + curTick);
   }
 
   Address line_addr(request->ruby_request.paddr);
diff -r 78be42cd81cd -r ede19abf2fa6 src/mem/ruby/system/Sequencer.py
--- a/src/mem/ruby/system/Sequencer.py  Thu Jan 14 22:17:25 2010 -0800
+++ b/src/mem/ruby/system/Sequencer.py  Thu Jan 14 22:17:25 2010 -0800
@@ -8,6 +8,8 @@
     port = VectorPort("M5 port")
     version = Param.Int(0, "")
     pio_port = Port("Ruby_pio_port")
+    physmem = Param.PhysicalMemory("")
+    physMemPort = Port("port to physical memory")
 
 class RubySequencer(RubyPort):
     type = 'RubySequencer'
@@ -18,7 +20,6 @@
         "max requests (incl. prefetches) outstanding")
     deadlock_threshold = Param.Int(500000,
         "max outstanding cycles for a request before deadlock/livelock 
declared")
-    funcmem_port = Port("port to functional memory")
 
 class DMASequencer(RubyPort):
     type = 'DMASequencer'

_______________________________________________
m5-dev mailing list
m5-dev@m5sim.org
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to