@@ -50,7 +50,9 @@ CruBar::CruBar(const Parameters& parameters, std::unique_ptr<RocPciDevice> rocPc
5050 mPonUpstream(parameters.getPonUpstreamEnabled().get_value_or(false )),
5151 mOnuAddress(parameters.getOnuAddress().get_value_or(0x0 )),
5252 mDynamicOffset(parameters.getDynamicOffsetEnabled().get_value_or(false )),
53- mTriggerWindowSize(parameters.getTriggerWindowSize().get_value_or(1000 ))
53+ mTriggerWindowSize(parameters.getTriggerWindowSize().get_value_or(1000 )),
54+ mGbtEnabled(parameters.getGbtEnabled().get_value_or(true )),
55+ mUserLogicEnabled(parameters.getUserLogicEnabled().get_value_or(false ))
5456{
5557 if (getIndex () == 0 ) {
5658 mFeatures = parseFirmwareFeatures ();
@@ -406,6 +408,7 @@ Cru::ReportInfo CruBar::report()
406408{
407409 std::map<int , Link> linkMap = initializeLinkMap ();
408410
411+ bool gbtEnabled = false ;
409412 // Update linkMap
410413 Gbt gbt = Gbt (mPdaBar , linkMap, mWrapperCount );
411414 gbt.getGbtModes ();
@@ -422,6 +425,10 @@ Cru::ReportInfo CruBar::report()
422425 link.stickyBit = gbt.getStickyBit (link);
423426 link.rxFreq = gbt.getRxClockFrequency (link) / 1e6 ; // Hz -> Mhz
424427 link.txFreq = gbt.getTxClockFrequency (link) / 1e6 ; // Hz -> Mhz
428+
429+ if (link.enabled ) {
430+ gbtEnabled = true ;
431+ }
425432 }
426433
427434 // Update the link map with optical power information through I2C
@@ -440,6 +447,12 @@ Cru::ReportInfo CruBar::report()
440447 bool dynamicOffset = datapathWrapper.getDynamicOffsetEnabled (mEndpoint );
441448 uint32_t triggerWindowSize = datapathWrapper.getTriggerWindowSize (mEndpoint );
442449
450+ Link userLogicLink;
451+ userLogicLink.dwrapper = mEndpoint ;
452+ userLogicLink.dwrapperId = 15 ;
453+
454+ bool userLogicEnabled = datapathWrapper.getLinkEnabled (userLogicLink);
455+
443456 Cru::ReportInfo reportInfo = {
444457 linkMap,
445458 clock,
@@ -448,7 +461,9 @@ Cru::ReportInfo CruBar::report()
448461 onuAddress,
449462 cruId,
450463 dynamicOffset,
451- triggerWindowSize
464+ triggerWindowSize,
465+ gbtEnabled,
466+ userLogicEnabled
452467 };
453468
454469 return reportInfo;
@@ -500,6 +515,8 @@ void CruBar::configure(bool force)
500515 mCruId == reportInfo.cruId &&
501516 mDynamicOffset == reportInfo.dynamicOffset &&
502517 mTriggerWindowSize == reportInfo.triggerWindowSize &&
518+ mUserLogicEnabled == reportInfo.userLogicEnabled &&
519+ mGbtEnabled == reportInfo.gbtEnabled &&
503520 !force) {
504521 log (" No need to reconfigure further" );
505522 return ;
@@ -527,11 +544,13 @@ void CruBar::configure(bool force)
527544 }
528545 }
529546
530- log (" Calibrating the fPLLs" );
531- Gbt gbt = Gbt (mPdaBar , mLinkMap , mWrapperCount );
532- gbt.calibrateGbt (mLinkMap );
533- Cru::fpllref (mLinkMap , mPdaBar , 2 );
534- Cru::fpllcal (mLinkMap , mPdaBar );
547+ if (mGbtEnabled ) {
548+ log (" Calibrating the fPLLs" );
549+ Gbt gbt = Gbt (mPdaBar , mLinkMap , mWrapperCount );
550+ gbt.calibrateGbt (mLinkMap );
551+ Cru::fpllref (mLinkMap , mPdaBar , 2 );
552+ Cru::fpllcal (mLinkMap , mPdaBar );
553+ }
535554 }
536555
537556 if (static_cast <uint32_t >(mDownstreamData ) != reportInfo.downstreamData || force) {
@@ -540,11 +559,11 @@ void CruBar::configure(bool force)
540559 }
541560
542561 /* GBT */
543- if (!std::equal ( mLinkMap . begin (), mLinkMap . end (), reportInfo.linkMap . begin ()) || force) {
544- // log("Calibrating GBT");
545- // Gbt gbt = Gbt(mPdaBar, mLinkMap, mWrapperCount );
546- // gbt.calibrateGbt({ std::pair<int, Link>(el.first, el.second) });
547-
562+ if (!mGbtEnabled && (( mGbtEnabled != reportInfo.gbtEnabled ) || force) ) {
563+ // Disable all links
564+ datapathWrapper. setLinksEnabled ( mEndpoint , 0x0 );
565+ toggleUserLogicLink (reportInfo. userLogicEnabled ); // Make sure the user logic link retains its state
566+ } else if ( mGbtEnabled && (! std::equal ( mLinkMap . begin (), mLinkMap . end (), reportInfo. linkMap . begin ()) || force)) {
548567 /* BSP */
549568 disableDataTaking ();
550569
@@ -577,8 +596,15 @@ void CruBar::configure(bool force)
577596 }
578597 }
579598
599+ /* USER LOGIC */
600+ if (mUserLogicEnabled != reportInfo.userLogicEnabled || force) {
601+ log (" Toggling the User Logic link" );
602+ toggleUserLogicLink (mUserLogicEnabled );
603+ }
604+
580605 /* BSP */
581606 if (mCruId != reportInfo.cruId || force) {
607+ log (" Setting the CRU ID" );
582608 setCruId (mCruId );
583609 }
584610
@@ -625,7 +651,7 @@ std::map<int, Link> CruBar::initializeLinkMap()
625651 uint32_t address = Cru::getWrapperBaseAddress (wrapper) + Cru::Registers::GBT_WRAPPER_CONF0.address ;
626652 uint32_t wrapperConfig = readRegister (address / 4 );
627653
628- for (int bank = mEndpoint * 2 ; bank < (mEndpoint * 2 + 2 ); bank++) {
654+ for (int bank = mEndpoint * 2 ; bank < (mEndpoint * 2 + 4 ); bank++) {
629655 // for (int bank = 0; bank < 4; bank++) { //for 0-23 range
630656 // endpoint 0 -> banks {0,1}
631657 // endpoint 1 -> banks {2,3}
@@ -860,5 +886,20 @@ Cru::OnuStatus CruBar::reportOnuStatus()
860886 return ttc.onuStatus ();
861887}
862888
889+ void CruBar::toggleUserLogicLink (bool userLogicEnabled)
890+ {
891+ Link userLogicLink;
892+ userLogicLink.dwrapper = mEndpoint ;
893+ userLogicLink.dwrapperId = 15 ;
894+
895+ DatapathWrapper datapathWrapper = DatapathWrapper (mPdaBar );
896+ if (userLogicEnabled) {
897+ datapathWrapper.setLinkEnabled (userLogicLink);
898+ } else {
899+ datapathWrapper.setLinkDisabled (userLogicLink);
900+ }
901+ datapathWrapper.setDatapathMode (userLogicLink, mDatapathMode );
902+ }
903+
863904} // namespace roc
864905} // namespace AliceO2
0 commit comments