Renamed ifdef flag, init uart from iblmain
[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 <string.h>
12 #include <stdint.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <stdlib.h>
18 /**
19  *  @brief
20  *     Configure the predivider for the main PLL, which resides outside the PLL controller
21  */
22 SINT16 chipPllSetExternalPrediv(UINT16 pllNum, UINT32 predivRegVal)
23 {
24     UINT32 reg;
26     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
27     reg = BOOT_SET_BITFIELD(reg, predivRegVal, 5, 0);
28     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
31     return (0);
33 } /* chipPllSetExternalPrediv */
36 /**
37  *  @brief
38  *      Configure the bandwidth adjustment for the main PLL, which resides outside the PLL controller
39  */
40 SINT16 chipPllExternalBwAdj (UINT16 pllNum, UINT16 mult)
41 {
42     UINT32 reg;
43     UINT32 bwAdj;
45     bwAdj = (mult >> 1) - 1;
47     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
48     reg = BOOT_SET_BITFIELD(reg, bwAdj & 0x00ff, 31, 24);
49     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
51     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_1);
52     reg = BOOT_SET_BITFIELD(reg, bwAdj >> 8, 3, 0);
53     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_1, reg);
55     return (0);
57 } /* chipPllExternalBwAdj */
60 /**
61  *  @brief
62  *      Configure the multiplier fields for the main PLL which reside outside the PLL controller
63  */
64 UINT32 chipPllExternalMult (UINT16 pllNum, UINT16 mult)
65 {
66     UINT32 pmult;
67     UINT32 reg;
68     UINT32 v;
71     pmult = mult-1; 
73     v = BOOT_READ_BITFIELD(pmult, 12, 6);
74    
76     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
77     reg = BOOT_SET_BITFIELD(reg, v, 18, 12);
78     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
81     v = BOOT_READ_BITFIELD(pmult, 5, 0);
83     return (v);
85 } /* chipPllExternalMult */
87 /**
88  *  @brief return the PSC module number for SPI
89  */
90 int32 deviceSpiPscNum (void)
91 {
92     uint32 v;
94     /* SPI is module number 3 only on the c6678. On the c6670 the SPI is in the
95      * always on domain */
96     v = *((Uint32 *)DEVICE_JTAG_ID_REG);
97     v &= DEVICE_JTAG_ID_MASK;
98     if (v == DEVICE_C6678_JTAG_ID_VAL)
99         return (3);
101     return (-1);  /* A negative number indicates the always on domain */
104 /**
105  *  @brief Power up a peripheral
106  *
107  *  @details
108  *    Boot peripherals are powered up
109  */
110 int32 devicePowerPeriph (int32 modNum)
112     int32 ret;
114     /* If the input value is < 0 there is nothing to power up */
115     if (modNum < 0)
116         return (0);
119     if (modNum >= TARGET_PWR_MAX_MOD)
120         return (-1);
123     /* Note that if the sgmii power enable is requested the PA must be
124      * powered up first */
125     if (modNum == TARGET_PWR_ETH(x))  {
126         ret = (int32)pscEnableModule (TARGET_PWR_PA);
127         if (ret != 0)
128             return (ret);
129     }
131     return ((int32)pscEnableModule(modNum));
132         
135 #ifdef PLL_REINIT_WORKAROUND
136 /**
137  *  @brief Simple DDR3 test
138  *
139  *  @details
140  *      This function performs a simple DDR3 test for a memory range
141  *      specified below and returns -1 for failure and 0 for success.
142  */
145 int32_t ddr3_memory_test (void)
147         uint32_t index, value;
149         /* Write a pattern */
150         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
151                 *(volatile uint32_t *) index = (uint32_t)index;
152         }
154         /* Read and check the pattern */
155         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
157                 value = *(uint32_t *) index;
159                 if (value  != index) {
160                         return -1;
161                 }
162         }
164         /* Write a pattern for complementary values */
165         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
166                 *(volatile uint32_t *) index = (uint32_t)~index;
167         }
169         /* Read and check the pattern */
170         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
172                 value = *(uint32_t *) index;
174                 if (value  != ~index) {
175                         return -1;
176                 }
177         }
179         return 0;
182 #endif