c46fd8f82a0f3d986c9e2aa29a3d6e0b81034375
[processor-sdk/pdk.git] / packages / ti / diag / sdr / test / sdtf-test / src / j721e_evm / r5f / baremetal / sdtf_rat.c
1 /*
2  * SDTF RAT
3  *
4  * Software Diagnostics Reference Test for RAT module
5  *
6  *  Copyright (c) Texas Instruments Incorporated 2019-2020
7  *
8  *  Redistribution and use in source and binary forms, with or without
9  *  modification, are permitted provided that the following conditions
10  *  are met:
11  *
12  *    Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  *
15  *    Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the
18  *    distribution.
19  *
20  *    Neither the name of Texas Instruments Incorporated nor the names of
21  *    its contributors may be used to endorse or promote products derived
22  *    from this software without specific prior written permission.
23  *
24  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35  *
36  */
38 #include <stdint.h>
39 #include <ti/csl/csl_rat.h>
41 #include "sdtf_common.h"
42 #include "sdtf_profile.h"
43 #include "sdtf_test.h"
44 #include "sdtf_rat.h"
46 /* Choosing unused address space */
47 #define SDTF_RAT_SELF_TEST_TRANSLATE_BASE  (0x10000000U)
49 #pragma DATA_SECTION (SDTF_RATTestArray, ".sdtf_rat_testsection");
50 #pragma DATA_ALIGN (SDTF_RATTestArray, 32);
51 uint32_t SDTF_RATTestArray[8];
53 #define SDTF_RAT_REGION_INDEX 0
55 /*********************************************************************
56  *
57  * \brief Test RAT module
58  *
59  *
60  * \return 0 if test pass, -1 in case of failure
61  */
62 int32_t SDTF_runtestRAT(void)
63 {
64     int32_t retValue=0;
65     CSL_RatTranslationCfgInfo translationCfg;
67     SDTF_printf("\n RAT Test: starting");
69     translationCfg.translatedAddress = ((uint64_t)&SDTF_RATTestArray);
70     translationCfg.sizeInBytes = sizeof(SDTF_RATTestArray);
71     translationCfg.baseAddress = (uint32_t)SDTF_RAT_SELF_TEST_TRANSLATE_BASE;
73     SDTF_profileBegin(SDTF_PROFILE_ONESHOT);
74     retValue = SDTF_RATSelfTest(SDTF_RAT_REGION_INDEX, &translationCfg, &SDTF_RATTestArray[0]);
76     SDTF_profileEnd(SDTF_PROFILE_ONESHOT);
77     if (retValue != 0 ) {
78         SDTF_printf("\n RAT Test failed");
79     } else {
80         SDTF_printf("\n RAT Test  complete");
81         SDTF_printf("\n Cycles taken %u", SDTF_profileDelta(SDTF_PROFILE_ONESHOT));
82     }
84     return retValue;
86 }
87 /*********************************************************************
88  *
89  * \brief Self test for RAT module
90  * Note: This function assumes both the mapped and translated addresses are accessible directly
91  * for the self test
92  * Note: The values in the region may be overwritten
93  *
94  * \param regionIndex: RAT region index to be used for the test
95  * \param pTranslateCfg: Pointer to translation configuration for
96  *                       the RAT mapping
97  * \param pTestMemArea: Test memory area for doing the RAT region mapping
98  *
99  * \return 0 if test pass, -1 in case of failure
100  */
101 /* Note this function assumes both the mapped and translated addresses are accessible directly
102  * for the self test
103  * Note: The values in the region may be overwritten
104  */
105 int32_t SDTF_RATSelfTest(uint32_t regionIndex, CSL_RatTranslationCfgInfo *pTranslationCfg,
106                          uint32_t *pTestMemArea)
108     int32_t retValue=0;
109     int32_t cslStatus;
110     bool result;
111     CSL_ratRegs *pRatRegs = (CSL_ratRegs *)CSL_MCU_ARMSS_RAT_CFG_BASE;
112     uint32_t *pMappedBase;
114     /* The assumption is that the tranlated Address is accessible directly as well
115      * for Self test to work.
116      */
117     if ((pTranslationCfg->translatedAddress > (uint64_t)0xffffffffu)
118             && (pTranslationCfg->translatedAddress != (uint64_t)pTestMemArea)){
119         retValue = -1;
120     }
122     if (retValue == 0) {
123         /* Write a value to RAT region */
124         pTestMemArea[0] = 0xbabeface;
126         /* Set up RAT translation */
127         result = CSL_ratConfigRegionTranslation(pRatRegs, regionIndex, pTranslationCfg);
128         if(result == false) {
129             retValue = -1;
130         }
131     }
133     if (retValue == 0) {
134         /* Verify RAT configuration */
135         cslStatus = CSL_ratVerifyConfigRegionTranslation(pRatRegs, regionIndex, pTranslationCfg);
136         if (cslStatus != CSL_PASS) {
137             retValue = -1;
138         }
139     }
141     if (retValue == 0) {
142         /* Now write another value to test area */
143         pTestMemArea[1] = 0xaaaa5555;
145         pMappedBase = ((uint32_t *)(SDTF_RAT_SELF_TEST_TRANSLATE_BASE));
147         /* Check the first written value */
148         if (pMappedBase[0] != pTestMemArea[0]) {
149             retValue = -1;
150         }
151     }
153     if (retValue == 0) {
155         /* Check second value written after RAT configuration */
156         if (pMappedBase[1] != pTestMemArea[1]) {
157             retValue = -1;
158         }
159     }
161     if (retValue == 0) {
163         /* Write a value to mapped region */
164         pMappedBase[2] = 0x5555aaaa;
165         /* Check third write to mapped area */
166         if (pMappedBase[1] != pTestMemArea[1]) {
167             retValue = -1;
168         }
169     }
171     /* Disable RAT region */
172     CSL_ratDisableRegionTranslation(pRatRegs, regionIndex);
174     return retValue;