Skip to content

Commit eef6ecb

Browse files
committed
Provide transfer, ready queue and dropped packets status funcs through the DMA channel
1 parent 597a0fb commit eef6ecb

File tree

7 files changed

+79
-3
lines changed

7 files changed

+79
-3
lines changed

include/ReadoutCard/DmaChannelInterface.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,17 @@ class DmaChannelInterface
8484
/// superpage can be inspected with getSuperpage() or popped with popSuperpage().
8585
virtual int getReadyQueueSize() = 0;
8686

87+
// Returns true if the Transfer Queue is empty
88+
// i.e. no free pages to send to the card
89+
virtual bool isTransferQueueEmpty() = 0;
90+
91+
// Returns true if the Ready Queue is full
92+
// i.e. queue filled by the card
93+
virtual bool isReadyQueueFull() = 0;
94+
95+
// Returns the number of dropped packets, as reported by the BAR
96+
virtual int32_t getDroppedPackets() = 0;
97+
8798
/// Stops DMA for the given channel.
8899
/// Called automatically on channel closure.
89100
/// This moves any remaining superpages to the "ready queue", even if they are not filled.

src/Crorc/CrorcDmaChannel.cxx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,26 @@ void CrorcDmaChannel::fillSuperpages()
428428
}
429429
}
430430

431+
// Return a boolean that denotes whether the transfer queue is empty
432+
// The transfer queue is empty when all its slots are available
433+
bool CrorcDmaChannel::isTransferQueueEmpty()
434+
{
435+
return mTransferQueue.empty();
436+
}
437+
438+
// Return a boolean that denotes whether the ready queue is full
439+
// The ready queue is full when the CRORC has filled it up
440+
bool CrorcDmaChannel::isReadyQueueFull()
441+
{
442+
return mReadyQueue.size() == READY_QUEUE_CAPACITY;
443+
}
444+
445+
int32_t CrorcDmaChannel::getDroppedPackets()
446+
{
447+
log("No support for dropped packets in CRORC yet", InfoLogger::InfoLogger::Warning);
448+
return -1;
449+
}
450+
431451
void CrorcDmaChannel::pushFreeFifoPage(int readyFifoIndex, uintptr_t pageBusAddress)
432452
{
433453
size_t pageWords = mPageSize / 4; // Size in 32-bit words

src/Crorc/CrorcDmaChannel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ class CrorcDmaChannel final : public DmaChannelPdaBase
5656
virtual Superpage getSuperpage() override;
5757
virtual Superpage popSuperpage() override;
5858
virtual void fillSuperpages() override;
59+
virtual bool isTransferQueueEmpty() override;
60+
virtual bool isReadyQueueFull() override;
61+
virtual int32_t getDroppedPackets() override;
5962

6063
AllowedChannels allowedChannels();
6164

src/Cru/CruDmaChannel.cxx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,11 +348,30 @@ int CruDmaChannel::getTransferQueueAvailable()
348348
return mLinkQueuesTotalAvailable;
349349
}
350350

351+
// Return a boolean that denotes whether the transfer queue is empty
352+
// The transfer queue is empty when all its slots are available
353+
bool CruDmaChannel::isTransferQueueEmpty()
354+
{
355+
return mLinkQueuesTotalAvailable == (LINK_QUEUE_CAPACITY * mLinks.size());
356+
}
357+
351358
int CruDmaChannel::getReadyQueueSize()
352359
{
353360
return mReadyQueue.size();
354361
}
355362

363+
// Return a boolean that denotes whether the ready queue is full
364+
// The ready queue is full when the CRU has filled it up
365+
bool CruDmaChannel::isReadyQueueFull()
366+
{
367+
return mReadyQueue.size() == READY_QUEUE_CAPACITY;
368+
}
369+
370+
int32_t CruDmaChannel::getDroppedPackets()
371+
{
372+
return getBar()->getDroppedPackets();
373+
}
374+
356375
bool CruDmaChannel::injectError()
357376
{
358377
if (mGeneratorEnabled) {

src/Cru/CruDmaChannel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ class CruDmaChannel final : public DmaChannelPdaBase
4747
virtual Superpage getSuperpage() override;
4848
virtual Superpage popSuperpage() override;
4949
virtual void fillSuperpages() override;
50+
virtual bool isTransferQueueEmpty() override;
51+
virtual bool isReadyQueueFull() override;
52+
virtual int32_t getDroppedPackets() override;
5053

5154
virtual bool injectError() override;
5255
virtual boost::optional<int32_t> getSerial() override;

src/Dummy/DummyDmaChannel.cxx

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ CardDescriptor makeDummyDescriptor()
2727
return {CardType::Dummy, ChannelFactory::getDummySerialNumber(), PciId {"dummy", "dummy"}, PciAddress {0,0,0}, -1};
2828
}
2929

30-
constexpr size_t TRANSFER_QUEUE_SIZE = 16;
31-
constexpr size_t READY_QUEUE_SIZE = 32;
30+
constexpr size_t TRANSFER_QUEUE_CAPACITY = 16;
31+
constexpr size_t READY_QUEUE_CAPACITY = 32;
3232
}
3333

3434
constexpr auto endm = InfoLogger::InfoLogger::StreamOps::endm;
3535

3636
DummyDmaChannel::DummyDmaChannel(const Parameters& params)
3737
: DmaChannelBase(makeDummyDescriptor(), const_cast<Parameters&>(params), { 0, 1, 2, 3, 4, 5, 6, 7 }),
38-
mTransferQueue(TRANSFER_QUEUE_SIZE), mReadyQueue(READY_QUEUE_SIZE)
38+
mTransferQueue(TRANSFER_QUEUE_CAPACITY), mReadyQueue(READY_QUEUE_CAPACITY)
3939
{
4040
getLogger() << "DummyDmaChannel::DummyDmaChannel(channel:" << params.getChannelNumberRequired() << ")"
4141
<< InfoLogger::InfoLogger::endm;
@@ -152,6 +152,22 @@ void DummyDmaChannel::fillSuperpages()
152152
}
153153
}
154154

155+
bool DummyDmaChannel::isTransferQueueEmpty()
156+
{
157+
return mTransferQueue.empty();
158+
}
159+
160+
bool DummyDmaChannel::isReadyQueueFull()
161+
{
162+
return mReadyQueue.size() == READY_QUEUE_CAPACITY;
163+
}
164+
165+
int32_t DummyDmaChannel::getDroppedPackets()
166+
{
167+
return 0; // No dropped packets on the Dummy DMA Channel
168+
}
169+
170+
155171
boost::optional<int32_t> DummyDmaChannel::getSerial()
156172
{
157173
return ChannelFactory::getDummySerialNumber();

src/Dummy/DummyDmaChannel.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ class DummyDmaChannel final : public DmaChannelBase
4040
virtual Superpage getSuperpage() override;
4141
virtual Superpage popSuperpage() override;
4242
virtual void fillSuperpages() override;
43+
virtual bool isTransferQueueEmpty() override;
44+
virtual bool isReadyQueueFull() override;
45+
virtual int32_t getDroppedPackets() override;
46+
4347
virtual bool injectError() override
4448
{
4549
return false;

0 commit comments

Comments
 (0)