1/* 2 * Copyright (c) 2006 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 124 unchanged lines hidden (view full) --- 133 pendingCount--; 134 135 assert(pendingCount >= 0); 136 assert(state); 137 138 state->numBytes += pkt->req->getSize(); 139 assert(state->totBytes >= state->numBytes); 140 if (state->totBytes == state->numBytes) { |
141 if (state->delay) 142 state->completionEvent->schedule(state->delay + curTick); 143 else 144 state->completionEvent->process(); |
145 delete state; 146 } 147 delete pkt->req; 148 delete pkt; 149 150 if (pendingCount == 0 && drainEvent) { 151 drainEvent->process(); 152 drainEvent = NULL; --- 61 unchanged lines hidden (view full) --- 214 DPRINTF(DMA, "TransmitList: %d, backoffTime: %d inRetry: %d es: %d\n", 215 transmitList.size(), backoffTime, inRetry, 216 backoffEvent.scheduled()); 217} 218 219 220void 221DmaPort::dmaAction(Packet::Command cmd, Addr addr, int size, Event *event, |
222 uint8_t *data, Tick delay) |
223{ 224 assert(event); 225 226 assert(device->getState() == SimObject::Running); 227 |
228 DmaReqState *reqState = new DmaReqState(event, this, size, delay); |
229 230 231 DPRINTF(DMA, "Starting DMA for addr: %#x size: %d sched: %d\n", addr, size, 232 event->scheduled()); 233 for (ChunkGenerator gen(addr, size, peerBlockSize()); 234 !gen.done(); gen.next()) { 235 Request *req = new Request(gen.addr(), gen.size(), 0); 236 PacketPtr pkt = new Packet(req, cmd, Packet::Broadcast); --- 75 unchanged lines hidden (view full) --- 312 state->numBytes += pkt->req->getSize(); 313 314 DPRINTF(DMA, "--Received response for DMA for addr: %#x size: %d nb: %d, tot: %d sched %d\n", 315 pkt->req->getPaddr(), pkt->req->getSize(), state->numBytes, 316 state->totBytes, state->completionEvent->scheduled()); 317 318 if (state->totBytes == state->numBytes) { 319 assert(!state->completionEvent->scheduled()); |
320 state->completionEvent->schedule(curTick + lat + state->delay); |
321 delete state; 322 delete pkt->req; 323 } 324 pendingCount--; 325 assert(pendingCount >= 0); 326 delete pkt; 327 328 if (pendingCount == 0 && drainEvent) { --- 13 unchanged lines hidden --- |