From 59a64ce5ba034b13cd7c711192c23007154c40c3 Mon Sep 17 00:00:00 2001 From: rasty slutsker Date: Thu, 21 Mar 2024 11:43:59 +0200 Subject: [PATCH 1/3] 1. Threaded DMA interrupt --- .../drivers/makefile.am243x.r5f.ti-arm-gcc | 4 + .../mcu_plus_sdk/source/drivers/udma/udma.c | 7 + .../source/drivers/udma/udma_event.c | 133 ++++++++++++++++-- .../source/drivers/udma/udma_ring_common.c | 36 +++-- .../source/drivers/udma/udma_utils.c | 8 +- 5 files changed, 165 insertions(+), 23 deletions(-) diff --git a/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/makefile.am243x.r5f.ti-arm-gcc b/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/makefile.am243x.r5f.ti-arm-gcc index f748c2c804..19cccf3708 100644 --- a/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/makefile.am243x.r5f.ti-arm-gcc +++ b/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/makefile.am243x.r5f.ti-arm-gcc @@ -196,6 +196,10 @@ FILES_PATH_common = \ INCLUDES_common := \ -I${CG_TOOL_ROOT}/include/c \ -I${MCU_PLUS_SDK_PATH}/source \ + -IFreeRTOS-Kernel/include \ + -I${MCU_PLUS_SDK_PATH}/source/kernel/freertos/config/am243x/r5f \ + -I${MCU_PLUS_SDK_PATH}/source/kernel/freertos/config/am243x/r5f \ + -I${MCU_PLUS_SDK_PATH}/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CR5F \ DEFINES_common := \ -DSOC_AM243X \ diff --git a/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma.c b/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma.c index db4945a294..b9fda63011 100644 --- a/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma.c +++ b/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma.c @@ -64,6 +64,8 @@ /* ========================================================================== */ /* Global Variables */ /* ========================================================================== */ +SemaphoreP_Object dmaPollMutex; +static int32_t once=1; /* None */ @@ -82,6 +84,11 @@ int32_t Udma_init(Udma_DrvHandle drvHandle, const Udma_InitPrms *initPrms) DebugP_assert(sizeof(Udma_EventObjectInt) <= sizeof(Udma_EventObject)); DebugP_assert(sizeof(Udma_RingObjectInt) <= sizeof(Udma_RingObject)); DebugP_assert(sizeof(Udma_FlowObjectInt) <= sizeof(Udma_FlowObject)); + if (once) + { + retVal = SemaphoreP_constructMutex(&dmaPollMutex); + once = 0; + } if((drvHandle == NULL_PTR) || (initPrms == NULL_PTR)) { diff --git a/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_event.c b/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_event.c index 3065c21dcc..370442f16a 100644 --- a/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_event.c +++ b/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_event.c @@ -40,9 +40,13 @@ /* ========================================================================== */ /* Include Files */ /* ========================================================================== */ - +#include #include - +#include +#include +#include +#include +#include /* ========================================================================== */ /* Macros & Typedefs */ /* ========================================================================== */ @@ -52,7 +56,32 @@ /* ========================================================================== */ /* Structure Declarations */ /* ========================================================================== */ +typedef struct Udma_Event +{ + Udma_EventCallback callback; + Udma_EventHandle eventHandle; + uint32_t eventType; + void *appData; +} Udma_Event; +#define EVENT_Q_LEN 256 +typedef struct Udma_EventPollObject_t +{ + /* + * Handle to Qeueue + */ + QueueHandle_t dmaPollQ; + + /* + * Handle to input task that sends polls the link status + */ + TaskP_Object dmaPollTaskObj; + uint8_t dmaPollTaskStack[1024]; + char dmaPollTaskName[64]; + Udma_EventObjectInt *handle; + Udma_Event eventQ[EVENT_Q_LEN]; + StaticQueue_t xStaticQueue; +} Udma_EventPollObject; /* None */ /* ========================================================================== */ @@ -80,7 +109,7 @@ static void Udma_eventResetSteering(Udma_DrvHandleInt drvHandle, /* ========================================================================== */ /* Global Variables */ /* ========================================================================== */ - +extern SemaphoreP_Object dmaPollMutex; /* None */ /* ========================================================================== */ @@ -424,13 +453,33 @@ void UdmaEventPrms_init(Udma_EventPrms *eventPrms) return; } - +uint32_t dmaisr_max = 0; +uint32_t * pdmaisr_max= &dmaisr_max; +uint32_t CycleCounterP_getCount32(void); +void dmaPoll(void *args) +{ + Udma_EventPollObject* obj = (Udma_EventPollObject*)args; + Udma_EventHandleInt eventHandle = obj->handle; + while (1) + { + BaseType_t stat; + Udma_Event event; + stat = xQueueReceive(obj->dmaPollQ, &event, SystemP_WAIT_FOREVER ); + SemaphoreP_pend(&dmaPollMutex,SystemP_WAIT_FOREVER); + if ( pdPASS == stat && event.callback) + { + event.callback(event.eventHandle, event.eventType, event.appData); + } + SemaphoreP_post(&dmaPollMutex); + } +} static void Udma_eventIsrFxn(void *args) { uint32_t vintrBitNum; uint32_t vintrNum; uint32_t teardownStatus; - Udma_EventHandleInt eventHandle = (Udma_EventHandleInt) args; + Udma_EventPollObject* obj = (Udma_EventPollObject*)args; + Udma_EventHandleInt eventHandle = obj->handle; Udma_DrvHandleInt drvHandle; Udma_EventPrms *eventPrms; Udma_RingHandleInt ringHandle; @@ -440,6 +489,8 @@ static void Udma_eventIsrFxn(void *args) drvHandle = eventHandle->drvHandle; vintrNum = eventHandle->vintrNum; DebugP_assert(vintrNum != UDMA_EVENT_INVALID); + uint32_t start, end, dif; + start = CycleCounterP_getCount32(); /* Loop through all the shared events. In case of exclusive events, * the next event is NULL_PTR and the logic remains same and the while breaks */ while(eventHandle != NULL_PTR) @@ -486,8 +537,26 @@ static void Udma_eventIsrFxn(void *args) { if((Udma_EventCallback) NULL_PTR != eventPrms->eventCb) { - eventPrms->eventCb( - eventHandle, eventPrms->eventType, eventPrms->appData); + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + BaseType_t stat; + + /* We have not woken a task at the start of the ISR. */ + Udma_Event event; + event.callback = eventPrms->eventCb; + event.eventHandle = eventHandle; + event.eventType = eventPrms->eventType; + event.appData = eventPrms->appData; + stat = xQueueSendFromISR( obj->dmaPollQ, &event, &xHigherPriorityTaskWoken ); + /* Now the buffer is empty we can switch context if necessary. */ + if( pdPASS == stat && xHigherPriorityTaskWoken ) + { + /* Actual macro used here is port specific. */ + portYIELD_FROM_ISR (xHigherPriorityTaskWoken); + } +/* + eventPrms->eventCb( + eventHandle, eventPrms->eventType, eventPrms->appData); + */ } } } @@ -496,6 +565,12 @@ static void Udma_eventIsrFxn(void *args) /* Move to next shared event */ eventHandle = eventHandle->nextEvent; } + end = CycleCounterP_getCount32(); + dif = end - start; + if (dif > dmaisr_max) + { + dmaisr_max = dif; + } return; } @@ -748,7 +823,7 @@ static int32_t Udma_eventAllocResource(Udma_DrvHandleInt drvHandle, if(UDMA_SOK == retVal) { /* Do atomic link list update as the same is used in ISR */ - cookie = HwiP_disable(); + SemaphoreP_pend(&dmaPollMutex,SystemP_WAIT_FOREVER); /* Link shared events to master event */ eventHandle->prevEvent = (Udma_EventHandleInt) NULL_PTR; @@ -766,7 +841,7 @@ static int32_t Udma_eventAllocResource(Udma_DrvHandleInt drvHandle, eventHandle->prevEvent = lastEvent; lastEvent->nextEvent = eventHandle; } - HwiP_restore(cookie); + SemaphoreP_post(&dmaPollMutex); } if(UDMA_SOK == retVal) @@ -813,7 +888,7 @@ static void Udma_eventFreeResource(Udma_DrvHandleInt drvHandle, uintptr_t cookie; /* Do atomic link list update as the same is used in ISR */ - cookie = HwiP_disable(); + SemaphoreP_pend(&dmaPollMutex,SystemP_WAIT_FOREVER); /* * Remove this event node - link previous to next @@ -831,7 +906,7 @@ static void Udma_eventFreeResource(Udma_DrvHandleInt drvHandle, eventHandle->nextEvent->prevEvent = eventHandle->prevEvent; } - HwiP_restore(cookie); + SemaphoreP_post(&dmaPollMutex); if(NULL_PTR != eventHandle->hwiHandle) { @@ -865,7 +940,8 @@ static void Udma_eventFreeResource(Udma_DrvHandleInt drvHandle, return; } - +Udma_EventPollObject pollpool[20]; +int poolidx=0; static int32_t Udma_eventConfig(Udma_DrvHandleInt drvHandle, Udma_EventHandleInt eventHandle) { @@ -1058,6 +1134,37 @@ static int32_t Udma_eventConfig(Udma_DrvHandleInt drvHandle, } } + { + int32_t retVal = SystemP_SUCCESS; + TaskP_Params params; + poolidx++; + pollpool[poolidx].handle = eventHandle; + /*Initialize semaphore to call synchronize the poll function with a timer*/ + pollpool[poolidx].dmaPollQ = xQueueCreateStatic(EVENT_Q_LEN,sizeof(Udma_Event), + (uint8_t*)&pollpool[poolidx].eventQ, &pollpool[poolidx].xStaticQueue ); + + if(NULL == pollpool[poolidx].dmaPollQ) + { + DebugP_logError("[UDMA] Event Q create failed!!!\r\n"); + } + { + /* Initialize the poll function as a thread */ + TaskP_Params_init(¶ms); + sprintf(pollpool[poolidx].dmaPollTaskName,"DMA_poll_irq_%d",(int)eventHandle->coreIntrNum); + params.name = pollpool[poolidx].dmaPollTaskName; + params.priority = 9; //todo ???? + params.stack = pollpool[poolidx].dmaPollTaskStack; + params.stackSize = sizeof(pollpool[poolidx].dmaPollTaskStack); + params.args = &pollpool[poolidx]; + params.taskMain = &dmaPoll; + + retVal = TaskP_construct(&pollpool[poolidx].dmaPollTaskObj, ¶ms); + if(SystemP_SUCCESS != retVal) + { + DebugP_logError("[UDMA] Poll task create failed!!!\r\n"); + } + } + } if(UDMA_SOK == retVal) { /* Register after programming IA, so that when spurious interrupts @@ -1070,7 +1177,7 @@ static int32_t Udma_eventConfig(Udma_DrvHandleInt drvHandle, HwiP_Params_init(&hwiPrms); hwiPrms.intNum = coreIntrNum; hwiPrms.callback = &Udma_eventIsrFxn; - hwiPrms.args = eventHandle; + hwiPrms.args = &pollpool[poolidx]; hwiPrms.priority = eventHandle->eventPrms.intrPriority; retVal = HwiP_construct(&eventHandle->hwiObject, &hwiPrms); if(SystemP_SUCCESS != retVal) diff --git a/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_ring_common.c b/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_ring_common.c index bcd8c9bf49..e271eae966 100644 --- a/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_ring_common.c +++ b/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_ring_common.c @@ -42,6 +42,7 @@ /* ========================================================================== */ #include +#include /* ========================================================================== */ /* Macros & Typedefs */ @@ -69,7 +70,7 @@ static inline void Udma_ringAssertFnPointers(Udma_DrvHandleInt drvHandle); /* ========================================================================== */ /* None */ - +extern SemaphoreP_Object dmaPollMutex; /* ========================================================================== */ /* Function Definitions */ /* ========================================================================== */ @@ -350,6 +351,11 @@ int32_t Udma_ringDetach(Udma_RingHandle ringHandle) return (retVal); } +uint32_t dmaenq_max = 0; +uint32_t * pdmaenq_max= &dmaenq_max; +uint32_t dmadeq_max = 0; +uint32_t * pdmadeq_max= &dmadeq_max; +uint32_t CycleCounterP_getCount32(void); int32_t Udma_ringQueueRaw(Udma_RingHandle ringHandle, uint64_t phyDescMem) { @@ -377,11 +383,17 @@ int32_t Udma_ringQueueRaw(Udma_RingHandle ringHandle, uint64_t phyDescMem) if(UDMA_SOK == retVal) { - cookie = HwiP_disable(); - + SemaphoreP_pend(&dmaPollMutex,SystemP_WAIT_FOREVER); + uint32_t start, end, dif; + start = CycleCounterP_getCount32(); retVal = drvHandle->ringQueueRaw(drvHandle, ringHandleInt, phyDescMem); - - HwiP_restore(cookie); + end = CycleCounterP_getCount32(); + dif = end - start; + if (dif > dmaenq_max) + { + dmaenq_max = dif; + } + SemaphoreP_post(&dmaPollMutex); } return (retVal); @@ -413,11 +425,17 @@ int32_t Udma_ringDequeueRaw(Udma_RingHandle ringHandle, uint64_t *phyDescMem) if(UDMA_SOK == retVal) { - cookie = HwiP_disable(); - + uint32_t start, end, dif; + SemaphoreP_pend(&dmaPollMutex,SystemP_WAIT_FOREVER); + start = CycleCounterP_getCount32(); retVal = drvHandle->ringDequeueRaw(drvHandle, ringHandleInt, phyDescMem); - - HwiP_restore(cookie); + end = CycleCounterP_getCount32(); + dif = end - start; + if (dif > dmadeq_max) + { + dmadeq_max = dif; + } + SemaphoreP_post(&dmaPollMutex); } return (retVal); diff --git a/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_utils.c b/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_utils.c index 5c988d3bcc..4ec3284527 100644 --- a/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_utils.c +++ b/ind_comms_sdk_am243x_09_01_00_03/mcu_plus_sdk/source/drivers/udma/udma_utils.c @@ -247,7 +247,13 @@ uint64_t Udma_defaultVirtToPhyFxn(const void *virtAddr, uint32_t chNum, void *appData) { - return ((uint64_t) virtAddr); +#if defined (__aarch64__) + uint64_t temp = virtAddr; +#else + /* R5 is 32-bit machine, need to truncate to avoid void * typecast error */ + uint32_t temp = (uint32_t) virtAddr; +#endif + return ((uint64_t) temp); } void *Udma_defaultPhyToVirtFxn(uint64_t phyAddr, -- 2.27.0.windows.1