Code review changes to ensure ddr3_mem_test() picking up types.h definition
[keystone-rtos/ibl.git] / src / device / c66x / c66xutil.c
1 /**
2  * @file c66xutil.c
3  *
4  * @brief
5  *        c66x functions used by both the ibl and utility programs
6  */
8 #include "device.h"
9 #include "target.h"
10 #include "pllapi.h"
11 #include "types.h"
13 /**
14  *  @brief
15  *     Configure the predivider for the main PLL, which resides outside the PLL controller
16  */
17 SINT16 chipPllSetExternalPrediv(UINT16 pllNum, UINT32 predivRegVal)
18 {
19     UINT32 reg;
21     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
22     reg = BOOT_SET_BITFIELD(reg, predivRegVal, 5, 0);
23     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
26     return (0);
28 } /* chipPllSetExternalPrediv */
31 /**
32  *  @brief
33  *      Configure the bandwidth adjustment for the main PLL, which resides outside the PLL controller
34  */
35 SINT16 chipPllExternalBwAdj (UINT16 pllNum, UINT16 mult)
36 {
37     UINT32 reg;
38     UINT32 bwAdj;
40     bwAdj = (mult >> 1) - 1;
42     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
43     reg = BOOT_SET_BITFIELD(reg, bwAdj & 0x00ff, 31, 24);
44     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
46     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_1);
47     reg = BOOT_SET_BITFIELD(reg, bwAdj >> 8, 3, 0);
48     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_1, reg);
50     return (0);
52 } /* chipPllExternalBwAdj */
55 /**
56  *  @brief
57  *      Configure the multiplier fields for the main PLL which reside outside the PLL controller
58  */
59 UINT32 chipPllExternalMult (UINT16 pllNum, UINT16 mult)
60 {
61     UINT32 pmult;
62     UINT32 reg;
63     UINT32 v;
66     pmult = mult-1; 
68     v = BOOT_READ_BITFIELD(pmult, 12, 6);
69    
71     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
72     reg = BOOT_SET_BITFIELD(reg, v, 18, 12);
73     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
76     v = BOOT_READ_BITFIELD(pmult, 5, 0);
78     return (v);
80 } /* chipPllExternalMult */
82 /**
83  *  @brief return the PSC module number for SPI
84  */
85 int32 deviceSpiPscNum (void)
86 {
87     uint32 v;
89     /* SPI is module number 3 only on the c6678. On the c6670 the SPI is in the
90      * always on domain */
91     v = *((Uint32 *)DEVICE_JTAG_ID_REG);
92     v &= DEVICE_JTAG_ID_MASK;
93     if (v == DEVICE_C6678_JTAG_ID_VAL)
94         return (3);
96     return (-1);  /* A negative number indicates the always on domain */
97 }
99 /**
100  *  @brief Power up a peripheral
101  *
102  *  @details
103  *    Boot peripherals are powered up
104  */
105 int32 devicePowerPeriph (int32 modNum)
107     int32 ret;
109     /* If the input value is < 0 there is nothing to power up */
110     if (modNum < 0)
111         return (0);
114     if (modNum >= TARGET_PWR_MAX_MOD)
115         return (-1);
118     /* Note that if the sgmii power enable is requested the PA must be
119      * powered up first */
120     if (modNum == TARGET_PWR_ETH(x))  {
121         ret = (int32)pscEnableModule (TARGET_PWR_PA);
122         if (ret != 0)
123             return (ret);
124     }
126     return ((int32)pscEnableModule(modNum));
127         
130 #ifdef PLL_REINIT_WORKAROUND
131 /**
132  *  @brief Simple DDR3 test
133  *
134  *  @details
135  *      This function performs a simple DDR3 test for a memory range
136  *      specified below and returns -1 for failure and 0 for success.
137  */
140 UINT32 ddr3_memory_test (void)
142          UINT32 index, value;
144         /* Write a pattern */
145         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
146                 *(VUint32 *) index = (UINT32)index;
147         }
149         /* Read and check the pattern */
150         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
152                 value = *(UINT32 *) index;
154                 if (value  != index) {
155                         return -1;
156                 }
157         }
159         /* Write a pattern for complementary values */
160         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
161                 *(VUint32 *) index = (UINT32)~index;
162         }
164         /* Read and check the pattern */
165         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
167                 value = *(UINT32 *) index;
169                 if (value  != ~index) {
170                         return -1;
171                 }
172         }
174         return 0;
177 #endif