dma_device.cc (11284:b3926db25371) | dma_device.cc (11896:5e718044e443) |
---|---|
1/* | 1/* |
2 * Copyright (c) 2012, 2015 ARM Limited | 2 * Copyright (c) 2012, 2015, 2017 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 --- 34 unchanged lines hidden (view full) --- 45 46#include "dev/dma_device.hh" 47 48#include <utility> 49 50#include "base/chunk_generator.hh" 51#include "debug/DMA.hh" 52#include "debug/Drain.hh" | 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 --- 34 unchanged lines hidden (view full) --- 45 46#include "dev/dma_device.hh" 47 48#include <utility> 49 50#include "base/chunk_generator.hh" 51#include "debug/DMA.hh" 52#include "debug/Drain.hh" |
53#include "mem/port_proxy.hh" |
|
53#include "sim/system.hh" 54 55DmaPort::DmaPort(MemObject *dev, System *s) 56 : MasterPort(dev->name() + ".dma", dev), 57 device(dev), sys(s), masterId(s->getMasterId(dev->name())), 58 sendEvent(this), pendingCount(0), inRetry(false) 59{ } 60 --- 305 unchanged lines hidden (view full) --- 366DmaReadFifo::resumeFill() 367{ 368 // Don't try to fetch more data if we are draining. This ensures 369 // that the DMA engine settles down before we checkpoint it. 370 if (drainState() == DrainState::Draining) 371 return; 372 373 const bool old_eob(atEndOfBlock()); | 54#include "sim/system.hh" 55 56DmaPort::DmaPort(MemObject *dev, System *s) 57 : MasterPort(dev->name() + ".dma", dev), 58 device(dev), sys(s), masterId(s->getMasterId(dev->name())), 59 sendEvent(this), pendingCount(0), inRetry(false) 60{ } 61 --- 305 unchanged lines hidden (view full) --- 367DmaReadFifo::resumeFill() 368{ 369 // Don't try to fetch more data if we are draining. This ensures 370 // that the DMA engine settles down before we checkpoint it. 371 if (drainState() == DrainState::Draining) 372 return; 373 374 const bool old_eob(atEndOfBlock()); |
375 376 if (port.sys->bypassCaches()) 377 resumeFillFunctional(); 378 else 379 resumeFillTiming(); 380 381 if (!old_eob && atEndOfBlock()) 382 onEndOfBlock(); 383} 384 385void 386DmaReadFifo::resumeFillFunctional() 387{ 388 const size_t fifo_space = buffer.capacity() - buffer.size(); 389 const size_t kvm_watermark = port.sys->cacheLineSize(); 390 if (fifo_space >= kvm_watermark || buffer.capacity() < kvm_watermark) { 391 const size_t block_remaining = endAddr - nextAddr; 392 const size_t xfer_size = std::min(fifo_space, block_remaining); 393 std::vector<uint8_t> tmp_buffer(xfer_size); 394 395 assert(pendingRequests.empty()); 396 DPRINTF(DMA, "KVM Bypassing startAddr=%#x xfer_size=%#x " \ 397 "fifo_space=%#x block_remaining=%#x\n", 398 nextAddr, xfer_size, fifo_space, block_remaining); 399 400 port.sys->physProxy.readBlob(nextAddr, tmp_buffer.data(), xfer_size); 401 buffer.write(tmp_buffer.begin(), xfer_size); 402 nextAddr += xfer_size; 403 } 404} 405 406void 407DmaReadFifo::resumeFillTiming() 408{ |
|
374 size_t size_pending(0); 375 for (auto &e : pendingRequests) 376 size_pending += e->requestSize(); 377 378 while (!freeRequests.empty() && !atEndOfBlock()) { 379 const size_t req_size(std::min(maxReqSize, endAddr - nextAddr)); 380 if (buffer.size() + size_pending + req_size > fifoSize) 381 break; --- 5 unchanged lines hidden (view full) --- 387 event->reset(req_size); 388 port.dmaAction(MemCmd::ReadReq, nextAddr, req_size, event.get(), 389 event->data(), 0, reqFlags); 390 nextAddr += req_size; 391 size_pending += req_size; 392 393 pendingRequests.emplace_back(std::move(event)); 394 } | 409 size_t size_pending(0); 410 for (auto &e : pendingRequests) 411 size_pending += e->requestSize(); 412 413 while (!freeRequests.empty() && !atEndOfBlock()) { 414 const size_t req_size(std::min(maxReqSize, endAddr - nextAddr)); 415 if (buffer.size() + size_pending + req_size > fifoSize) 416 break; --- 5 unchanged lines hidden (view full) --- 422 event->reset(req_size); 423 port.dmaAction(MemCmd::ReadReq, nextAddr, req_size, event.get(), 424 event->data(), 0, reqFlags); 425 nextAddr += req_size; 426 size_pending += req_size; 427 428 pendingRequests.emplace_back(std::move(event)); 429 } |
395 396 // EOB can be set before a call to dmaDone() if in-flight accesses 397 // have been canceled. 398 if (!old_eob && atEndOfBlock()) 399 onEndOfBlock(); | |
400} 401 402void 403DmaReadFifo::dmaDone() 404{ 405 const bool old_active(isActive()); 406 407 handlePending(); --- 17 unchanged lines hidden (view full) --- 425 // Move the event to the list of free requests 426 freeRequests.emplace_back(std::move(event)); 427 } 428 429 if (pendingRequests.empty()) 430 signalDrainDone(); 431} 432 | 430} 431 432void 433DmaReadFifo::dmaDone() 434{ 435 const bool old_active(isActive()); 436 437 handlePending(); --- 17 unchanged lines hidden (view full) --- 455 // Move the event to the list of free requests 456 freeRequests.emplace_back(std::move(event)); 457 } 458 459 if (pendingRequests.empty()) 460 signalDrainDone(); 461} 462 |
433 434 | |
435DrainState 436DmaReadFifo::drain() 437{ 438 return pendingRequests.empty() ? DrainState::Drained : DrainState::Draining; 439} 440 441 442DmaReadFifo::DmaDoneEvent::DmaDoneEvent(DmaReadFifo *_parent, --- 37 unchanged lines hidden --- | 463DrainState 464DmaReadFifo::drain() 465{ 466 return pendingRequests.empty() ? DrainState::Drained : DrainState::Draining; 467} 468 469 470DmaReadFifo::DmaDoneEvent::DmaDoneEvent(DmaReadFifo *_parent, --- 37 unchanged lines hidden --- |