diff --git a/src/tcp3d_drv.c b/src/tcp3d_drv.c
index 044bf9f35440b8396e2c0b9e9a97bf53721233a9..39ad454b8c24881d41df5b7452cda186be0e150a 100644 (file)
--- a/src/tcp3d_drv.c
+++ b/src/tcp3d_drv.c
*\r
* \brief TCP3D Driver functions.\r
*\r
- * Copyright (C) Texas Instruments Incorporated 2009\r
+ * Copyright (C) Texas Instruments Incorporated 2009, 2014\r
* \r
* Redistribution and use in source and binary forms, with or without \r
* modification, are permitted provided that the following conditions \r
EDMA3_DRV_PaRAMRegs *prmSd;\r
EDMA3_DRV_PaRAMRegs *prevLastPrmPtr;\r
EDMA3_DRV_PaRAMRegs *prmWrap;\r
- uint32_t l2pCh[2];\r
- uint16_t revtLink[2];\r
- uint16_t ntfdLink[2];\r
+\r
uint16_t ntfLink[2];\r
uint16_t stsLink[2];\r
uint16_t sdLink[2];\r
uint32_t wrapLink[2];\r
+ uint16_t chainToNextCbDummyLink[2];\r
+ uint16_t chainToNextCbNtfdLink[2];\r
\r
- l2pCh[PING_INDEX] = tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P];\r
- l2pCh[PONG_INDEX] = tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_L2P];\r
- revtLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_REVT];\r
- revtLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_REVT];\r
- ntfdLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_NTFD];\r
- ntfdLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_NTFD];\r
ntfLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_NTF];\r
ntfLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_NTF];\r
stsLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_STS];\r
sdLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_SD];\r
wrapLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_WRAP];\r
wrapLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_WRAP];\r
+ chainToNextCbDummyLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_NEXTCB_DUMMY];\r
+ chainToNextCbDummyLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_NEXTCB_DUMMY];\r
+ chainToNextCbNtfdLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_NEXTCB_NTFD];\r
+ chainToNextCbNtfdLink[PONG_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_NEXTCB_NTFD];\r
\r
#if TWO_PATHS\r
/* get next available path index */\r
/* Get the previous last output PaRAM, used in chaining */\r
prevLastPrmPtr = tcp3dInst->lastParam[pathFlag];\r
\r
- /* Change the TCC to L2P */\r
- CSL_FINS(prevLastPrmPtr->opt, TPCC_PARAM_OPT_TCC, l2pCh[pathFlag]);\r
-\r
/**\r
* If previous block has notification, change the previous param\r
* link to NTFD, otherwise change to dummy REVT link PaRAM.\r
if ( tcp3dInst->prevNtfFlag[pathFlag] )\r
{\r
/* Change the LINK to interrupt Notify PaRAM */\r
- prevLastPrmPtr->linkAddr = ntfdLink[pathFlag];\r
+ prevLastPrmPtr->linkAddr = chainToNextCbNtfdLink[pathFlag];\r
}\r
else\r
{\r
/* Change the LINK to dummy REVT PaRAM */\r
- prevLastPrmPtr->linkAddr = revtLink[pathFlag];\r
+ prevLastPrmPtr->linkAddr = chainToNextCbDummyLink[pathFlag];\r
}\r
}\r
\r
\r
/* Store pointers for the end of list (PING starts first in the list)*/\r
prm = &tcp3dInst->pseudoParamBufPtr[(tcp3dInst->maxCodeBlocks-2)*TCP3D_DRV_LINK_CB];\r
- if ( tcp3dInst->maxCodeBlocks % 1 )\r
+ if ( tcp3dInst->maxCodeBlocks & 1 )\r
{ /* even */\r
tcp3dInst->endListParam[PING_INDEX] = prm;\r
tcp3dInst->endListParam[PONG_INDEX] = prm+TCP3D_DRV_LINK_CB;\r
@@ -1698,6 +1693,162 @@ static EDMA3_DRV_Result Tcp3d_initEdmaChParam (IN Tcp3d_Instance *tcp3dInst)
tcp3dInst->pongLinkCh[LINK_CH_IDX_WRAP],\r
prm);\r
\r
+ \r
+ /* Link Channel - NEXTCB Dummy 0 (LINK_CH_IDX_NEXTCB_DUMMY PaRAM) */\r
+ /* chain to L2P\r
+ link to ping dummy REVT channel \r
+ A-sync\r
+ ACNT = 1\r
+ BCNT = 0\r
+ CCNT = 0\r
+ scrBIDX = 0\r
+ desBIDX = 0\r
+ scrCIDX = 0\r
+ desCIDX = 0 */\r
+ /* Fill the PaRAM Set with transfer specific information */\r
+ /* First set OPT field with appropriate values */\r
+#if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
+ prm->opt = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
+ CSL_EDMA3_TCCH_EN,\r
+ CSL_EDMA3_ITCINT_DIS,\r
+ CSL_EDMA3_TCINT_DIS,\r
+ tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P],\r
+ CSL_EDMA3_TCC_EARLY,\r
+ CSL_EDMA3_FIFOWIDTH_NONE,\r
+ CSL_EDMA3_STATIC_DIS,\r
+ CSL_EDMA3_SYNC_A,\r
+ CSL_EDMA3_ADDRMODE_INCR,\r
+ CSL_EDMA3_ADDRMODE_INCR );\r
+#else\r
+ prm->opt = 0;\r
+ /* Enable Final transfer completion chain */\r
+ prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
+ /* Program the TCC */\r
+ CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P]);\r
+ /* Early Trasfer Completion */\r
+ prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCMOD_SHIFT);\r
+ /* A Sync Transfer Mode */\r
+ prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
+ /* Src & Dest are in INCR modes */\r
+ prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
+ prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
+#endif\r
+ prm->srcAddr = NULL;\r
+ prm->destAddr = NULL;\r
+ prm->aCnt = 1;\r
+ prm->bCnt = 0;\r
+ prm->cCnt = 0;\r
+ prm->bCntReload = 0;\r
+ prm->srcBIdx = 0;\r
+ prm->destBIdx = 0;\r
+ prm->srcCIdx = 0;\r
+ prm->destCIdx = 0;\r
+ prm->linkAddr = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_REVT]);\r
+\r
+ /* Now, write the PaRAM Set. */\r
+ status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
+ tcp3dInst->pingLinkCh[LINK_CH_IDX_NEXTCB_DUMMY],\r
+ prm);\r
+\r
+ \r
+ /* Link Channel - NEXTCB 1 (LINK_CH_IDX_NEXTCB_DUMMY PaRAM) */\r
+ /* chain to L2P\r
+ link to pong dummy REVT channel\r
+ A-sync\r
+ ACNT = 1\r
+ BCNT = 1\r
+ CCNT = 1\r
+ scrBIDX = 0\r
+ desBIDX = 0\r
+ scrCIDX = 0\r
+ desCIDX = 0 */\r
+ /* Fill the PaRAM Set with transfer specific information */\r
+ CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_L2P]);\r
+ prm->linkAddr = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_REVT]);\r
+\r
+ /* Now, write the PaRAM Set. */\r
+ status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
+ tcp3dInst->pongLinkCh[LINK_CH_IDX_NEXTCB_DUMMY],\r
+ prm);\r
+ \r
+\r
+ /* Link Channel - NEXTCB Notify Dummy 0 (LINK_CH_IDX_NEXTCB_NTFD PaRAM) */\r
+ /* chain to L2P\r
+ link to NotifyD channel \r
+ A-sync\r
+ ACNT = 1\r
+ BCNT = 0\r
+ CCNT = 0\r
+ scrBIDX = 0\r
+ desBIDX = 0\r
+ scrCIDX = 0\r
+ desCIDX = 0 */\r
+ /* Fill the PaRAM Set with transfer specific information */\r
+ /* First set OPT field with appropriate values */\r
+#if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
+ prm->opt = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
+ CSL_EDMA3_TCCH_EN,\r
+ CSL_EDMA3_ITCINT_DIS,\r
+ CSL_EDMA3_TCINT_DIS,\r
+ tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P],\r
+ CSL_EDMA3_TCC_EARLY,\r
+ CSL_EDMA3_FIFOWIDTH_NONE,\r
+ CSL_EDMA3_STATIC_DIS,\r
+ CSL_EDMA3_SYNC_A,\r
+ CSL_EDMA3_ADDRMODE_INCR,\r
+ CSL_EDMA3_ADDRMODE_INCR );\r
+#else\r
+ prm->opt = 0;\r
+ /* Enable Final transfer completion chain */\r
+ prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
+ /* Program the TCC */\r
+ CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P]);\r
+ /* Early Trasfer Completion */\r
+ prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCMOD_SHIFT);\r
+ /* A Sync Transfer Mode */\r
+ prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
+ /* Src & Dest are in INCR modes */\r
+ prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
+ prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
+#endif\r
+ prm->srcAddr = NULL;\r
+ prm->destAddr = NULL;\r
+ prm->aCnt = 1;\r
+ prm->bCnt = 0;\r
+ prm->cCnt = 0;\r
+ prm->bCntReload = 0;\r
+ prm->srcBIdx = 0;\r
+ prm->destBIdx = 0;\r
+ prm->srcCIdx = 0;\r
+ prm->destCIdx = 0;\r
+ prm->linkAddr = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_NTFD]);\r
+\r
+ /* Now, write the PaRAM Set. */\r
+ status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
+ tcp3dInst->pingLinkCh[LINK_CH_IDX_NEXTCB_NTFD],\r
+ prm);\r
+\r
+ \r
+ /* Link Channel - NEXTCB Notify Dummy 1 (LINK_CH_IDX_NEXTCB_NTFD PaRAM) */\r
+ /* chain to L2P\r
+ link to NotifyD channel\r
+ A-sync\r
+ ACNT = 1\r
+ BCNT = 1\r
+ CCNT = 1\r
+ scrBIDX = 0\r
+ desBIDX = 0\r
+ scrCIDX = 0\r
+ desCIDX = 0 */\r
+ /* Fill the PaRAM Set with transfer specific information */\r
+ CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_L2P]);\r
+ prm->linkAddr = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_NTFD]);\r
+\r
+ /* Now, write the PaRAM Set. */\r
+ status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
+ tcp3dInst->pongLinkCh[LINK_CH_IDX_NEXTCB_NTFD],\r
+ prm); \r
+\r
return ( status );\r
\r
} /* end of - Tcp3d_initEdmaChParam() function */\r