Hi,
While doing one time UDMA initialisation (Udma_druLinkedInit()) it is taking a lot of cycles. Close to 300ms. I'm referring UDMA DRU example from PDK. Is there a better way to initialize? Can we ignore any redundancies here?
I'm attaching my UDMA init code.
Call_LK_return_codes App_init(Udma_DrvHandle drvHandle)
{
Call_LK_return_codes retVal = _CALL_LK_RETURN_OK_;
int32_t tempRetVal = UDMA_SOK;
Udma_InitPrms initPrms;
uint32_t instId;
uint32_t utcId;
uint32_t numQueue, queId;
CSL_DruQueueConfig queueCfg;
/* Note: There is no external channel support in MCU NAVSS. So always use
* main NAVSS even for MCU builds */
/* UDMA driver init */
instId = UDMA_INST_ID_MAIN_0;
UdmaInitPrms_init(instId, &initPrms);
initPrms.printFxn = &App_print;
tempRetVal = Udma_init(drvHandle, &initPrms);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] UDMA init failed!!\n");
}
/* Init all DRU queue */
utcId = UDMA_UTC_ID_MSMC_DRU0;
numQueue = Udma_druGetNumQueue(drvHandle, utcId);
if (0U == numQueue)
{
App_print("[Error] Invalid queue number!!\n");
}
UdmaDruQueueConfig_init(&queueCfg);
for (queId = CSL_DRU_QUEUE_ID_0; queId < numQueue; queId++)
{
tempRetVal = Udma_druQueueConfig(drvHandle, utcId, queId, &queueCfg);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] DRU queue config failed!!\n");
break;
}
}
if (tempRetVal != UDMA_SOK)
retVal = _CALL_LK_RETURN_DMA_ERROR_;
return (retVal);
}
Call_LK_return_codes App_create(Udma_DrvHandle drvHandle, Udma_ChHandle chHandle0, Udma_ChHandle chHandle1)
{
Call_LK_return_codes retVal = _CALL_LK_RETURN_OK_;
int32_t tempRetVal = UDMA_SOK;
uint32_t chType;
Udma_ChPrms chPrms;
Udma_ChUtcPrms utcPrms;
Udma_EventHandle eventHandle;
Udma_EventPrms eventPrms;
SemaphoreP_Params semPrms;
SemaphoreP_Params_init(&semPrms);
gUdmaAppDoneSemCh0 = SemaphoreP_create(0, &semPrms);
gUdmaAppDoneSemCh1 = SemaphoreP_create(1, &semPrms);
if ((NULL == gUdmaAppDoneSemCh0) || (NULL == gUdmaAppDoneSemCh1))
{
App_print("[Error] Sem create failed!!\n");
tempRetVal = UDMA_EFAIL;
}
if (UDMA_SOK == tempRetVal)
{
/* Init channel parameters */
chType = UDMA_CH_TYPE_UTC;
UdmaChPrms_init(&chPrms, chType);
chPrms.utcId = UDMA_UTC_ID_MSMC_DRU0;
chPrms.fqRingPrms.ringMem = gDruRingMem;
chPrms.cqRingPrms.ringMem = gDruCompRingMem;
chPrms.tdCqRingPrms.ringMem = gDruTdCompRingMem;
chPrms.fqRingPrms.ringMemSize = UDMA_TEST_APP_RING_MEM_SIZE;
chPrms.cqRingPrms.ringMemSize = UDMA_TEST_APP_RING_MEM_SIZE;
chPrms.tdCqRingPrms.ringMemSize = UDMA_TEST_APP_RING_MEM_SIZE;
chPrms.fqRingPrms.elemCnt = UDMA_TEST_APP_RING_ENTRIES;
chPrms.cqRingPrms.elemCnt = UDMA_TEST_APP_RING_ENTRIES;
chPrms.tdCqRingPrms.elemCnt = UDMA_TEST_APP_RING_ENTRIES;
/* Open channel for DRU */
tempRetVal = Udma_chOpen(drvHandle, chHandle0, chType, &chPrms);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] UDMA channel 0 open failed!!\n");
}
chType = UDMA_CH_TYPE_UTC;
UdmaChPrms_init(&chPrms, chType);
chPrms.utcId = UDMA_UTC_ID_MSMC_DRU0;
chPrms.fqRingPrms.ringMem = gDruRingMem + UDMA_TEST_APP_RING_MEM_SIZE_ALIGN;
chPrms.cqRingPrms.ringMem = gDruCompRingMem + UDMA_TEST_APP_RING_MEM_SIZE_ALIGN;
chPrms.tdCqRingPrms.ringMem = gDruTdCompRingMem + UDMA_TEST_APP_RING_MEM_SIZE_ALIGN;
chPrms.fqRingPrms.ringMemSize = UDMA_TEST_APP_RING_MEM_SIZE;
chPrms.cqRingPrms.ringMemSize = UDMA_TEST_APP_RING_MEM_SIZE;
chPrms.tdCqRingPrms.ringMemSize = UDMA_TEST_APP_RING_MEM_SIZE;
chPrms.fqRingPrms.elemCnt = UDMA_TEST_APP_RING_ENTRIES;
chPrms.cqRingPrms.elemCnt = UDMA_TEST_APP_RING_ENTRIES;
chPrms.tdCqRingPrms.elemCnt = UDMA_TEST_APP_RING_ENTRIES;
tempRetVal = Udma_chOpen(drvHandle, chHandle1, chType, &chPrms);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] UDMA channel 1 open failed!!\n");
}
}
if (UDMA_SOK == tempRetVal)
{
/* Config UTC channel */
UdmaChUtcPrms_init(&utcPrms);
utcPrms.druOwner = CSL_DRU_OWNER_UDMAC_TR;
utcPrms.druQueueId = CSL_DRU_QUEUE_ID_3;
tempRetVal = Udma_chConfigUtc(chHandle0, &utcPrms);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] UDMA UTC channel 0 config failed!!\n");
}
UdmaChUtcPrms_init(&utcPrms);
utcPrms.druOwner = CSL_DRU_OWNER_UDMAC_TR;
utcPrms.druQueueId = CSL_DRU_QUEUE_ID_4;
tempRetVal = Udma_chConfigUtc(chHandle1, &utcPrms);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] UDMA UTC channel 1 config failed!!\n");
}
}
if (UDMA_SOK == tempRetVal)
{
/* Register ring completion callback */
eventHandle = &gUdmaCqEventObj[0];
UdmaEventPrms_init(&eventPrms);
eventPrms.eventType = UDMA_EVENT_TYPE_DMA_COMPLETION;
eventPrms.eventMode = UDMA_EVENT_MODE_SHARED;
eventPrms.chHandle = chHandle0;
eventPrms.masterEventHandle = Udma_eventGetGlobalHandle(drvHandle);
eventPrms.eventCb = &App_udmaEventCbCh0;
tempRetVal = Udma_eventRegister(drvHandle, eventHandle, &eventPrms);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] UDMA CQ event register failed Ch 0!!\n");
}
eventHandle = &gUdmaCqEventObj[1];
UdmaEventPrms_init(&eventPrms);
eventPrms.eventType = UDMA_EVENT_TYPE_DMA_COMPLETION;
eventPrms.eventMode = UDMA_EVENT_MODE_SHARED;
eventPrms.chHandle = chHandle1;
eventPrms.masterEventHandle = Udma_eventGetGlobalHandle(drvHandle);
eventPrms.eventCb = &App_udmaEventCbCh1;
tempRetVal = Udma_eventRegister(drvHandle, eventHandle, &eventPrms);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] UDMA CQ event register failed Ch 1!!\n");
}
}
if (UDMA_SOK == retVal)
{
/* Register teardown ring completion callback */
eventHandle = &gUdmaTdCqEventObj[0];
UdmaEventPrms_init(&eventPrms);
eventPrms.eventType = UDMA_EVENT_TYPE_TEARDOWN_PACKET;
eventPrms.eventMode = UDMA_EVENT_MODE_SHARED;
eventPrms.chHandle = chHandle0;
eventPrms.masterEventHandle = Udma_eventGetGlobalHandle(drvHandle);
eventPrms.eventCb = &App_udmaEventCbCh0;
tempRetVal = Udma_eventRegister(drvHandle, eventHandle, &eventPrms);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] UDMA Teardown CQ event register failed Ch 0!!\n");
}
eventHandle = &gUdmaTdCqEventObj[1];
UdmaEventPrms_init(&eventPrms);
eventPrms.eventType = UDMA_EVENT_TYPE_TEARDOWN_PACKET;
eventPrms.eventMode = UDMA_EVENT_MODE_SHARED;
eventPrms.chHandle = chHandle1;
eventPrms.masterEventHandle = Udma_eventGetGlobalHandle(drvHandle);
eventPrms.eventCb = &App_udmaEventCbCh1;
tempRetVal = Udma_eventRegister(drvHandle, eventHandle, &eventPrms);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] UDMA Teardown CQ event register failed Ch 1!!\n");
}
}
if (UDMA_SOK == tempRetVal)
{
/* Channel enable */
tempRetVal = Udma_chEnable(chHandle0);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] UDMA channel 0 enable failed!!\n");
}
tempRetVal = Udma_chEnable(chHandle1);
if (UDMA_SOK != tempRetVal)
{
App_print("[Error] UDMA channel 1 enable failed!!\n");
}
}
if (tempRetVal != UDMA_SOK)
retVal = _CALL_LK_RETURN_DMA_ERROR_;
return (retVal);
}
Call_LK_return_codes Udma_druLinkedInit()
{
Call_LK_return_codes retVal = _CALL_LK_RETURN_OK_;
// int32_t iBufMemUsed = 0;
Udma_DrvHandle drvHandle = &gUdmaDrvObj;
Udma_ChHandle chHandle0 = &gUdmaChObj[0];
Udma_ChHandle chHandle1 = &gUdmaChObj[1];
if (_CALL_LK_RETURN_OK_ == retVal)
{
#ifdef DMA_VALIDATION
App_print("UDMA DRU application started...\n");
#endif
retVal = App_init(drvHandle);
if (_CALL_LK_RETURN_OK_ != retVal)
{
App_print("[Error] UDMA App init failed!!\n");
}
}
if (_CALL_LK_RETURN_OK_ == retVal)
{
retVal = App_create(drvHandle, chHandle0, chHandle1);
if (_CALL_LK_RETURN_OK_ != retVal)
{
App_print("[Error] UDMA App create failed!!\n");
}
#ifdef DEBUG_PRINTS
App_print("[Debug] UDMA App create Passed!!\n");
#endif
}
return retVal;
}
please Guide