c895bcfdf72711dc0a8bcd6bb85445edea8a755d
[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 "pllapi.h"
10 #include <string.h>
11 #include <stdint.h>
12 #include <stdio.h>
13 #include <string.h>
14 #include <stdlib.h>
17 /**
18  *  @brief
19  *     Configure the predivider for the main PLL, which resides outside the PLL controller
20  */
21 SINT16 chipPllSetExternalPrediv(UINT16 pllNum, UINT32 predivRegVal)
22 {
23     UINT32 reg;
25     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
26     reg = BOOT_SET_BITFIELD(reg, predivRegVal, 5, 0);
27     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
30     return (0);
32 } /* chipPllSetExternalPrediv */
35 /**
36  *  @brief
37  *      Configure the bandwidth adjustment for the main PLL, which resides outside the PLL controller
38  */
39 SINT16 chipPllExternalBwAdj (UINT16 pllNum, UINT16 mult)
40 {
41     UINT32 reg;
42     UINT32 bwAdj;
44     bwAdj = (mult >> 1) - 1;
46     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
47     reg = BOOT_SET_BITFIELD(reg, bwAdj & 0x00ff, 31, 24);
48     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
50     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_1);
51     reg = BOOT_SET_BITFIELD(reg, bwAdj >> 8, 3, 0);
52     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_1, reg);
54     return (0);
56 } /* chipPllExternalBwAdj */
59 /**
60  *  @brief
61  *      Configure the multiplier fields for the main PLL which reside outside the PLL controller
62  */
63 UINT32 chipPllExternalMult (UINT16 pllNum, UINT16 mult)
64 {
65     UINT32 pmult;
66     UINT32 reg;
67     UINT32 v;
70     pmult = mult-1; 
72     v = BOOT_READ_BITFIELD(pmult, 12, 6);
73    
75     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
76     reg = BOOT_SET_BITFIELD(reg, v, 18, 12);
77     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
80     v = BOOT_READ_BITFIELD(pmult, 5, 0);
82     return (v);
84 } /* chipPllExternalMult */
86 /**
87  *  @brief return the PSC module number for SPI
88  */
89 int32 deviceSpiPscNum (void)
90 {
91     uint32 v;
93     /* SPI is module number 3 only on the c6678. On the c6670 the SPI is in the
94      * always on domain */
95     v = *((Uint32 *)DEVICE_JTAG_ID_REG);
96     v &= DEVICE_JTAG_ID_MASK;
97     if (v == DEVICE_C6678_JTAG_ID_VAL)
98         return (3);
100     return (-1);  /* A negative number indicates the always on domain */
103 /**
104  *  @brief Power up a peripheral
105  *
106  *  @details
107  *    Boot peripherals are powered up
108  */
109 int32 devicePowerPeriph (int32 modNum)
111     int32 ret;
113     /* If the input value is < 0 there is nothing to power up */
114     if (modNum < 0)
115         return (0);
118     if (modNum >= TARGET_PWR_MAX_MOD)
119         return (-1);
122     /* Note that if the sgmii power enable is requested the PA must be
123      * powered up first */
124     if (modNum == TARGET_PWR_ETH(x))  {
125         ret = (int32)pscEnableModule (TARGET_PWR_PA);
126         if (ret != 0)
127             return (ret);
128     }
130     return ((int32)pscEnableModule(modNum));
131         
134 #ifdef DDR3_TEST_ENABLE
135 /**
136  *  @brief Simple DDR3 test
137  *
138  *  @details
139  *      This function performs a simple DDR3 test for a memory range
140  *      specified below and returns -1 for failure and 0 for success.
141  */
144 int32_t ddr3_memory_test (void)
146         uint32_t index, value;
148         /* Write a pattern */
149         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
150                 *(volatile uint32_t *) index = (uint32_t)index;
151         }
153         /* Read and check the pattern */
154         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
156                 value = *(uint32_t *) index;
158                 if (value  != index) {
159                         return -1;
160                 }
161         }
163         /* Write a pattern for complementary values */
164         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
165                 *(volatile uint32_t *) index = (uint32_t)~index;
166         }
168         /* Read and check the pattern */
169         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
171                 value = *(uint32_t *) index;
173                 if (value  != ~index) {
174                         return -1;
175                 }
176         }
178         return 0;
181 #endif