@@ -54,7 +54,8 @@ CruBar::CruBar(const Parameters& parameters, std::unique_ptr<RocPciDevice> rocPc
5454 mDynamicOffset(parameters.getDynamicOffsetEnabled().get_value_or(false )),
5555 mTriggerWindowSize(parameters.getTriggerWindowSize().get_value_or(1000 )),
5656 mGbtEnabled(parameters.getGbtEnabled().get_value_or(true )),
57- mUserLogicEnabled(parameters.getUserLogicEnabled().get_value_or(false ))
57+ mUserLogicEnabled(parameters.getUserLogicEnabled().get_value_or(false )),
58+ mRunStatsEnabled(parameters.getRunStatsEnabled().get_value_or(false ))
5859{
5960 if (getIndex () == 0 ) {
6061 mFeatures = parseFirmwareFeatures ();
@@ -494,9 +495,13 @@ Cru::ReportInfo CruBar::report()
494495 Link userLogicLink;
495496 userLogicLink.dwrapper = mEndpoint ;
496497 userLogicLink.dwrapperId = 15 ;
497-
498498 bool userLogicEnabled = datapathWrapper.getLinkEnabled (userLogicLink);
499499
500+ Link runStatsLink;
501+ runStatsLink.dwrapper = mEndpoint ;
502+ runStatsLink.dwrapperId = (mEndpoint == 0 ) ? 13 : 14 ;
503+ bool runStatsEnabled = datapathWrapper.getLinkEnabled (runStatsLink);
504+
500505 Cru::ReportInfo reportInfo = {
501506 linkMap,
502507 clock,
@@ -507,7 +512,8 @@ Cru::ReportInfo CruBar::report()
507512 dynamicOffset,
508513 triggerWindowSize,
509514 gbtEnabled,
510- userLogicEnabled
515+ userLogicEnabled,
516+ runStatsEnabled
511517 };
512518
513519 return reportInfo;
@@ -527,14 +533,23 @@ Cru::PacketMonitoringInfo CruBar::monitorPackets()
527533 linkPacketInfoMap.insert ({ el.first , { accepted, rejected, forced } });
528534 }
529535
536+ // Insert the Run Statistics link
537+ Link runStatsLink = {};
538+ runStatsLink.dwrapper = mEndpoint ;
539+ runStatsLink.dwrapperId = (mEndpoint == 0 ) ? 13 : 14 ;
540+ uint32_t accepted = datapathWrapper.getAcceptedPackets (runStatsLink);
541+ uint32_t rejected = datapathWrapper.getRejectedPackets (runStatsLink);
542+ uint32_t forced = datapathWrapper.getForcedPackets (runStatsLink);
543+ linkPacketInfoMap.insert ({ runStatsLink.dwrapperId , { accepted, rejected, forced } });
544+
530545 // Insert the UL link at 15
531546 Link uLLink = {};
532547 // dwrapper 0 on endpoint 0, dwrapper 1 on endpoint 1
533548 uLLink.dwrapper = mEndpoint ;
534549 uLLink.dwrapperId = 15 ;
535- uint32_t accepted = datapathWrapper.getAcceptedPackets (uLLink);
536- uint32_t rejected = datapathWrapper.getRejectedPackets (uLLink);
537- uint32_t forced = datapathWrapper.getForcedPackets (uLLink);
550+ accepted = datapathWrapper.getAcceptedPackets (uLLink);
551+ rejected = datapathWrapper.getRejectedPackets (uLLink);
552+ forced = datapathWrapper.getForcedPackets (uLLink);
538553 linkPacketInfoMap.insert ({ 15 , { accepted, rejected, forced } });
539554
540555 int wrapper = mEndpoint ;
@@ -561,6 +576,7 @@ void CruBar::configure(bool force)
561576 mDynamicOffset == reportInfo.dynamicOffset &&
562577 mTriggerWindowSize == reportInfo.triggerWindowSize &&
563578 mUserLogicEnabled == reportInfo.userLogicEnabled &&
579+ mRunStatsEnabled == reportInfo.runStatsEnabled &&
564580 mGbtEnabled == reportInfo.gbtEnabled &&
565581 !force) {
566582 log (" No need to reconfigure further" );
@@ -608,6 +624,7 @@ void CruBar::configure(bool force)
608624 // Disable all links
609625 datapathWrapper.setLinksEnabled (mEndpoint , 0x0 );
610626 toggleUserLogicLink (reportInfo.userLogicEnabled ); // Make sure the user logic link retains its state
627+ toggleRunStatsLink (reportInfo.runStatsEnabled ); // Make sure the run stats link retains its state
611628 } else if (mGbtEnabled && (!std::equal (mLinkMap .begin (), mLinkMap .end (), reportInfo.linkMap .begin ()) || force)) {
612629 /* BSP */
613630 disableDataTaking ();
@@ -647,6 +664,12 @@ void CruBar::configure(bool force)
647664 toggleUserLogicLink (mUserLogicEnabled );
648665 }
649666
667+ /* RUN STATS */
668+ if (mRunStatsEnabled != reportInfo.runStatsEnabled || force) {
669+ log (" Toggling the Run Statistics link" );
670+ toggleRunStatsLink (mRunStatsEnabled );
671+ }
672+
650673 /* BSP */
651674 if (mCruId != reportInfo.cruId || force) {
652675 log (" Setting the CRU ID" );
@@ -915,6 +938,20 @@ void CruBar::toggleUserLogicLink(bool userLogicEnabled)
915938 datapathWrapper.setDatapathMode (userLogicLink, mDatapathMode );
916939}
917940
941+ void CruBar::toggleRunStatsLink (bool runStatsLinkEnabled)
942+ {
943+ Link runStatsLink;
944+ runStatsLink.dwrapper = mEndpoint ;
945+ runStatsLink.dwrapperId = (mEndpoint == 0 ) ? 13 : 14 ;
946+
947+ DatapathWrapper datapathWrapper = DatapathWrapper (mPdaBar );
948+ if (runStatsLinkEnabled) {
949+ datapathWrapper.setLinkEnabled (runStatsLink);
950+ } else {
951+ datapathWrapper.setLinkDisabled (runStatsLink);
952+ }
953+ }
954+
918955boost::optional<std::string> CruBar::getUserLogicVersion ()
919956{
920957 uint32_t firmwareHash = readRegister (Cru::Registers::USERLOGIC_GIT_HASH.index );
0 commit comments