[processor-sdk/pdk.git] / packages / ti / drv / udma / unit_test / udma_ut / src / udma_test_event.c
1 /*
2 * Copyright (c) Texas Instruments Incorporated 2018
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the
14 * distribution.
15 *
16 * Neither the name of Texas Instruments Incorporated nor the names of
17 * its contributors may be used to endorse or promote products derived
18 * from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
33 /**
34 * \file udma_test_event.c
35 *
36 * \brief UDMA event related test case file.
37 *
38 */
40 /* ========================================================================== */
41 /* Include Files */
42 /* ========================================================================== */
44 #include <udma_test.h>
46 /* ========================================================================== */
47 /* Macros & Typedefs */
48 /* ========================================================================== */
50 /* None */
52 /* ========================================================================== */
53 /* Structure Declarations */
54 /* ========================================================================== */
56 /* None */
58 /* ========================================================================== */
59 /* Function Declarations */
60 /* ========================================================================== */
62 static int32_t udmaTestEventOutOfRangeFlowLoop(UdmaTestTaskObj *taskObj,
63 uint32_t loopCnt);
64 static void udmaTestEventCb(Udma_EventHandle eventHandle,
65 uint32_t eventType,
66 void *appData);
68 /* ========================================================================== */
69 /* Global Variables */
70 /* ========================================================================== */
72 /* Global test pass/fail flag */
73 static volatile int32_t gUdmaTestEventResult = UDMA_SOK;
75 /* ========================================================================== */
76 /* Function Definitions */
77 /* ========================================================================== */
79 int32_t udmaTestEventOutOfRangeFlow(UdmaTestTaskObj *taskObj)
80 {
81 int32_t retVal = UDMA_SOK;
82 uint32_t loopCnt = 0U;
84 GT_1trace(taskObj->traceMask, GT_INFO1,
85 " |TEST INFO|:: Task:%d: Out Of Range Flow Event Testcase ::\r\n", taskObj->taskId);
86 GT_2trace(taskObj->traceMask, GT_INFO1,
87 " |TEST INFO|:: Task:%d: Loop count : %d ::\r\n", taskObj->taskId, taskObj->loopCnt);
89 gUdmaTestEventResult = UDMA_SOK;
90 while(loopCnt < taskObj->loopCnt)
91 {
92 /* Perform flow event test */
93 retVal = udmaTestEventOutOfRangeFlowLoop(taskObj, loopCnt);
94 if(UDMA_SOK != retVal)
95 {
96 break;
97 }
99 loopCnt++;
100 }
102 retVal += gUdmaTestEventResult;
104 return (retVal);
105 }
107 static int32_t udmaTestEventOutOfRangeFlowLoop(UdmaTestTaskObj *taskObj,
108 uint32_t loopCnt)
109 {
110 int32_t retVal = UDMA_SOK;
111 uint32_t instId;
112 Udma_DrvHandle drvHandle;
113 Udma_EventPrms eventPrms;
114 struct Udma_EventObj eventObj;
115 Udma_EventHandle eventHandle = NULL;
116 Udma_EventRxFlowIdFwStatus status;
117 char *instanceIdStr[] = {"MAIN", "MCU", "BCDMA", "PKTDMA"};
119 for(instId = UDMA_INST_ID_START; instId <= UDMA_INST_ID_MAX; instId++)
120 {
121 if(0U == loopCnt)
122 {
123 GT_1trace(taskObj->traceMask, GT_INFO1,
124 " Testing for NAVSS Inst: %s ...\r\n", instanceIdStr[instId]);
125 }
127 drvHandle = &taskObj->testObj->drvObj[instId];
129 /* Register flow error event */
130 eventHandle = &eventObj;
131 UdmaEventPrms_init(&eventPrms);
132 eventPrms.eventType = UDMA_EVENT_TYPE_ERR_OUT_OF_RANGE_FLOW;
133 eventPrms.eventMode = UDMA_EVENT_MODE_SHARED;
134 eventPrms.masterEventHandle = Udma_eventGetGlobalHandle(drvHandle);
135 eventPrms.eventCb = &udmaTestEventCb;
136 retVal = Udma_eventRegister(drvHandle, eventHandle, &eventPrms);
137 if(UDMA_SOK != retVal)
138 {
139 GT_0trace(taskObj->traceMask, GT_ERR,
140 " UDMA Flow error event register failed!!\n");
141 break;
142 }
144 /* Note: Since this event can't be reproduced in a standalone UDMA
145 * level testcase, this test doesn't wait for the event to happen.
146 * This just checks register and unregister check
147 */
149 /* Just check status API sanity */
150 retVal = Udma_eventGetRxFlowIdFwStatus(eventHandle, &status);
151 if(UDMA_SOK != retVal)
152 {
153 GT_0trace(taskObj->traceMask, GT_ERR, " RX flow ID FW status get failed!!\n");
154 }
155 else
156 {
157 if(0U == loopCnt)
158 {
159 GT_1trace(taskObj->traceMask, GT_INFO1,
160 " Rx Flow ID Status : %d\r\n", status.isException);
161 GT_1trace(taskObj->traceMask, GT_INFO1,
162 " Rx Flow ID : %d\r\n", status.flowId);
163 GT_1trace(taskObj->traceMask, GT_INFO1,
164 " Rx Channel : %d\r\n", status.chNum);
165 }
166 }
168 retVal += Udma_eventUnRegister(eventHandle);
169 if(UDMA_SOK != retVal)
170 {
171 GT_0trace(taskObj->traceMask, GT_ERR, " Event unregister failed!!\n");
172 break;
173 }
175 if(0U == loopCnt)
176 {
177 GT_1trace(taskObj->traceMask, GT_INFO1,
178 " Testing for NAVSS Inst: %s passed!!\r\n", instanceIdStr[instId]);
179 }
180 }
182 return (retVal);
183 }
185 static void udmaTestEventCb(Udma_EventHandle eventHandle,
186 uint32_t eventType,
187 void *appData)
188 {
189 SemaphoreP_Handle transferDoneSem = (SemaphoreP_Handle) appData;
191 if(transferDoneSem != NULL)
192 {
193 if(UDMA_EVENT_TYPE_ERR_OUT_OF_RANGE_FLOW == eventType)
194 {
195 SemaphoreP_post(transferDoneSem);
196 }
197 else
198 {
199 gUdmaTestEventResult = UDMA_EFAIL;
200 }
201 }
202 else
203 {
204 gUdmaTestEventResult = UDMA_EFAIL;
205 }
207 return;
208 }