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