Deleted Added
sdiff udiff text old ( 6433:0f0f0fbef977 ) new ( 6467:5670eee2a866 )
full compact
1
2#include "mem/ruby/system/DMASequencer.hh"
3#include "mem/ruby/buffers/MessageBuffer.hh"
4#include "mem/ruby/slicc_interface/AbstractController.hh"
5
6/* SLICC generated types */
7#include "mem/protocol/SequencerMsg.hh"
8#include "mem/protocol/SequencerRequestType.hh"
9#include "mem/ruby/system/System.hh"
10
11DMASequencer::DMASequencer(const string & name)
12 : RubyPort(name)
13{
14}
15
16void DMASequencer::init(const vector<string> & argv)

--- 43 unchanged lines hidden (view full) ---

60 active_request.start_paddr = paddr;
61 active_request.write = write;
62 active_request.data = data;
63 active_request.len = len;
64 active_request.bytes_completed = 0;
65 active_request.bytes_issued = 0;
66 active_request.id = makeUniqueRequestID();
67
68 SequencerMsg msg;
69 msg.getPhysicalAddress() = Address(paddr);
70 msg.getLineAddress() = line_address(msg.getPhysicalAddress());
71 msg.getType() = write ? SequencerRequestType_ST : SequencerRequestType_LD;
72 int offset = paddr & m_data_block_mask;
73 msg.getLen() = (offset + len) <= RubySystem::getBlockSizeBytes() ?
74 len :
75 RubySystem::getBlockSizeBytes() - offset;
76 if (write)
77 msg.getDataBlk().setData(data, offset, msg.getLen());
78 m_mandatory_q_ptr->enqueue(msg);
79 active_request.bytes_issued += msg.getLen();
80
81 return active_request.id;
82}
83
84void DMASequencer::issueNext()
85{
86 assert(m_is_busy == true);
87 active_request.bytes_completed = active_request.bytes_issued;
88 if (active_request.len == active_request.bytes_completed) {
89 m_hit_callback(active_request.id);
90 m_is_busy = false;
91 return;
92 }
93
94 SequencerMsg msg;
95 msg.getPhysicalAddress() = Address(active_request.start_paddr +
96 active_request.bytes_completed);
97 assert((msg.getPhysicalAddress().getAddress() & m_data_block_mask) == 0);
98 msg.getLineAddress() = line_address(msg.getPhysicalAddress());
99 msg.getType() = (active_request.write ? SequencerRequestType_ST :
100 SequencerRequestType_LD);
101 msg.getLen() = (active_request.len -
102 active_request.bytes_completed < RubySystem::getBlockSizeBytes() ?
103 active_request.len - active_request.bytes_completed :
104 RubySystem::getBlockSizeBytes());
105 if (active_request.write) {
106 msg.getDataBlk().setData(&active_request.data[active_request.bytes_completed],
107 0, msg.getLen());
108 msg.getType() = SequencerRequestType_ST;
109 } else {
110 msg.getType() = SequencerRequestType_LD;
111 }
112 m_mandatory_q_ptr->enqueue(msg);
113 active_request.bytes_issued += msg.getLen();
114}
115
116void DMASequencer::dataCallback(const DataBlock & dblk)
117{
118 assert(m_is_busy == true);

--- 19 unchanged lines hidden ---