Merge pull request #3 in PROCESSOR-SDK/ibl from PRSDK-5675 to master
[keystone-rtos/ibl.git] / src / device / c66xk2x / c66xk2xutil.c
1 /*
2  *
3  * Copyright (C) 2010-2012 Texas Instruments Incorporated - http://www.ti.com/
4  *
5  *
6  *  Redistribution and use in source and binary forms, with or without
7  *  modification, are permitted provided that the following conditions
8  *  are met:
9  *
10  *    Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  *
13  *    Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the
16  *    distribution.
17  *
18  *    Neither the name of Texas Instruments Incorporated nor the names of
19  *    its contributors may be used to endorse or promote products derived
20  *    from this software without specific prior written permission.
21  *
22  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  *
34 */
36 /**
37  * @file c66xk2xutil.c
38  *
39  * @brief
40  *        c66xk2x functions used by both the ibl and utility programs
41  */
43 #include "device.h"
44 #include "target.h"
45 #include "pllapi.h"
46 #include "types.h"
48 /**
49  *  @brief
50  *     Configure the predivider for the main PLL, which resides outside the PLL controller
51  */
52 SINT16 chipPllSetExternalPrediv(UINT16 pllNum, UINT32 predivRegVal)
53 {
54     UINT32 reg;
56     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
57     reg = BOOT_SET_BITFIELD(reg, predivRegVal, 5, 0);
58     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
61     return (0);
63 } /* chipPllSetExternalPrediv */
66 /**
67  *  @brief
68  *      Configure the bandwidth adjustment for the main PLL, which resides outside the PLL controller
69  */
70 SINT16 chipPllExternalBwAdj (UINT16 pllNum, UINT16 mult)
71 {
72     UINT32 reg;
73     UINT32 bwAdj;
75     bwAdj = (mult >> 1) - 1;
77     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
78     reg = BOOT_SET_BITFIELD(reg, bwAdj & 0x00ff, 31, 24);
79     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
81     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_1);
82     reg = BOOT_SET_BITFIELD(reg, bwAdj >> 8, 3, 0);
83     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_1, reg);
85     return (0);
87 } /* chipPllExternalBwAdj */
90 /**
91  *  @brief
92  *      Configure the multiplier fields for the main PLL which reside outside the PLL controller
93  */
94 UINT32 chipPllExternalMult (UINT16 pllNum, UINT16 mult)
95 {
96     UINT32 pmult;
97     UINT32 reg;
98     UINT32 v;
101     pmult = mult-1;
103     v = BOOT_READ_BITFIELD(pmult, 12, 6);
106     reg = DEVICE_REG32_R (DEVICE_MAIN_PLL_CTL_0);
107     reg = BOOT_SET_BITFIELD(reg, v, 18, 12);
108     DEVICE_REG32_W (DEVICE_MAIN_PLL_CTL_0, reg);
111     v = BOOT_READ_BITFIELD(pmult, 5, 0);
113     return (v);
115 } /* chipPllExternalMult */
117 /**
118  *  @brief return the PSC module number for SPI
119  */
120 int32 deviceSpiPscNum (void)
122     uint32 v;
124     /* SPI is module number 3 for c66xk2x devices. the SPI is in the
125      * always on domain */
126     v = *((Uint32 *)DEVICE_JTAG_ID_REG);
127     v &= DEVICE_JTAG_ID_MASK;
128     if (v == DEVICE_TCI6636K2H_JTAG_ID_VAL)
129         return (TARGET_SPI_EMIF_TCI6634K2K);
131     return (-1);  /* A negative number indicates the always on domain */
134 /**
135  *  @brief Power up a peripheral
136  *
137  *  @details
138  *    Boot peripherals are powered up
139  */
140 int32 devicePowerPeriph (int32 modNum)
142     int32 ret;
144     /* If the input value is < 0 there is nothing to power up */
145     if (modNum < 0)
146         return (0);
149     if (modNum >= TARGET_PWR_MAX_MOD)
150         return (-1);
153     /* Note that if the sgmii power enable is requested the PA must be
154      * powered up first */
155     if (modNum == TARGET_PWR_ETH(x))  {
156         ret = (int32)pscEnableModule (TARGET_PWR_PA);
157         if (ret != 0)
158             return (ret);
159     }
161     return ((int32)pscEnableModule(modNum));
165 #ifdef PLL_REINIT_WORKAROUND
166 /**
167  *  @brief Simple DDR3 test
168  *
169  *  @details
170  *      This function performs a simple DDR3 test for a memory range
171  *      specified below and returns -1 for failure and 0 for success.
172  */
175 UINT32 ddr3_memory_test (void)
177          UINT32 index, value;
179         /* Write a pattern */
180         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
181                 *(VUint32 *) index = (UINT32)index;
182         }
184         /* Read and check the pattern */
185         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
187                 value = *(UINT32 *) index;
189                 if (value  != index) {
190                         return -1;
191                 }
192         }
194         /* Write a pattern for complementary values */
195         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
196                 *(VUint32 *) index = (UINT32)~index;
197         }
199         /* Read and check the pattern */
200         for (index = DDR3_TEST_START_ADDRESS; index < DDR3_TEST_END_ADDRESS; index += 4) {
202                 value = *(UINT32 *) index;
204                 if (value  != ~index) {
205                         return -1;
206                 }
207         }
209         return 0;
211 #endif