dma_device.cc (9152:86c0e6ca5e7c) | dma_device.cc (9165:f9e3dac185ba) |
---|---|
1/* 2 * Copyright (c) 2012 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 --- 33 unchanged lines hidden (view full) --- 42 */ 43 44#include "base/chunk_generator.hh" 45#include "debug/DMA.hh" 46#include "debug/Drain.hh" 47#include "dev/dma_device.hh" 48#include "sim/system.hh" 49 | 1/* 2 * Copyright (c) 2012 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 --- 33 unchanged lines hidden (view full) --- 42 */ 43 44#include "base/chunk_generator.hh" 45#include "debug/DMA.hh" 46#include "debug/Drain.hh" 47#include "dev/dma_device.hh" 48#include "sim/system.hh" 49 |
50DmaPort::DmaPort(MemObject *dev, System *s, Tick min_backoff, Tick max_backoff) | 50DmaPort::DmaPort(MemObject *dev, System *s) |
51 : MasterPort(dev->name() + ".dma", dev), device(dev), sys(s), 52 masterId(s->getMasterId(dev->name())), 53 pendingCount(0), drainEvent(NULL), | 51 : MasterPort(dev->name() + ".dma", dev), device(dev), sys(s), 52 masterId(s->getMasterId(dev->name())), 53 pendingCount(0), drainEvent(NULL), |
54 backoffTime(0), minBackoffDelay(min_backoff), 55 maxBackoffDelay(max_backoff), inRetry(false), 56 backoffEvent(this) | 54 inRetry(false) |
57{ } 58 59bool 60DmaPort::recvTimingResp(PacketPtr pkt) 61{ | 55{ } 56 57bool 58DmaPort::recvTimingResp(PacketPtr pkt) 59{ |
62 if (pkt->wasNacked()) { 63 DPRINTF(DMA, "Received nacked %s addr %#x\n", 64 pkt->cmdString(), pkt->getAddr()); 65 66 if (backoffTime < minBackoffDelay) 67 backoffTime = minBackoffDelay; 68 else if (backoffTime < maxBackoffDelay) 69 backoffTime <<= 1; 70 71 device->reschedule(backoffEvent, curTick() + backoffTime, true); 72 73 DPRINTF(DMA, "Backoff time set to %d ticks\n", backoffTime); 74 75 pkt->reinitNacked(); 76 queueDma(pkt, true); 77 } else if (pkt->senderState) { | 60 if (pkt->senderState) { |
78 DmaReqState *state; | 61 DmaReqState *state; |
79 backoffTime >>= 2; | |
80 81 DPRINTF(DMA, "Received response %s addr %#x size %#x\n", 82 pkt->cmdString(), pkt->getAddr(), pkt->req->getSize()); 83 state = dynamic_cast<DmaReqState*>(pkt->senderState); 84 pendingCount--; 85 86 assert(pendingCount >= 0); 87 assert(state); --- 23 unchanged lines hidden (view full) --- 111 } else { 112 panic("Got packet without sender state... huh?\n"); 113 } 114 115 return true; 116} 117 118DmaDevice::DmaDevice(const Params *p) | 62 63 DPRINTF(DMA, "Received response %s addr %#x size %#x\n", 64 pkt->cmdString(), pkt->getAddr(), pkt->req->getSize()); 65 state = dynamic_cast<DmaReqState*>(pkt->senderState); 66 pendingCount--; 67 68 assert(pendingCount >= 0); 69 assert(state); --- 23 unchanged lines hidden (view full) --- 93 } else { 94 panic("Got packet without sender state... huh?\n"); 95 } 96 97 return true; 98} 99 100DmaDevice::DmaDevice(const Params *p) |
119 : PioDevice(p), dmaPort(this, sys, params()->min_backoff_delay, 120 params()->max_backoff_delay) | 101 : PioDevice(p), dmaPort(this, sys) |
121{ } 122 123void 124DmaDevice::init() 125{ 126 if (!dmaPort.isConnected()) 127 panic("DMA port of %s not connected to anything!", name()); 128 PioDevice::init(); --- 34 unchanged lines hidden (view full) --- 163 if (result) { 164 DPRINTF(DMA, "-- Done\n"); 165 transmitList.pop_front(); 166 inRetry = false; 167 } else { 168 inRetry = true; 169 DPRINTF(DMA, "-- Failed, queued\n"); 170 } | 102{ } 103 104void 105DmaDevice::init() 106{ 107 if (!dmaPort.isConnected()) 108 panic("DMA port of %s not connected to anything!", name()); 109 PioDevice::init(); --- 34 unchanged lines hidden (view full) --- 144 if (result) { 145 DPRINTF(DMA, "-- Done\n"); 146 transmitList.pop_front(); 147 inRetry = false; 148 } else { 149 inRetry = true; 150 DPRINTF(DMA, "-- Failed, queued\n"); 151 } |
171 } while (!backoffTime && result && transmitList.size()); | 152 } while (result && transmitList.size()); |
172 | 153 |
173 if (transmitList.size() && backoffTime && !inRetry) { 174 DPRINTF(DMA, "Scheduling backoff for %d\n", curTick()+backoffTime); 175 if (!backoffEvent.scheduled()) 176 device->schedule(backoffEvent, backoffTime + curTick()); 177 } 178 DPRINTF(DMA, "TransmitList: %d, backoffTime: %d inRetry: %d es: %d\n", 179 transmitList.size(), backoffTime, inRetry, 180 backoffEvent.scheduled()); | 154 DPRINTF(DMA, "TransmitList: %d, inRetry: %d\n", 155 transmitList.size(), inRetry); |
181} 182 183void 184DmaPort::dmaAction(Packet::Command cmd, Addr addr, int size, Event *event, 185 uint8_t *data, Tick delay, Request::Flags flag) 186{ 187 DmaReqState *reqState = new DmaReqState(event, size, delay); 188 --- 37 unchanged lines hidden (view full) --- 226 // some kind of selction between access methods 227 // more work is going to have to be done to make 228 // switching actually work 229 assert(transmitList.size()); 230 PacketPtr pkt = transmitList.front(); 231 232 Enums::MemoryMode state = sys->getMemoryMode(); 233 if (state == Enums::timing) { | 156} 157 158void 159DmaPort::dmaAction(Packet::Command cmd, Addr addr, int size, Event *event, 160 uint8_t *data, Tick delay, Request::Flags flag) 161{ 162 DmaReqState *reqState = new DmaReqState(event, size, delay); 163 --- 37 unchanged lines hidden (view full) --- 201 // some kind of selction between access methods 202 // more work is going to have to be done to make 203 // switching actually work 204 assert(transmitList.size()); 205 PacketPtr pkt = transmitList.front(); 206 207 Enums::MemoryMode state = sys->getMemoryMode(); 208 if (state == Enums::timing) { |
234 if (backoffEvent.scheduled() || inRetry) { 235 DPRINTF(DMA, "Can't send immediately, waiting for retry or backoff timer\n"); | 209 if (inRetry) { 210 DPRINTF(DMA, "Can't send immediately, waiting for retry\n"); |
236 return; 237 } 238 239 DPRINTF(DMA, "Attempting to send %s addr %#x\n", 240 pkt->cmdString(), pkt->getAddr()); 241 242 bool result; 243 do { 244 result = sendTimingReq(pkt); 245 if (result) { 246 transmitList.pop_front(); 247 DPRINTF(DMA, "-- Done\n"); 248 } else { 249 inRetry = true; 250 DPRINTF(DMA, "-- Failed: queued\n"); 251 } | 211 return; 212 } 213 214 DPRINTF(DMA, "Attempting to send %s addr %#x\n", 215 pkt->cmdString(), pkt->getAddr()); 216 217 bool result; 218 do { 219 result = sendTimingReq(pkt); 220 if (result) { 221 transmitList.pop_front(); 222 DPRINTF(DMA, "-- Done\n"); 223 } else { 224 inRetry = true; 225 DPRINTF(DMA, "-- Failed: queued\n"); 226 } |
252 } while (result && !backoffTime && transmitList.size()); 253 254 if (transmitList.size() && backoffTime && !inRetry && 255 !backoffEvent.scheduled()) { 256 DPRINTF(DMA, "-- Scheduling backoff timer for %d\n", 257 backoffTime+curTick()); 258 device->schedule(backoffEvent, backoffTime + curTick()); 259 } | 227 } while (result && transmitList.size()); |
260 } else if (state == Enums::atomic) { 261 transmitList.pop_front(); 262 263 Tick lat; 264 DPRINTF(DMA, "--Sending DMA for addr: %#x size: %d\n", 265 pkt->req->getPaddr(), pkt->req->getSize()); 266 lat = sendAtomic(pkt); 267 assert(pkt->senderState); --- 44 unchanged lines hidden --- | 228 } else if (state == Enums::atomic) { 229 transmitList.pop_front(); 230 231 Tick lat; 232 DPRINTF(DMA, "--Sending DMA for addr: %#x size: %d\n", 233 pkt->req->getPaddr(), pkt->req->getSize()); 234 lat = sendAtomic(pkt); 235 assert(pkt->senderState); --- 44 unchanged lines hidden --- |