45 #include "debug/RubyDma.hh"
46 #include "debug/RubyStats.hh"
47 #include "mem/ruby/protocol/SequencerMsg.hh"
48 #include "mem/ruby/protocol/SequencerRequestType.hh"
52 int bytes_completed,
int bytes_issued, uint8_t *
data,
54 : start_paddr(start_paddr),
len(
len), write(write),
55 bytes_completed(bytes_completed), bytes_issued(bytes_issued),
data(
data),
62 m_max_outstanding_requests(
p.max_outstanding_requests)
77 return RequestStatus_BufferFull;
92 std::forward_as_tuple(line_addr),
93 std::forward_as_tuple(paddr,
len, write, 0,
95 DMARequest& active_request = emplace_pair.first->second;
100 if (!emplace_pair.second) {
101 DPRINTF(RubyDma,
"DMA aliased: addr %p, len %d\n", line_addr,
len);
102 return RequestStatus_Aliased;
105 DPRINTF(RubyDma,
"DMA req created: addr %p, len %d\n", line_addr,
len);
107 std::shared_ptr<SequencerMsg> msg =
108 std::make_shared<SequencerMsg>(
clockEdge());
109 msg->getPhysicalAddress() = paddr;
110 msg->getLineAddress() = line_addr;
112 if (pkt->
req->isAtomic()) {
113 msg->setType(SequencerRequestType_ATOMIC);
119 int atomic_offset = pkt->
getAddr() - line_addr;
121 assert(atomic_offset + pkt->
getSize() <= block_size);
123 for (
int idx = 0; idx < pkt->
getSize(); ++idx) {
124 access_mask[atomic_offset + idx] =
true;
131 atomic_ops.emplace_back(atomic_op);
132 msg->getwriteMask().setAtomicOps(atomic_ops);
134 msg->setType(SequencerRequestType_ST);
137 msg->setType(SequencerRequestType_LD);
145 if (write && (
data != NULL)) {
146 if (active_request.
data != NULL) {
147 msg->getDataBlk().setData(
data,
offset, msg->getLen());
157 return RequestStatus_Issued;
171 DPRINTF(RubyDma,
"DMA request completed: addr %p, size %d\n",
172 address, active_request.
len);
180 std::shared_ptr<SequencerMsg> msg =
181 std::make_shared<SequencerMsg>(
clockEdge());
182 msg->getPhysicalAddress() = active_request.
start_paddr +
188 msg->getType() = (active_request.
write ? SequencerRequestType_ST :
189 SequencerRequestType_LD);
192 (active_request.
len -
197 if (active_request.
write) {
207 "DMA request bytes issued %d, bytes completed %d, total len %d\n",
224 assert(!active_request.
write);
225 if (active_request.
data != NULL) {
261 DPRINTF(RubyStats,
"Recorded statistic: %s\n",
262 DMASequencerRequestType_to_string(requestType));