1 /**\r
2 * \file tcp3d_drv.c\r
3 *\r
4 * \brief TCP3D Driver functions.\r
5 *\r
6 * Copyright (C) Texas Instruments Incorporated 2009, 2014\r
7 * \r
8 * Redistribution and use in source and binary forms, with or without \r
9 * modification, are permitted provided that the following conditions \r
10 * are met:\r
11 *\r
12 * Redistributions of source code must retain the above copyright \r
13 * notice, this list of conditions and the following disclaimer.\r
14 *\r
15 * Redistributions in binary form must reproduce the above copyright\r
16 * notice, this list of conditions and the following disclaimer in the \r
17 * documentation and/or other materials provided with the \r
18 * distribution.\r
19 *\r
20 * Neither the name of Texas Instruments Incorporated nor the names of\r
21 * its contributors may be used to endorse or promote products derived\r
22 * from this software without specific prior written permission.\r
23 *\r
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
27 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
28 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
31 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
35 *\r
36 */\r
37 \r
38 /**\r
39 * Include Files\r
40 */\r
41 /* TCP3D driver includes */\r
42 #include <ti/drv/tcp3d/tcp3d_drv.h>\r
43 #include <ti/drv/tcp3d/src/tcp3d_drv_priv.h>\r
44 \r
45 /* TCP3D Types and OSAL defintions: These files can be overriden by customers\r
46 * to point to their copies. Because of this the files have not been explicitly \r
47 * specified to include the driver path.*/\r
48 #include <tcp3d_drv_types.h>\r
49 #include <tcp3d_osal.h>\r
50 \r
51 #define TWO_PATHS 0\r
52 \r
53 #define TPCC_REVT_REGS 0\r
54 #define TPCC_L2P_REGS 1\r
55 \r
56 #define PING_INDEX 0\r
57 #define PONG_INDEX 1\r
58 \r
59 /** @brief Global Variable which describes the TCP3D Driver Version Information */\r
60 const char Tcp3dDrvVersionStr[] = TCP3D_DRV_VERSION_STR ":" __DATE__ ":" __TIME__;\r
61 \r
62 /****************************************************************************\r
63 * TCP3D Driver Functions *\r
64 ****************************************************************************/\r
65 /*******************************************************************************\r
66 * Enables interrupt generation by EDMA CC. Sets two bits of L2P channels \r
67 * in the TPCC_IESR/TPCC_IESRH.\r
68 ******************************************************************************/\r
69 static void Tcp3d_enableEdmaL2pIntr(Tcp3d_Instance *inst)\r
70 {\r
71 #if UNTESTED_CODE\r
72 *inst->intEnSetReg[TPCC_L2P_REGS] = (inst->l2pChMaskPing | inst->l2pChMaskPong);\r
73 #ifdef SIM_WORKAROUND\r
74 /**\r
75 * WORKAROUND: Current Simulator does not generate interrupt\r
76 * when there is a pending IPR bit and we enable the IER in the\r
77 * EDMA register space. So, We are forcing the EDMA to generate\r
78 * the interrupt if the IPR has valid bits. \r
79 */\r
80 if ( inst->intPendReg[TPCC_L2P_REGS] &&\r
81 (inst->l2pChMaskPing | inst->l2pChMaskPong) )\r
82 {\r
83 inst->tpccShadowRegs->TPCC_IEVAL = 1;\r
84 }\r
85 #endif\r
86 #else\r
87 /* Set/Clear ITCINT bit in OPT field based on drvCtrl->intrFlag */\r
88 inst->pingPtrL2p->opt |= (1 << CSL_TPCC_PARAM_OPT_ITCINTEN_SHIFT);\r
89 inst->pongPtrL2p->opt |= (1 << CSL_TPCC_PARAM_OPT_ITCINTEN_SHIFT);\r
90 inst->pingPtrL2p->opt |= (1 << CSL_TPCC_PARAM_OPT_TCINTEN_SHIFT);\r
91 inst->pongPtrL2p->opt |= (1 << CSL_TPCC_PARAM_OPT_TCINTEN_SHIFT);\r
92 #endif\r
93 inst->pingL2pEnCntr++;\r
94 }\r
95 \r
96 /*******************************************************************************\r
97 * Disables interrupt generation by EDMA CC. Sets two bits of L2P channels \r
98 * in the TPCC_IECR/TPCC_IECRH.\r
99 ******************************************************************************/\r
100 static void Tcp3d_disableEdmaL2pIntr(Tcp3d_Instance *inst)\r
101 {\r
102 #if UNTESTED_CODE\r
103 *inst->intEnClrReg[TPCC_L2P_REGS] = (inst->l2pChMaskPing | inst->l2pChMaskPong); \r
104 #else\r
105 /* Set/Clear ITCINT bit in OPT field based on drvCtrl->intrFlag */\r
106 inst->pingPtrL2p->opt &= ~(1 << CSL_TPCC_PARAM_OPT_ITCINTEN_SHIFT);\r
107 inst->pongPtrL2p->opt &= ~(1 << CSL_TPCC_PARAM_OPT_ITCINTEN_SHIFT);\r
108 inst->pingPtrL2p->opt &= ~(1 << CSL_TPCC_PARAM_OPT_TCINTEN_SHIFT);\r
109 inst->pongPtrL2p->opt &= ~(1 << CSL_TPCC_PARAM_OPT_TCINTEN_SHIFT);\r
110 #endif\r
111 inst->pingL2pEnCntr--;\r
112 }\r
113 \r
114 /*******************************************************************************\r
115 * Clears pending interrupt generated by EDMA CC. Sets two bits of L2P channels \r
116 * in the TPCC_ICR/TPCC_ICRH.\r
117 ******************************************************************************/\r
118 static void Tcp3d_clearEdmaL2pIntr(Tcp3d_Instance *inst)\r
119 {\r
120 #if UNTESTED_CODE\r
121 *inst->clrIntPendReg[TPCC_L2P_REGS] = (inst->l2pChMaskPing | inst->l2pChMaskPong); \r
122 #endif\r
123 inst->pingL2pEnCntr=0;\r
124 }\r
125 \r
126 /*******************************************************************************\r
127 * Enables interrupt generation by EDMA CC. Sets two bits of REVT channels \r
128 * in the TPCC_IESR/TPCC_IESRH.\r
129 ******************************************************************************/\r
130 static void Tcp3d_enableEdmaPauseIntr(Tcp3d_Instance *inst)\r
131 {\r
132 *inst->intEnSetReg[TPCC_REVT_REGS] = (inst->pauseChMaskPing | inst->pauseChMaskPong);\r
133 #ifdef SIM_WORKAROUND\r
134 /**\r
135 * WORKAROUND: Current Simulator does not generate interrupt\r
136 * when there is a pending IPR bit and we enable the IER in the\r
137 * EDMA register space. So, We are forcing the EDMA to generate\r
138 * the interrupt if the IPR has valid bits. \r
139 */\r
140 if ( inst->intPendReg[TPCC_REVT_REGS] &&\r
141 (inst->pauseChMaskPing | inst->pauseChMaskPong) )\r
142 {\r
143 inst->tpccShadowRegs->TPCC_IEVAL = 1;\r
144 }\r
145 #endif\r
146 inst->pingPauseEnCntr++;\r
147 }\r
148 \r
149 /*******************************************************************************\r
150 * Disables interrupt generation by EDMA CC. Sets two bits of REVT channels \r
151 * in the TPCC_IECR/TPCC_IECRH.\r
152 ******************************************************************************/\r
153 static void Tcp3d_disableEdmaPauseIntr(Tcp3d_Instance *inst)\r
154 {\r
155 *inst->intEnClrReg[TPCC_REVT_REGS] = (inst->pauseChMaskPing | inst->pauseChMaskPong); \r
156 inst->pingPauseEnCntr--;\r
157 }\r
158 \r
159 /*******************************************************************************\r
160 * Clears pending interrupt generated by EDMA CC. Sets two bits of REVT channels \r
161 * in the TPCC_ICR/TPCC_ICRH.\r
162 ******************************************************************************/\r
163 static void Tcp3d_clearEdmaPauseIntr(Tcp3d_Instance *inst)\r
164 {\r
165 *inst->clrIntPendReg[TPCC_REVT_REGS] = (inst->pauseChMaskPing | inst->pauseChMaskPong); \r
166 inst->pingPauseEnCntr=0;\r
167 }\r
168 \r
169 /**\r
170 * @brief TCP3D Driver function for providing the number of buffers\r
171 * required.\r
172 */\r
173 Tcp3d_Result Tcp3d_getNumBuf (IN Tcp3d_SizeCfg *cfg,\r
174 OUT int16_t *nbufs)\r
175 {\r
176 *nbufs = TCP3D_DRV_NUM_BUF;\r
177 \r
178 return ( TCP3D_DRV_NO_ERR );\r
179 }\r
180 \r
181 /**\r
182 * @brief TCP3D Driver function for providing the attributes of all the\r
183 * number of buffers requested through the structure of type\r
184 * Tcp3d_MemBuffer provided.\r
185 */\r
186 Tcp3d_Result Tcp3d_getBufDesc ( IN Tcp3d_SizeCfg *cfg,\r
187 OUT Tcp3d_MemBuffer bufs[])\r
188 {\r
189 bufs[TCP3D_DRV_INST_BUFN].size = sizeof(Tcp3d_Instance);\r
190 bufs[TCP3D_DRV_INST_BUFN].log2align = 2;\r
191 bufs[TCP3D_DRV_INST_BUFN].mclass = Tcp3d_BufClass_L2RAM;\r
192 bufs[TCP3D_DRV_INST_BUFN].volat = TRUE;\r
193 \r
194 bufs[TCP3D_DRV_PSEUDO_PARAM_BUFN].size = (cfg->maxCodeBlocks<<5)*TCP3D_DRV_LINK_CB;\r
195 bufs[TCP3D_DRV_PSEUDO_PARAM_BUFN].log2align = 2;\r
196 bufs[TCP3D_DRV_PSEUDO_PARAM_BUFN].mclass = Tcp3d_BufClass_L2RAM;\r
197 bufs[TCP3D_DRV_PSEUDO_PARAM_BUFN].volat = TRUE;\r
198 \r
199 return ( TCP3D_DRV_NO_ERR );\r
200 }\r
201 \r
202 /**\r
203 * @brief TCP3D Driver Initialization function which must be called only\r
204 * once to initialize the driver instance and other required\r
205 * resources needed for the driver functionality.\r
206 */\r
207 Tcp3d_Result Tcp3d_init( IN Tcp3d_MemBuffer bufs[],\r
208 IN Tcp3d_InitParams *drvInitParams)\r
209 {\r
210 Tcp3d_Result tcp3dResult = TCP3D_DRV_NO_ERR;\r
211 Tcp3d_Instance *tcp3dInst;\r
212 uint32_t modeReg = 0, endReg = 0, exeRegP0 = 0, exeRegP1 =0;\r
213 int32_t idx, locBufSize[TCP3D_DRV_NUM_BUF];\r
214 CSL_Tcp3d_cfgRegs *tcp3dCfgRegs;\r
215 \r
216 /* Check for valid instance number */\r
217 if ( drvInitParams->instNum >= TCP3D_DRV_MAX_NUM_INSTANCES )\r
218 {\r
219 /* Return error */\r
220 tcp3dResult = TCP3D_DRV_INVALID_INSTANCE_NUMBER;\r
221 \r
222 return ( tcp3dResult );\r
223 }\r
224 \r
225 /* compute the buffer sizes table */\r
226 locBufSize[TCP3D_DRV_INST_BUFN] = sizeof(Tcp3d_Instance);\r
227 locBufSize[TCP3D_DRV_PSEUDO_PARAM_BUFN] = (drvInitParams->maxCodeBlocks<<5)*TCP3D_DRV_LINK_CB;\r
228 \r
229 /* Check if all buffers have valid addresses and sizes */\r
230 for ( idx = 0; idx < TCP3D_DRV_NUM_BUF; idx++)\r
231 {\r
232 if ( bufs[idx].base == NULL || bufs[idx].size < locBufSize[idx] )\r
233 tcp3dResult = TCP3D_DRV_INVALID_BUFF;\r
234 }\r
235 \r
236 /* Initialize the instance if the buffer addresses are not NULL */\r
237 if ( tcp3dResult == TCP3D_DRV_NO_ERR )\r
238 {\r
239 /* Initialize the driver Instance */\r
240 tcp3dInst = (Tcp3d_Instance *) bufs[TCP3D_DRV_INST_BUFN].base;\r
241 \r
242 /* Initialize the pseudo PaRAM array pointer */\r
243 tcp3dInst->pseudoParamBufPtr = (EDMA3_DRV_PaRAMRegs *) bufs[TCP3D_DRV_PSEUDO_PARAM_BUFN].base;\r
244 }\r
245 else\r
246 {\r
247 /* Return the error */\r
248 return ( tcp3dResult );\r
249 }\r
250 \r
251 /* Get the address of TCP3D configuration registers base address */\r
252 tcp3dCfgRegs = drvInitParams->tcp3dCfgRegs;\r
253 \r
254 /* Update the instace with the input parameters */\r
255 tcp3dInst->mode = drvInitParams->ctrlParams.mode;\r
256 tcp3dInst->doubleBuffer = drvInitParams->ctrlParams.doubleBuf;\r
257 tcp3dInst->edmaHnd = drvInitParams->edmaHnd;\r
258 tcp3dInst->edmaRegionId = drvInitParams->edmaRegionId;\r
259 tcp3dInst->maxCodeBlocks = drvInitParams->maxCodeBlocks;\r
260 tcp3dInst->notificationEventNum = drvInitParams->notificationEventNum;\r
261 tcp3dInst->cpIntc0RegsBase = drvInitParams->cpIntc0RegsBase;\r
262 tcp3dInst->tpccShadowRegs = drvInitParams->edma3ShadowRegsBase;\r
263 tcp3dInst->instNum = drvInitParams->instNum;\r
264 tcp3dInst->coreId = drvInitParams->coreID;\r
265 \r
266 /* Verify the REVT channels */\r
267 if ( ( drvInitParams->pingCh[0] != drvInitParams->pingConfig.revtCh ) ||\r
268 ( drvInitParams->pongCh[0] != drvInitParams->pongConfig.revtCh ) )\r
269 {\r
270 /* Return error */\r
271 tcp3dResult = TCP3D_DRV_INVALID_EDMA_CH;\r
272 \r
273 return ( tcp3dResult );\r
274 }\r
275 \r
276 for ( idx = 0; idx < TCP3D_DRV_MAX_CH_PER_PATH; idx++ )\r
277 {\r
278 /* Copy PING Channels */\r
279 tcp3dInst->pingCh[idx] = drvInitParams->pingCh[idx];\r
280 \r
281 /* Copy PONG Channels */\r
282 tcp3dInst->pongCh[idx] = drvInitParams->pongCh[idx];\r
283 }\r
284 \r
285 for ( idx = 0; idx < (TCP3D_DRV_MAX_LINK_CH>>1); idx++ )\r
286 {\r
287 /* Copy PING Channels */\r
288 tcp3dInst->pingLinkCh[idx] = drvInitParams->linkCh[idx];\r
289 \r
290 /* Copy PONG Channels */\r
291 tcp3dInst->pongLinkCh[idx] = drvInitParams->linkCh[idx+(TCP3D_DRV_MAX_LINK_CH>>1)];\r
292 }\r
293 \r
294 /* Set the Driver variables to defaults */\r
295 tcp3dInst->constantOne = 1;\r
296 tcp3dInst->pauseState = TCP3D_DRV_STATE_PAUSE;\r
297 \r
298 /* Initialize the driver variables */\r
299 tcp3dInst->maxPingCbCnt = (tcp3dInst->maxCodeBlocks >> 1);\r
300 tcp3dInst->maxPongCbCnt = (tcp3dInst->maxCodeBlocks >> 1);\r
301 tcp3dInst->maxPingCbIdx = ((tcp3dInst->maxPingCbCnt - 1) << 1);\r
302 tcp3dInst->maxPongCbIdx = ((tcp3dInst->maxPongCbCnt << 1) - 1);\r
303 \r
304 /* Reset run-time variables */\r
305 Tcp3d_resetRuntimeVariables(tcp3dInst);\r
306 \r
307 /* EDMA3 - get PaRAM addresses of all physical channels */\r
308 if ( EDMA3_DRV_SOK != Tcp3d_getEdmaChParamAddr(tcp3dInst) )\r
309 {\r
310 tcp3dResult = TCP3D_DRV_FAIL_EDMA_GET_PARAM_ADDR;\r
311 \r
312 return ( tcp3dResult );\r
313 }\r
314 \r
315 /* Initialize the EDMA PaRAM memory for the physical channels */\r
316 if ( EDMA3_DRV_SOK != Tcp3d_initEdmaChParam(tcp3dInst) )\r
317 {\r
318 tcp3dResult = TCP3D_DRV_FAIL_EDMA_PARAM_INIT;\r
319 \r
320 return ( tcp3dResult );\r
321 }\r
322 \r
323 /* EDMA3 - Enable the EVENT triggered channels */\r
324 if ( EDMA3_DRV_SOK != Tcp3d_enableEdmaChannels(tcp3dInst) )\r
325 {\r
326 tcp3dResult = TCP3D_DRV_FAIL_EDMA_ENABLE_CHANNEL;\r
327 \r
328 return ( tcp3dResult );\r
329 }\r
330 \r
331 /* Initialize the pseudo PaRAM memory */\r
332 Tcp3d_initPseudoParam ( tcp3dInst,\r
333 tcp3dInst->maxCodeBlocks,\r
334 &drvInitParams->pingConfig,\r
335 &drvInitParams->pongConfig);\r
336 \r
337 /* Prepare the control registers for both P0 and P1 processes */\r
338 Tcp3d_prepControlRegs ( &drvInitParams->ctrlParams,\r
339 &modeReg,\r
340 &endReg,\r
341 &exeRegP0,\r
342 &exeRegP1);\r
343 \r
344 /* \r
345 * Soft Reset the TCP3D.\r
346 * Insert NOPs b/w the reset calls in HW to work properly.\r
347 */\r
348 tcp3dCfgRegs->TCP3_SOFT_RESET = 1;\r
349 tcp3dCfgRegs->TCP3_SOFT_RESET = 0;\r
350 \r
351 /**\r
352 * Write to the Control registers with the prepared values to start\r
353 * the TCP3D state machine.\r
354 */\r
355 tcp3dCfgRegs->TCP3_MODE = modeReg;\r
356 tcp3dCfgRegs->TCP3_END = endReg;\r
357 tcp3dCfgRegs->TCP3_EXE_P0 = exeRegP0;\r
358 if ( tcp3dInst->doubleBuffer != CSL_TCP3D_CFG_TCP3_MODE_IN_MEM_DB_EN_ENABLE )\r
359 tcp3dCfgRegs->TCP3_EXE_P1 = exeRegP1;\r
360 \r
361 /* Set Local Variables used in the runtime APIs */\r
362 Tcp3d_setLocalVariables(tcp3dInst);\r
363 \r
364 /* Disable the interrupts */\r
365 Tcp3d_disableEdmaL2pIntr(tcp3dInst);\r
366 Tcp3d_disableEdmaPauseIntr(tcp3dInst);\r
367 \r
368 /* Clear pending interrupts */\r
369 Tcp3d_clearEdmaL2pIntr(tcp3dInst);\r
370 Tcp3d_clearEdmaPauseIntr(tcp3dInst);\r
371 \r
372 /* Reset the EDMA Channels */\r
373 Tcp3d_resetEdmaChParam (tcp3dInst,\r
374 tcp3dInst->maxPingCbCnt,\r
375 tcp3dInst->maxPongCbCnt);\r
376 \r
377 /* Change the state */\r
378 tcp3dInst->state = TCP3D_DRV_STATE_INIT;\r
379 \r
380 return ( tcp3dResult );\r
381 \r
382 } /* end of - Tcp3d_init() function */\r
383 \r
384 /**\r
385 * @brief TCP3D Driver Deinitialization function.\r
386 */\r
387 Tcp3d_Result Tcp3d_deInit ( IN Tcp3d_Instance *inst )\r
388 {\r
389 /* Disable interrupts */\r
390 Tcp3d_disableEdmaL2pIntr(inst); \r
391 Tcp3d_disableEdmaPauseIntr(inst); \r
392 \r
393 /* Clear pending interrupts */\r
394 Tcp3d_clearEdmaL2pIntr(inst);\r
395 Tcp3d_clearEdmaPauseIntr(inst);\r
396 \r
397 return ( TCP3D_DRV_NO_ERR );\r
398 }\r
399 \r
400 /**\r
401 * @brief TCP3D Driver function called to reset the driver at sub-frame\r
402 * boundary. This function does the following:\r
403 * 1) Set the instance with the passed values - for example number\r
404 * of blocks for decoding in this subframe which is needed to\r
405 * for checking the boundary and a new status array pointer\r
406 * where the status register values for each code block are\r
407 * trasferred.\r
408 * 2) Initialize all the run-time instance variables to default.\r
409 * 3) Initialize the pseudo PaRAM memory with all the defaults\r
410 * based on mode.\r
411 * 4) Reset the EDMA channels with default values. \r
412 */\r
413 Tcp3d_Result Tcp3d_reset ( IN Tcp3d_Instance *tcp3dInst,\r
414 IN uint32_t codeBlocks)\r
415 {\r
416 Tcp3d_Result tcp3dResult = TCP3D_DRV_NO_ERR;\r
417 \r
418 /* First check for valid statte */\r
419 if ( ( tcp3dInst->pingStop != 1 ) && ( tcp3dInst->pongStop != 1) )\r
420 tcp3dResult = TCP3D_DRV_INVALID_STATE;\r
421 \r
422 /* Check if the codeblocks value is valid */\r
423 if ( ( codeBlocks > tcp3dInst->maxCodeBlocks ) || ( codeBlocks < 2 ) )\r
424 tcp3dResult = TCP3D_DRV_INVALID_PARAMETER;\r
425 \r
426 /* Return if any error found */\r
427 if ( tcp3dResult != TCP3D_DRV_NO_ERR )\r
428 return ( tcp3dResult );\r
429 \r
430 /* update the maxCodeBlocks and dependent variables, if needed */\r
431 if ( codeBlocks != NULL )\r
432 {\r
433 tcp3dInst->maxCodeBlocks = codeBlocks;\r
434 tcp3dInst->maxPingCbCnt = (codeBlocks >> 1);\r
435 tcp3dInst->maxPongCbCnt = (codeBlocks >> 1);\r
436 /* max position index in pseudo Param Buffer */\r
437 tcp3dInst->maxPingCbIdx = ((tcp3dInst->maxPingCbCnt - 1) << 1);\r
438 tcp3dInst->maxPongCbIdx = ((tcp3dInst->maxPongCbCnt << 1) - 1);\r
439 }\r
440 \r
441 /* Reset run-time variables */\r
442 Tcp3d_resetRuntimeVariables(tcp3dInst);\r
443 \r
444 /* Reset the pseudo PaRAM memory */\r
445 Tcp3d_resetPseudoParam(tcp3dInst, tcp3dInst->maxCodeBlocks);\r
446 \r
447 /* Reset the EDMA Channels */\r
448 Tcp3d_resetEdmaChParam (tcp3dInst,\r
449 tcp3dInst->maxPingCbCnt,\r
450 tcp3dInst->maxPongCbCnt);\r
451 \r
452 /* Disable the interrupts */\r
453 Tcp3d_disableEdmaL2pIntr(tcp3dInst);\r
454 Tcp3d_disableEdmaPauseIntr(tcp3dInst);\r
455 \r
456 /* Clear pending interrupts */\r
457 Tcp3d_clearEdmaL2pIntr(tcp3dInst);\r
458 Tcp3d_clearEdmaPauseIntr(tcp3dInst);\r
459 \r
460 /* Change the state */\r
461 tcp3dInst->state = TCP3D_DRV_STATE_INIT;\r
462 \r
463 return ( tcp3dResult );\r
464 } /* end of - Tcp3d_reset() function */\r
465 \r
466 /**\r
467 * @brief TCP3D Driver function for enqueuing the code blocks to the input\r
468 * list. Here the input list is a pseudo PaRAM list consisting of\r
469 * actual PaRAM entries for INCFG, LLR, HD, SD & STS transfers.\r
470 */\r
471 Tcp3d_Result Tcp3d_enqueueCodeBlock(IN Tcp3d_Instance *tcp3dInst,\r
472 IN uint32_t blockLength,\r
473 IN uint32_t *inputConfigPtr,\r
474 IN int8_t *llrPtr,\r
475 IN uint32_t llrOffset,\r
476 IN uint32_t *hdPtr,\r
477 IN int8_t *sdPtr,\r
478 IN uint32_t sdOffset,\r
479 IN uint32_t *statusPtr,\r
480 IN uint8_t ntfEventFlag)\r
481 {\r
482 EDMA3_DRV_PaRAMRegs *lastOutPrm;\r
483 int32_t blockIndex;\r
484 int32_t pathFlag;\r
485 Tcp3d_Result tcp3dResult = TCP3D_DRV_NO_ERR;\r
486 Tcp3d_Result tcp3dResult2 = TCP3D_DRV_NO_ERR;\r
487 EDMA3_DRV_PaRAMRegs *prmCfg;\r
488 EDMA3_DRV_PaRAMRegs *prmLlr;\r
489 EDMA3_DRV_PaRAMRegs *prmHd;\r
490 EDMA3_DRV_PaRAMRegs *prmSts;\r
491 EDMA3_DRV_PaRAMRegs *prmSd;\r
492 EDMA3_DRV_PaRAMRegs *prevLastPrmPtr;\r
493 EDMA3_DRV_PaRAMRegs *prmWrap;\r
494 \r
495 uint16_t ntfLink[2];\r
496 uint16_t stsLink[2];\r
497 uint16_t sdLink[2];\r
498 uint32_t wrapLink[2];\r
499 uint16_t chainToNextCbDummyLink[2];\r
500 uint16_t chainToNextCbNtfdLink[2];\r
501 \r
502 ntfLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_NTF];\r
503 ntfLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_NTF];\r
504 stsLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_STS];\r
505 stsLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_STS];\r
506 sdLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_SD];\r
507 sdLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_SD];\r
508 wrapLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_WRAP];\r
509 wrapLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_WRAP];\r
510 chainToNextCbDummyLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_NEXTCB_DUMMY];\r
511 chainToNextCbDummyLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_NEXTCB_DUMMY];\r
512 chainToNextCbNtfdLink[PING_INDEX] = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_NEXTCB_NTFD];\r
513 chainToNextCbNtfdLink[PONG_INDEX] = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_NEXTCB_NTFD];\r
514 \r
515 #if TWO_PATHS\r
516 /* get next available path index */\r
517 pathFlag = tcp3dInst->nextCodeBlockIndex;\r
518 if ( pathFlag )\r
519 {\r
520 if ( tcp3dInst->pongFreeCnt )\r
521 {\r
522 blockIndex = tcp3dInst->nextPongInIdx;\r
523 }\r
524 else if ( tcp3dInst->pingFreeCnt )\r
525 {\r
526 blockIndex = tcp3dInst->nextPingInIdx;\r
527 pathFlag = 0;\r
528 }\r
529 }\r
530 else\r
531 {\r
532 if ( tcp3dInst->pingFreeCnt )\r
533 {\r
534 blockIndex = tcp3dInst->nextPingInIdx;\r
535 }\r
536 else if ( tcp3dInst->pongFreeCnt )\r
537 {\r
538 blockIndex = tcp3dInst->nextPongInIdx;\r
539 pathFlag = 1;\r
540 }\r
541 }\r
542 \r
543 /* update the next path flag */\r
544 if ( pathFlag )\r
545 tcp3dInst->nextCodeBlockIndex = 0;\r
546 else\r
547 tcp3dInst->nextCodeBlockIndex = 1;\r
548 \r
549 /* add new block to the list until available capacity */\r
550 if ( tcp3dInst->pingFreeCnt || tcp3dInst->pongFreeCnt )\r
551 #else\r
552 /* path flag from the blockIndex value */\r
553 blockIndex = tcp3dInst->nextCodeBlockIndex;\r
554 pathFlag = (blockIndex & 1);\r
555 \r
556 /* add new block to the list until available capacity */\r
557 if ( ( ( pathFlag == 0 ) && tcp3dInst->pingFreeCnt ) ||\r
558 ( ( pathFlag == 1 ) && tcp3dInst->pongFreeCnt ) )\r
559 #endif\r
560 {\r
561 /* Update the pointers */\r
562 prmCfg = &tcp3dInst->pseudoParamBufPtr[blockIndex*TCP3D_DRV_LINK_CB];\r
563 prmLlr = prmCfg + LINK_CH_IDX_LLR;\r
564 prmHd = prmCfg + LINK_CH_IDX_HD;\r
565 prmSts = prmCfg + LINK_CH_IDX_STS;\r
566 prmSd = prmCfg + LINK_CH_IDX_SD;\r
567 \r
568 /**\r
569 * Update addresses first\r
570 */\r
571 prmCfg->srcAddr = (uint32_t) inputConfigPtr;\r
572 prmLlr->srcAddr = (uint32_t) llrPtr;\r
573 prmHd->destAddr = (uint32_t) hdPtr;\r
574 prmSts->destAddr = (uint32_t) statusPtr;\r
575 prmSd->destAddr = (uint32_t) sdPtr;\r
576 /**\r
577 * Update counts for needed\r
578 */\r
579 prmSd->aCnt = blockLength;\r
580 if ( ( tcp3dInst->mode == CSL_TCP3D_CFG_TCP3_MODE_MODE_SEL_LTE) ||\r
581 ( tcp3dInst->mode == CSL_TCP3D_CFG_TCP3_MODE_MODE_SEL_WIMAX ) )\r
582 {\r
583 prmLlr->aCnt = (blockLength>>1);\r
584 prmLlr->srcBIdx = (blockLength>>1);\r
585 prmLlr->srcCIdx = llrOffset;\r
586 prmHd->aCnt = (blockLength>>3);\r
587 prmSd->destBIdx = sdOffset;\r
588 }\r
589 else\r
590 {\r
591 prmLlr->aCnt = COMPUTE_KOUT(blockLength);\r
592 prmLlr->srcBIdx = llrOffset;\r
593 prmHd->aCnt = COMPUTE_HD_BYTE_SIZE(blockLength);\r
594 }\r
595 \r
596 /**\r
597 * Link Status & Soft decisions if avaiable.\r
598 * NOTE: For wrap-around case, load OPT & LINK fields with reset values\r
599 */\r
600 /* load HD OPT reset value */\r
601 prmHd->opt = tcp3dInst->resetHdOpt[pathFlag];\r
602 /* Check if STS is available */\r
603 if ( statusPtr != NULL )\r
604 {\r
605 /* update HD link */\r
606 prmHd->linkAddr = stsLink[pathFlag];\r
607 /* load STS OPT reset value */\r
608 prmSts->opt = tcp3dInst->resetStsOpt[pathFlag];\r
609 /* Check if SD is available */\r
610 if ( sdPtr != NULL )\r
611 {\r
612 /* load SD OPT reset value */\r
613 prmSd->opt = tcp3dInst->resetSdOpt[pathFlag];\r
614 /* update Status link */\r
615 prmSts->linkAddr = sdLink[pathFlag];\r
616 /* load SD link reset value */\r
617 prmSd->linkAddr = tcp3dInst->resetSdLink[pathFlag];\r
618 /* last param pointer */\r
619 lastOutPrm = prmSd;\r
620 }\r
621 else\r
622 {\r
623 /* link reset value */\r
624 prmSts->linkAddr = tcp3dInst->resetStsLink[pathFlag];\r
625 /* last param pointer */\r
626 lastOutPrm = prmSts;\r
627 }\r
628 }\r
629 else if ( sdPtr != NULL )\r
630 {\r
631 /* update HD link */\r
632 prmHd->linkAddr = sdLink[pathFlag];\r
633 /* load SD OPT reset value */\r
634 prmSd->opt = tcp3dInst->resetSdOpt[pathFlag];\r
635 /* load SD link reset value */\r
636 prmSd->linkAddr = tcp3dInst->resetSdLink[pathFlag];\r
637 /* last param pointer */\r
638 lastOutPrm = prmSd;\r
639 }\r
640 else\r
641 {\r
642 /* load HD link reset value */\r
643 prmHd->linkAddr = tcp3dInst->resetHdLink[pathFlag];\r
644 /* last param pointer */\r
645 lastOutPrm = prmHd;\r
646 }\r
647 \r
648 /* Add the WRAP param at the end of the output PaRAM */\r
649 if ( blockIndex >= (tcp3dInst->maxCodeBlocks-2) )\r
650 {\r
651 /* get the pointer for the wrap param for the appropriate path */\r
652 prmWrap = (EDMA3_DRV_PaRAMRegs *) wrapLink[pathFlag];\r
653 /* link with last out param */\r
654 lastOutPrm->linkAddr = 0xFFFF & wrapLink[pathFlag];\r
655 /* change the last param pointer */\r
656 lastOutPrm = prmWrap;\r
657 }\r
658 \r
659 /**\r
660 * If Interrupt nofication is requested, change the default link \r
661 * to LINK_CH_IDX_NTF for the last PaRAM.\r
662 */\r
663 if ( ntfEventFlag )\r
664 {\r
665 lastOutPrm->linkAddr = ntfLink[pathFlag];\r
666 }\r
667 \r
668 /**\r
669 * Chain the block to previous one in each path. This is done for blocks\r
670 * starting from the second one in each path.\r
671 * \r
672 * Since the blockIndex is tracking linearly the pseudo param buffer\r
673 * and ping & pong lists are used as interleaved lists, chaining is\r
674 * done starting from index 2 onwards till max.\r
675 */\r
676 if ( blockIndex > 1 )\r
677 {\r
678 /* Get the previous last output PaRAM, used in chaining */\r
679 prevLastPrmPtr = tcp3dInst->lastParam[pathFlag];\r
680 \r
681 /**\r
682 * If previous block has notification, change the previous param\r
683 * link to NTFD, otherwise change to dummy REVT link PaRAM.\r
684 */\r
685 if ( tcp3dInst->prevNtfFlag[pathFlag] )\r
686 {\r
687 /* Change the LINK to interrupt Notify PaRAM */\r
688 prevLastPrmPtr->linkAddr = chainToNextCbNtfdLink[pathFlag];\r
689 }\r
690 else\r
691 {\r
692 /* Change the LINK to dummy REVT PaRAM */\r
693 prevLastPrmPtr->linkAddr = chainToNextCbDummyLink[pathFlag];\r
694 }\r
695 }\r
696 \r
697 /* Store ntfEventFlag, used in chaining next block */\r
698 tcp3dInst->prevNtfFlag[pathFlag] = ntfEventFlag;\r
699 \r
700 /* Store the last output PaRAM, used in chaining next block */\r
701 tcp3dInst->lastParam[pathFlag] = lastOutPrm;\r
702 \r
703 /* Increment the ping/pong load counter */\r
704 if ( pathFlag )\r
705 {\r
706 tcp3dInst->pongLoadCnt++;\r
707 tcp3dInst->pongFreeCnt--;\r
708 tcp3dInst->nextPongInIdx += 2;\r
709 }\r
710 else\r
711 {\r
712 tcp3dInst->pingLoadCnt++;\r
713 tcp3dInst->pingFreeCnt--;\r
714 tcp3dInst->nextPingInIdx += 2;\r
715 }\r
716 \r
717 /* Reset index when reached maximum */\r
718 if ( tcp3dInst->nextPingInIdx > tcp3dInst->maxPingCbIdx )\r
719 {\r
720 tcp3dInst->nextPingInIdx = 0;\r
721 }\r
722 if ( tcp3dInst->nextPongInIdx > tcp3dInst->maxPongCbIdx )\r
723 {\r
724 tcp3dInst->nextPongInIdx = 1;\r
725 }\r
726 \r
727 #if !TWO_PATHS\r
728 /* Increment the index value until reaching the last block */\r
729 tcp3dInst->nextCodeBlockIndex++;\r
730 \r
731 /* Reset index when reached maximum */\r
732 if ( tcp3dInst->nextCodeBlockIndex >= tcp3dInst->maxCodeBlocks )\r
733 {\r
734 tcp3dInst->nextCodeBlockIndex = 0;\r
735 }\r
736 #endif\r
737 } /* if enqueue possible */\r
738 else\r
739 {\r
740 tcp3dResult = TCP3D_DRV_INPUT_LIST_FULL;\r
741 } /* if enqueue not possible */\r
742 \r
743 /* Call Start function as needed */\r
744 if ( ( tcp3dInst->startFlag ) &&\r
745 ( (tcp3dInst->pingStop) || (tcp3dInst->pongStop) ) )\r
746 {\r
747 tcp3dResult2 = Tcp3d_start(tcp3dInst, TCP3D_DRV_START_AUTO);\r
748 \r
749 /* If start returned an error, generate an error message. */\r
750 if ( TCP3D_DRV_NO_ERR != tcp3dResult2 )\r
751 {\r
752 Tcp3d_osalLog("Enqueue: Tcp3d_start function returned error with value : %d\n", tcp3dResult2);\r
753 }\r
754 }\r
755 \r
756 return ( tcp3dResult );\r
757 } /* end of - Tcp3d_enqueueCodeBlock() function */\r
758 \r
759 /**\r
760 * @brief This API could be used for starting the driver to start doing\r
761 * EDMA transfers to TCP3 decoder for decoding from the pseudo\r
762 * PaRAM list.\r
763 *\r
764 * This function is executed at the application task thread for\r
765 * starting either the PING or PONG path execution.\r
766 */\r
767 Tcp3d_Result Tcp3d_start ( INOUT Tcp3d_Instance *inst,\r
768 IN uint8_t startMode)\r
769 {\r
770 EDMA3_DRV_Result result = EDMA3_DRV_SOK;\r
771 EDMA3_DRV_PaRAMRegs *currPrmPtr1, *currPrmPtr2;\r
772 Tcp3d_Result tcp3dResult = TCP3D_DRV_NO_ERR;\r
773 uint16_t startNeeded = 0; /* 0 - not started, 1 - started */ \r
774 int32_t pingOutIdx, pongOutIdx;\r
775 \r
776 /* Set startFlag if first call to the function is made with AUTO mode */\r
777 if ( ( startMode == TCP3D_DRV_START_AUTO) && ( !inst->startFlag ) )\r
778 {\r
779 inst->startFlag = startMode;\r
780 }\r
781 \r
782 /**\r
783 * Return immediately, if both stop flags are not set.\r
784 * This is possible in two scenarios\r
785 * 1) After the init and before calling start with AUTO mode.\r
786 * 2) In steady state when both ping and pong decoders are busy. \r
787 */\r
788 if ( ( ( inst->pingStop == NULL ) && ( inst->pongStop == NULL ) ) ||\r
789 ( !inst->startFlag ) )\r
790 {\r
791 return ( tcp3dResult );\r
792 }\r
793 \r
794 /**\r
795 * Check startMode parameter to see if start needed\r
796 */\r
797 if ( startMode == TCP3D_DRV_START_AUTO )\r
798 {\r
799 /**\r
800 * Start is needed in the following cases.\r
801 * - if the current out index is less than next in index\r
802 * - if not, in the wrap case when blocks are loaded from beginning\r
803 * of the list where out index could be greater than next in index.\r
804 * Here check for the load count.\r
805 * \r
806 * Two LSB bits of the variable startNeeded are used for indicating the\r
807 * need to do start. LSB0 is used for PING and LSB1 is used for PONG. \r
808 */\r
809 /* PING STOP */\r
810 if ( inst->pingStop )\r
811 {\r
812 /**\r
813 * Only update the list variables if the driver is stopped \r
814 * for the ping side.\r
815 */\r
816 /**\r
817 * Read the source address of L2P Channel PaRAM to get the current\r
818 * pseudo PaRAM pointer for PING paths. Then compare with the \r
819 * start pointer to get the out index. \r
820 */\r
821 currPrmPtr1 = (EDMA3_DRV_PaRAMRegs *) inst->pingPtrL2p->srcAddr;\r
822 pingOutIdx = GET_CB_IDX(currPrmPtr1 - inst->startPrmPtr);\r
823 \r
824 /* Update the counters and indexes using the current out indexes */\r
825 Tcp3d_updatePingListVariables( inst, pingOutIdx );\r
826 \r
827 if ( pingOutIdx < inst->nextPingInIdx )\r
828 {\r
829 startNeeded |= 1;\r
830 }\r
831 else if ( inst->pingLoadCnt > 0 )\r
832 {\r
833 startNeeded |= 1;\r
834 }\r
835 }\r
836 \r
837 /* PONG STOP */\r
838 if ( inst->pongStop )\r
839 {\r
840 /**\r
841 * Only update the list variables if the driver is stopped \r
842 * for the pong side.\r
843 */\r
844 /**\r
845 * Read the source address of L2P Channel PaRAM to get the current\r
846 * pseudo PaRAM pointer for PONG paths. Then compare with the \r
847 * start pointer to get the out index. \r
848 */\r
849 currPrmPtr2 = (EDMA3_DRV_PaRAMRegs *) inst->pongPtrL2p->srcAddr;\r
850 pongOutIdx = GET_CB_IDX(currPrmPtr2 - inst->startPrmPtr);\r
851 \r
852 /* Update the counters and indexes using the current out indexes */\r
853 Tcp3d_updatePongListVariables( inst, pongOutIdx );\r
854 \r
855 if ( pongOutIdx < inst->nextPongInIdx )\r
856 {\r
857 startNeeded |= 2;\r
858 }\r
859 else if ( inst->pongLoadCnt > 0 )\r
860 {\r
861 startNeeded |= 2;\r
862 }\r
863 }\r
864 }\r
865 else if ( ( startMode == TCP3D_DRV_START_PING ) && ( inst->pingStop ) )\r
866 {\r
867 startNeeded |= 1;\r
868 }\r
869 else if ( ( startMode == TCP3D_DRV_START_PONG ) && ( inst->pongStop ) )\r
870 {\r
871 startNeeded |= 2;\r
872 }\r
873 \r
874 /* If LSB0 is set, start PING */\r
875 if ( startNeeded & 0x1 )\r
876 {\r
877 /**\r
878 * Clear the wrap adjust flags,\r
879 * when the last block decoding in the ping list is detected.\r
880 */\r
881 if (inst->pingLastOutFlag)\r
882 {\r
883 inst->pingLastOutFlag = 0;\r
884 inst->pingWrapCheck = 1;\r
885 }\r
886 \r
887 /* increment counter */\r
888 inst->pingStartCntr++;\r
889 /* Clear the stop flag */\r
890 inst->pingStop = 0;\r
891 /* Enable L2P channel in the PING path */\r
892 result |= EDMA3_DRV_enableTransfer( inst->edmaHnd,\r
893 inst->pingCh[TCP3D_DRV_CH_IDX_L2P],\r
894 EDMA3_DRV_TRIG_MODE_MANUAL);\r
895 }\r
896 \r
897 /* If LSB1 is set, start PONG */\r
898 if ( startNeeded & 0x2 )\r
899 {\r
900 /**\r
901 * Clear the wrap adjust flags,\r
902 * when the last block decoding in the pong list is detected.\r
903 */\r
904 if (inst->pongLastOutFlag)\r
905 {\r
906 inst->pongLastOutFlag = 0;\r
907 inst->pongWrapCheck = 1;\r
908 }\r
909 \r
910 /* increment counter */\r
911 inst->pongStartCntr++;\r
912 /* Clear the stop flag */\r
913 inst->pongStop = 0;\r
914 \r
915 /* Enable L2P channel in the PONG path */\r
916 result |= EDMA3_DRV_enableTransfer( inst->edmaHnd,\r
917 inst->pongCh[TCP3D_DRV_CH_IDX_L2P],\r
918 EDMA3_DRV_TRIG_MODE_MANUAL);\r
919 }\r
920 \r
921 /* Update the return status, if any EDMA starts fail */\r
922 if ( result != EDMA3_DRV_SOK )\r
923 {\r
924 tcp3dResult = TCP3D_DRV_FAIL_EDMA_ENABLE_CHANNEL;\r
925 }\r
926 \r
927 /* Change the state to RUNNING, if start successful */\r
928 if ( ( startNeeded ) && ( result == EDMA3_DRV_SOK ) )\r
929 {\r
930 inst->state = TCP3D_DRV_STATE_RUNNING;\r
931 }\r
932 \r
933 return ( tcp3dResult );\r
934 \r
935 } /* end of - Tcp3d_start() function */\r
936 \r
937 /**\r
938 * @brief This API could be used for querying the TCP3D driver to get\r
939 * updates or take appropriate actions.\r
940 * \r
941 * \note This API is not fully scoped currently and the possible query\r
942 * commands and their actions are open as of now.\r
943 */\r
944 Tcp3d_Result Tcp3d_status ( IN Tcp3d_Instance *inst,\r
945 INOUT Tcp3d_Sts *drvStatus )\r
946 {\r
947 Tcp3d_Result tcp3dResult = TCP3D_DRV_NO_ERR;\r
948 EDMA3_DRV_PaRAMRegs *currPrmPtr1, *currPrmPtr2;\r
949 \r
950 /* Check the control command */\r
951 switch ( drvStatus->cmd )\r
952 {\r
953 case TCP3D_DRV_GET_STATE :\r
954 /* Read state value from driver instance */\r
955 drvStatus->state = inst->state;\r
956 break;\r
957 \r
958 case TCP3D_DRV_GET_MIN_OUT_IDX:\r
959 /**\r
960 * Get the L2P Channel PaRAM address and then read the source\r
961 * address from the PaRAM to get the index to the pseudo PaRAM\r
962 * current read pointer.\r
963 * \r
964 * Compute the minimum index by comparing the current indexes with\r
965 * the pseudo PaRAM start pointer.\r
966 */\r
967 currPrmPtr1 = (EDMA3_DRV_PaRAMRegs *) inst->pingPtrL2p->srcAddr;\r
968 currPrmPtr2 = (EDMA3_DRV_PaRAMRegs *) inst->pongPtrL2p->srcAddr;\r
969 drvStatus->prmOutIdx = (MIN(currPrmPtr1, currPrmPtr2) - inst->startPrmPtr)>>2;\r
970 break;\r
971 \r
972 case TCP3D_DRV_GET_PING_OUT_IDX:\r
973 /**\r
974 * Read the source address of L2P Channel PaRAM to get the current\r
975 * pseudo PaRAM pointer for PING path. Then compare with the start\r
976 * pointer for the index.\r
977 */\r
978 currPrmPtr1 = (EDMA3_DRV_PaRAMRegs *) inst->pingPtrL2p->srcAddr;\r
979 drvStatus->prmOutIdx = (currPrmPtr1 - inst->startPrmPtr)>>2;\r
980 break;\r
981 \r
982 case TCP3D_DRV_GET_PONG_OUT_IDX:\r
983 /**\r
984 * Read the source address of L2P Channel PaRAM to get the current\r
985 * pseudo PaRAM pointer for PONG path. Then compare with the start\r
986 * pointer for the index.\r
987 */\r
988 currPrmPtr2 = (EDMA3_DRV_PaRAMRegs *) inst->pongPtrL2p->srcAddr;\r
989 drvStatus->prmOutIdx = (currPrmPtr2 - inst->startPrmPtr)>>2;\r
990 break;\r
991 \r
992 default:\r
993 /* If invalid command passed, flag error */\r
994 tcp3dResult = TCP3D_DRV_FAIL;\r
995 break;\r
996 }\r
997 \r
998 return (tcp3dResult);\r
999 \r
1000 } /* end of - Tcp3d_status() function */\r
1001 \r
1002 /**\r
1003 * \brief This API could be used for change or update the TCP3D driver\r
1004 * instance values which are set during the init time.\r
1005 * \r
1006 * Currently, there are few commands supported with some the\r
1007 * limitation that they are allowed only when the driver is in\r
1008 * IDLE state.\r
1009 * \r
1010 * \note -# This API is not fully scoped currently and the possible\r
1011 * control commands and their actions are open as of now.\r
1012 * -# We may need to protect the instance value updations, once\r
1013 * they are allowed to change in any state.\r
1014 */\r
1015 Tcp3d_Result Tcp3d_control (IN Tcp3d_Instance *inst,\r
1016 IN Tcp3d_Ctrl *drvCtrl)\r
1017 {\r
1018 Tcp3d_Result tcp3dResult = TCP3D_DRV_NO_ERR;\r
1019 \r
1020 /* Check the control command */\r
1021 switch ( drvCtrl->cmd )\r
1022 {\r
1023 case TCP3D_DRV_SET_L2P_INT :\r
1024 if ( drvCtrl->intrFlag )\r
1025 {\r
1026 Tcp3d_enableEdmaL2pIntr(inst);\r
1027 }\r
1028 else\r
1029 { \r
1030 Tcp3d_disableEdmaL2pIntr(inst);\r
1031 }\r
1032 break;\r
1033 case TCP3D_DRV_SET_REVT_INT :\r
1034 if ( drvCtrl->intrFlag )\r
1035 {\r
1036 Tcp3d_enableEdmaPauseIntr(inst);\r
1037 }\r
1038 else\r
1039 { \r
1040 Tcp3d_disableEdmaPauseIntr(inst);\r
1041 }\r
1042 break;\r
1043 \r
1044 case TCP3D_DRV_CLR_REVT_INT :\r
1045 Tcp3d_clearEdmaPauseIntr(inst);\r
1046 break;\r
1047 \r
1048 case TCP3D_DRV_SET_PING_L2P_INT :\r
1049 case TCP3D_DRV_SET_PONG_L2P_INT :\r
1050 case TCP3D_DRV_SET_PING_PAUSE_INT :\r
1051 case TCP3D_DRV_SET_PONG_PAUSE_INT :\r
1052 default:\r
1053 /* If invalid command passed, flag error */\r
1054 tcp3dResult = TCP3D_DRV_FAIL;\r
1055 break;\r
1056 }\r
1057 \r
1058 return (tcp3dResult);\r
1059 \r
1060 } /* end of - Tcp3d_control() function */\r
1061 \r
1062 /*******************************************************************************\r
1063 ******************************************************************************/\r
1064 static void Tcp3d_setLocalVariables (IN Tcp3d_Instance *tcp3dInst)\r
1065 {\r
1066 // NOTE: Removed after the shadow registers base is set during init\r
1067 // CSL_TpccRegs *tpcc2Regs = (CSL_TpccRegs *) CSL_EDMACC_2_REGS;\r
1068 EDMA3_DRV_PaRAMRegs *prm;\r
1069 \r
1070 /* Set EDMA PaRAM pointers */\r
1071 tcp3dInst->startPrmPtr = (EDMA3_DRV_PaRAMRegs *) L2GLBMAP(tcp3dInst->coreId, \\r
1072 tcp3dInst->pseudoParamBufPtr);\r
1073 tcp3dInst->pingPtrL2p = (EDMA3_DRV_PaRAMRegs *) tcp3dInst->pingChParamAddr[TCP3D_DRV_CH_IDX_L2P];\r
1074 tcp3dInst->pongPtrL2p = (EDMA3_DRV_PaRAMRegs *) tcp3dInst->pongChParamAddr[TCP3D_DRV_CH_IDX_L2P];\r
1075 \r
1076 /* Store pointers for the end of list (PING starts first in the list)*/\r
1077 prm = &tcp3dInst->pseudoParamBufPtr[(tcp3dInst->maxCodeBlocks-2)*TCP3D_DRV_LINK_CB];\r
1078 if ( tcp3dInst->maxCodeBlocks & 1 )\r
1079 { \r
1080 tcp3dInst->endListParam[PING_INDEX] = prm;\r
1081 tcp3dInst->endListParam[PONG_INDEX] = prm+TCP3D_DRV_LINK_CB;\r
1082 }\r
1083 else\r
1084 { \r
1085 tcp3dInst->endListParam[PING_INDEX] = prm+TCP3D_DRV_LINK_CB;\r
1086 tcp3dInst->endListParam[PONG_INDEX] = prm;\r
1087 }\r
1088 \r
1089 /**\r
1090 * Set interrupt enable/disable mask for channels using the shadow region\r
1091 * registers.\r
1092 */\r
1093 /* Get EDMA Controller shadow registers pointer */\r
1094 // NOTE: Removed after the value is set through init sequence\r
1095 // tcp3dInst->tpccShadowRegs = &tpcc2Regs->SHADOW[tcp3dInst->edmaRegionId];\r
1096 \r
1097 /* REVT channel mask and registers (for PAUSE interrupt) */\r
1098 tcp3dInst->pauseChMaskPing = 1 << (tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT] & 0x1f);\r
1099 tcp3dInst->pauseChMaskPong = 1 << (tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT] & 0x1f);\r
1100 if ( tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT] < 32 )\r
1101 {\r
1102 tcp3dInst->intEnClrReg[TPCC_REVT_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IECR;\r
1103 tcp3dInst->intEnSetReg[TPCC_REVT_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IESR;\r
1104 tcp3dInst->clrIntPendReg[TPCC_REVT_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_ICR;\r
1105 tcp3dInst->intPendReg[TPCC_REVT_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IPR;\r
1106 }\r
1107 else\r
1108 {\r
1109 tcp3dInst->intEnClrReg[TPCC_REVT_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IECRH;\r
1110 tcp3dInst->intEnSetReg[TPCC_REVT_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IESRH;\r
1111 tcp3dInst->clrIntPendReg[TPCC_REVT_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_ICRH;\r
1112 tcp3dInst->intPendReg[TPCC_REVT_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IPRH;\r
1113 }\r
1114 /* L2P channel mask and registers (for L2P interrupt) */\r
1115 tcp3dInst->l2pChMaskPing = 1 << (tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P] & 0x1f);\r
1116 tcp3dInst->l2pChMaskPong = 1 << (tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_L2P] & 0x1f);\r
1117 if ( tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P] < 32 )\r
1118 {\r
1119 tcp3dInst->intEnClrReg[TPCC_L2P_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IECR;\r
1120 tcp3dInst->intEnSetReg[TPCC_L2P_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IESR;\r
1121 tcp3dInst->clrIntPendReg[TPCC_L2P_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_ICR;\r
1122 tcp3dInst->intPendReg[TPCC_L2P_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IPR;\r
1123 }\r
1124 else\r
1125 {\r
1126 tcp3dInst->intEnClrReg[TPCC_L2P_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IECRH;\r
1127 tcp3dInst->intEnSetReg[TPCC_L2P_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IESRH;\r
1128 tcp3dInst->clrIntPendReg[TPCC_L2P_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_ICRH;\r
1129 tcp3dInst->intPendReg[TPCC_L2P_REGS] = (uint32_t *) &tcp3dInst->tpccShadowRegs->TPCC_IPRH;\r
1130 }\r
1131 \r
1132 /* Clear countes */\r
1133 tcp3dInst->pingStartCntr = 0;\r
1134 tcp3dInst->pongStartCntr = 0;\r
1135 tcp3dInst->pingPauseEnCntr = 0;\r
1136 tcp3dInst->pingL2pEnCntr = 0;\r
1137 tcp3dInst->pingIntr = 0;\r
1138 tcp3dInst->pongIntr = 0;\r
1139 }\r
1140 \r
1141 static void Tcp3d_resetRuntimeVariables (IN Tcp3d_Instance *tcp3dInst)\r
1142 {\r
1143 /* Initialize the driver instace run-time variables */\r
1144 tcp3dInst->nextCodeBlockIndex = 0;\r
1145 tcp3dInst->pingStop = 1;\r
1146 tcp3dInst->pongStop = 1;\r
1147 tcp3dInst->startFlag = 0;\r
1148 tcp3dInst->prevNtfFlag[PING_INDEX] = 0;\r
1149 tcp3dInst->prevNtfFlag[PONG_INDEX] = 0;\r
1150 tcp3dInst->pingLoadCnt = 0;\r
1151 tcp3dInst->pongLoadCnt = 0;\r
1152 tcp3dInst->prevPingOutIdx = 0;\r
1153 tcp3dInst->prevPongOutIdx = 1;\r
1154 tcp3dInst->nextPingInIdx = 0;\r
1155 tcp3dInst->nextPongInIdx = 1;\r
1156 tcp3dInst->pingWrapCheck = 1;\r
1157 tcp3dInst->pongWrapCheck = 1;\r
1158 tcp3dInst->pingLastOutFlag = 0;\r
1159 tcp3dInst->pongLastOutFlag = 0;\r
1160 tcp3dInst->pingFreeCnt = tcp3dInst->maxPingCbCnt;\r
1161 tcp3dInst->pongFreeCnt = tcp3dInst->maxPongCbCnt;\r
1162 }\r
1163 \r
1164 static void Tcp3d_updatePingListVariables ( INOUT Tcp3d_Instance *inst,\r
1165 IN int32_t pingOutIdx )\r
1166 {\r
1167 int32_t indexDiff1;\r
1168 \r
1169 /**\r
1170 * Load count adjustment is done following the steps described below.\r
1171 * \r
1172 * step1 : get index difference between current and previous indexes\r
1173 * step2 : convert the index difference to count\r
1174 * step3 : reduce the load count by index difference. It is possible that\r
1175 * the diffrence could be negative, which gets corrected after\r
1176 * step4 is completed.\r
1177 * step4 : wrap is detected, reduce the load count by maximum one time.\r
1178 * The wrap detection is done either of the cases.\r
1179 * 1) when index difference is negative\r
1180 * 2) the last block decoding is detected\r
1181 * \r
1182 * NOTES:\r
1183 * - At reset/init, checking for wrap is enabled.\r
1184 * - Once the adjustment is done, checking is disabled until the last\r
1185 * block decoding is done.\r
1186 */\r
1187 \r
1188 /* Adjust the loaded count - PING */\r
1189 /* step1 */\r
1190 indexDiff1 = ( pingOutIdx - inst->prevPingOutIdx );\r
1191 /* step2, step3 */\r
1192 inst->pingLoadCnt -= (indexDiff1>>1);\r
1193 /* step4 */\r
1194 if ( ( (indexDiff1 < 0) || (inst->pingLastOutFlag) ) && \r
1195 (inst->pingWrapCheck) )\r
1196 {\r
1197 inst->pingLoadCnt -= inst->maxPingCbCnt;\r
1198 inst->pingWrapCheck = 0;\r
1199 }\r
1200 \r
1201 /* update free counts - can be negative */\r
1202 inst->pingFreeCnt = ( inst->maxPingCbCnt - inst->pingLoadCnt );\r
1203 \r
1204 /* update previous out index */\r
1205 inst->prevPingOutIdx = pingOutIdx;\r
1206 }\r
1207 \r
1208 static void Tcp3d_updatePongListVariables ( INOUT Tcp3d_Instance *inst,\r
1209 IN int32_t pongOutIdx )\r
1210 {\r
1211 int32_t indexDiff2;\r
1212 \r
1213 /**\r
1214 * Load count adjustment is done following the steps described below.\r
1215 * \r
1216 * step1 : get index difference between current and previous indexes\r
1217 * step2 : convert the index difference to count\r
1218 * step3 : reduce the load count by index difference. It is possible that\r
1219 * the diffrence could be negative, which gets corrected after\r
1220 * step4 is completed.\r
1221 * step4 : wrap is detected, reduce the load count by maximum one time.\r
1222 * The wrap detection is done either of the cases.\r
1223 * 1) when index difference is negative\r
1224 * 2) the last block decoding is detected\r
1225 * \r
1226 * NOTES:\r
1227 * - At reset/init, checking for wrap is enabled.\r
1228 * - Once the adjustment is done, checking is disabled until the last\r
1229 * block decoding is done.\r
1230 */\r
1231 \r
1232 \r
1233 /* Adjust the loaded count - PONG */\r
1234 /* step1 */\r
1235 indexDiff2 = ( pongOutIdx - inst->prevPongOutIdx );\r
1236 /* step2, step3 */\r
1237 inst->pongLoadCnt -= (indexDiff2>>1);\r
1238 /* step4 */\r
1239 if ( ( (indexDiff2 < 0) || (inst->pongLastOutFlag) ) && \r
1240 (inst->pongWrapCheck) )\r
1241 {\r
1242 inst->pongLoadCnt -= inst->maxPongCbCnt;\r
1243 inst->pongWrapCheck = 0;\r
1244 }\r
1245 \r
1246 /* update free counts - can be negative */\r
1247 inst->pongFreeCnt = ( inst->maxPongCbCnt - inst->pongLoadCnt );\r
1248 \r
1249 /* update previous out index */\r
1250 inst->prevPongOutIdx = pongOutIdx;\r
1251 }\r
1252 \r
1253 /**\r
1254 * @brief Function to get the physical addresses of all the EDMA3 channels\r
1255 * used in TCP3D driver. \r
1256 */\r
1257 static EDMA3_DRV_Result Tcp3d_getEdmaChParamAddr(IN Tcp3d_Instance *tcp3dInst)\r
1258 { \r
1259 EDMA3_DRV_Result result = EDMA3_DRV_SOK; \r
1260 int32_t cnt;\r
1261 \r
1262 for ( cnt = 0; cnt < TCP3D_DRV_MAX_CH_PER_PATH; cnt++ )\r
1263 {\r
1264 /* Get PaRAM address for PING physical channel */ \r
1265 result |= EDMA3_DRV_getPaRAMPhyAddr(tcp3dInst->edmaHnd,\r
1266 tcp3dInst->pingCh[cnt],\r
1267 &tcp3dInst->pingChParamAddr[cnt]);\r
1268 \r
1269 /* Get PaRAM address for PONG physical channel */ \r
1270 result |= EDMA3_DRV_getPaRAMPhyAddr(tcp3dInst->edmaHnd,\r
1271 tcp3dInst->pongCh[cnt],\r
1272 &tcp3dInst->pongChParamAddr[cnt]);\r
1273 }\r
1274 \r
1275 for ( cnt = 0; cnt < (TCP3D_DRV_MAX_LINK_CH>>1); cnt++ )\r
1276 {\r
1277 /* Get PaRAM address for PING Link channel */ \r
1278 result |= EDMA3_DRV_getPaRAMPhyAddr(tcp3dInst->edmaHnd,\r
1279 tcp3dInst->pingLinkCh[cnt],\r
1280 &tcp3dInst->pingLinkChParamAddr[cnt]);\r
1281 \r
1282 /* Get PaRAM address for PONG link channel */ \r
1283 result |= EDMA3_DRV_getPaRAMPhyAddr(tcp3dInst->edmaHnd,\r
1284 tcp3dInst->pongLinkCh[cnt],\r
1285 &tcp3dInst->pongLinkChParamAddr[cnt]);\r
1286 }\r
1287 \r
1288 return ( result );\r
1289 \r
1290 } /* end of - Tcp3d_getEdmaChParamAddr() function */\r
1291 \r
1292 /**\r
1293 * @brief Enabling the Event triggered EDMA3 channels \r
1294 */\r
1295 static EDMA3_DRV_Result Tcp3d_enableEdmaChannels(Tcp3d_Instance *tcp3dInst)\r
1296 {\r
1297 EDMA3_DRV_Result result = EDMA3_DRV_SOK;\r
1298 \r
1299 /* Enable PING channels */\r
1300 result |= EDMA3_DRV_enableTransfer( tcp3dInst->edmaHnd,\r
1301 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
1302 EDMA3_DRV_TRIG_MODE_EVENT);\r
1303 \r
1304 /* Enable PoNG channels */\r
1305 result |= EDMA3_DRV_enableTransfer( tcp3dInst->edmaHnd,\r
1306 tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT],\r
1307 EDMA3_DRV_TRIG_MODE_EVENT);\r
1308 \r
1309 return ( result );\r
1310 } /* end of - Tcp3d_enableEdmaChannels() function */ \r
1311 \r
1312 /**\r
1313 * @brief Initialize the EDMA channels PaRAM memory with default values\r
1314 */\r
1315 static EDMA3_DRV_Result Tcp3d_initEdmaChParam (IN Tcp3d_Instance *tcp3dInst)\r
1316 {\r
1317 EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0,0};\r
1318 EDMA3_DRV_PaRAMRegs *prm = ¶mSet;\r
1319 EDMA3_DRV_Result status = EDMA3_DRV_SOK;\r
1320 CSL_CPINTC_RegsOvly cpintc0Regs = (CSL_CPINTC_RegsOvly) tcp3dInst->cpIntc0RegsBase;\r
1321 \r
1322 /* Channel - REVT 0 (dummy PaRAM) */\r
1323 /* chain to REVT 0\r
1324 link to ping link cfg channel \r
1325 A-sync\r
1326 ACNT = 1\r
1327 BCNT = 0\r
1328 CCNT = 0\r
1329 scrBIDX = 0\r
1330 desBIDX = 0\r
1331 scrCIDX = 0\r
1332 desCIDX = 0 */\r
1333 /* Fill the PaRAM Set with transfer specific information */\r
1334 /* First set OPT field with appropriate values */\r
1335 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
1336 prm->opt = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
1337 CSL_EDMA3_TCCH_EN,\r
1338 CSL_EDMA3_ITCINT_DIS,\r
1339 CSL_EDMA3_TCINT_DIS,\r
1340 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
1341 CSL_EDMA3_TCC_EARLY,\r
1342 CSL_EDMA3_FIFOWIDTH_NONE,\r
1343 CSL_EDMA3_STATIC_DIS,\r
1344 CSL_EDMA3_SYNC_A,\r
1345 CSL_EDMA3_ADDRMODE_INCR,\r
1346 CSL_EDMA3_ADDRMODE_INCR );\r
1347 #else\r
1348 prm->opt = 0;\r
1349 /* Enable Final transfer completion chain */\r
1350 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
1351 /* Program the TCC */\r
1352 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT]);\r
1353 /* Early Trasfer Completion */\r
1354 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCMOD_SHIFT);\r
1355 /* A Sync Transfer Mode */\r
1356 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
1357 /* Src & Dest are in INCR modes */\r
1358 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
1359 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
1360 #endif\r
1361 prm->srcAddr = NULL;\r
1362 prm->destAddr = NULL;\r
1363 prm->aCnt = 1;\r
1364 prm->bCnt = 0;\r
1365 prm->cCnt = 0;\r
1366 prm->bCntReload = 0;\r
1367 prm->srcBIdx = 0;\r
1368 prm->destBIdx = 0;\r
1369 prm->srcCIdx = 0;\r
1370 prm->destCIdx = 0;\r
1371 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_INCFG]);\r
1372 \r
1373 /* Now, write the PaRAM Set. */\r
1374 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1375 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
1376 prm);\r
1377 \r
1378 /* Link Channel - set the reload Link PaRAM */\r
1379 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1380 tcp3dInst->pingLinkCh[LINK_CH_IDX_REVT],\r
1381 prm);\r
1382 \r
1383 /* Copy to use in reset function */\r
1384 Tcp3d_memcpy(&tcp3dInst->revtPrm[PING_INDEX], prm, sizeof(EDMA3_DRV_PaRAMRegs));\r
1385 \r
1386 /* Channel - REVT 1 (dummy PaRAM) */\r
1387 /* chain to REVT 1\r
1388 link to ping link cfg channel \r
1389 A-sync\r
1390 ACNT = 1\r
1391 BCNT = 1\r
1392 CCNT = 1\r
1393 scrBIDX = 0\r
1394 desBIDX = 0\r
1395 scrCIDX = 0\r
1396 desCIDX = 0 */\r
1397 /* Fill the PaRAM Set with transfer specific information */\r
1398 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT]);\r
1399 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_INCFG]);\r
1400 \r
1401 /* Now, write the PaRAM Set. */\r
1402 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1403 tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT],\r
1404 prm);\r
1405 \r
1406 /* Link Channel - set the reload Link PaRAM */\r
1407 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1408 tcp3dInst->pongLinkCh[LINK_CH_IDX_REVT],\r
1409 prm);\r
1410 \r
1411 /* Copy to use in reset */\r
1412 Tcp3d_memcpy(&tcp3dInst->revtPrm[PONG_INDEX], prm, sizeof(EDMA3_DRV_PaRAMRegs));\r
1413 \r
1414 /* Channel - L2P 0 */\r
1415 /* chain to REVT 0\r
1416 link to ping link l2p channel \r
1417 AB-sync\r
1418 ACNT = 32\r
1419 BCNT = 4\r
1420 CCNT = pingNumCBs\r
1421 scrBIDX = 32\r
1422 desBIDX = 32\r
1423 scrCIDX = 32*4*2\r
1424 desCIDX = 0 */\r
1425 /* Fill the PaRAM Set with transfer specific information */\r
1426 /* Set OPT field with appropriate values */\r
1427 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
1428 prm->opt = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_EN,\r
1429 CSL_EDMA3_TCCH_EN,\r
1430 CSL_EDMA3_ITCINT_DIS,\r
1431 CSL_EDMA3_TCINT_DIS,\r
1432 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
1433 CSL_EDMA3_TCC_NORMAL,\r
1434 CSL_EDMA3_FIFOWIDTH_NONE,\r
1435 CSL_EDMA3_STATIC_DIS,\r
1436 CSL_EDMA3_SYNC_AB,\r
1437 CSL_EDMA3_ADDRMODE_INCR,\r
1438 CSL_EDMA3_ADDRMODE_INCR );\r
1439 #else\r
1440 prm->opt = 0;\r
1441 /* Enable Intermediate & Final transfer completion chain */\r
1442 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_ITCCHEN_SHIFT);\r
1443 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
1444 /* Program the TCC */\r
1445 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT]);\r
1446 /* AB Sync Transfer Mode */\r
1447 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
1448 /* Src & Dest are in INCR modes */\r
1449 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
1450 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
1451 #endif\r
1452 prm->srcAddr = NULL;\r
1453 prm->destAddr = (uint32_t)(tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_INCFG]);\r
1454 prm->aCnt = 32;\r
1455 prm->bCnt = TCP3D_DRV_LINK_CB;\r
1456 prm->cCnt = NULL;\r
1457 prm->bCntReload = TCP3D_DRV_LINK_CB;\r
1458 prm->srcBIdx = 32;\r
1459 prm->destBIdx = 32;\r
1460 prm->srcCIdx = (32<<1)*TCP3D_DRV_LINK_CB;\r
1461 prm->destCIdx = 0;\r
1462 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_L2P]);\r
1463 \r
1464 /* Now, write the PaRAM Set. */\r
1465 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1466 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P],\r
1467 prm);\r
1468 \r
1469 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1470 tcp3dInst->pingLinkCh[LINK_CH_IDX_L2P],\r
1471 prm);\r
1472 \r
1473 /* Copy to use in reset function */\r
1474 Tcp3d_memcpy(&tcp3dInst->l2pPrm[PING_INDEX], prm, sizeof(EDMA3_DRV_PaRAMRegs));\r
1475 \r
1476 /* Channel - L2P 1 */\r
1477 /* chain to REVT 1\r
1478 link to ping link l2p channel \r
1479 AB-sync\r
1480 ACNT = 32\r
1481 BCNT = 4\r
1482 CCNT = pingNumCBs\r
1483 scrBIDX = 32\r
1484 desBIDX = 32\r
1485 scrCIDX = 32*4*2\r
1486 desCIDX = 0 */\r
1487 /* Fill the PaRAM Set with transfer specific information */\r
1488 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT]);\r
1489 prm->destAddr = (uint32_t)(tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_INCFG]);\r
1490 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_L2P]);\r
1491 \r
1492 /* Now, write the PaRAM Set. */\r
1493 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1494 tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_L2P],\r
1495 prm);\r
1496 \r
1497 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1498 tcp3dInst->pongLinkCh[LINK_CH_IDX_L2P],\r
1499 prm);\r
1500 \r
1501 /* Copy to use in reset function */\r
1502 Tcp3d_memcpy(&tcp3dInst->l2pPrm[PONG_INDEX], prm, sizeof(EDMA3_DRV_PaRAMRegs));\r
1503 \r
1504 /* Link Channel - pause 0 */\r
1505 /* chain to REVT 0\r
1506 link to ping link revt channel \r
1507 AB-sync\r
1508 ACNT = 1\r
1509 BCNT = 2\r
1510 CCNT = 1 \r
1511 scrBIDX = offset b/w tcp3dInst->pauseState & tcp3dInst->constantOne\r
1512 scrCIDX = 0\r
1513 desBIDX = offet b/w tcp3dInst->state & tcp3dInst->pingStop\r
1514 desCIDX = 0 */\r
1515 /* Fill the PaRAM Set with transfer specific information */\r
1516 /* Set OPT field with appropriate values */\r
1517 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
1518 prm->opt = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
1519 CSL_EDMA3_TCCH_DIS,\r
1520 CSL_EDMA3_ITCINT_DIS,\r
1521 CSL_EDMA3_TCINT_EN,\r
1522 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
1523 CSL_EDMA3_TCC_NORMAL,\r
1524 CSL_EDMA3_FIFOWIDTH_NONE,\r
1525 CSL_EDMA3_STATIC_DIS,\r
1526 CSL_EDMA3_SYNC_AB,\r
1527 CSL_EDMA3_ADDRMODE_INCR,\r
1528 CSL_EDMA3_ADDRMODE_INCR );\r
1529 #else\r
1530 prm->opt = 0;\r
1531 /* Enable Intermediate & Final transfer completion interrupt */\r
1532 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCINTEN_SHIFT);\r
1533 /* Program the TCC */\r
1534 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT]);\r
1535 /* AB Sync Transfer Mode */\r
1536 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
1537 /* Src & Dest are in INCR modes */\r
1538 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
1539 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
1540 #endif\r
1541 prm->srcAddr = L2GLBMAP(tcp3dInst->coreId, &tcp3dInst->constantOne);\r
1542 prm->destAddr = L2GLBMAP(tcp3dInst->coreId, &tcp3dInst->pingStop);\r
1543 prm->aCnt = 1;\r
1544 prm->bCnt = 2;\r
1545 prm->cCnt = 1;\r
1546 prm->bCntReload = 0;\r
1547 prm->srcBIdx = ((uint8_t *)&tcp3dInst->pauseState - &tcp3dInst->constantOne);\r
1548 prm->destBIdx = ((uint8_t *)&tcp3dInst->state - &tcp3dInst->pingStop);\r
1549 prm->srcCIdx = 0;\r
1550 prm->destCIdx = 0;\r
1551 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_REVT]);\r
1552 \r
1553 /* Now, write the PaRAM Set. */\r
1554 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1555 tcp3dInst->pingLinkCh[LINK_CH_IDX_PAUSE],\r
1556 prm);\r
1557 \r
1558 /* Link Channel - pause 1 */\r
1559 /* chain to REVT 1\r
1560 link to ping link revt channel \r
1561 AB-sync\r
1562 ACNT = 1\r
1563 BCNT = 2\r
1564 CCNT = 1 \r
1565 scrBIDX = offset b/w tcp3dInst->pauseState & tcp3dInst->constantOne\r
1566 scrCIDX = 0\r
1567 desBIDX = offet b/w tcp3dInst->state & tcp3dInst->pingStop\r
1568 desCIDX = 0 */\r
1569 /* Fill the PaRAM Set with transfer specific information */\r
1570 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT]);\r
1571 prm->destAddr = L2GLBMAP(tcp3dInst->coreId, &tcp3dInst->pongStop);\r
1572 prm->destBIdx = ((uint8_t *)&tcp3dInst->state - &tcp3dInst->pongStop);\r
1573 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_REVT]);\r
1574 \r
1575 /* Now, write the PaRAM Set. */\r
1576 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1577 tcp3dInst->pongLinkCh[LINK_CH_IDX_PAUSE],\r
1578 prm);\r
1579 \r
1580 /* Link Channel - INT 0 (notification PaRAM) */\r
1581 /* chain to REVT 0\r
1582 link to ping link cfg channel \r
1583 A-sync\r
1584 ACNT = 4\r
1585 BCNT = 1\r
1586 CCNT = 1\r
1587 scrBIDX = 0\r
1588 desBIDX = 0\r
1589 scrCIDX = 0\r
1590 desCIDX = 0 */\r
1591 /* Fill the PaRAM Set with transfer specific information */\r
1592 /* First set OPT field with appropriate values */\r
1593 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
1594 prm->opt = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
1595 CSL_EDMA3_TCCH_EN,\r
1596 CSL_EDMA3_ITCINT_DIS,\r
1597 CSL_EDMA3_TCINT_DIS,\r
1598 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
1599 CSL_EDMA3_TCC_EARLY,\r
1600 CSL_EDMA3_FIFOWIDTH_NONE,\r
1601 CSL_EDMA3_STATIC_DIS,\r
1602 CSL_EDMA3_SYNC_A,\r
1603 CSL_EDMA3_ADDRMODE_INCR,\r
1604 CSL_EDMA3_ADDRMODE_INCR );\r
1605 #else\r
1606 prm->opt = 0;\r
1607 /* Enable Final transfer completion chain */\r
1608 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
1609 /* Program the TCC */\r
1610 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT]);\r
1611 /* Early Trasfer Completion */\r
1612 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCMOD_SHIFT);\r
1613 /* A Sync Transfer Mode */\r
1614 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
1615 /* Src & Dest are in INCR modes */\r
1616 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
1617 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
1618 #endif\r
1619 prm->srcAddr = L2GLBMAP(tcp3dInst->coreId, &tcp3dInst->notificationEventNum);\r
1620 prm->destAddr = (uint32_t)(&cpintc0Regs->STATUS_SET_INDEX_REG);\r
1621 prm->aCnt = 4;\r
1622 prm->bCnt = 1;\r
1623 prm->cCnt = 1;\r
1624 prm->bCntReload = 0;\r
1625 prm->srcBIdx = 0;\r
1626 prm->destBIdx = 0;\r
1627 prm->srcCIdx = 0;\r
1628 prm->destCIdx = 0;\r
1629 prm->linkAddr = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_PAUSE];\r
1630 \r
1631 /* Now, write the PaRAM Set. */\r
1632 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1633 tcp3dInst->pingLinkCh[LINK_CH_IDX_NTF],\r
1634 prm);\r
1635 \r
1636 prm->linkAddr = tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_INCFG];\r
1637 /* Now, write the PaRAM Set. */\r
1638 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1639 tcp3dInst->pingLinkCh[LINK_CH_IDX_NTFD],\r
1640 prm);\r
1641 \r
1642 /* Link Channel - INT 1 (notification PaRAM) */\r
1643 /* chain to REVT 1\r
1644 link to ping link cfg channel \r
1645 A-sync\r
1646 ACNT = 4\r
1647 BCNT = 1\r
1648 CCNT = 1\r
1649 scrBIDX = 0\r
1650 desBIDX = 0\r
1651 scrCIDX = 0\r
1652 desCIDX = 0 */\r
1653 /* Fill the PaRAM Set with transfer specific information */\r
1654 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT]);\r
1655 prm->linkAddr = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_PAUSE];\r
1656 \r
1657 /* Now, write the PaRAM Set. */\r
1658 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1659 tcp3dInst->pongLinkCh[LINK_CH_IDX_NTF],\r
1660 prm);\r
1661 \r
1662 /* Now, write the PaRAM Set. */\r
1663 prm->linkAddr = tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_INCFG];\r
1664 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1665 tcp3dInst->pongLinkCh[LINK_CH_IDX_NTFD],\r
1666 prm);\r
1667 \r
1668 /* Link Channel - Wrap 0 */\r
1669 /* chain to REVT 0\r
1670 link to ping link l2p channel \r
1671 A-sync\r
1672 ACNT = 4\r
1673 BCNT = 1\r
1674 CCNT = 1 \r
1675 scrBIDX = 0\r
1676 scrCIDX = 0\r
1677 desBIDX = 0\r
1678 desCIDX = 0 */\r
1679 /* Fill the PaRAM Set with transfer specific information */\r
1680 /* Set OPT field with appropriate values */\r
1681 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
1682 prm->opt = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
1683 CSL_EDMA3_TCCH_EN,\r
1684 CSL_EDMA3_ITCINT_DIS,\r
1685 CSL_EDMA3_TCINT_DIS,\r
1686 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
1687 CSL_EDMA3_TCC_NORMAL,\r
1688 CSL_EDMA3_FIFOWIDTH_NONE,\r
1689 CSL_EDMA3_STATIC_DIS,\r
1690 CSL_EDMA3_SYNC_A,\r
1691 CSL_EDMA3_ADDRMODE_INCR,\r
1692 CSL_EDMA3_ADDRMODE_INCR );\r
1693 #else\r
1694 prm->opt = 0;\r
1695 /* Enable Final transfer completion chain */\r
1696 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
1697 /* Program the TCC */\r
1698 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT]);\r
1699 /* A Sync Transfer Mode */\r
1700 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
1701 /* Src & Dest are in INCR modes */\r
1702 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
1703 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
1704 #endif\r
1705 prm->srcAddr = L2GLBMAP(tcp3dInst->coreId, &tcp3dInst->maxPingCbCnt);\r
1706 prm->destAddr = L2GLBMAP(tcp3dInst->coreId, &tcp3dInst->pingLastOutFlag);\r
1707 prm->aCnt = 4;\r
1708 prm->bCnt = 1;\r
1709 prm->cCnt = 1;\r
1710 prm->bCntReload = 0;\r
1711 prm->srcBIdx = 0;\r
1712 prm->destBIdx = 0;\r
1713 prm->srcCIdx = 0;\r
1714 prm->destCIdx = 0;\r
1715 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_PAUSE]);\r
1716 \r
1717 /* Now, write the PaRAM Set. */\r
1718 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1719 tcp3dInst->pingLinkCh[LINK_CH_IDX_WRAP],\r
1720 prm);\r
1721 \r
1722 /* Link Channel - Wrap 1 */\r
1723 /* chain to REVT 1\r
1724 link to ping link l2p channel \r
1725 A-sync\r
1726 ACNT = 4\r
1727 BCNT = 1\r
1728 CCNT = 1 \r
1729 scrBIDX = 0\r
1730 scrCIDX = 0\r
1731 desBIDX = 0\r
1732 desCIDX = 0 */\r
1733 /* Fill the PaRAM Set with transfer specific information */\r
1734 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT]);\r
1735 prm->srcAddr = L2GLBMAP(tcp3dInst->coreId, &tcp3dInst->maxPongCbCnt);\r
1736 prm->destAddr = L2GLBMAP(tcp3dInst->coreId, &tcp3dInst->pongLastOutFlag);\r
1737 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_PAUSE]);\r
1738 \r
1739 /* Now, write the PaRAM Set. */\r
1740 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1741 tcp3dInst->pongLinkCh[LINK_CH_IDX_WRAP],\r
1742 prm);\r
1743 \r
1744 \r
1745 /* Link Channel - NEXTCB Dummy 0 (LINK_CH_IDX_NEXTCB_DUMMY PaRAM) */\r
1746 /* chain to L2P\r
1747 link to ping dummy REVT channel \r
1748 A-sync\r
1749 ACNT = 1\r
1750 BCNT = 0\r
1751 CCNT = 0\r
1752 scrBIDX = 0\r
1753 desBIDX = 0\r
1754 scrCIDX = 0\r
1755 desCIDX = 0 */\r
1756 /* Fill the PaRAM Set with transfer specific information */\r
1757 /* First set OPT field with appropriate values */\r
1758 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
1759 prm->opt = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
1760 CSL_EDMA3_TCCH_EN,\r
1761 CSL_EDMA3_ITCINT_DIS,\r
1762 CSL_EDMA3_TCINT_DIS,\r
1763 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P],\r
1764 CSL_EDMA3_TCC_EARLY,\r
1765 CSL_EDMA3_FIFOWIDTH_NONE,\r
1766 CSL_EDMA3_STATIC_DIS,\r
1767 CSL_EDMA3_SYNC_A,\r
1768 CSL_EDMA3_ADDRMODE_INCR,\r
1769 CSL_EDMA3_ADDRMODE_INCR );\r
1770 #else\r
1771 prm->opt = 0;\r
1772 /* Enable Final transfer completion chain */\r
1773 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
1774 /* Program the TCC */\r
1775 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P]);\r
1776 /* Early Trasfer Completion */\r
1777 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCMOD_SHIFT);\r
1778 /* A Sync Transfer Mode */\r
1779 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
1780 /* Src & Dest are in INCR modes */\r
1781 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
1782 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
1783 #endif\r
1784 prm->srcAddr = NULL;\r
1785 prm->destAddr = NULL;\r
1786 prm->aCnt = 1;\r
1787 prm->bCnt = 0;\r
1788 prm->cCnt = 0;\r
1789 prm->bCntReload = 0;\r
1790 prm->srcBIdx = 0;\r
1791 prm->destBIdx = 0;\r
1792 prm->srcCIdx = 0;\r
1793 prm->destCIdx = 0;\r
1794 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_REVT]);\r
1795 \r
1796 /* Now, write the PaRAM Set. */\r
1797 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1798 tcp3dInst->pingLinkCh[LINK_CH_IDX_NEXTCB_DUMMY],\r
1799 prm);\r
1800 \r
1801 \r
1802 /* Link Channel - NEXTCB 1 (LINK_CH_IDX_NEXTCB_DUMMY PaRAM) */\r
1803 /* chain to L2P\r
1804 link to pong dummy REVT channel\r
1805 A-sync\r
1806 ACNT = 1\r
1807 BCNT = 1\r
1808 CCNT = 1\r
1809 scrBIDX = 0\r
1810 desBIDX = 0\r
1811 scrCIDX = 0\r
1812 desCIDX = 0 */\r
1813 /* Fill the PaRAM Set with transfer specific information */\r
1814 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_L2P]);\r
1815 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_REVT]);\r
1816 \r
1817 /* Now, write the PaRAM Set. */\r
1818 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1819 tcp3dInst->pongLinkCh[LINK_CH_IDX_NEXTCB_DUMMY],\r
1820 prm);\r
1821 \r
1822 \r
1823 /* Link Channel - NEXTCB Notify Dummy 0 (LINK_CH_IDX_NEXTCB_NTFD PaRAM) */\r
1824 /* chain to L2P\r
1825 link to NotifyD channel \r
1826 A-sync\r
1827 ACNT = 1\r
1828 BCNT = 0\r
1829 CCNT = 0\r
1830 scrBIDX = 0\r
1831 desBIDX = 0\r
1832 scrCIDX = 0\r
1833 desCIDX = 0 */\r
1834 /* Fill the PaRAM Set with transfer specific information */\r
1835 /* First set OPT field with appropriate values */\r
1836 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
1837 prm->opt = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
1838 CSL_EDMA3_TCCH_EN,\r
1839 CSL_EDMA3_ITCINT_DIS,\r
1840 CSL_EDMA3_TCINT_DIS,\r
1841 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P],\r
1842 CSL_EDMA3_TCC_EARLY,\r
1843 CSL_EDMA3_FIFOWIDTH_NONE,\r
1844 CSL_EDMA3_STATIC_DIS,\r
1845 CSL_EDMA3_SYNC_A,\r
1846 CSL_EDMA3_ADDRMODE_INCR,\r
1847 CSL_EDMA3_ADDRMODE_INCR );\r
1848 #else\r
1849 prm->opt = 0;\r
1850 /* Enable Final transfer completion chain */\r
1851 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
1852 /* Program the TCC */\r
1853 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P]);\r
1854 /* Early Trasfer Completion */\r
1855 prm->opt |= (1 << CSL_TPCC_PARAM_OPT_TCCMOD_SHIFT);\r
1856 /* A Sync Transfer Mode */\r
1857 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
1858 /* Src & Dest are in INCR modes */\r
1859 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
1860 prm->opt &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
1861 #endif\r
1862 prm->srcAddr = NULL;\r
1863 prm->destAddr = NULL;\r
1864 prm->aCnt = 1;\r
1865 prm->bCnt = 0;\r
1866 prm->cCnt = 0;\r
1867 prm->bCntReload = 0;\r
1868 prm->srcBIdx = 0;\r
1869 prm->destBIdx = 0;\r
1870 prm->srcCIdx = 0;\r
1871 prm->destCIdx = 0;\r
1872 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_NTFD]);\r
1873 \r
1874 /* Now, write the PaRAM Set. */\r
1875 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1876 tcp3dInst->pingLinkCh[LINK_CH_IDX_NEXTCB_NTFD],\r
1877 prm);\r
1878 \r
1879 \r
1880 /* Link Channel - NEXTCB Notify Dummy 1 (LINK_CH_IDX_NEXTCB_NTFD PaRAM) */\r
1881 /* chain to L2P\r
1882 link to NotifyD channel\r
1883 A-sync\r
1884 ACNT = 1\r
1885 BCNT = 1\r
1886 CCNT = 1\r
1887 scrBIDX = 0\r
1888 desBIDX = 0\r
1889 scrCIDX = 0\r
1890 desCIDX = 0 */\r
1891 /* Fill the PaRAM Set with transfer specific information */\r
1892 CSL_FINS(prm->opt, TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_L2P]);\r
1893 prm->linkAddr = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_NTFD]);\r
1894 \r
1895 /* Now, write the PaRAM Set. */\r
1896 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1897 tcp3dInst->pongLinkCh[LINK_CH_IDX_NEXTCB_NTFD],\r
1898 prm); \r
1899 \r
1900 return ( status );\r
1901 \r
1902 } /* end of - Tcp3d_initEdmaChParam() function */\r
1903 \r
1904 /**\r
1905 * @brief Resets the the EDMA channels PaRAM memory with default values\r
1906 */\r
1907 static EDMA3_DRV_Result Tcp3d_resetEdmaChParam( IN Tcp3d_Instance *tcp3dInst,\r
1908 IN uint32_t pingNumCBs,\r
1909 IN uint32_t pongNumCBs)\r
1910 {\r
1911 EDMA3_DRV_Result status = EDMA3_DRV_SOK;\r
1912 EDMA3_DRV_PaRAMRegs *prm;\r
1913 \r
1914 /* L2P 0 */\r
1915 prm = &tcp3dInst->l2pPrm[PING_INDEX];\r
1916 prm->srcAddr = L2GLBMAP(tcp3dInst->coreId, &tcp3dInst->pseudoParamBufPtr[0]);\r
1917 prm->cCnt = pingNumCBs;\r
1918 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1919 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_L2P],\r
1920 prm);\r
1921 \r
1922 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1923 tcp3dInst->pingLinkCh[LINK_CH_IDX_L2P],\r
1924 prm);\r
1925 \r
1926 /* L2P 1 */\r
1927 prm = &tcp3dInst->l2pPrm[PONG_INDEX];\r
1928 prm->srcAddr = L2GLBMAP(tcp3dInst->coreId, &tcp3dInst->pseudoParamBufPtr[TCP3D_DRV_LINK_CB]);\r
1929 prm->cCnt = pongNumCBs;\r
1930 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1931 tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_L2P],\r
1932 prm);\r
1933 \r
1934 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1935 tcp3dInst->pongLinkCh[LINK_CH_IDX_L2P],\r
1936 prm);\r
1937 \r
1938 /* REVT 0 */\r
1939 prm = &tcp3dInst->revtPrm[PING_INDEX];\r
1940 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1941 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
1942 prm);\r
1943 \r
1944 /* REVT 1 */\r
1945 prm = &tcp3dInst->revtPrm[PONG_INDEX];\r
1946 status |= EDMA3_DRV_setPaRAM(tcp3dInst->edmaHnd,\r
1947 tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT],\r
1948 prm);\r
1949 \r
1950 return ( status );\r
1951 \r
1952 } /* end of - Tcp3d_resetEdmaChParam() function */\r
1953 \r
1954 /**\r
1955 * @brief Initialize the Pseudo PaRAM memory with default values\r
1956 */\r
1957 static void Tcp3d_initPseudoParam ( IN Tcp3d_Instance *tcp3dInst,\r
1958 IN uint32_t codeBlocks,\r
1959 IN Tcp3d_Config *pingConfig,\r
1960 IN Tcp3d_Config *pongConfig)\r
1961 {\r
1962 int32_t cnt, flag;\r
1963 EDMA3_DRV_PaRAMRegs prmSet[TCP3D_DRV_LINK_CB];\r
1964 EDMA3_DRV_PaRAMRegs *prm;\r
1965 uint8_t mode = tcp3dInst->mode;\r
1966 uint32_t incfgOpt[2];\r
1967 uint32_t incfgLink[2];\r
1968 uint32_t incfgStartAddress[2];\r
1969 uint32_t stsOpt[2];\r
1970 uint32_t stsLink[2];\r
1971 uint32_t stsStartAddress[2];\r
1972 uint32_t hdOpt[2];\r
1973 uint32_t hdLink[2];\r
1974 uint32_t hdStartAddress[2];\r
1975 uint32_t llrOpt[2];\r
1976 uint32_t llrLink[2];\r
1977 uint32_t llrStartAddress[2];\r
1978 uint32_t sdOpt[2];\r
1979 uint32_t sdLink[2];\r
1980 uint32_t sdStartAddress[2];\r
1981 \r
1982 incfgStartAddress[PING_INDEX] = pingConfig->inCfgStart;\r
1983 incfgStartAddress[PONG_INDEX] = pongConfig->inCfgStart;\r
1984 \r
1985 incfgLink[PING_INDEX] = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_LLR]);\r
1986 incfgLink[PONG_INDEX] = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_LLR]);\r
1987 \r
1988 llrStartAddress[PING_INDEX] = pingConfig->llrStart;\r
1989 llrStartAddress[PONG_INDEX] = pongConfig->llrStart;\r
1990 \r
1991 llrLink[PING_INDEX] = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_HD]);\r
1992 llrLink[PONG_INDEX] = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_HD]);\r
1993 \r
1994 hdStartAddress[PING_INDEX] = pingConfig->hdStart;\r
1995 hdStartAddress[PONG_INDEX] = pongConfig->hdStart;\r
1996 \r
1997 hdLink[PING_INDEX] = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_PAUSE]);\r
1998 hdLink[PONG_INDEX] = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_PAUSE]);\r
1999 \r
2000 stsStartAddress[PING_INDEX] = pingConfig->stsStart;\r
2001 stsStartAddress[PONG_INDEX] = pongConfig->stsStart;\r
2002 \r
2003 stsLink[PING_INDEX] = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_PAUSE]);\r
2004 stsLink[PONG_INDEX] = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_PAUSE]);\r
2005 \r
2006 sdStartAddress[PING_INDEX] = pingConfig->sdStart;\r
2007 sdStartAddress[PONG_INDEX] = pongConfig->sdStart;\r
2008 \r
2009 sdLink[PING_INDEX] = (0xFFFFu) & (tcp3dInst->pingLinkChParamAddr[LINK_CH_IDX_PAUSE]);\r
2010 sdLink[PONG_INDEX] = (0xFFFFu) & (tcp3dInst->pongLinkChParamAddr[LINK_CH_IDX_PAUSE]);\r
2011 \r
2012 /**\r
2013 * INCFG Ping & Pong - fill all the initial values\r
2014 */\r
2015 /* chain to REVT\r
2016 link to link llr channel \r
2017 A-sync\r
2018 ACNT = 60\r
2019 BCNT = 1\r
2020 CCNT = 1\r
2021 scrBIDX = 0\r
2022 desBIDX = 0\r
2023 scrCIDX = 0\r
2024 desCIDX = 0 */\r
2025 /* Set OPT field with appropriate values */\r
2026 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
2027 incfgOpt[PING_INDEX] = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
2028 CSL_EDMA3_TCCH_EN,\r
2029 CSL_EDMA3_ITCINT_DIS,\r
2030 CSL_EDMA3_TCINT_DIS,\r
2031 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
2032 CSL_EDMA3_TCC_NORMAL,\r
2033 CSL_EDMA3_FIFOWIDTH_NONE,\r
2034 CSL_EDMA3_STATIC_DIS,\r
2035 CSL_EDMA3_SYNC_A,\r
2036 CSL_EDMA3_ADDRMODE_INCR,\r
2037 CSL_EDMA3_ADDRMODE_INCR );\r
2038 \r
2039 incfgOpt[PONG_INDEX] = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
2040 CSL_EDMA3_TCCH_EN,\r
2041 CSL_EDMA3_ITCINT_DIS,\r
2042 CSL_EDMA3_TCINT_DIS,\r
2043 tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT],\r
2044 CSL_EDMA3_TCC_NORMAL,\r
2045 CSL_EDMA3_FIFOWIDTH_NONE,\r
2046 CSL_EDMA3_STATIC_DIS,\r
2047 CSL_EDMA3_SYNC_A,\r
2048 CSL_EDMA3_ADDRMODE_INCR,\r
2049 CSL_EDMA3_ADDRMODE_INCR );\r
2050 #else\r
2051 incfgOpt[PING_INDEX] = 0;\r
2052 /* Src & Dest are in INCR modes */\r
2053 incfgOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
2054 incfgOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
2055 /* Program the TCC */\r
2056 CSL_FINS(incfgOpt[PING_INDEX], TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT]);\r
2057 /* Enable Final transfer completion chain */\r
2058 incfgOpt[PING_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
2059 /* A Sync Transfer Mode */\r
2060 incfgOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2061 \r
2062 incfgOpt[PONG_INDEX] = 0;\r
2063 /* Src & Dest are in INCR modes */\r
2064 incfgOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
2065 incfgOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
2066 /* Program the TCC */\r
2067 CSL_FINS(incfgOpt[PONG_INDEX], TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT]);\r
2068 /* Enable Final transfer completion chain */\r
2069 incfgOpt[PONG_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
2070 /* AB Sync Transfer Mode */\r
2071 incfgOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2072 #endif\r
2073 prm = &prmSet[LINK_CH_IDX_INCFG];\r
2074 prm->srcAddr = NULL;\r
2075 prm->aCnt = 60;\r
2076 prm->bCnt = 1;\r
2077 prm->cCnt = 1;\r
2078 prm->bCntReload = 0;\r
2079 prm->srcBIdx = 0;\r
2080 prm->destBIdx = 0;\r
2081 prm->srcCIdx = 0;\r
2082 prm->destCIdx = 0;\r
2083 \r
2084 /**\r
2085 * LLR Ping & Pong - fill all the initial values\r
2086 */\r
2087 /* chain to REVT\r
2088 link to link hd channel \r
2089 AB-sync\r
2090 ACNT = NULL (updated during enque operation)\r
2091 BCNT = NULL (updated during enque operation)\r
2092 CCNT = NULL (updated during enque operation)\r
2093 scrBIDX = 0\r
2094 desBIDX = 0\r
2095 scrCIDX = 0\r
2096 desCIDX = 0 */\r
2097 /* Set OPT field with appropriate values */\r
2098 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
2099 llrOpt[PING_INDEX] = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
2100 CSL_EDMA3_TCCH_DIS,\r
2101 CSL_EDMA3_ITCINT_DIS,\r
2102 CSL_EDMA3_TCINT_DIS,\r
2103 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
2104 CSL_EDMA3_TCC_NORMAL,\r
2105 CSL_EDMA3_FIFOWIDTH_NONE,\r
2106 CSL_EDMA3_STATIC_DIS,\r
2107 CSL_EDMA3_SYNC_AB,\r
2108 CSL_EDMA3_ADDRMODE_INCR,\r
2109 CSL_EDMA3_ADDRMODE_INCR );\r
2110 \r
2111 llrOpt[PONG_INDEX] = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
2112 CSL_EDMA3_TCCH_DIS,\r
2113 CSL_EDMA3_ITCINT_DIS,\r
2114 CSL_EDMA3_TCINT_DIS,\r
2115 tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT],\r
2116 CSL_EDMA3_TCC_NORMAL,\r
2117 CSL_EDMA3_FIFOWIDTH_NONE,\r
2118 CSL_EDMA3_STATIC_DIS,\r
2119 CSL_EDMA3_SYNC_AB,\r
2120 CSL_EDMA3_ADDRMODE_INCR,\r
2121 CSL_EDMA3_ADDRMODE_INCR );\r
2122 #else\r
2123 llrOpt[PING_INDEX] = 0;\r
2124 /* Src & Dest are in INCR modes */\r
2125 llrOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
2126 llrOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
2127 /* Program the TCC */\r
2128 CSL_FINS(llrOpt[PING_INDEX], TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT]);\r
2129 /* Enable Intermediate & Final transfer completion chain */\r
2130 llrOpt[PING_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_ITCCHEN_SHIFT);\r
2131 /* AB Sync Transfer Mode */\r
2132 llrOpt[PING_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2133 \r
2134 llrOpt[PONG_INDEX] = 0;\r
2135 /* Src & Dest are in INCR modes */\r
2136 llrOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
2137 llrOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
2138 /* Program the TCC */\r
2139 CSL_FINS(llrOpt[PONG_INDEX], TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT]);\r
2140 /* Enable Intermediate & Final transfer completion chain */\r
2141 llrOpt[PONG_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_ITCCHEN_SHIFT);\r
2142 /* AB Sync Transfer Mode */\r
2143 llrOpt[PONG_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2144 #endif\r
2145 prm = &prmSet[LINK_CH_IDX_LLR];\r
2146 prm->srcAddr = NULL;\r
2147 prm->aCnt = NULL;\r
2148 prm->bCntReload = 0;\r
2149 if ( ( mode == CSL_TCP3D_CFG_TCP3_MODE_MODE_SEL_LTE) ||\r
2150 ( mode == CSL_TCP3D_CFG_TCP3_MODE_MODE_SEL_WIMAX ) )\r
2151 {\r
2152 prm->bCnt = 2;\r
2153 prm->cCnt = 3;\r
2154 prm->srcBIdx = NULL;\r
2155 prm->destBIdx = 0x1000;\r
2156 prm->srcCIdx = NULL;\r
2157 prm->destCIdx = 0x2000;\r
2158 }\r
2159 else\r
2160 {\r
2161 prm->bCnt = 3;\r
2162 prm->cCnt = 1;\r
2163 prm->srcBIdx = NULL;\r
2164 prm->destBIdx = 0x2000;\r
2165 prm->srcCIdx = 0;\r
2166 prm->destCIdx = 0;\r
2167 llrOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_ITCCHEN_SHIFT);\r
2168 llrOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_ITCCHEN_SHIFT);\r
2169 }\r
2170 \r
2171 /**\r
2172 * HD Ping & Pong - fill all the initial values\r
2173 */\r
2174 /* chain to REVT\r
2175 link to link pause channel \r
2176 A-sync\r
2177 ACNT = NULL (updated during enque operation)\r
2178 BCNT = 1\r
2179 CCNT = 1\r
2180 scrBIDX = 0\r
2181 desBIDX = 0\r
2182 scrCIDX = 0\r
2183 desCIDX = 0 */\r
2184 /* Set OPT field with appropriate values */\r
2185 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
2186 hdOpt[PING_INDEX] = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
2187 CSL_EDMA3_TCCH_EN,\r
2188 CSL_EDMA3_ITCINT_DIS,\r
2189 CSL_EDMA3_TCINT_DIS,\r
2190 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
2191 CSL_EDMA3_TCC_NORMAL,\r
2192 CSL_EDMA3_FIFOWIDTH_NONE,\r
2193 CSL_EDMA3_STATIC_DIS,\r
2194 CSL_EDMA3_SYNC_A,\r
2195 CSL_EDMA3_ADDRMODE_INCR,\r
2196 CSL_EDMA3_ADDRMODE_INCR );\r
2197 \r
2198 hdOpt[PONG_INDEX] = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
2199 CSL_EDMA3_TCCH_EN,\r
2200 CSL_EDMA3_ITCINT_DIS,\r
2201 CSL_EDMA3_TCINT_DIS,\r
2202 tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT],\r
2203 CSL_EDMA3_TCC_NORMAL,\r
2204 CSL_EDMA3_FIFOWIDTH_NONE,\r
2205 CSL_EDMA3_STATIC_DIS,\r
2206 CSL_EDMA3_SYNC_A,\r
2207 CSL_EDMA3_ADDRMODE_INCR,\r
2208 CSL_EDMA3_ADDRMODE_INCR );\r
2209 #else\r
2210 hdOpt[PING_INDEX] = 0;\r
2211 /* Src & Dest are in INCR modes */\r
2212 hdOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
2213 hdOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
2214 /* Program the TCC */\r
2215 CSL_FINS(hdOpt[PING_INDEX], TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT]);\r
2216 /* Enable Intermediate & Final transfer completion chain */\r
2217 hdOpt[PING_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
2218 /* A Sync Transfer Mode */\r
2219 hdOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2220 \r
2221 hdOpt[PONG_INDEX] = 0;\r
2222 /* Src & Dest are in INCR modes */\r
2223 hdOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
2224 hdOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
2225 /* Program the TCC */\r
2226 CSL_FINS(hdOpt[PONG_INDEX], TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT]);\r
2227 /* Enable Intermediate & Final transfer completion chain */\r
2228 hdOpt[PONG_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
2229 /* A Sync Transfer Mode */\r
2230 hdOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2231 #endif\r
2232 prm = &prmSet[LINK_CH_IDX_HD];\r
2233 prm->destAddr = NULL;\r
2234 prm->aCnt = NULL;\r
2235 prm->bCnt = 1;\r
2236 prm->cCnt = 1;\r
2237 prm->bCntReload = 0;\r
2238 prm->srcBIdx = 0;\r
2239 prm->destBIdx = 0;\r
2240 prm->srcCIdx = 0;\r
2241 prm->destCIdx = 0;\r
2242 \r
2243 /**\r
2244 * STS Ping & Pong - fill all the initial values\r
2245 */\r
2246 /* chain to REVT\r
2247 link to link sd channel \r
2248 A-sync\r
2249 ACNT = 12\r
2250 BCNT = 1\r
2251 CCNT = 1\r
2252 scrBIDX = 0\r
2253 desBIDX = 0\r
2254 scrCIDX = 0\r
2255 desCIDX = 0 */\r
2256 /* Set OPT field with appropriate values */\r
2257 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
2258 stsOpt[PING_INDEX] = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
2259 CSL_EDMA3_TCCH_EN,\r
2260 CSL_EDMA3_ITCINT_DIS,\r
2261 CSL_EDMA3_TCINT_DIS,\r
2262 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
2263 CSL_EDMA3_TCC_NORMAL,\r
2264 CSL_EDMA3_FIFOWIDTH_NONE,\r
2265 CSL_EDMA3_STATIC_DIS,\r
2266 CSL_EDMA3_SYNC_A,\r
2267 CSL_EDMA3_ADDRMODE_INCR,\r
2268 CSL_EDMA3_ADDRMODE_INCR );\r
2269 \r
2270 stsOpt[PONG_INDEX] = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
2271 CSL_EDMA3_TCCH_EN,\r
2272 CSL_EDMA3_ITCINT_DIS,\r
2273 CSL_EDMA3_TCINT_DIS,\r
2274 tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT],\r
2275 CSL_EDMA3_TCC_NORMAL,\r
2276 CSL_EDMA3_FIFOWIDTH_NONE,\r
2277 CSL_EDMA3_STATIC_DIS,\r
2278 CSL_EDMA3_SYNC_A,\r
2279 CSL_EDMA3_ADDRMODE_INCR,\r
2280 CSL_EDMA3_ADDRMODE_INCR );\r
2281 #else\r
2282 stsOpt[PING_INDEX] = 0;\r
2283 /* Src & Dest are in INCR modes */\r
2284 stsOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
2285 stsOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
2286 /* Program the TCC */\r
2287 CSL_FINS(stsOpt[PING_INDEX], TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT]);\r
2288 /* Enable Final transfer completion chain */\r
2289 stsOpt[PING_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
2290 /* A Sync Transfer Mode */\r
2291 stsOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2292 \r
2293 stsOpt[PONG_INDEX] = 0;\r
2294 /* Src & Dest are in INCR modes */\r
2295 stsOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
2296 stsOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
2297 /* Program the TCC */\r
2298 CSL_FINS(stsOpt[PONG_INDEX], TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT]);\r
2299 /* Enable Final transfer completion chain */\r
2300 stsOpt[PONG_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
2301 /* A Sync Transfer Mode */\r
2302 stsOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2303 #endif\r
2304 prm = &prmSet[LINK_CH_IDX_STS];\r
2305 prm->destAddr = NULL;\r
2306 prm->aCnt = 12;\r
2307 prm->bCnt = 1;\r
2308 prm->cCnt = 1;\r
2309 prm->bCntReload = 0;\r
2310 prm->srcBIdx = 0;\r
2311 prm->destBIdx = 0;\r
2312 prm->srcCIdx = 0;\r
2313 prm->destCIdx = 0;\r
2314 \r
2315 /**\r
2316 * SD Ping & Pong - fill all the initial values\r
2317 */\r
2318 /* chain to REVT\r
2319 link to link pause channel \r
2320 A-sync / AB-sync based on mode\r
2321 ACNT = NULL (updated during enque operation)\r
2322 BCNT = 1/3 based on mode \r
2323 CCNT = 1\r
2324 scrBIDX = 0\r
2325 desBIDX = 0\r
2326 scrCIDX = 0\r
2327 desCIDX = 0 */\r
2328 /* Set OPT field with appropriate values */\r
2329 #if TCP3D_DRV_USE_CSL_EDMA3_OPT_MAKE\r
2330 sdOpt[PING_INDEX] = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
2331 CSL_EDMA3_TCCH_EN,\r
2332 CSL_EDMA3_ITCINT_DIS,\r
2333 CSL_EDMA3_TCINT_DIS,\r
2334 tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT],\r
2335 CSL_EDMA3_TCC_NORMAL,\r
2336 CSL_EDMA3_FIFOWIDTH_NONE,\r
2337 CSL_EDMA3_STATIC_DIS,\r
2338 CSL_EDMA3_SYNC_A,\r
2339 CSL_EDMA3_ADDRMODE_INCR,\r
2340 CSL_EDMA3_ADDRMODE_INCR );\r
2341 \r
2342 sdOpt[PONG_INDEX] = CSL_EDMA3_OPT_MAKE ( CSL_EDMA3_ITCCH_DIS,\r
2343 CSL_EDMA3_TCCH_EN,\r
2344 CSL_EDMA3_ITCINT_DIS,\r
2345 CSL_EDMA3_TCINT_DIS,\r
2346 tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT],\r
2347 CSL_EDMA3_TCC_NORMAL,\r
2348 CSL_EDMA3_FIFOWIDTH_NONE,\r
2349 CSL_EDMA3_STATIC_DIS,\r
2350 CSL_EDMA3_SYNC_A,\r
2351 CSL_EDMA3_ADDRMODE_INCR,\r
2352 CSL_EDMA3_ADDRMODE_INCR );\r
2353 #else\r
2354 sdOpt[PING_INDEX] = 0;\r
2355 /* Src & Dest are in INCR modes */\r
2356 sdOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
2357 sdOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
2358 /* Program the TCC */\r
2359 CSL_FINS(sdOpt[PING_INDEX], TPCC_PARAM_OPT_TCC, tcp3dInst->pingCh[TCP3D_DRV_CH_IDX_REVT]);\r
2360 /* Enable Intermediate & Final transfer completion chain */\r
2361 sdOpt[PING_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
2362 /* A Sync Transfer Mode */\r
2363 sdOpt[PING_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2364 \r
2365 sdOpt[PONG_INDEX] = 0;\r
2366 /* Src & Dest are in INCR modes */\r
2367 sdOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SAM_SHIFT);\r
2368 sdOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_DAM_SHIFT);\r
2369 /* Program the TCC */\r
2370 CSL_FINS(sdOpt[PONG_INDEX], TPCC_PARAM_OPT_TCC, tcp3dInst->pongCh[TCP3D_DRV_CH_IDX_REVT]);\r
2371 /* Enable Intermediate & Final transfer completion chain */\r
2372 sdOpt[PONG_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_TCCHEN_SHIFT);\r
2373 /* A Sync Transfer Mode */\r
2374 sdOpt[PONG_INDEX] &= ~(1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2375 #endif\r
2376 prm = &prmSet[LINK_CH_IDX_SD];\r
2377 prm->destAddr = NULL;\r
2378 prm->aCnt = NULL;\r
2379 prm->cCnt = 1;\r
2380 prm->bCntReload = 0;\r
2381 prm->srcCIdx = 0;\r
2382 prm->destCIdx = 0;\r
2383 if ( ( mode == CSL_TCP3D_CFG_TCP3_MODE_MODE_SEL_LTE) ||\r
2384 ( mode == CSL_TCP3D_CFG_TCP3_MODE_MODE_SEL_WIMAX ) )\r
2385 {\r
2386 prm->bCnt = 3;\r
2387 prm->srcBIdx = 0x2000;\r
2388 prm->destBIdx = NULL;\r
2389 sdOpt[PING_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2390 sdOpt[PONG_INDEX] |= (1 << CSL_TPCC_PARAM_OPT_SYNCDIM_SHIFT);\r
2391 }\r
2392 else\r
2393 {\r
2394 prm->bCnt = 1;\r
2395 prm->srcBIdx = 0;\r
2396 prm->destBIdx = 0;\r
2397 }\r
2398 \r
2399 for ( cnt = 0; cnt < codeBlocks; cnt++ )\r
2400 {\r
2401 flag = cnt & 1;\r
2402 \r
2403 prm = &prmSet[LINK_CH_IDX_INCFG];\r
2404 prm->opt = incfgOpt[flag];\r
2405 prm->destAddr = incfgStartAddress[flag];\r
2406 prm->linkAddr = incfgLink[flag];\r
2407 \r
2408 prm = &prmSet[LINK_CH_IDX_LLR];\r
2409 prm->opt = llrOpt[flag];\r
2410 prm->destAddr = llrStartAddress[flag];\r
2411 prm->linkAddr = llrLink[flag];\r
2412 \r
2413 prm = &prmSet[LINK_CH_IDX_STS];\r
2414 prm->opt = stsOpt[flag];\r
2415 prm->srcAddr = stsStartAddress[flag];\r
2416 prm->linkAddr = stsLink[flag];\r
2417 \r
2418 prm = &prmSet[LINK_CH_IDX_HD];\r
2419 prm->opt = hdOpt[flag];\r
2420 prm->srcAddr = hdStartAddress[flag];\r
2421 prm->linkAddr = hdLink[flag];\r
2422 \r
2423 prm = &prmSet[LINK_CH_IDX_SD];\r
2424 prm->opt = sdOpt[flag];\r
2425 prm->srcAddr = sdStartAddress[flag];\r
2426 prm->linkAddr = sdLink[flag];\r
2427 \r
2428 Tcp3d_memcpy(&tcp3dInst->pseudoParamBufPtr[cnt*TCP3D_DRV_LINK_CB], &prmSet[0], 32*TCP3D_DRV_LINK_CB);\r
2429 \r
2430 } /* end of - for ( cnt = 0; cnt < codeBlocks; cnt++ ) */\r
2431 \r
2432 /* Store the lastOpt & lastLink values for use in enque function */\r
2433 tcp3dInst->resetHdOpt[PING_INDEX] = hdOpt[PING_INDEX];\r
2434 tcp3dInst->resetHdOpt[PONG_INDEX] = hdOpt[PONG_INDEX];\r
2435 tcp3dInst->resetHdLink[PING_INDEX] = hdLink[PING_INDEX];\r
2436 tcp3dInst->resetHdLink[PONG_INDEX] = hdLink[PONG_INDEX];\r
2437 \r
2438 tcp3dInst->resetStsOpt[PING_INDEX] = stsOpt[PING_INDEX];\r
2439 tcp3dInst->resetStsOpt[PONG_INDEX] = stsOpt[PONG_INDEX];\r
2440 tcp3dInst->resetStsLink[PING_INDEX] = stsLink[PING_INDEX];\r
2441 tcp3dInst->resetStsLink[PONG_INDEX] = stsLink[PONG_INDEX];\r
2442 \r
2443 tcp3dInst->resetSdOpt[PING_INDEX] = sdOpt[PING_INDEX];\r
2444 tcp3dInst->resetSdOpt[PONG_INDEX] = sdOpt[PONG_INDEX];\r
2445 tcp3dInst->resetSdLink[PING_INDEX] = sdLink[PING_INDEX];\r
2446 tcp3dInst->resetSdLink[PONG_INDEX] = sdLink[PONG_INDEX];\r
2447 } /* end of - Tcp3d_initPseudoParam() function */\r
2448 \r
2449 /**\r
2450 * @brief Resets Pseudo PaRAM memory with default values\r
2451 */\r
2452 static void Tcp3d_resetPseudoParam (IN Tcp3d_Instance *tcp3dInst,\r
2453 IN uint32_t codeBlocks)\r
2454 {\r
2455 int32_t cnt;\r
2456 EDMA3_DRV_PaRAMRegs *prm1 = &tcp3dInst->pseudoParamBufPtr[LINK_CH_IDX_HD];\r
2457 EDMA3_DRV_PaRAMRegs *prm2 = &tcp3dInst->pseudoParamBufPtr[LINK_CH_IDX_STS];\r
2458 EDMA3_DRV_PaRAMRegs *prm3 = &tcp3dInst->pseudoParamBufPtr[LINK_CH_IDX_SD];\r
2459 \r
2460 for ( cnt = 0; cnt < codeBlocks; cnt++ )\r
2461 {\r
2462 prm1->opt = tcp3dInst->resetHdOpt[cnt & 1];\r
2463 prm1->linkAddr = tcp3dInst->resetHdLink[cnt & 1];\r
2464 prm2->opt = tcp3dInst->resetStsOpt[cnt & 1];\r
2465 prm2->linkAddr = tcp3dInst->resetStsLink[cnt & 1];\r
2466 prm3->opt = tcp3dInst->resetSdOpt[cnt & 1];\r
2467 prm3->linkAddr = tcp3dInst->resetSdLink[cnt & 1];\r
2468 \r
2469 prm1 +=TCP3D_DRV_LINK_CB;\r
2470 prm2 +=TCP3D_DRV_LINK_CB;\r
2471 prm3 +=TCP3D_DRV_LINK_CB;\r
2472 } /* end of - for ( cnt = 0; cnt < codeBlocks; cnt++ ) */\r
2473 } /* end of - Tcp3d_resetPseudoParam() function */\r
2474 \r
2475 /**\r
2476 * @b Description\r
2477 * @n \r
2478 * The function is used to get the version information of the TCP3D Driver.\r
2479 *\r
2480 * @retval\r
2481 * Version Information.\r
2482 */\r
2483 uint32_t Tcp3d_getVersion (void)\r
2484 {\r
2485 return TCP3D_DRV_VERSION_ID;\r
2486 }\r
2487 \r
2488 /**\r
2489 * @b Description\r
2490 * @n \r
2491 * The function is used to get the version string for the TCP3D Driver.\r
2492 *\r
2493 * @retval\r
2494 * Version String.\r
2495 */\r
2496 const char* Tcp3d_getVersionStr (void)\r
2497 {\r
2498 return Tcp3dDrvVersionStr;\r
2499 }\r
2500 \r
2501 /* end of file */\r