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