@@ -372,13 +372,64 @@ void CrorcBar::stopDataReceiver()
372372 Utilities::setBit (CSRRegister, Crorc::Registers::DATA_RX_ON_OFF_BIT, true );
373373 writeRegister (Crorc::Registers::CHANNEL_CSR.index , CSRRegister);
374374 }
375+
376+ nSPpush = 0 ;
377+ nSPpushErr = 0 ;
378+ nSPcounter = 0 ;
375379}
376380
377381void CrorcBar::pushSuperpageAddressAndSize (uintptr_t blockAddress, uint32_t blockLength)
378382{
383+ /*
379384 writeRegister(Crorc::Registers::SP_WR_ADDR_HIGH.index, arch64() ? (blockAddress >> 32) : 0x0);
380385 writeRegister(Crorc::Registers::SP_WR_ADDR_LOW.index, blockAddress & 0xffffffff);
381386 writeRegister(Crorc::Registers::SP_WR_SIZE.index, blockLength);
387+ */
388+
389+ uint32_t vwr; // value to write
390+ uint32_t vxp; // value expected on read back (not always = vwr)
391+ uint32_t vrd; // value read back
392+ size_t ix; // address index
393+
394+ auto checkSuccess = [&] () {
395+ if (vrd != vxp) {
396+ char err[1024 ];
397+ snprintf (err,1024 , " pushSuperpageAddress : write failed ix = 0x%X write = 0x%X expected = 0x%X != read 0x%X" , (int )ix, (int )vwr, (int )vxp, (int )vrd);
398+ log (err, LogErrorDevel_ (4699 ));
399+ nSPpushErr++;
400+ return -1 ;
401+ }
402+ return 0 ;
403+ };
404+
405+ try {
406+ nSPpush++;
407+
408+ ix = Crorc::Registers::SP_WR_ADDR_HIGH.index ;
409+ vxp = vwr = arch64 () ? (blockAddress >> 32 ) : 0x0 ;
410+ writeRegister (ix, vwr);
411+ vrd = readRegister (ix);
412+ checkSuccess ();
413+
414+ ix = Crorc::Registers::SP_WR_ADDR_LOW.index ;
415+ vxp = vwr = blockAddress & 0xffffffff ;
416+ writeRegister (ix, vwr);
417+ vrd = readRegister (ix);
418+ checkSuccess ();
419+
420+ ix = Crorc::Registers::SP_WR_SIZE.index ;
421+ vxp = vwr = blockLength;
422+ vxp = (vwr << 8 ) | (++nSPcounter); // weird feature of crorc
423+ writeRegister (ix, vwr);
424+ vrd = readRegister (ix);
425+ if (!checkSuccess ()) {
426+ nSPcounter = vrd & 0xFF ;
427+ }
428+ } catch (...) {
429+ nSPpushErr++;
430+ log (" pushSuperpageAddress exception" , LogErrorDevel_ (4699 ));
431+ }
432+ return ;
382433}
383434
384435void CrorcBar::startDataGenerator ()
0 commit comments