dma_device.cc (13892:0182a0601f66) | dma_device.cc (13930:c5e728ccd2e2) |
---|---|
1/* | 1/* |
2 * Copyright (c) 2012, 2015, 2017 ARM Limited | 2 * Copyright (c) 2012, 2015, 2017, 2019 ARM Limited |
3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated --- 38 unchanged lines hidden (view full) --- 49 50#include "base/chunk_generator.hh" 51#include "debug/DMA.hh" 52#include "debug/Drain.hh" 53#include "mem/port_proxy.hh" 54#include "sim/clocked_object.hh" 55#include "sim/system.hh" 56 | 3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated --- 38 unchanged lines hidden (view full) --- 49 50#include "base/chunk_generator.hh" 51#include "debug/DMA.hh" 52#include "debug/Drain.hh" 53#include "mem/port_proxy.hh" 54#include "sim/clocked_object.hh" 55#include "sim/system.hh" 56 |
57DmaPort::DmaPort(ClockedObject *dev, System *s) | 57DmaPort::DmaPort(ClockedObject *dev, System *s, 58 uint32_t sid, uint32_t ssid) |
58 : MasterPort(dev->name() + ".dma", dev), 59 device(dev), sys(s), masterId(s->getMasterId(dev)), 60 sendEvent([this]{ sendDma(); }, dev->name()), | 59 : MasterPort(dev->name() + ".dma", dev), 60 device(dev), sys(s), masterId(s->getMasterId(dev)), 61 sendEvent([this]{ sendDma(); }, dev->name()), |
61 pendingCount(0), inRetry(false) | 62 pendingCount(0), inRetry(false), 63 defaultSid(sid), 64 defaultSSid(ssid) |
62{ } 63 64void 65DmaPort::handleResp(PacketPtr pkt, Tick delay) 66{ 67 // should always see a response with a sender state 68 assert(pkt->isResponse()); 69 --- 42 unchanged lines hidden (view full) --- 112 !(pkt->cacheResponding() && !pkt->hasSharers())); 113 114 handleResp(pkt); 115 116 return true; 117} 118 119DmaDevice::DmaDevice(const Params *p) | 65{ } 66 67void 68DmaPort::handleResp(PacketPtr pkt, Tick delay) 69{ 70 // should always see a response with a sender state 71 assert(pkt->isResponse()); 72 --- 42 unchanged lines hidden (view full) --- 115 !(pkt->cacheResponding() && !pkt->hasSharers())); 116 117 handleResp(pkt); 118 119 return true; 120} 121 122DmaDevice::DmaDevice(const Params *p) |
120 : PioDevice(p), dmaPort(this, sys) | 123 : PioDevice(p), dmaPort(this, sys, p->sid, p->ssid) |
121{ } 122 123void 124DmaDevice::init() 125{ 126 if (!dmaPort.isConnected()) 127 panic("DMA port of %s not connected to anything!", name()); 128 PioDevice::init(); --- 14 unchanged lines hidden (view full) --- 143DmaPort::recvReqRetry() 144{ 145 assert(transmitList.size()); 146 trySendTimingReq(); 147} 148 149RequestPtr 150DmaPort::dmaAction(Packet::Command cmd, Addr addr, int size, Event *event, | 124{ } 125 126void 127DmaDevice::init() 128{ 129 if (!dmaPort.isConnected()) 130 panic("DMA port of %s not connected to anything!", name()); 131 PioDevice::init(); --- 14 unchanged lines hidden (view full) --- 146DmaPort::recvReqRetry() 147{ 148 assert(transmitList.size()); 149 trySendTimingReq(); 150} 151 152RequestPtr 153DmaPort::dmaAction(Packet::Command cmd, Addr addr, int size, Event *event, |
151 uint8_t *data, Tick delay, Request::Flags flag) | 154 uint8_t *data, uint32_t sid, uint32_t ssid, Tick delay, 155 Request::Flags flag) |
152{ 153 // one DMA request sender state for every action, that is then 154 // split into many requests and packets based on the block size, 155 // i.e. cache line size 156 DmaReqState *reqState = new DmaReqState(event, size, delay); 157 158 // (functionality added for Table Walker statistics) 159 // We're only interested in this when there will only be one request. --- 4 unchanged lines hidden (view full) --- 164 DPRINTF(DMA, "Starting DMA for addr: %#x size: %d sched: %d\n", addr, size, 165 event ? event->scheduled() : -1); 166 for (ChunkGenerator gen(addr, size, sys->cacheLineSize()); 167 !gen.done(); gen.next()) { 168 169 req = std::make_shared<Request>( 170 gen.addr(), gen.size(), flag, masterId); 171 | 156{ 157 // one DMA request sender state for every action, that is then 158 // split into many requests and packets based on the block size, 159 // i.e. cache line size 160 DmaReqState *reqState = new DmaReqState(event, size, delay); 161 162 // (functionality added for Table Walker statistics) 163 // We're only interested in this when there will only be one request. --- 4 unchanged lines hidden (view full) --- 168 DPRINTF(DMA, "Starting DMA for addr: %#x size: %d sched: %d\n", addr, size, 169 event ? event->scheduled() : -1); 170 for (ChunkGenerator gen(addr, size, sys->cacheLineSize()); 171 !gen.done(); gen.next()) { 172 173 req = std::make_shared<Request>( 174 gen.addr(), gen.size(), flag, masterId); 175 |
176 req->setStreamId(sid); 177 req->setSubStreamId(ssid); 178 |
|
172 req->taskId(ContextSwitchTaskId::DMA); 173 PacketPtr pkt = new Packet(req, cmd); 174 175 // Increment the data pointer on a write 176 if (data) 177 pkt->dataStatic(data + gen.complete()); 178 179 pkt->senderState = reqState; --- 6 unchanged lines hidden (view full) --- 186 // in zero time also initiate the sending of the packets we have 187 // just created, for atomic this involves actually completing all 188 // the requests 189 sendDma(); 190 191 return req; 192} 193 | 179 req->taskId(ContextSwitchTaskId::DMA); 180 PacketPtr pkt = new Packet(req, cmd); 181 182 // Increment the data pointer on a write 183 if (data) 184 pkt->dataStatic(data + gen.complete()); 185 186 pkt->senderState = reqState; --- 6 unchanged lines hidden (view full) --- 193 // in zero time also initiate the sending of the packets we have 194 // just created, for atomic this involves actually completing all 195 // the requests 196 sendDma(); 197 198 return req; 199} 200 |
201RequestPtr 202DmaPort::dmaAction(Packet::Command cmd, Addr addr, int size, Event *event, 203 uint8_t *data, Tick delay, Request::Flags flag) 204{ 205 return dmaAction(cmd, addr, size, event, data, 206 defaultSid, defaultSSid, delay, flag); 207} 208 |
|
194void 195DmaPort::queueDma(PacketPtr pkt) 196{ 197 transmitList.push_back(pkt); 198 199 // remember that we have another packet pending, this will only be 200 // decremented once a response comes back 201 pendingCount++; --- 65 unchanged lines hidden (view full) --- 267DmaDevice::getPort(const std::string &if_name, PortID idx) 268{ 269 if (if_name == "dma") { 270 return dmaPort; 271 } 272 return PioDevice::getPort(if_name, idx); 273} 274 | 209void 210DmaPort::queueDma(PacketPtr pkt) 211{ 212 transmitList.push_back(pkt); 213 214 // remember that we have another packet pending, this will only be 215 // decremented once a response comes back 216 pendingCount++; --- 65 unchanged lines hidden (view full) --- 282DmaDevice::getPort(const std::string &if_name, PortID idx) 283{ 284 if (if_name == "dma") { 285 return dmaPort; 286 } 287 return PioDevice::getPort(if_name, idx); 288} 289 |
275 276 277 278 | |
279DmaReadFifo::DmaReadFifo(DmaPort &_port, size_t size, 280 unsigned max_req_size, 281 unsigned max_pending, 282 Request::Flags flags) 283 : maxReqSize(max_req_size), fifoSize(size), 284 reqFlags(flags), port(_port), 285 buffer(size), 286 nextAddr(0), endAddr(0) --- 225 unchanged lines hidden --- | 290DmaReadFifo::DmaReadFifo(DmaPort &_port, size_t size, 291 unsigned max_req_size, 292 unsigned max_pending, 293 Request::Flags flags) 294 : maxReqSize(max_req_size), fifoSize(size), 295 reqFlags(flags), port(_port), 296 buffer(size), 297 nextAddr(0), endAddr(0) --- 225 unchanged lines hidden --- |