# HG changeset patch # User Brad Beckmann <brad.beckm...@amd.com> # Date 1263536244 28800 # Node ID e04160e57f4307f0b1d40524f08f6c1e4b8252ea # Parent fa362ac18a7a7c2f737fc092f987d94f1beb906a ruby: Converted MOESI_hammer dma cntrl to new config system
diff -r fa362ac18a7a -r e04160e57f43 configs/example/memtest-ruby.py --- a/configs/example/memtest-ruby.py Thu Jan 14 22:17:24 2010 -0800 +++ b/configs/example/memtest-ruby.py Thu Jan 14 22:17:24 2010 -0800 @@ -104,6 +104,7 @@ # l1_cntrl_nodes = [] dir_cntrl_nodes = [] +dma_cntrl_nodes = [] # # Must create the individual controllers before the network to ensure the @@ -138,12 +139,15 @@ directory = RubyDirectoryMemory(), memBuffer = RubyMemoryControl()) + dma_cntrl = DMA_Controller(version = i, + dma_sequencer = DMASequencer()) # # As noted above: Two independent list are track to maintain the order of # nodes/controllers assumed by the ruby network # l1_cntrl_nodes.append(l1_cntrl) dir_cntrl_nodes.append(dir_cntrl) + dma_cntrl_nodes.append(dma_cntrl) # # Finally tie the memtester ports to the correct system ports @@ -157,7 +161,8 @@ # constructor. # network = SimpleNetwork(topology = makeCrossbar(l1_cntrl_nodes + \ - dir_cntrl_nodes)) + dir_cntrl_nodes + \ + dma_cntrl_nodes)) mem_size_mb = sum([int(dir_cntrl.directory.size_mb) \ for dir_cntrl in dir_cntrl_nodes]) @@ -166,7 +171,9 @@ network = network, profiler = RubyProfiler(), tracer = RubyTracer(), - debug = RubyDebug(), + debug = RubyDebug(filter_string = 'qQin', + verbosity_string = 'high', + protocol_trace = True), mem_size_mb = mem_size_mb) diff -r fa362ac18a7a -r e04160e57f43 src/mem/protocol/MOESI_hammer-dma.sm --- a/src/mem/protocol/MOESI_hammer-dma.sm Thu Jan 14 22:17:24 2010 -0800 +++ b/src/mem/protocol/MOESI_hammer-dma.sm Thu Jan 14 22:17:24 2010 -0800 @@ -28,7 +28,8 @@ machine(DMA, "DMA Controller") -: int request_latency = 6 +: DMASequencer * dma_sequencer, + int request_latency = 6 { MessageBuffer responseFromDir, network="From", virtual_network="4", ordered="true", no_vector="true"; @@ -47,20 +48,14 @@ Ack, desc="DMA write to memory completed"; } - external_type(DMASequencer) { - void ackCallback(); - void dataCallback(DataBlock); - } - MessageBuffer mandatoryQueue, ordered="false", no_vector="true"; - DMASequencer dma_sequencer, factory='RubySystem::getDMASequencer(m_cfg["dma_sequencer"])', no_vector="true"; State cur_state, no_vector="true"; State getState(Address addr) { return cur_state; } void setState(Address addr, State state) { - cur_state := state; + cur_state := state; } out_port(reqToDirectory_out, DMARequestMsg, reqToDirectory, desc="..."); diff -r fa362ac18a7a -r e04160e57f43 src/mem/protocol/RubySlicc_Types.sm --- a/src/mem/protocol/RubySlicc_Types.sm Thu Jan 14 22:17:24 2010 -0800 +++ b/src/mem/protocol/RubySlicc_Types.sm Thu Jan 14 22:17:24 2010 -0800 @@ -122,6 +122,11 @@ } +external_type(DMASequencer) { + void ackCallback(); + void dataCallback(DataBlock); +} + external_type(TimerTable, inport="yes") { bool isReady(); Address readyAddress(); diff -r fa362ac18a7a -r e04160e57f43 src/mem/ruby/system/DMASequencer.cc --- a/src/mem/ruby/system/DMASequencer.cc Thu Jan 14 22:17:24 2010 -0800 +++ b/src/mem/ruby/system/DMASequencer.cc Thu Jan 14 22:17:24 2010 -0800 @@ -8,6 +8,10 @@ #include "mem/protocol/SequencerRequestType.hh" #include "mem/ruby/system/System.hh" +// +// Fix me: This code needs comments! +// + DMASequencer::DMASequencer(const Params *p) : RubyPort(p) { @@ -15,6 +19,7 @@ void DMASequencer::init() { + RubyPort::init(); m_is_busy = false; m_data_block_mask = ~ (~0 << RubySystem::getBlockSizeBits()); } @@ -58,11 +63,16 @@ msg.getLineAddress() = line_address(msg.getPhysicalAddress()); msg.getType() = write ? SequencerRequestType_ST : SequencerRequestType_LD; int offset = paddr & m_data_block_mask; + msg.getLen() = (offset + len) <= RubySystem::getBlockSizeBytes() ? len : RubySystem::getBlockSizeBytes() - offset; - if (write) + + if (write) { msg.getDataBlk().setData(data, offset, msg.getLen()); + } + + assert(m_mandatory_q_ptr != NULL); m_mandatory_q_ptr->enqueue(msg); active_request.bytes_issued += msg.getLen(); @@ -82,14 +92,18 @@ SequencerMsg msg; msg.getPhysicalAddress() = Address(active_request.start_paddr + active_request.bytes_completed); + assert((msg.getPhysicalAddress().getAddress() & m_data_block_mask) == 0); msg.getLineAddress() = line_address(msg.getPhysicalAddress()); + msg.getType() = (active_request.write ? SequencerRequestType_ST : SequencerRequestType_LD); + msg.getLen() = (active_request.len - active_request.bytes_completed < RubySystem::getBlockSizeBytes() ? active_request.len - active_request.bytes_completed : RubySystem::getBlockSizeBytes()); + if (active_request.write) { msg.getDataBlk().setData(&active_request.data[active_request.bytes_completed], 0, msg.getLen()); @@ -97,6 +111,8 @@ } else { msg.getType() = SequencerRequestType_LD; } + + assert(m_mandatory_q_ptr != NULL); m_mandatory_q_ptr->enqueue(msg); active_request.bytes_issued += msg.getLen(); } diff -r fa362ac18a7a -r e04160e57f43 src/mem/slicc/symbols/StateMachine.py --- a/src/mem/slicc/symbols/StateMachine.py Thu Jan 14 22:17:24 2010 -0800 +++ b/src/mem/slicc/symbols/StateMachine.py Thu Jan 14 22:17:24 2010 -0800 @@ -38,6 +38,7 @@ "Sequencer": "RubySequencer", "DirectoryMemory": "RubyDirectoryMemory", "MemoryControl": "RubyMemoryControl", + "DMASequencer": "DMASequencer" } class StateMachine(Symbol): @@ -369,7 +370,7 @@ # contains_sequencer = False for param in self.config_parameters: - if param.name == "sequencer": + if param.name == "sequencer" or param.name == "dma_sequencer": contains_sequencer = True if param.pointer: code('m_${{param.name}}_ptr = p->${{param.name}};') @@ -395,7 +396,19 @@ locked_read_request4 = Address(-1); read_counter = 0; ''') + # + # For the DMA controller, pass the sequencer a pointer to the + # controller. + # + if self.ident == "DMA": + if not contains_sequencer: + self.error("The DMA controller must include the sequencer " \ + "configuration parameter") + code(''' +m_dma_sequencer_ptr->setController(this); +''') + code('m_num_controllers++;') for var in self.objects: if var.ident.find("mandatoryQueue") >= 0: _______________________________________________ m5-dev mailing list m5-dev@m5sim.org http://m5sim.org/mailman/listinfo/m5-dev