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 ---