878caf895f07d9d4365c85952b1e5aad9dd2bd15
[processor-sdk/pdk.git] / packages / ti / osal / test / src / main_osal_test.c
1 /**
2  *  \file   main_osal_test.c
3  *
4  *  \brief  OSAL driver test application main file.
5  *
6  */
8 /*
9  * Copyright (C) 2016-2020 Texas Instruments Incorporated - http://www.ti.com/
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  *
15  * Redistributions of source code must retain the above copyright
16  * notice, this list of conditions and the following disclaimer.
17  *
18  * Redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the
21  * distribution.
22  *
23  * Neither the name of Texas Instruments Incorporated nor the names of
24  * its contributors may be used to endorse or promote products derived
25  * from this software without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  *
39  */
41 #if !(defined(BARE_METAL) || defined(FREERTOS))
42 /* XDCtools Header files */
43 #include <xdc/std.h>
44 #if defined (SOC_J721E) || defined(SOC_J7200)
45 // workaround for A72 does not supported in SYS/BIOS yet
46 #if defined (BUILD_C7X_1)
47 #ifndef BARE_METAL
48 #include <ti/sysbios/family/c7x/Hwi.h>
49 #endif //BARE_METAL
50 #endif //BUILD_C7X_1
51 #else
52 #include <xdc/cfg/global.h>
53 #endif
54 #include <xdc/runtime/System.h>
55 #include <xdc/runtime/Error.h>
57 /* BIOS Header files */
58 #include <ti/sysbios/BIOS.h>
59 #include <ti/osal/SwiP.h>
60 #endif
62 #if !defined(BARE_METAL)
63 /* include for both tirtos and freertos. */
64 #include <ti/osal/TaskP.h>
65 #endif
67 #if defined (FREERTOS)
68 #include "FreeRTOS.h"
69 #include "task.h"
70 #include <ti/osal/MemoryP.h>
71 #endif
73 #include <stdio.h>
74 #include <string.h>
76 /* TI-RTOS Header files */
77 #include <ti/osal/osal.h>
78 #include "OSAL_log.h"
80 #include "OSAL_board.h"
82 #if defined (SOC_J721E) || defined(SOC_J7200)
83 #include <ti/drv/sciclient/sciclient.h>
84 #endif
85 /**********************************************************************
86  ************************** Internal functions ************************
87  **********************************************************************/
88 #define TWO_TIMER_INTERRUPT_TEST 0
89 #if defined(SOC_TPR12) || defined (SOC_AWR294X)
90 #define ENABLE_DEBUG_LOG_TEST   1
91 #endif
93 #include <ti/csl/soc.h>
95 #if defined (__C7100__)
96 #include <ti/csl/csl_clec.h>
97 #include <ti/csl/arch/csl_arch.h>
98 #endif
99 #include <ti/csl/tistdtypes.h>
100 #if defined (BARE_METAL)
101 #if !defined(SOC_TPR12) && !defined (SOC_AWR294X)
102 #include <ti/csl/csl_timer.h>
103 #endif
104 #include <ti/csl/arch/csl_arch.h>
106 #if   defined (SOC_AM571x) || defined (SOC_AM572x) || defined (SOC_AM574x)
107 #undef  TWO_TIMER_INTERRUPT_TEST
108 #define TWO_TIMER_INTERRUPT_TEST 1
109 #endif
110 #elif defined (FREERTOS)
112 #else
113 void ErrorHandler(Error_Block *eb)
115     OSAL_log("ErrorHandler: ");
116     Error_print(eb);
118 #endif
120 #if defined(BUILD_C66X_1) || defined(BUILD_C66X_2)
121 /* To set C66 timer interrupts on J7ES VLAB */
122 void C66xTimerInterruptInit(void);
123 #endif
125 #ifdef BUILD_C7X_1
126 void    Osal_appC7xPreInit(void);
127 void    C7x_ConfigureTimerOutput(void);
128 #endif
130 #undef  ENABLE_GET_TIME_TEST
131 #if defined(SOC_AM65XX) || defined(SOC_J721E) || defined(SOC_AM572x) || defined(SOC_K2G) || defined(SOC_AM335x) || defined(SOC_AM437x) || defined(SOC_J7200)|| defined(SOC_TPR12) || defined (SOC_AWR294X)
132 #define ENABLE_GET_TIME_TEST     1
133 #endif
135 #ifndef NULL_PTR
136 #define NULL_PTR ((void *)0x0)
137 #endif
139 /**********************************************************************
140  ************************** Global Variables **************************
141  **********************************************************************/
142 #if defined (__TI_ARM_V5__)
143 TimerP_Handle handle;
144 #endif
146 /* Test application stack size */
147 #if defined (__C7100__)
148 /* Temp workaround to avoid assertion failure: A_stackSizeTooSmall : Task stack size must be >= 16KB.
149   * until the Bug PDK-7605 is resolved */
150 #define APP_TSK_STACK_MAIN              (32U * 1024U)
151 #else
152 #define APP_TSK_STACK_MAIN              (16U * 1024U)
153 #endif
155 #ifdef BARE_METAL
156 /* No task support for Bare metal */
157 #else
158 /* Test application stack */
159 static uint8_t  gAppTskStackMain[APP_TSK_STACK_MAIN] __attribute__((aligned(32)));
160 #endif
162 /*
163  *  ======== Board_initOSAL ========
164  */
165 void Board_initOSAL(void)
167     Board_initCfg boardCfg;
168     Board_STATUS  status;
169 #if defined(evmK2E) || defined(evmC6678)
170     boardCfg = BOARD_INIT_MODULE_CLOCK |
171         BOARD_INIT_UART_STDIO;
172 #else
173     boardCfg = BOARD_INIT_PINMUX_CONFIG;
174     /* For TPR12 AWR294X we dont do module clock init from app. This is done by
175      * GEL file or SBL. Doing Module Clock init causes OSAL RTI interrupts
176      * to stop if another core also runs OSAL test
177      */
178     #if !defined(SOC_TPR12) && !defined (SOC_AWR294X)
179     #if !defined(_TMS320C6X)
180         boardCfg |= BOARD_INIT_MODULE_CLOCK;
181     #endif
182     #endif /* !defined(SOC_TPR12) */
184     #if defined (UART_CONSOLE)
185         boardCfg |= BOARD_INIT_UART_STDIO;
186     #endif
187 #endif
188     status = Board_init(boardCfg);
190     if (status != BOARD_SOK)
191     {
192         OSAL_log(" Board_init() is not successful...unexpected results may happen \n");
193     }
195     return;
199 /*
200  *  ======== HWI test function ========
201  */
202 volatile   uint64_t gTestlocalTimeout = 0x300000U;
204 #if (defined (SOC_AM65XX) || defined (SOC_AM64X) || defined(SOC_J721E) || defined(SOC_J7200) || defined (SOC_TPR12) || defined (SOC_AWR294X)) && (!defined(BUILD_C66X_1))&&(!defined(BUILD_C66X_2))&&(!defined(BUILD_C7X_1))
205 #define INT_NUM_IRQ 32
206 #define LOOP_CNT    100
207 volatile uint64_t gFlagIRQ = 0;
209 void myIsrIRQ(uintptr_t arg)
211     gFlagIRQ = 1;
212     gTestlocalTimeout = 0x300000;
214 bool  OSAL_core_hwi_test()
217     HwiP_Params hwiParams;
218     HwiP_Handle handle;
219     volatile int intCount = 0;
220     int32_t ret;
221     bool test_pass=true;
223     HwiP_Params_init(&hwiParams);
225     OSAL_log("Creating Hwi myIsr \n");
226     handle = HwiP_create(INT_NUM_IRQ, myIsrIRQ, &hwiParams);
227     if (handle == NULL_PTR) {
228       OSAL_log("Failed to create the HwiP handle \n");
229       test_pass = false;
230     }
232     if (test_pass == true)
233     {
234         while (intCount != LOOP_CNT)
235         {
236             ret=HwiP_post(INT_NUM_IRQ);
238             if(ret==osal_UNSUPPORTED)
239             { /* In case of unsupported SOC/error */
240               OSAL_log("HwiP_post unsupported/failed!\n");
241               test_pass=false;
242               break;
243             }
245             /* Wait for software timeout, ISR should hit
246              * otherwise return the test as failed */
247             while (gTestlocalTimeout != 0U)
248             {
249               gTestlocalTimeout--;
250               if (gFlagIRQ)
251               {
252                 gFlagIRQ = 0;
253                 intCount++;
254                 break;
255               }
256             }
257             /* Wait is over - did not get any interrupts posted/received
258              * declare the test as fail
259              */
260             if (gTestlocalTimeout == 0)
261             {
262               OSAL_log("Failed to get interrupts \n");
263               test_pass = false;
264               break;
265             }
266         }
268         OSAL_log("%d IRQs received. Test over !\n",intCount);
269         ret = HwiP_delete(handle);
270         if (ret != HwiP_OK)
271         {
272           OSAL_log(" Failed to delete HwiP handle \n");
273           test_pass= false;
274         }
275     }
277     return test_pass;
279 #endif
281 bool OSAL_hwi_test()
283   bool pass = true;
284 #if (defined (SOC_AM65XX) || defined (SOC_AM64X) || defined(SOC_J721E) || defined(SOC_J7200) || defined (SOC_TPR12) || defined (SOC_AWR294X)) && (!defined(BUILD_C66X_1))&&(!defined(BUILD_C66X_2))&&(!defined(BUILD_C7X_1))
285   pass = OSAL_core_hwi_test();
286 #endif
287   return pass;
290 typedef enum UT_Timer_Type_s {
291     UT_Timer_DMTIMER = 0,
292     UT_Timer_TIMER64 = 1,
293     UT_Timer_RTITIMER = 2
294 } UT_Timer_Type_t;
297 #if defined(SOC_AM335x)
298 #define CM_PER_TIMER3_CLKCTRL             (0x44e00084)
299 #define CM_DPLL_CLKSEL_TIMER3_CLK         (0x44e0050c)
300 UT_Timer_Type_t  timer_type    =          UT_Timer_DMTIMER;
301 #define OSAL_TEST_TIMER_ID                (1U)
302 #define OSAL_TEST_TIMER_PERIOD            (5000U)
303 #elif defined(SOC_AM437x)
304 #define CM_PER_TIMER3_CLKCTRL             (0x44DF8800 + 0x538)
305 #define CM_DPLL_CLKSEL_TIMER3_CLK         (0x44DF4200 + 0x8)
306 UT_Timer_Type_t  timer_type  =            UT_Timer_DMTIMER;
307 #define OSAL_TEST_TIMER_ID                (3U)
308 #define OSAL_TEST_TIMER_PERIOD            (5000U)
310 #elif defined(SOC_K2E) || defined(SOC_K2L)
311 UT_Timer_Type_t  timer_type =             UT_Timer_TIMER64;
312 #define OSAL_TEST_TIMER_ID                (TimerP_ANY)
313 #define OSAL_TEST_TIMER_PERIOD            (5000U)
314 #elif defined(SOC_K2H) || defined(SOC_K2K)
315 UT_Timer_Type_t  timer_type =             UT_Timer_TIMER64;
316 #define OSAL_TEST_TIMER_ID                (8U)
317 #define OSAL_TEST_TIMER_PERIOD            (5000U)
318 #elif defined(SOC_K2G)
319 UT_Timer_Type_t  timer_type =             UT_Timer_TIMER64;
320 #define OSAL_TEST_TIMER_ID                (1U)
321 #define OSAL_TEST_TIMER_ID2               (2U)
322 #define OSAL_TEST_TIMER_PERIOD            (5000U)
323 #elif defined(SOC_AM572x) || defined (SOC_AM574x)
324 UT_Timer_Type_t  timer_type   =           UT_Timer_DMTIMER;
325   #if defined (__ARM_ARCH_7A__)
326     #define OSAL_TEST_TIMER_ID                (1U)
327     #define OSAL_TEST_TIMER_ID2               (9U)
328     #define OSAL_TEST_TIMER_PERIOD            (5000U)
329   #elif   defined (_TMS320C6X)
330     #define OSAL_TEST_TIMER_ID                (4U)
331     #define OSAL_TEST_TIMER_ID2               (5U)
332     #define OSAL_TEST_TIMER_PERIOD            (5000U)
333   #else
334     #define OSAL_TEST_TIMER_ID                (8U)
335     #define OSAL_TEST_TIMER_ID2               (10U)
336     #define OSAL_TEST_TIMER_PERIOD            (5000U)
337   #endif
338 #elif defined(SOC_AM571x)
339 UT_Timer_Type_t  timer_type   =           UT_Timer_DMTIMER;
340   #if defined (__ARM_ARCH_7A__)
341     #define OSAL_TEST_TIMER_ID                (1U)
342     #define OSAL_TEST_TIMER_ID2               (9U)
343     #define OSAL_TEST_TIMER_PERIOD            (5000U)
344   #elif   defined (_TMS320C6X)
345     #define OSAL_TEST_TIMER_ID                (4U)
346     #define OSAL_TEST_TIMER_ID2               (5U)
347     #define OSAL_TEST_TIMER_PERIOD            (5000U)
348   #else
349     #define OSAL_TEST_TIMER_ID                (8U)
350     #define OSAL_TEST_TIMER_ID2               (10U)
351     #define OSAL_TEST_TIMER_PERIOD            (5000U)
352   #endif
353 #elif defined(SOC_OMAPL137) || defined (SOC_OMAPL138)
354 UT_Timer_Type_t  timer_type =             UT_Timer_TIMER64;
355 #define OSAL_TEST_TIMER_ID                (1U)
356 #define OSAL_TEST_TIMER_PERIOD            (5000U)
358 #elif defined(SOC_AM65XX)
359   UT_Timer_Type_t  timer_type    =          UT_Timer_DMTIMER;
360   #if defined (__TI_ARM_V7R4__)
361     #define OSAL_TEST_TIMER_ID                (1U)
362     #define OSAL_TEST_TIMER_ID2               (2U)
363     #define OSAL_TEST_TIMER_PERIOD            (5000U)
364   #else
365     #define OSAL_TEST_TIMER_ID                (4U)
366     #define OSAL_TEST_TIMER_ID2               (5U)
367     #define OSAL_TEST_TIMER_PERIOD            (5000U)
368   #endif
369 #elif defined(SOC_J721E)
370   UT_Timer_Type_t  timer_type    =          UT_Timer_DMTIMER;
371   #if defined (BUILD_MCU1_0)
372     #define OSAL_TEST_TIMER_ID                (2U)
373     #define OSAL_TEST_TIMER_ID2               (3U)
374     #define OSAL_TEST_TIMER_PERIOD            (5000U)
375   #elif defined (__TI_ARM_V7R4__)
376     #define OSAL_TEST_TIMER_ID                (1U)
377     #define OSAL_TEST_TIMER_ID2               (2U)
378     #define OSAL_TEST_TIMER_PERIOD            (5000U)
379   #elif defined (BUILD_C66X_1)
380     #define OSAL_TEST_TIMER_ID                (2U)
381     #define OSAL_TEST_TIMER_ID2               (3U)
382     #define OSAL_TEST_TIMER_PERIOD            (5000U)
383   #elif defined (BUILD_C66X_2)
384     #define OSAL_TEST_TIMER_ID                (2U)
385     #define OSAL_TEST_TIMER_ID2               (3U)
386     #define OSAL_TEST_TIMER_PERIOD            (5000U)
387   #elif defined (BUILD_C7X_1)
388     #define OSAL_TEST_TIMER_ID                (1U)
389     #define OSAL_TEST_TIMER_ID2               (2U)
390     #define OSAL_TEST_TIMER_PERIOD            (5000U)
391   #else
392     #define OSAL_TEST_TIMER_ID                (2U)
393     #define OSAL_TEST_TIMER_ID2               (5U)
394     #define OSAL_TEST_TIMER_PERIOD            (5000U)
395   #endif
396 #elif defined(SOC_J7200)
397   UT_Timer_Type_t  timer_type    =          UT_Timer_DMTIMER;
398   #if defined (__TI_ARM_V7R4__)
399     #define OSAL_TEST_TIMER_ID                (1U)
400     #define OSAL_TEST_TIMER_ID2               (2U)
401     #define OSAL_TEST_TIMER_PERIOD            (5000U)
402   #else
403     #define OSAL_TEST_TIMER_ID                (2U)
404     #define OSAL_TEST_TIMER_ID2               (5U)
405     #define OSAL_TEST_TIMER_PERIOD            (5000U)
406   #endif
407 #elif defined(SOC_AM64X)
408   UT_Timer_Type_t  timer_type    =          UT_Timer_DMTIMER;
409   #if defined(BUILD_MCU)
410     #define OSAL_TEST_TIMER_ID                (1U)
411     #define OSAL_TEST_TIMER_ID2               (2U)
412     #define OSAL_TEST_TIMER_PERIOD            (5000U)
413   #endif
414   #if defined(BUILD_MPU)
415     #define OSAL_TEST_TIMER_ID                (4U)
416     #define OSAL_TEST_TIMER_ID2               (2U)
417     #define OSAL_TEST_TIMER_PERIOD            (5000U)
418   #endif
419   #if defined(BUILD_M4F)
420     #define OSAL_TEST_TIMER_ID                (1U)
421     #define OSAL_TEST_TIMER_ID2               (2U)
422     #define OSAL_TEST_TIMER_PERIOD            (5000U)
423   #endif
424 #elif (defined(SOC_TPR12) || defined (SOC_AWR294X))
425     UT_Timer_Type_t  timer_type =           UT_Timer_RTITIMER;
426 #define OSAL_TEST_TIMER_ID                    (TimerP_ANY)
427 #if defined(SIM_BUILD)
428 #define OSAL_TEST_TIMER_PERIOD                (500U)
429 #else
430 #define OSAL_TEST_TIMER_PERIOD                (5000U)
431 #endif
432 #else
433 UT_Timer_Type_t  timer_type   =           UT_Timer_DMTIMER;
434   #if defined (__ARM_ARCH_7A__)
435     #define OSAL_TEST_TIMER_ID                (1U)
436     #define OSAL_TEST_TIMER_PERIOD            (5000U)
437   #elif   defined (_TMS320C6X)
438     #define OSAL_TEST_TIMER_ID                (4U)
439     #define OSAL_TEST_TIMER_PERIOD            (5000U)
440   #else
441     #define OSAL_TEST_TIMER_ID                (8U)
442     #define OSAL_TEST_TIMER_PERIOD            (5000U)
443   #endif
444 #endif
446 #if defined(SIM_BUILD)
447 #define      OSAL_GET_TIME_MAX_SAMPLES  (10U)
448 #else
449 #define      OSAL_GET_TIME_MAX_SAMPLES  (20U)
450 #endif
451 volatile uint32_t timerIsrCount = 0;
452 volatile uint32_t timerIsr2Count = 0;
454 #if defined(SIM_BUILD)
455 #define OSAL_TIMER_TEST_MAX_INTERRUPTS      (10U)
456 #else
457 #define OSAL_TIMER_TEST_MAX_INTERRUPTS      (100U)
458 #endif
461 #if defined (ENABLE_GET_TIME_TEST)
462 uint64_t     gTestTimeRd[OSAL_GET_TIME_MAX_SAMPLES];
463 #endif
465 void timerIsr(void *arg)
467 #if defined(BARE_METAL) && defined(__TI_ARM_V5__)
468     TimerP_ClearInterrupt(handle);
469 #endif
471 #if defined (ENABLE_GET_TIME_TEST)
472     if (timerIsrCount < OSAL_GET_TIME_MAX_SAMPLES)
473     {
474         gTestTimeRd[timerIsrCount] = TimerP_getTimeInUsecs();
475     }
476 #endif
477     timerIsrCount++;
481 #if    TWO_TIMER_INTERRUPT_TEST
482 void timerIsr2(void *arg)
484     timerIsr2Count++;
486 #endif
488 /*
489  * ========= Osal Delay Test function =========
490  */
491 #if defined(SIM_BUILD)
492 #define OSAL_DELAY_TIME         1
493 #else
494 #define OSAL_DELAY_TIME         10
495 #endif
496 bool Osal_delay_test(void)
498 #if !defined(SOC_AM64X)
499    int32_t i;
500   /* This test assumes that Board init has been already
501    * called outside this function
502    */
503    /* Notice a '.' on terminal for every 1 second */
505    for (i=0; i<10;i++) {
506 #endif
507       Osal_delay(OSAL_DELAY_TIME);
508       OSAL_log(".");
509 #if !defined(SOC_AM64X)
510    }
511 #endif
512    OSAL_log("\n");
514   return(true);
517 #if defined (ENABLE_GET_TIME_TEST)
518 /*
519  * ========= Osal getTime Test function =========
520  */
521 bool Osal_getTime_test(void)
523    int32_t      i;
524    bool         retVal   = true;
526    OSAL_log(" \n     time read in micro seconds is \n ");
527    for (i = 0; i < OSAL_GET_TIME_MAX_SAMPLES; i++)
528    {
529        OSAL_log(" %d \n ", (uint32_t) gTestTimeRd[i]);
530    }
532    return(retVal);
534 #endif
536 /*
537  *  ======== Timer test function ========
538  */
539 bool OSAL_timer_test()
541     TimerP_Params timerParams;
542 #if !defined (__TI_ARM_V5__)
543     /* Timer handle is defined as global for OMAPL13x ARM9 core since
544        it is required for clearing the interrupt from ISR */
545     TimerP_Handle handle;
546 #endif
548 #if    TWO_TIMER_INTERRUPT_TEST
549     TimerP_Handle handle2;
550 #endif
551     TimerP_Status timerStatus;
552     Osal_HwAttrs  hwAttrs;
554 #if defined(BARE_METAL) || defined(FREERTOS)
555     int32_t       id    = OSAL_TEST_TIMER_ID;
556 #else
557     int32_t       id    = TimerP_ANY;
558 #endif
560 #if defined(SOC_AM437x)
561     /* We can't use Timer_ANY for Sys BIOS as it allocates Timer0 which is
562      * firewalled on HS device and hence changing the Test Timer ID = 3 for
563      * both HS and GP parts
564      */
565     id                  = OSAL_TEST_TIMER_ID;
566 #endif
568 #if defined(SOC_J721E)
569 #if !defined(BARE_METAL)
570 #if defined(BUILD_C66X_1) || defined(BUILD_C66X_2) || defined(BUILD_C7X_1) || defined(BUILD_MCU1_0)
571     id                  = OSAL_TEST_TIMER_ID;
572 #endif
573 #endif
574 #endif
575     volatile      int32_t i;
576     uint32_t      prevCount, ctrlBitmap = OSAL_HWATTR_SET_OSALDELAY_TIMER_BASE ;
577     bool          ret = true;
578     int32_t       osal_ret;
580 #if (defined (SOC_AM437x) || defined (SOC_AM335x))
581     *(unsigned int*)CM_DPLL_CLKSEL_TIMER3_CLK = 0x1; /* high frequency input clock */
583     // enable the TIMER
584     *(unsigned int*)CM_PER_TIMER3_CLKCTRL = 0x2; /* Module is explicitly enabled */
585 #endif
587     /* Set the timer base for the osal delay */
588     Osal_getHwAttrs(&hwAttrs);
590 #if defined (SOC_AM437x)
591     hwAttrs.osalDelayTimerBaseAddr = (uintptr_t) 0x48040000U; /* DMTIMER2 */
592 #endif
594 #if defined (OSAL_TEST_CPU_FREQ_KHZ)
595     hwAttrs.cpuFreqKHz = OSAL_TEST_CPU_FREQ_KHZ;
596     ctrlBitmap        |= OSAL_HWATTR_SET_CPU_FREQ;
597 #endif
599     /* This API should return osal_OK for AM3/AM4 and return unsupported for other Socs */
600     osal_ret = Osal_setHwAttrs(ctrlBitmap, &hwAttrs);
602 #if defined (SOC_AM437x) || defined (SOC_AM335x)
603     if (osal_ret == osal_OK) {
604       ret = true;
605     }
606     else {
607       ret = false;
608     }
609 #else
610     if ((osal_ret == osal_UNSUPPORTED) ||
611        (osal_ret == osal_OK)) {
612       ret = true;
613     }
614     else {
615       ret = false;
616     }
617 #endif /* (SOC_AM437x) || defined (SOC_AM335x) */
619     TimerP_Params_init(&timerParams);
620     timerParams.runMode    = TimerP_RunMode_CONTINUOUS;
621     timerParams.startMode  = TimerP_StartMode_USER;
622     timerParams.periodType = TimerP_PeriodType_MICROSECS;
623     timerParams.period     = OSAL_TEST_TIMER_PERIOD;
625 #if defined(SOC_J721E) || defined(SOC_J7200)
626 #if defined(BUILD_C66X_1)
627     /* the Eevnt 21 is used for DMTimer0 by SYS/BIOS by default, so we need to use a different one here for DMTimer2 */
628         timerParams.eventId    = 22;
629     /* the Interrupt 14 is used for DMTimer0 by SYS/BIOS by default, so we need to use a different one here for DMTimer2 */
630     timerParams.intNum     = 15;
631     OSAL_log("\n set intNum=%d, id=%d,  \n", timerParams.intNum, id);
632 #endif
633 #if defined(BUILD_C66X_2)
634     /* the Eevnt 20 is used for DMTimer0 by SYS/BIOS by default, so we need to use a different one here for DMTimer2 */
635         timerParams.eventId    = 22;
636     /* the Interrupt 14 is used for DMTimer0 by SYS/BIOS by default, so we need to use a different one here for DMTimer2 */
637     timerParams.intNum     = 15;
638 #endif
640 #if defined(BUILD_C7X_1)
641     timerParams.intNum     = 15;
642     OSAL_log("\n set intNum=%d, id=%d,  \n", timerParams.intNum, id);
643 #endif
644 #endif
646 #if !defined(SOC_J721E) || !defined(SOC_J7200)
647 #if defined(_TMS320C6X)
648 #if defined(SOC_TPR12)
649     timerParams.intNum     = 16;
650 #else
651     timerParams.intNum     = 15;
652 #endif
653     OSAL_log("\n set intNum=%d, id=%d,  \n", timerParams.intNum, id);
654 #endif
655 #endif
657     if (timer_type == UT_Timer_TIMER64)
658     {
659       timerParams.timerMode = TimerP_Timer64Mode_UNCHAINED;
660       timerParams.timerHalf = TimerP_Timer64Half_LOWER;
661     }
662     handle = TimerP_create(id, (TimerP_Fxn)&timerIsr, &timerParams);
664     /* don't expect the handle to be null */
665     if (handle == NULL_PTR)
666     {
667       OSAL_log("\n Timer Create error \n");
668       ret = false;
669     }
671 #if defined(ENABLE_GET_TIME_TEST)
672      TimerP_getTimeInUsecs();
673 #endif
675 #if    TWO_TIMER_INTERRUPT_TEST
677 #if (defined(_TMS320C6X) && (!defined(SOC_J721E) ))
678     timerParams.intNum     = 14;
679 #endif
681     if (ret == true)  {
682       handle2 = TimerP_create(OSAL_TEST_TIMER_ID2, (TimerP_Fxn)&timerIsr2, &timerParams);
683       /* don't expect the handle to be null */
684       if (handle2 == NULL_PTR)
685       {
686         OSAL_log("\n Timer Create error for handle2 \n");
687         ret = false;
688       }
689     }
690 #endif
692     if (ret == true)
693     {
694       timerIsrCount = 0U;
695       timerStatus = TimerP_start(handle);
697       if (timerStatus != TimerP_OK) {
698         OSAL_log("Err: Coult not start the timer %d \n", id);
699         ret = false;
700       }
702 #if    TWO_TIMER_INTERRUPT_TEST
703       timerIsr2Count = 0U;
704       timerStatus = TimerP_start(handle2);
706       if (timerStatus != TimerP_OK) {
707         OSAL_log("Err: Coult not start the timer %d \n", id + 1);
708         ret = false;
709       }
711       while (1)
712       {
713         if (timerIsr2Count >= OSAL_TIMER_TEST_MAX_INTERRUPTS) {
714           timerStatus = TimerP_stop(handle2);
715           if (timerStatus != TimerP_OK) {
716             OSAL_log("Err: Coult not stop the timer %d \n", id);
717             ret = false;
718           }
719           break;
720         }
721       }
722 #endif
724       while (1)
725       {
726         if (timerIsrCount >= OSAL_TIMER_TEST_MAX_INTERRUPTS) {
727           timerStatus = TimerP_stop(handle);
728           if (timerStatus != TimerP_OK) {
729             OSAL_log("Err: Coult not stop the timer %d \n", id);
730             ret = false;
731           }
733           break;
734         }
735       }
737       /* Latch the ISR count after the timer stops */
738       prevCount = (timerIsrCount);
740       /* Give some time for all pending interrupts to be processed */
741       for(i = 0; i < 1000; i++)
742       {
743         asm (" nop ");
744       }
746       /* Now check if timer ISR gets kicked in
747        * timer ISR should not be kicked in */
748       if (ret == true)
749       {
750          for (i = 0; i < 50000; i++);
752          if (prevCount != timerIsrCount)
753          {
754            OSAL_log(" Error: Timer appears to be not stopped via OSAL calls, val1 = %u and val2 = %u \n ", prevCount, timerIsrCount);
755            ret = false;
756          }
757          else
758          {
759            OSAL_log("  TimerTestLog: got %u ticks from timer id = %d \n", timerIsrCount, id);
760 #if    TWO_TIMER_INTERRUPT_TEST
761            OSAL_log("  TimerTestLog: got %u ticks from timer id = %d \n", timerIsr2Count, id+1);
762 #endif
763          }
764        }
765     }
767     if (handle != NULL_PTR)
768     {
769       if (TimerP_delete(handle) != TimerP_OK)
770       {
771         ret = false;
772       }
773     }
774     return (ret);
777 /*
778  *  ======== Clock test function ========
779  */
780 bool OSAL_clock_test()
782     return true;
785 #ifdef MANUAL_CACHE_TEST
787 #if defined (__ARM_ARCH_7A__)
788 #include <ti/csl/csl_a15.h>
789 #include <ti/csl/csl_armGicAux.h>
790 #elif defined (_TMS320C6X)
791 #include <ti/csl/csl_cacheAux.h>
792 #endif
794 #if defined (SOC_AM437x) || defined(SOC_AM335x)
795 #include <ti/starterware/include/chipdb.h>
796 #include <ti/starterware/include/armv7a/pl310.h>
797 #include <ti/starterware/include/armv7a/pl310_config.h>
798 #endif
800 #define BUF_LEN 256
801 #define LOCAL_CPU_WRITE_PATTERN_1 0xA1A1A1A1
802 #define LOCAL_CPU_WRITE_PATTERN_2 0xA2A2A2A2
803 #define LOCAL_CPU_WRITE_PATTERN_3 0xA3A3A3A3
805 #define ALTERNATE_CPU_WRITE_PATTERN_1 0xB1B1B1B1
806 #define ALTERNATE_CPU_WRITE_PATTERN_2 0xB2B2B2B2
807 #define ALTERNATE_CPU_WRITE_PATTERN_3 0xB3B3B3B3
809 #if defined (__ARM_ARCH_7A__)
810 uint32_t ddr_buf[BUF_LEN] __attribute__((aligned(256))); // GCC way of aligning
811 #elif defined (_TMS320C6X)
812 #pragma DATA_SECTION(ddr_buf,".cachetest_ddrbuf")
813 #pragma DATA_ALIGN(ddr_buf,256)
814 uint32_t ddr_buf[BUF_LEN];
815 #elif defined(__TI_ARM_V7M4__)
816 uint32_t ddr_buf[BUF_LEN];
817 #endif
818 void OSAL_cache_test_fill_buf(uint32_t *buf, int len,uint32_t pattern) {
819   int i;
820   for(i=0;i<len;i++) {
821      buf[i]=pattern;
822   }
824 /* Returns FALSE if all the buffer is not 'pattern'. This will read the contents though */
825 bool OSAL_cache_test_check_buf(uint32_t *buf, int len,uint32_t pattern) {
826   int i;
827   bool match=TRUE;
828   for(i=0;i<len;i++) {
829      if(buf[i]!=pattern) {
830        match=FALSE;
831      }
832   }
833   return(match);
836 #if defined (SOC_AM572x) || defined (SOC_AM574x)
837 bool OSAL_cache_test()
840   bool match,res=TRUE;
841 #if defined (__ARM_ARCH_7A__)
842   CSL_a15EnableCache();
843 #elif defined(_TMS320C6X)
844     /* Enable for most of the DDR3 memory , especially the first two MAR regions where ddr_buf will reside */
845     CACHE_enableCaching(128);
846     CACHE_enableCaching(129);
847     CACHE_setL1DSize(CACHE_L1_4KCACHE);
848     CACHE_setL2Size(CACHE_1024KCACHE);
849 #endif
850   OSAL_log("This manual cache test is a CCS based test. Please do the following\n");
851   OSAL_log("1) On the local CPU open two memory windows for the address 0x%x\n: One CPU view and One Physical memory view\n",&ddr_buf[0]);
852   OSAL_log("2) Connect an alternate CPU (for example if local cpu is A15, open a c66/m4 as the alternate CPU\n");
853   OSAL_log("3) On the alternate CPU ( preferably a different window through (CCS->New Window)) Open the address 0x%x\n with a physical memory view\n",&ddr_buf[0]);
855   OSAL_log("\n**** Forcing a read to get the buffer cached() ******\n");
856   OSAL_cache_test_check_buf(ddr_buf,BUF_LEN,0); /* Checking for dummy pattern, just to force the cache read */
858   OSAL_log("\n**** Testing Cache_Invalidate() ******\n");
860   OSAL_log("\nWriting  0x%x local ddr memory\n",LOCAL_CPU_WRITE_PATTERN_1);
861     /************************ TEST for CacheP_Inv() *********************/
862     /* A15- Write LOCAL_CPU_WRITE_PATTERN_1 in to ddr_buf[0] */
863     OSAL_cache_test_fill_buf(ddr_buf,BUF_LEN,LOCAL_CPU_WRITE_PATTERN_1);
865     /* Check in the alternate cpu window (m4/c66x/a15) if it can see it (Physical memory). It shouldnt if cache is enabled. */
866     OSAL_log("\nCheck in the alternate cpu window (m4/c66x/a15) if it can see it (Physical memory). It shouldn't appear as it is still in cache\n");
868     OSAL_log("\nInvalidating cache.\n");
869     /* Now OSAL_CacheInv() - Invalidates and writes back cache() */
870     CacheP_Inv(ddr_buf,BUF_LEN*sizeof(uint32_t));
872     OSAL_log("\nCheck in alternate cpu window (m4/c66x/a15) if it can see it (Physical memory). For A15 it should (Invalidate also writes back for A15), for others it should not \n");
874     OSAL_log("\nNow write(%d 32-bit words) of pattern 0x%x on the alternate CPU physical memory window (a15/m4/c66x) \n",BUF_LEN,ALTERNATE_CPU_WRITE_PATTERN_1);
875     OSAL_log("\nCheck if this pattern 0x%x has made it to the physical memory view of this cpu.It should. \n",ALTERNATE_CPU_WRITE_PATTERN_1);
877 #if defined(__ARM_ARCH_7A__)
878     /* The below invalidate test is to account for ARM prefetching. On A15 Cache Inv writes back too. To see any changes AFTER the DDR was
879     externally modified, a Cache Invalidate is required */
880     CacheP_Inv(ddr_buf,BUF_LEN*sizeof(uint32_t));
881 #endif
882     OSAL_log("\nChecking if local CPU read fetches the 0x%x value updated by the alternate cpu core\n",ALTERNATE_CPU_WRITE_PATTERN_1);
883     /* Now read the value on A15 now */
884     match=OSAL_cache_test_check_buf(ddr_buf,BUF_LEN,ALTERNATE_CPU_WRITE_PATTERN_1);
885     if(match==TRUE) {
886         OSAL_log("\nPattern matched. OSAL_CacheInv() Test passed\n");
887     } else {
888         OSAL_log("\n OSAL_CacheInv() Test failed\n");
889     }
891     /************************ TEST for CacheP_wb() *********************/
892     OSAL_log("\n**** Testing Cache_WriteBack() ******\n");
894     OSAL_log("\nWriting  0x%x local ddr memory\n",LOCAL_CPU_WRITE_PATTERN_2);
895     /* local cpu- Write LOCAL_CPU_WRITE_PATTERN_2 in to ddr_buf[0] */
896     OSAL_cache_test_fill_buf(ddr_buf,BUF_LEN,LOCAL_CPU_WRITE_PATTERN_2);
898     OSAL_log("\nCheck in the alternate cpu window (m4/c66x/a15) if the pattern 0x%x can be seen it (Physical memory). It shouldn't appear as it is still in cache\n",LOCAL_CPU_WRITE_PATTERN_2);
900     OSAL_log("\nWriting back cache.\n");
901     /* Now OSAL_CacheWb() - Writes back cache() */
902     CacheP_wb(ddr_buf,BUF_LEN*sizeof(uint32_t));
904     /* Check in DSP window if it can see it (Physical memory). It should now. */
905     OSAL_log("\nCheck in alternate cpu window (m4/c66x/a15) and verify that the 0x%x is seen in Physical memory\n",LOCAL_CPU_WRITE_PATTERN_2);
907     /* If so, write back portion is tested. */
908     OSAL_log("\nNow write the pattern 0x%x on the alternate CPU physical memory window (a15/m4/c66x) \n",ALTERNATE_CPU_WRITE_PATTERN_2);
909     /* Since, on this local cpu, we just wrote back cache() only, and not invalidated, the ALTERNATE_CPU_WRITE_PATTERN_2 wont be seen in the local cpu's cached memory
910        Read Variable on A15 to ensure CPU Read(). The value should be the old LOCAL_CPU_WRITE_PATTERN_2.. and NOT the ALTERNATE_CPU_WRITE_PATTERN_2.. which the alternate CPU wrote. */
911     match=OSAL_cache_test_check_buf(ddr_buf,BUF_LEN,LOCAL_CPU_WRITE_PATTERN_2);
912     if(match==TRUE) {
913         OSAL_log("\nPattern matched. OSAL_Cache_Writeback() Test passed\n");
914      } else {
915         OSAL_log("\n OSAL_Cache_Writeback() Test failed\n");
916      }
918     /************************ TEST for CacheP_wbInv() *********************/
919      OSAL_log("\n**** Testing Cache_WriteBack_Invalidate() ******\n");
921      OSAL_log("\nWriting  0x%x local ddr memory\n",LOCAL_CPU_WRITE_PATTERN_3);
923      /* local cpu- Write LOCAL_CPU_WRITE_PATTERN_3 in to ddr_buf[0] */
924      OSAL_cache_test_fill_buf(ddr_buf,BUF_LEN,LOCAL_CPU_WRITE_PATTERN_3);
926      OSAL_log("\nCheck in the alternate cpu window (m4/c66x/a15) if the pattern 0x%x can be seen it (Physical memory). It shouldn't appear as it is still in cache\n",LOCAL_CPU_WRITE_PATTERN_3);
928      OSAL_log("\nWriting back cache and invalidating it.\n");
930      /* Now OSAL_CacheWbInv() - Writes back cache and invalidate() */
931       CacheP_wbInv(ddr_buf,BUF_LEN*sizeof(uint32_t));
933       /* Check in DSP window if it can see it (Physical memory). It should now. */
934       OSAL_log("\nCheck in alternate cpu window (m4/c66x/a15) and verify that the 0x%x is seen in Physical memory. If not it is a failure \n",LOCAL_CPU_WRITE_PATTERN_3);
937       OSAL_log("\nNow write the pattern 0x%x on the alternate CPU physical memory window (a15/m4/c66x) \n",ALTERNATE_CPU_WRITE_PATTERN_3);
939 #if defined(__ARM_ARCH_7A__)
940     /* This is due to ARM prefetching */
941      CacheP_Inv(ddr_buf,BUF_LEN*sizeof(uint32_t));
942 #endif
944     /* Since, on local cpu, we not only wrote back cache but also invalidated it,the local cpu should be able the alternate pattern now */
945     match=OSAL_cache_test_check_buf(ddr_buf,BUF_LEN,ALTERNATE_CPU_WRITE_PATTERN_3);
946     if(match==TRUE) {
947         OSAL_log("\nPattern matched. OSAL_Cache_WritebackInvalidate() Test passed\n");
948      } else {
949         OSAL_log("\nOSAL_Cache_WritebackInvalidate() Test failed\n");
950      }
952      return(res);
954 #endif /* SOC_AM572x || SOC_AM574x */
955 #endif /* MANUAL_CACHE_TEST */
957 /*
958  *  ======== Extended memory block test function ========
959  * This test aims at testing the create and delete functions that
960  * are enhanced to support extended memory blocks for SemaphoreP and HwiP
961  */
962 #define OSAL_TEST_NUM_EXT_SEMAPHORES    (1U)
963 #define OSAL_TEST_NUM_EXT_HWIPS         (1U)
965 #if defined (BARE_METAL)
966 #define SEMP_BLOCK_SIZE (OSAL_TEST_NUM_EXT_SEMAPHORES * OSAL_NONOS_SEMAPHOREP_SIZE_BYTES)
967 #define HWIP_BLOCK_SIZE (OSAL_TEST_NUM_EXT_HWIPS * OSAL_NONOS_HWIP_SIZE_BYTES)
968 uint8_t semPMemBlock[SEMP_BLOCK_SIZE];
969 uint8_t hwiPMemBlock[HWIP_BLOCK_SIZE];
970 #else
971 #define SEMP_BLOCK_SIZE (OSAL_TEST_NUM_EXT_SEMAPHORES * OSAL_TIRTOS_SEMAPHOREP_SIZE_BYTES)
972 #define HWIP_BLOCK_SIZE (OSAL_TEST_NUM_EXT_HWIPS * OSAL_TIRTOS_HWIP_SIZE_BYTES)
973 uint8_t semPMemBlock[SEMP_BLOCK_SIZE];
974 uint8_t hwiPMemBlock[HWIP_BLOCK_SIZE];
975 #endif
977 static void myIsr(void)
981 bool OSAL_ExtBlock_test(void)
983     SemaphoreP_Params semParams;
984     HwiP_Params       hwiParams;
985     Osal_HwAttrs      hwAttrs;
986     int32_t           osal_ret;
987     uint32_t          ctrlBitMap = ( OSAL_HWATTR_SET_SEMP_EXT_BASE |
988                                      OSAL_HWATTR_SET_HWIP_EXT_BASE);
989     SemaphoreP_Handle semHandle;
990     HwiP_Handle       hwiHandle;
992     /* Set the timer base for the osal delay */
993     osal_ret = Osal_getHwAttrs(&hwAttrs);
994     if (osal_ret != osal_OK)
995     {
996         return (false);
997     }
999     /* This API should return osal_OK for AM3/AM4 and return unsupported for other Socs */
1000     hwAttrs.extSemaphorePBlock.base = (uintptr_t) &semPMemBlock[0];
1001     hwAttrs.extSemaphorePBlock.size = SEMP_BLOCK_SIZE;
1002     hwAttrs.extHwiPBlock.size       = HWIP_BLOCK_SIZE;
1003     hwAttrs.extHwiPBlock.base       = (uintptr_t) &hwiPMemBlock[0];
1004     osal_ret = Osal_setHwAttrs(ctrlBitMap, &hwAttrs);
1005     if (osal_ret != osal_OK)
1006     {
1007         return (false);
1008     }
1010     /* Default parameter initialization */
1011     SemaphoreP_Params_init(&semParams);
1013     /* create the semaphore block */
1014     semHandle = SemaphoreP_create(0, &semParams);
1015     if (semHandle == (SemaphoreP_Handle) NULL_PTR)
1016     {
1017         return (false);
1018     }
1020     /* Verify the block created is in the extended memory block range */
1021     if (semHandle != (SemaphoreP_Handle) &semPMemBlock[0])
1022     {
1023         return(false);
1024     }
1026     /* delete the semaphore block */
1027     osal_ret = SemaphoreP_delete(semHandle);
1028     if (osal_ret != (SemaphoreP_Status) SemaphoreP_OK)
1029     {
1030         return (false);
1031     }
1034     /* Default parameter initialization */
1035     HwiP_Params_init(&hwiParams);
1037     /* create the hwi block */
1038     hwiHandle = HwiP_create(8, (HwiP_Fxn)myIsr, &hwiParams);
1039     if (hwiHandle == (HwiP_Handle) NULL_PTR)
1040     {
1041         return (false);
1042     }
1044     /* Verify the block created is in the extended memory block range */
1045     if (hwiHandle != (HwiP_Handle) &hwiPMemBlock[0])
1046     {
1047         return(false);
1048     }
1050     /* delete the hwi block */
1051     osal_ret = HwiP_delete(hwiHandle);
1052     if (osal_ret != (HwiP_Status) HwiP_OK)
1053     {
1054         return (false);
1055     }
1057     /* Clear the extended block base for next tests */
1058     /* This API should return osal_OK for AM3/AM4 and return unsupported for other Socs */
1059     hwAttrs.extSemaphorePBlock.base = (uintptr_t) NULL_PTR;
1060     hwAttrs.extSemaphorePBlock.size = 0;
1061     hwAttrs.extHwiPBlock.size       = 0;
1062     hwAttrs.extHwiPBlock.base       = (uintptr_t) NULL_PTR;
1063     osal_ret = Osal_setHwAttrs(ctrlBitMap, &hwAttrs);
1064     if (osal_ret != osal_OK)
1065     {
1066         return (false);
1067     }
1068     return(true);
1073 /*
1074  *  ======== Semaphore test function ========
1075  */
1076 bool OSAL_semaphore_test()
1078     SemaphoreP_Params semParams;
1079     SemaphoreP_Handle handle1, handle2;
1081     SemaphoreP_Params_init(&semParams);
1083     /* Test 1: counting mode, no timeout */
1084     semParams.mode = SemaphoreP_Mode_COUNTING;
1085     handle1 = SemaphoreP_create(0, &semParams);
1086     if (handle1 == NULL_PTR)
1087     {
1088         return false;
1089     }
1090     if (SemaphoreP_post(handle1) != SemaphoreP_OK)
1091     {
1092         return false;
1093     }
1094     if (SemaphoreP_pend(handle1, 0) != SemaphoreP_OK)
1095     {
1096         return false;
1097     }
1099     /* Test 2: binary mode, with timeout */
1100     semParams.mode = SemaphoreP_Mode_BINARY;
1101     handle2 = SemaphoreP_create(1, &semParams);
1102     if (handle2 == NULL_PTR)
1103     {
1104         return false;
1105     }
1106     if (SemaphoreP_pend(handle2, 0) != SemaphoreP_OK)
1107     {
1108         return false;
1109     }
1110     if (SemaphoreP_pend(handle2, 10) != SemaphoreP_TIMEOUT)
1111     {
1112         return false;
1113     }
1115     if (SemaphoreP_delete(handle1) != SemaphoreP_OK)
1116     {
1117         return false;
1118     }
1120     if (SemaphoreP_delete(handle2) != SemaphoreP_OK)
1121     {
1122         return false;
1123     }
1125     return true;
1128 #if !(defined(BARE_METAL) || defined(FREERTOS))
1130 /*
1131  *  ======== Queue test function ========
1132  */
1133 typedef struct Test_Queue_Buf_s
1135     Osal_Queue_Elem lnk;
1136     uint32_t        index;
1137     uint8_t*        pkt;
1139 } Test_Queue_Buf;
1141 bool OSAL_queue_test()
1143     Osal_Queue_Elem queueList;
1144     Osal_Queue_Handle   handle;
1145     Test_Queue_Buf buf[10], *pBuf;
1146     int i;
1148     Osal_Queue_construct((void *)&queueList, (void *)NULL);
1149     handle = Osal_Queue_handle((void *)&queueList);
1151     if (handle == NULL_PTR)
1152     {
1153         OSAL_log("Failed to create queue \n");
1154         return false;
1155     }
1157     for (i = 0; i < 10; i++)
1158     {
1159         buf[i].index = (uint32_t)i;
1160         buf[i].pkt = NULL;
1161     }
1163     /* Test 1: queue push/pop test */
1164     for (i = 0; i < 10; i++)
1165     {
1166         Osal_Queue_put(handle, (Osal_Queue_Elem *)&buf[i]);
1167     }
1169     for (i = 0; i < 10; i++)
1170     {
1171         pBuf = (Test_Queue_Buf *)Osal_Queue_get(handle);
1173         if (pBuf == NULL_PTR)
1174         {
1175             OSAL_log("Failed to pop queue element %d \n", i);
1176             return false;
1177         }
1179         if (pBuf->index != i)
1180         {
1181             OSAL_log("Pop element %d, but expect %d \n", pBuf->index, i);
1182             return false;
1184         }
1185     }
1187     /* Test 2: queue empty test */
1188     if (!Osal_Queue_empty(handle))
1189     {
1190         OSAL_log("Empty queue check failed\n");
1191         return false;
1192     }
1194     pBuf = (Test_Queue_Buf *)Osal_Queue_get(handle);
1196     if (pBuf != (Test_Queue_Buf *)&queueList)
1197     {
1198         OSAL_log("Queue is still not empry with element %p handle %p queue struct %p\n", pBuf, handle, &queueList);
1199         return false;
1200     }
1202     return true;
1205 volatile bool gFlagSwi;
1206 void mySwiFxn(uintptr_t arg0, uintptr_t arg1)
1208     gFlagSwi = 1U;
1211 bool OSAL_swi_test()
1213     SwiP_Handle handle;
1214     SwiP_Params swiParams;
1215     SwiP_Status status;
1216     bool        retVal = true;
1218     SwiP_Params_init(&swiParams);
1219     handle = SwiP_create((SwiP_Fxn)&mySwiFxn, &swiParams);
1220     if (handle == NULL_PTR)
1221     {
1222         OSAL_log("Failed to create software interrupt \n");
1223         retVal = false;
1224     }
1226     if (retVal == true)
1227     {
1228         gFlagSwi = 0;
1229         status = SwiP_post(handle);
1230         if (status != SwiP_OK)
1231         {
1232             OSAL_log("Failed to post software interrupt \n");
1233             retVal = false;
1234         }
1235     }
1237     if (retVal == true)
1238     {
1239         gTestlocalTimeout = 0x300000U;
1240         while (gTestlocalTimeout != 0U)
1241         {
1242             gTestlocalTimeout--;
1243             if (gFlagSwi)
1244             {
1245                 gFlagSwi = 0;
1246                 retVal = true;
1247                 break;
1248             }
1249         }
1251         if (gTestlocalTimeout == 0)
1252         {
1253             OSAL_log("Failed to get software interrupt \n");
1254             retVal = false;
1255         }
1256     }
1258     if (retVal == true)
1259     {
1260         status = SwiP_delete(&handle);
1261         if (status != SwiP_OK)
1262         {
1263             OSAL_log("Failed to delete software interrupt \n");
1264             retVal = false;
1265         }
1266     }
1268     return (retVal);
1270 #endif
1272 #if ENABLE_DEBUG_LOG_TEST
1273 bool OSAL_log_test()
1275     bool        retVal = true;
1277     OSAL_log("BegugP Log test starts!\n");
1279     DebugP_log0 ("debugP_log0 run successfully\n");
1280     DebugP_log1 ("debugP_log1 run with %u argument uccessfully\n", 1U);
1281     DebugP_log2 ("debugP_log2 run with %u arguments (2, %d) successfully\n", 2U, 2);
1282     DebugP_log3 ("debugP_log3 run with %u arguments (3, %d, %d) successfully\n", 3U, 3, 3);
1283     DebugP_log4 ("debugP_log4 run with %u arguments (4, %d, %d, 0x%x) successfully\n", 4U, 4, 4, 64);
1285     return (retVal);
1287 #endif
1289 #ifndef BARE_METAL
1290 #if  defined(FREERTOS)
1292 #else
1293 #include <ti/sysbios/knl/Clock.h>
1294 #endif
1295 #ifndef SIM_BUILD
1296 #define   OSAL_TASKP_TEST_ITERATION    (10U)
1297 #if  defined(FREERTOS)
1298 #define   OSAL_TASKP_TEST_1MS          (1U)
1299 #else
1300 #define   OSAL_TASKP_TEST_1MS          (1000U)
1301 #endif
1302 #define   OSAL_TASKP_TEST_TICKS        (1000U)
1303 #else
1304 #define   OSAL_TASKP_TEST_ITERATION    (2U)
1305 #define   OSAL_TASKP_TEST_1MS          (10U)
1306 #define   OSAL_TASKP_TEST_TICKS        (10U)
1307 #endif
1309 uint64_t OSAL_get_ticks()
1311     uint64_t ticks;
1312 #if  defined(FREERTOS)
1313     ticks = (uint64_t)uiPortGetRunTimeCounterValue();
1314 #else
1315     ticks = (uint64_t)Clock_getTicks();
1316 #endif
1317     return ticks;
1320 bool OSAL_task_sleep_test(void)
1322     int32_t i;
1323     uint64_t    start_time_nticks, end_time_nticks;
1324     uint32_t    diff_nticks, diff_tout;
1326     /* nTicks in OSAL is 1000 ticks per milli seconds
1327      * hence the task sleep = 1000 milliseconds should
1328      * provide the same sleep time as in TaskP_sleep(nTicks = 1000)
1329      */
1330     start_time_nticks = OSAL_get_ticks();
1332     for (i=0; i < OSAL_TASKP_TEST_ITERATION; i++)
1333     {
1334        TaskP_sleep(OSAL_TASKP_TEST_TICKS);
1335     }
1336     end_time_nticks = OSAL_get_ticks();
1337     diff_nticks     = (uint32_t)(end_time_nticks - start_time_nticks);
1339     start_time_nticks = OSAL_get_ticks();
1341     for (i=0; i < OSAL_TASKP_TEST_ITERATION; i++)
1342     {
1343        TaskP_sleepInMsecs(OSAL_TASKP_TEST_1MS);
1344     }
1345     end_time_nticks = OSAL_get_ticks();
1346     diff_tout       = (uint32_t)(end_time_nticks - start_time_nticks);
1348     OSAL_log(" \n \
1349                diff_nticks = %d \n \
1350                diff_tout   = %d \n ", diff_nticks, diff_tout);
1351 #if  !defined(FREERTOS)
1352     OSAL_log(" Clock_tickPeriod = %d \n \
1353                Clock_tickSource = %d ", Clock_tickPeriod, Clock_tickSource);
1354 #endif
1356     return (true);
1359 #endif
1361 #if  defined(FREERTOS)
1362 bool OSAL_mempry_test()
1364     void *memPtr1, *memPtr2, *memPtr[5];
1365     uint32_t align;
1366     bool retVal = true;
1367     uint32_t i;
1369     /* Test1: Allocate 16 bytes aligned memory. */
1370     align = 16;
1371     memPtr1 = MemoryP_ctrlAlloc(100, align);
1372     if (memPtr1 != NULL)
1373     {
1374         /* Check if teh allocated mempry is 16 bytes aligned. */
1375         if ((uintptr_t)memPtr1 & (align - 1)!= 0)
1376         {
1377             retVal = false;
1378         }
1379     }
1380     else
1381     {
1382         retVal = false;
1383     }
1385     /* Test2: Allocate 64 bytes aligned memory. */
1386     align = 64;
1387     memPtr2 = MemoryP_ctrlAlloc(200, align);
1388     if (memPtr2 != NULL)
1389     {
1390         /* Check if teh allocated mempry is 16 bytes aligned. */
1391         if ((uintptr_t)memPtr2 & (align - 1)!= 0)
1392         {
1393             retVal = false;
1394         }
1395     }
1396     else
1397     {
1398         retVal = false;
1399     }
1401     if (memPtr1 != NULL)
1402     {
1403         MemoryP_ctrlFree(memPtr1, 100);
1404     }
1405     if (memPtr2 != NULL)
1406     {
1407         MemoryP_ctrlFree(memPtr2, 200);
1408     }
1410     /* Test2: check memory leak
1411      * multiple iteration of alloc and free to give same mem pointer.
1412      */
1413     for (i=0; i<5; i++)
1414     {
1415         align = 64;
1416         memPtr[i] = MemoryP_ctrlAlloc(200, align);
1417         MemoryP_ctrlFree(memPtr[i], 200);
1418     }
1419     for (i=1; i<5; i++)
1420     {
1421         if (memPtr[i] != memPtr[i-1])
1422         {
1423             retVal = false;
1424             break;
1425         }
1426     }
1427     return retVal;
1429 #endif
1431 /*
1432  *  ======== main test function ========
1433  */
1434 #if defined(BARE_METAL)
1435 void osal_test()
1436 #elif defined(FREERTOS)
1437 void osal_test(void *arg0, void *arg1)
1438 #else
1439 void osal_test(UArg arg0, UArg arg1)
1440 #endif
1442     bool testFail = false;
1443     Osal_StaticMemStatus pMemStats;
1445     Board_initOSAL();
1447 #ifdef BUILD_C7X_1
1448     Osal_appC7xPreInit();
1449     C7x_ConfigureTimerOutput();
1450 #endif
1452 #ifdef BUILD_M4F    
1453     OSAL_log("\n M4 test \n");
1454 #endif
1456 #if defined(BUILD_C66X_1) || defined(BUILD_C66X_2)
1457 /* To set C66 timer interrupts on J7ES VLAB */
1458     C66xTimerInterruptInit();
1459 #endif
1461     OSAL_log(" OSAL Test Starting...\n Takes about 30 seconds ...\n"); 
1463 #if defined(BARE_METAL)
1464     /* No TASKP test for BAREmetal */
1465 #else
1466     /* TASK Sleep APIs test for RTOS */
1467     if (OSAL_task_sleep_test() == true)
1468     {
1469         OSAL_log("\n TaskP tests have passed. \n");
1470     }
1471     else
1472     {
1473         OSAL_log("\n TaskP tests have failed. \n");
1474     }
1475 #endif
1477     if(OSAL_hwi_test() == true)
1478     {
1479         OSAL_log("\n HWI tests have passed. \n");
1480     }
1481     else
1482     {
1483         OSAL_log("\n HWI tests have failed. \n");
1484         testFail = true;
1485     }
1487 #ifdef ENABLE_TIMER_TEST
1488     if(OSAL_timer_test() == true)
1489     {
1490         OSAL_log("\n Timer tests have passed. \n");
1491     }
1492     else
1493     {
1494         OSAL_log("\n Timer tests have failed. \n");
1495         testFail = true;
1496     }
1497 #endif
1499 /* The test does not support below SoCs */
1500 #if !defined(SOC_TDA2XX) && !defined(SOC_TDA2PX) && !defined(SOC_TDA2EX) && !defined(SOC_TDA3XX)
1501   OSAL_log("\n Running Osal_Delay test:");
1503   if(Osal_delay_test() == true)
1504   {
1505       OSAL_log("\n Osal_Delay  tests have passed. \n");
1506   }
1507   else
1508   {
1509       OSAL_log("\n Osal_Delay  tests have failed. \n");
1510       testFail = true;
1511   }
1512 #endif
1514 #ifdef ENABLE_GET_TIME_TEST
1515     OSAL_log("\n Running Osal_getTime test:");
1517     if(Osal_getTime_test() == true)
1518     {
1519         OSAL_log("\n Osal_getTime  tests have passed. \n");
1520     }
1521     else
1522     {
1523         OSAL_log("\n Osal_getTime  tests have failed. \n");
1524         testFail = true;
1525     }
1526 #endif
1528     if(OSAL_clock_test() == true)
1529     {
1530         OSAL_log("\n Clock tests have passed. \n");
1531     }
1532     else
1533     {
1534         OSAL_log("\n Clock tests have failed. \n");
1535         testFail = true;
1536     }
1538     if(OSAL_semaphore_test() == true)
1539     {
1540         OSAL_log("\n Semaphore tests have passed. \n");
1541     }
1542     else
1543     {
1544         OSAL_log("\n Semaphore tests have failed. \n");
1545         testFail = true;
1546     }
1548 #ifdef ENABLE_EXT_BLOCK_TEST
1550     if(OSAL_ExtBlock_test() == true)
1551     {
1552         OSAL_log("\n Extended Memory Block tests for HwiP/SwiP have passed. \n");
1553     }
1554     else
1555     {
1556         OSAL_log("\n Extended Memory Block tests for HwiP/SwiP have failed. \n");
1557         testFail = true;
1558     }
1559 #endif
1561     #ifdef MANUAL_CACHE_TEST
1562     /* This test is valid only for MANUAL testing */
1563     OSAL_cache_test();
1564     #endif
1566     /* Now print the static memory statistics */
1567     if(Osal_getStaticMemStatus(&pMemStats) == osal_OK)
1568     {
1569        OSAL_log("\n Semaphore Statistics:     \
1570                  \n  PeakSemObjs    = %u,     \
1571                  \n  numMaxSemObjs  = %u,     \
1572                  \n  numFreeSemObjs = %u \n", \
1573                  pMemStats.peakSemObjs,       \
1574                  pMemStats.numMaxSemObjs,     \
1575                  pMemStats.numFreeSemObjs);
1577        OSAL_log("\n Hwi Statistics:           \
1578                  \n  PeakHwiObjs    = %u,     \
1579                  \n  numMaxHwiObjs  = %u,     \
1580                  \n  numFreeHwiObjs = %u \n", \
1581                  pMemStats.peakHwiObjs,       \
1582                  pMemStats.numMaxHwiObjs,     \
1583                  pMemStats.numFreeHwiObjs);
1585        OSAL_log("\n Timer Statistics:           \
1586                  \n  PeakTimerObjs    = %u,     \
1587                  \n  numMaxTimerObjs  = %u,     \
1588                  \n  numFreeTimerObjs = %u \n", \
1589                  pMemStats.peakTimerObjs,       \
1590                  pMemStats.numMaxTimerObjs,     \
1591                  pMemStats.numFreeTimerObjs);
1593     }
1594     else
1595     {
1596       testFail = true;
1597       OSAL_log("\n Memory Statistics query failed \n");
1598     }
1600 #if !(defined(BARE_METAL) || defined(FREERTOS))
1601     if(OSAL_swi_test() == true)
1602     {
1603         OSAL_log("\n SWI tests have passed. \n");
1604     }
1605     else
1606     {
1607         OSAL_log("\n SWI tests have failed. \n");
1608         testFail = true;
1609     }
1611     if(OSAL_queue_test() == true)
1612     {
1613         OSAL_log("\n Queue tests have passed. \n");
1614     }
1615     else
1616     {
1617         OSAL_log("\n Queue tests have failed. \n");
1618         testFail = true;
1619     }
1620 #endif
1622 #if ENABLE_DEBUG_LOG_TEST
1623     if(OSAL_log_test() == true)
1624     {
1625         OSAL_log("\n DebugP Log tests have passed. \n");
1626     }
1627     else
1628     {
1629         OSAL_log("\n DebugP Log tests have failed. \n");
1630         testFail = true;
1631     }
1632 #endif
1634 #if defined(FREERTOS)
1635     if(OSAL_mempry_test() == true)
1636     {
1637         OSAL_log("\n MemoryP Log tests have passed. \n");
1638     }
1639     else
1640     {
1641         OSAL_log("\n MemoryP Log tests have failed. \n");
1642         testFail = true;
1643     }
1644 #endif
1646     if(testFail == true)
1647     {
1648         OSAL_log("\n Some tests have failed. \n");
1649     }
1650     else
1651     {
1652         OSAL_log("\n All tests have passed. \n");
1653     }
1655 #ifdef BARE_METAL
1656     while (1)
1657     {
1658     }
1659 #endif
1663 #ifdef BUILD_C7X_1
1664 void sysIdleLoop(void)
1666    __asm(" IDLE");
1669 #include <ti/sysbios/family/c7x/Hwi.h>
1670 #include <ti/csl/csl_clec.h>
1671 void C7x_ConfigureTimerOutput()
1673     CSL_ClecEventConfig   cfgClec;
1674     CSL_CLEC_EVTRegs     *clecBaseAddr = (CSL_CLEC_EVTRegs*)CSL_COMPUTE_CLUSTER0_CLEC_REGS_BASE;
1676     uint32_t input         = CSLR_COMPUTE_CLUSTER0_GIC500SS_SPI_TIMER0_INTR_PEND_0 + 992; /* Used for Timer Interrupt */
1677     uint32_t corepackEvent = 14;
1679     /* Configure CLEC */
1680     cfgClec.secureClaimEnable = FALSE;
1681     cfgClec.evtSendEnable     = TRUE;
1682     cfgClec.rtMap             = CSL_CLEC_RTMAP_CPU_ALL;
1683     cfgClec.extEvtNum         = 0;
1684     cfgClec.c7xEvtNum         = corepackEvent;
1685     CSL_clecConfigEvent(clecBaseAddr, input, &cfgClec);
1687     input         = CSLR_COMPUTE_CLUSTER0_GIC500SS_SPI_TIMER1_INTR_PEND_0 + 992; /* Used for Timer Interrupt */
1688     corepackEvent = 15;
1690     /* Configure CLEC */
1691     cfgClec.secureClaimEnable = FALSE;
1692     cfgClec.evtSendEnable     = TRUE;
1693     cfgClec.rtMap             = CSL_CLEC_RTMAP_CPU_ALL;
1694     cfgClec.extEvtNum         = 0;
1695     cfgClec.c7xEvtNum         = corepackEvent;
1696     CSL_clecConfigEvent(clecBaseAddr, input, &cfgClec);
1699 #endif
1701 #if defined(BUILD_C66X_1) || defined(BUILD_C66X_2)
1702 /* To set C66 timer interrupts on J7ES VLAB */
1703 void C66xTimerInterruptInit(void)
1705 #if defined (_TMS320C6X) && !defined(SOC_TPR12) && !defined (SOC_AWR294X)
1706     struct tisci_msg_rm_irq_set_req     rmIrqReq;
1707     struct tisci_msg_rm_irq_set_resp    rmIrqResp;
1709     /* On C66x builds we define OS timer tick in the configuration file to
1710      * trigger event #21 for C66x_1 and #20 for C66x_2. Map
1711      * DMTimer 0 interrupt to these events through DMSC RM API.
1712      */
1713     rmIrqReq.valid_params           = TISCI_MSG_VALUE_RM_DST_ID_VALID |
1714                                       TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
1715     rmIrqReq.src_id                 = TISCI_DEV_TIMER0;
1716     rmIrqReq.src_index              = 0U;
1717 #if defined (BUILD_C66X_1)
1718     rmIrqReq.dst_id                 = TISCI_DEV_C66SS0_CORE0;
1719     rmIrqReq.dst_host_irq           = 21U;
1720 #endif
1721 #if defined (BUILD_C66X_2)
1722     rmIrqReq.dst_id                 = TISCI_DEV_C66SS1_CORE0;
1723     rmIrqReq.dst_host_irq           = 20U;
1724 #endif
1725     /* Unused params */
1726     rmIrqReq.global_event           = 0U;
1727     rmIrqReq.ia_id                  = 0U;
1728     rmIrqReq.vint                   = 0U;
1729     rmIrqReq.vint_status_bit_index  = 0U;
1730     rmIrqReq.secondary_host         = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
1732     Sciclient_rmIrqSet(&rmIrqReq, &rmIrqResp, SCICLIENT_SERVICE_WAIT_FOREVER);
1734     /* On C66x builds we define OS timer tick in the configuration file to
1735      * trigger event #22 for C66x_1 and #22 for C66x_2. Map
1736      * DMTimer 0 interrupt to these events through DMSC RM API.
1737      */
1738     rmIrqReq.valid_params           = TISCI_MSG_VALUE_RM_DST_ID_VALID |
1739                                       TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
1740     rmIrqReq.src_id                 = TISCI_DEV_TIMER2;
1741     rmIrqReq.src_index              = 0U;
1742 #if defined (BUILD_C66X_1)
1743     rmIrqReq.dst_id                 = TISCI_DEV_C66SS0_CORE0;
1744     rmIrqReq.dst_host_irq           = 22U;
1745 #endif
1746 #if defined (BUILD_C66X_2)
1747     rmIrqReq.dst_id                 = TISCI_DEV_C66SS1_CORE0;
1748     rmIrqReq.dst_host_irq           = 22U;
1749 #endif
1751     /* Unused params */
1752     rmIrqReq.global_event           = 0U;
1753     rmIrqReq.ia_id                  = 0U;
1754     rmIrqReq.vint                   = 0U;
1755     rmIrqReq.vint_status_bit_index  = 0U;
1756     rmIrqReq.secondary_host         = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
1758     Sciclient_rmIrqSet(&rmIrqReq, &rmIrqResp, SCICLIENT_SERVICE_WAIT_FOREVER);
1760 #endif
1763 void sysIdleLoop(void)
1765    __asm(" IDLE");
1768 #endif
1770 /*
1771  *  ======== main ========
1772  */
1773 int main(void)
1776 #ifdef BARE_METAL
1777     osal_test();
1778 #else
1779     /* All other platforms have the task created under RTSC cfg file
1780      * hence not needed to be created again as below
1781      * For AM65XX TPR12 and J7 the common RTSC cfg file is used and hence there is
1782      * no test application specific task is created in teh RTSC cfg file
1783      */
1784 #if defined (SOC_AM65XX) || defined (SOC_J721E) || defined(SOC_J7200) || defined(SOC_TPR12) || defined (SOC_AWR294X)|| defined(SOC_AM64X)
1785     TaskP_Params taskParams;
1786 #if !defined(FREERTOS)
1787     Error_Block  eb;
1788 #endif
1789     TaskP_Params_init(&taskParams);
1790     taskParams.priority =2;
1791     taskParams.stack        = gAppTskStackMain;
1792     taskParams.stacksize    = sizeof (gAppTskStackMain);
1793 #if !defined(FREERTOS)
1794     taskParams.pErrBlk      = &eb;
1795 #endif
1796     TaskP_create(osal_test, &taskParams);
1797 #endif
1798 #if defined (FREERTOS)
1799     /* Start the scheduler to start the tasks executing. */
1800     vTaskStartScheduler();
1801 #else
1802     /* Start BIOS */
1803     BIOS_start();
1804 #endif
1805 #endif
1806     return (0);
1809 #if defined(BUILD_MPU) || defined (__C7100__)
1810 extern void Osal_initMmuDefault(void);
1811 void InitMmu(void)
1813     Osal_initMmuDefault();
1815 #endif
1817 void Osal_appC7xPreInit(void)
1819 #if defined (__C7100__)
1820     CSL_ClecEventConfig cfgClec;
1821     CSL_CLEC_EVTRegs   *clecBaseAddr = (CSL_CLEC_EVTRegs*) CSL_COMPUTE_CLUSTER0_CLEC_REGS_BASE;
1822     uint32_t            i, maxInputs = 2048U;
1824     /* make secure claim bit to FALSE so that after we switch to non-secure mode
1825      * we can program the CLEC MMRs
1826      */
1827     cfgClec.secureClaimEnable = FALSE;
1828     cfgClec.evtSendEnable     = FALSE;
1829     cfgClec.rtMap             = CSL_CLEC_RTMAP_DISABLE;
1830     cfgClec.extEvtNum         = 0U;
1831     cfgClec.c7xEvtNum         = 0U;
1832     for(i = 0U; i < maxInputs; i++)
1833     {
1834         CSL_clecConfigEvent(clecBaseAddr, i, &cfgClec);
1835     }
1836 #endif
1838     return;