@@ -138,6 +138,7 @@ void CrorcDmaChannel::deviceStartDma()
138138
139139 log (" DMA start deferred until enough superpages available" );
140140
141+ mFreeFifoFront = 0 ;
141142 mFreeFifoBack = 0 ;
142143 mFreeFifoSize = 0 ;
143144 mReadyQueue .clear ();
@@ -292,7 +293,7 @@ void CrorcDmaChannel::armDdl(ResetLevel::type resetLevel)
292293void CrorcDmaChannel::startDataGenerator ()
293294{
294295 getCrorc ().armDataGenerator (mGeneratorInitialValue , mGeneratorInitialWord , mGeneratorPattern , mGeneratorDataSize ,
295- mGeneratorSeed );
296+ mGeneratorSeed ); // TODO: To be simplified
296297
297298 if (LoopbackMode::Internal == mLoopbackMode ) {
298299 getCrorc ().setLoopbackOn ();
@@ -343,26 +344,20 @@ void CrorcDmaChannel::pushSuperpage(Superpage superpage)
343344{
344345 checkSuperpage (superpage);
345346
346- if (superpage.getSize () != SUPERPAGE_SIZE) {
347- BOOST_THROW_EXCEPTION (CrorcException ()
348- << ErrorInfo::Message (" Could not enqueue superpage, the C-RORC backend only supports superpage sizes of 1 MiB" ));
349- }
350-
351347 if (mTransferQueue .size () >= TRANSFER_QUEUE_CAPACITY) {
352348 BOOST_THROW_EXCEPTION (Exception () << ErrorInfo::Message (" Could not push superpage, transfer queue was full" ));
353349 }
354350
355- if (mFreeFifoSize >= READYFIFO_ENTRIES ) {
351+ if (mFreeFifoSize >= MAX_SUPERPAGE_DESCRIPTORS ) {
356352 BOOST_THROW_EXCEPTION (Exception ()
357353 << ErrorInfo::Message (" Could not push superpage, firmware queue was full (this should never happen)" ));
358354 }
359355
360- for (int i = 0 ; i < READYFIFO_ENTRIES; i++) { // *always* push 128 FIFO entries
361- auto busAddress = getBusOffsetAddress (superpage.getOffset () + i * mPageSize );
362- pushFreeFifoPage (i, busAddress);
363- }
364- mFreeFifoSize = READYFIFO_ENTRIES;
365- ;
356+ auto busAddress = getBusOffsetAddress (superpage.getOffset ());
357+ pushFreeFifoPage (mFreeFifoFront , busAddress, superpage.getSize ());
358+ mFreeFifoSize ++;
359+ mFreeFifoFront = (mFreeFifoFront + 1 ) % MAX_SUPERPAGE_DESCRIPTORS;
360+
366361 mTransferQueue .push_back (superpage);
367362}
368363
@@ -388,39 +383,26 @@ void CrorcDmaChannel::fillSuperpages()
388383 }
389384
390385 // Check for arrivals & handle them
391- if (!mTransferQueue .empty ()) {
386+ if (!mTransferQueue .empty ()) { // i.e. If something is pushed to the CRORC
392387 auto isArrived = [&](int descriptorIndex) { return dataArrived (descriptorIndex) == DataArrivalStatus::WholeArrived; };
393388 auto resetDescriptor = [&](int descriptorIndex) { getReadyFifoUser ()->entries [descriptorIndex].reset (); };
389+ auto getLength = [&](int descriptorIndex) { return getReadyFifoUser ()->entries [descriptorIndex].length * 4 ; }; // length in 4B words
394390
395391 while (mFreeFifoSize > 0 ) {
396392 if (isArrived (mFreeFifoBack )) {
397- uint32_t length = getReadyFifoUser ()->entries [mFreeFifoBack ].getSize ();
398-
399- // Write length of the DMA page in the RDH
400- auto writeRdhLength = [](uintptr_t dmaPageAddress, uint32_t length) {
401- auto writeTo = reinterpret_cast <volatile uint32_t *>(dmaPageAddress + sizeof (uint32_t ) * 2 ); // writeTo the 3rd word
402- uint32_t shiftedLength = (length << 16 ) & 0xffff0000 ;
403- *writeTo |= shiftedLength; // Only the 16 MSBs
404- };
405-
406- // Write the length of the DMA page in its RDH
407- if ((mLoopbackMode == LoopbackMode::None) && mRDYRX ) { // Don't write the header for STBRD
408- auto superpage = mTransferQueue .front ();
409- auto dmaPageAddress = mDmaBufferUserspace + superpage.getOffset () + mFreeFifoBack * mPageSize ;
410- writeRdhLength (dmaPageAddress, length);
411- }
393+ // size_t superpageFilled = SUPERPAGE_SIZE; // Get the length before updating our descriptor index
394+ size_t superpageFilled = getLength (mFreeFifoBack ); // Get the length before updating our descriptor index
412395 resetDescriptor (mFreeFifoBack );
413396
414397 mFreeFifoSize --;
415- mFreeFifoBack = (mFreeFifoBack + 1 ) % READYFIFO_ENTRIES;
416-
417- if (mFreeFifoBack == 0 ) { // Push the superpage after all of the 128 fifo entries are pushed
418- auto superpage = mTransferQueue .front ();
419- superpage.setReceived (mPageSize * READYFIFO_ENTRIES); // Always full Superpages
420- superpage.setReady (true );
421- mReadyQueue .push_back (superpage);
422- mTransferQueue .pop_front ();
423- }
398+ mFreeFifoBack = (mFreeFifoBack + 1 ) % MAX_SUPERPAGE_DESCRIPTORS;
399+
400+ // Push Superpage
401+ auto superpage = mTransferQueue .front ();
402+ superpage.setReceived (superpageFilled);
403+ superpage.setReady (true );
404+ mReadyQueue .push_back (superpage);
405+ mTransferQueue .pop_front ();
424406 } else {
425407 // If the back one hasn't arrived yet, the next ones will certainly not have arrived either...
426408 break ;
@@ -449,9 +431,9 @@ int32_t CrorcDmaChannel::getDroppedPackets()
449431 return -1 ;
450432}
451433
452- void CrorcDmaChannel::pushFreeFifoPage (int readyFifoIndex, uintptr_t pageBusAddress)
434+ void CrorcDmaChannel::pushFreeFifoPage (int readyFifoIndex, uintptr_t pageBusAddress, int pageSize )
453435{
454- size_t pageWords = mPageSize / 4 ; // Size in 32-bit words
436+ size_t pageWords = pageSize / 4 ; // Size in 32-bit words
455437 getCrorc ().pushRxFreeFifo (pageBusAddress, pageWords, readyFifoIndex);
456438}
457439
0 commit comments