This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TDA4VM: C7X: UDMA DRU: udma initialization takes a lot of cycles

Part Number: TDA4VM

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