Debug option added to makefiles
[keystone-rtos/ibl.git] / src / device / c6474 / c6474.c
1 /************************************************************************************
2  * FILE PURPOSE: C6474 Device Specific functions
3  ************************************************************************************
4  * FILE NAME: c6474.c
5  *
6  * DESCRIPTION: Implements the device specific functions for the IBL
7  *
8  * @file c6474.c
9  *
10  * @brief
11  *  This file implements the device specific functions for the IBL
12  *
13  ************************************************************************************/
14 #include "ibl.h"
15 #include "device.h"
16 #include "pllapi.h"
17 #include "emif31api.h"
18 #include "pscapi.h"
19 #include "gpio.h"
20 #include <string.h>
22 extern cregister unsigned int DNUM;
25 #if 0
26 /**
27  * @brief The default boot configuration table is filled in
28  *
29  * @details
30  *   A default ibl configuraiton table is provided when one is not found
31  *   preloaded.
32  */
33 void deviceLoadDefaultIblTable (void)
34 {
35     uint32 macA, macB;
37 #if 0  /* This is really the default. Switching to a direct tftp boot until I have a bootp server
38         * on a private lan for test */
39     ibl.ethConfig[0].ethPriority = ibl_LOWEST_PRIORITY;
40     ibl.ethConfig[0].port        = 0;
41     ibl.ethConfig[0].doBootp     = TRUE;
42     ibl.ethConfig[0].bootFormat  = ibl_BOOT_FORMAT_AUTO;
44     memset (&ibl.ethConfig[0].ethInfo, 0, sizeof(ibl.ethConfig[0].ethInfo));
45 #endif
47     /* This is the temporary code */
48     ibl.ethConfig[0].ethPriority      = ibl_LOWEST_PRIORITY;
49     ibl.ethConfig[0].port             = 0;
50     ibl.ethConfig[0].doBootp          = FALSE;
51     ibl.ethConfig[0].useBootpServerIp = FALSE;
52     ibl.ethConfig[0].useBootpFileName = FALSE;
53     ibl.ethConfig[0].bootFormat       = ibl_BOOT_FORMAT_NAME;
55     memset (&ibl.ethConfig[0].ethInfo, 0, sizeof(ibl.ethConfig[0].ethInfo));
57     ibl.ethConfig[0].ethInfo.ipAddr[0] = 10;
58     ibl.ethConfig[0].ethInfo.ipAddr[1] = 218;
59     ibl.ethConfig[0].ethInfo.ipAddr[2] = 109;
60     ibl.ethConfig[0].ethInfo.ipAddr[3] = 21;
62     ibl.ethConfig[0].ethInfo.serverIp[0] = 10;
63     ibl.ethConfig[0].ethInfo.serverIp[1] = 218;
64     ibl.ethConfig[0].ethInfo.serverIp[2] = 109;
65     ibl.ethConfig[0].ethInfo.serverIp[3] = 196;
67     ibl.ethConfig[0].ethInfo.gatewayIp[0] = 10;
68     ibl.ethConfig[0].ethInfo.gatewayIp[1] = 218;
69     ibl.ethConfig[0].ethInfo.gatewayIp[2] = 109;
70     ibl.ethConfig[0].ethInfo.gatewayIp[3] = 1;
72     /* Leave hw address as 0 */
74     strcpy (ibl.ethConfig[0].ethInfo.fileName, "test2_little.out");
76     ibl.ethConfig[0].blob.startAddress  = 0x00200000;       /* Base address of SL2 */
77     ibl.ethConfig[0].blob.sizeBytes     = 0x000c0000;       /* All of SL2 */
78     ibl.ethConfig[0].blob.branchAddress = 0x00200000;       /* Base of SL2 */
82     macA = *((uint32 *)0x2a80700);
83     macB = *((uint32 *)0x2a80704);
85     ibl.ethConfig[0].ethInfo.hwAddress[0] = (macA >> 24) & 0xff;
86     ibl.ethConfig[0].ethInfo.hwAddress[1] = (macA >> 16) & 0xff;
87     ibl.ethConfig[0].ethInfo.hwAddress[2] = (macA >>  8) & 0xff;
88     ibl.ethConfig[0].ethInfo.hwAddress[3] = (macA >>  0) & 0xff;
89     ibl.ethConfig[0].ethInfo.hwAddress[4] = (macB >> 24) & 0xff;
90     ibl.ethConfig[0].ethInfo.hwAddress[5] = (macB >> 16) & 0xff;
93     ibl.ethConfig[1].ethPriority = ibl_DEVICE_NOBOOT;
96     /* MDIO configuration */
97     ibl.mdioConfig.nMdioOps = 8;
98     ibl.mdioConfig.mdioClkDiv = 0x20;
99     ibl.mdioConfig.interDelay = 1400;   /* ~2ms at 700 MHz */
101     ibl.mdioConfig.mdio[0] =  (1 << 30) | (27 << 21) | (24 << 16) | 0x848b;
102     ibl.mdioConfig.mdio[1] =  (1 << 30) | (20 << 21) | (24 << 16) | 0x0ce0;
103     ibl.mdioConfig.mdio[2] =  (1 << 30) | (24 << 21) | (24 << 16) | 0x4101;
104     ibl.mdioConfig.mdio[3] =  (1 << 30) | ( 0 << 21) | (24 << 16) | 0x9140;
106     ibl.mdioConfig.mdio[4] =  (1 << 30) | (27 << 21) | (25 << 16) | 0x848b;
107     ibl.mdioConfig.mdio[5] =  (1 << 30) | (20 << 21) | (25 << 16) | 0x0ce0;
108     ibl.mdioConfig.mdio[6] =  (1 << 30) | (24 << 21) | (25 << 16) | 0x4101;
109     ibl.mdioConfig.mdio[7] =  (1 << 30) | ( 0 << 21) | (25 << 16) | 0x9140;
112     /* Main Pll configuration */
113     ibl.pllConfig[ibl_MAIN_PLL].doEnable = TRUE;
114     ibl.pllConfig[ibl_MAIN_PLL].prediv   = 1;
115     ibl.pllConfig[ibl_MAIN_PLL].mult     = 28;
116     ibl.pllConfig[ibl_MAIN_PLL].postdiv  = 1;
118     ibl.pllConfig[ibl_MAIN_PLL].pllOutFreqMhz = 500;
120     /* The DDR PLL. The multipliers/dividers are fixed, so are really dont cares */
121     ibl.pllConfig[ibl_DDR_PLL].doEnable = TRUE;
123     /* The network PLL. The multipliers/dividers are fixed */
124     ibl.pllConfig[ibl_NET_PLL].doEnable = TRUE;
126     /* EMIF configuration */
127     ibl.ddrConfig.uEmif.emif3p1.sdcfg  = 0x00538832; /* timing, 32bit wide */
128     ibl.ddrConfig.uEmif.emif3p1.sdrfc  = 0x0000073B; /* Refresh 533Mhz */ 
129     ibl.ddrConfig.uEmif.emif3p1.sdtim1 = 0x47245BD2; /* Timing 1 */
130     ibl.ddrConfig.uEmif.emif3p1.sdtim2 = 0x0125DC44; /* Timing 2 */
131     ibl.ddrConfig.uEmif.emif3p1.dmcctl = 0x50001906; /* PHY read latency for CAS 5 is 5 + 2 - 1 */
134     /* NAND configuration for the MT29F1G08 flash */
135     ibl.nandConfig.nandPriority = ibl_HIGHEST_PRIORITY;
136     ibl.nandConfig.bootFormat   = ibl_BOOT_FORMAT_COFF;
138     ibl.nandConfig.nandInfo.busWidthBits  = 8;
139     ibl.nandConfig.nandInfo.pageSizeBytes = 2048;
140     ibl.nandConfig.nandInfo.pageEccBytes  = 64;
141     ibl.nandConfig.nandInfo.pagesPerBlock = 64;
142     ibl.nandConfig.nandInfo.totalBlocks   = 1024;
144     ibl.nandConfig.nandInfo.addressBytes  = 4;
145     ibl.nandConfig.nandInfo.lsbFirst      = TRUE;
146     ibl.nandConfig.nandInfo.blockOffset   = 22;
147     ibl.nandConfig.nandInfo.pageOffset    = 16;
148     ibl.nandConfig.nandInfo.columnOffset  = 0;
150     ibl.nandConfig.nandInfo.resetCommand    = 0xff;
151     ibl.nandConfig.nandInfo.readCommandPre  = 0;
152     ibl.nandConfig.nandInfo.readCommandPost = 0x30;
153     ibl.nandConfig.nandInfo.postCommand     = TRUE;
154     
157 #endif
159 /**
160  *  @brief Determine if an address is local
161  *
162  *  @details
163  *    Examines an input address to determine if it is a local address
164  */
165 bool address_is_local (Uint32 addr)
167     /* L2 */
168     if ((addr >= 0x00800000) && (addr < 0x00898000))
169         return (TRUE);
171     /* L1P */
172     if ((addr >= 0x00e00000) && (addr < 0x00e08000))
173         return (TRUE);
175     /* L2D */
176     if ((addr >= 0x00f00000) && (addr < 0x00f08000))
177         return (TRUE);
179     return (FALSE);
184 /**
185  * @brief  Convert a local l1d, l1p or l2 address to a global address
186  *
187  * @details
188  *  The global address is formed. If the address is not local then
189  *  the input address is returned
190  */
191 Uint32 deviceLocalAddrToGlobal (Uint32 addr)
194     if (address_is_local (addr))
195         addr = (1 << 28) | (DNUM << 24) | addr;
197     return (addr);
200         
201         
202 /**
203  * @brief Configure the PLLs
204  *
205  * @details
206  *   Only the main PLL can be configured here. The DDR pll is enabled by default,
207  *   and the network PLL is enabled through serdes configuration.
208  *   the multiplier and dividers.
209  */
210 void devicePllConfig (void)
212     if (ibl.pllConfig[ibl_MAIN_PLL].doEnable == TRUE)
213         hwPllSetPll (MAIN_PLL, 
214                      ibl.pllConfig[ibl_MAIN_PLL].prediv,
215                      ibl.pllConfig[ibl_MAIN_PLL].mult,
216                      ibl.pllConfig[ibl_MAIN_PLL].postdiv);
220 /**
221  * @brief
222  *   Enable the DDR
223  *
224  * @details
225  *   The DDR controller on the c6474 is an emif 3.1. The controller is
226  *   initialized directly with the supplied values
227  */
228 void deviceDdrConfig (void)
230     if (ibl.ddrConfig.configDdr != 0)
231         hwEmif3p1Enable (&ibl.ddrConfig.uEmif.emif3p1);
234         
236 /**
237  *  @brief Power up a peripheral
238  *
239  *  @details
240  *    Boot peripherals are powered up
241  */
242 int32 devicePowerPeriph (int32 modNum)
244     /* If the input value is < 0 there is nothing to power up */
245     if (modNum < 0)
246         return (0);
249     if (modNum >= TARGET_PWR_MAX_MOD)
250         return (-1);
252     return ((int32)pscEnableModule(modNum));
253         
257 /**
258  *  @brief  Enable the pass through version of the nand controller
259  *
260  *  @details  On the evm the nand controller is enabled by setting 
261  *            gpio 14 high
262  */
263 int32 deviceConfigureForNand(void)
265         hwGpioSetDirection(NAND_MODE_GPIO, GPIO_OUT);
266         hwGpioSetOutput(NAND_MODE_GPIO);
267     return (0);
272 /**
273  *  @brief
274  *    The e-fuse mac address is loaded
275  */
276 void deviceLoadDefaultEthAddress (uint8 *maddr)
278     uint32 macA, macB;
280     /* Read the e-fuse mac address */
281     macA = *((uint32 *)0x2880834);
282     macB = *((uint32 *)0x2880838);
284     maddr[0] = (macB >>  8) & 0xff;
285     maddr[1] = (macB >>  0) & 0xff;
286     maddr[2] = (macA >> 24) & 0xff;
287     maddr[3] = (macA >> 16) & 0xff;
288     maddr[4] = (macA >>  8) & 0xff;
289     maddr[5] = (macA >>  0) & 0xff;