eh49er

SRIO Direct I/O

Feb 24th, 2012
419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.43 KB | None | 0 0
  1. srio_err_t srio_mwrite(uint srioID, uint address, uint length, uchar hopCount, void* buffer) {
  2.     srio_err_t result;
  3.  
  4.     gSRIOMWriteXfer.idSize = 1;
  5.     gSRIOMWriteXfer.intrRequest = 0;
  6.     gSRIOMWriteXfer.outPortID = 0;
  7.     gSRIOMWriteXfer.priority = 2;
  8.     gSRIOMWriteXfer.xambs = 0;
  9.     gSRIOMWriteXfer.ttype = 1;
  10.     gSRIOMWriteXfer.ftype = 8;
  11.     gSRIOMWriteXfer.doorbellInfo = 0;
  12.     gSRIOMWriteXfer.priority = 0;
  13.     gSRIOMWriteXfer.rapidIOMSB = 0;
  14.     gSRIOMWriteXfer.rapidIOLSB = address;
  15.     gSRIOMWriteXfer.dspAddress = ((uint) buffer);
  16.     gSRIOMWriteXfer.bytecount = length;
  17.     gSRIOMWriteXfer.dstID = srioID;
  18.     gSRIOMWriteXfer.hopCount = hopCount;
  19.     gSRIOMWriteXfer.priority = 0;
  20.  
  21.     result = srio_xfer(&gSRIOMWriteXfer);
  22.  
  23.     return result;
  24. }
  25.  
  26. srio_err_t srio_mread(uint srioID, uint address, uint length, uchar hopCount, void* buffer) {
  27.  
  28.     srio_err_t result;
  29.  
  30.     gSRIOMReadXfer.idSize = 1;
  31.     gSRIOMReadXfer.intrRequest = 0;
  32.     gSRIOMReadXfer.outPortID = 0;
  33.     gSRIOMReadXfer.priority = 2;
  34.     gSRIOMReadXfer.xambs = 0;
  35.     gSRIOMReadXfer.ttype = 0;
  36.     gSRIOMReadXfer.ftype = 8;
  37.     gSRIOMReadXfer.doorbellInfo = 0;
  38.     gSRIOMReadXfer.priority = 0;
  39.     gSRIOMReadXfer.rapidIOMSB = 0;
  40.     gSRIOMReadXfer.rapidIOLSB = address;
  41.     gSRIOMReadXfer.dspAddress = ((uint) buffer);
  42.     gSRIOMReadXfer.bytecount = length;
  43.     gSRIOMReadXfer.dstID = srioID;
  44.     gSRIOMReadXfer.hopCount = hopCount;
  45.     gSRIOMReadXfer.priority = 0;
  46.  
  47.     result = srio_xfer(&gSRIOMReadXfer);
  48.  
  49.     return result;
  50. }
  51.  
  52.  
  53. bool _srio_lsu_busy(uint8* context, uint8* transId) {
  54.     long long   timeout = 0;
  55.     uint        busy;
  56.  
  57.     do {
  58.         if(timeout++ > LSU_BUSY_TIMEOUT) {
  59.             return true;
  60.         }
  61.         busy = SRIO_REGS->LSU_CMD[lsuNum].RIO_LSU_REG6;
  62.     } while ((busy & ((1 << 31) | (1 << 30))) != 0);
  63.  
  64.     CSL_SRIO_GetLSUContextTransaction(sjlHSrio, lsuNum, context, transId);
  65.  
  66.     return false;
  67. }
  68.  
  69. #define _srio_lsu_load(x)       CSL_SRIO_SetLSUTransfer(sjlHSrio, 0, x)
  70. srio_err_t srio_xfer(SRIO_LSU_TRANSFER* srio_xfer) {
  71.     uint8 context, contextCheck, transId, compCode;
  72.     if(_srio_lsu_busy(&context, &transId) == true) {
  73.         lsuCompletionCode = LSU_RESV_SJL_INVALID;
  74.         return kSRIOErrorBusy;
  75.     }
  76.  
  77.     /* if we get here that means a shaddow reg is availiable */
  78.     _srio_lsu_load(srio_xfer);
  79.     do {
  80.         CSL_SRIO_GetLSUCompletionCode(sjlHSrio, lsuNum, transId, &compCode, &contextCheck);
  81.     } while (context != contextCheck);
  82.     lsuCompletionCode = (LsuCompCode)compCode;
  83.     if (lsuCompletionCode == LSU_TRANS_NO_ERR) {
  84.         return kSRIONoError;
  85.     }
  86.     return lsuCompletionCode;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment