ca397487e760b318a85c4828d6bf22583e33c4b4
1 /************************************************************************************\r
2 * FILE PURPOSE: C6474 Device Specific functions\r
3 ************************************************************************************\r
4 * FILE NAME: c6474l.c\r
5 *\r
6 * DESCRIPTION: Implements the device specific functions for the IBL\r
7 *\r
8 * @file c6474l.c\r
9 *\r
10 * @brief\r
11 * This file implements the device specific functions for the IBL\r
12 *\r
13 ************************************************************************************/\r
14 #include "ibl.h"\r
15 #include "device.h"\r
16 #include "pllapi.h"\r
17 #include "emif31api.h"\r
18 #include "pscapi.h"\r
19 #include "gpio.h"\r
20 #include <string.h>\r
21 \r
22 extern cregister unsigned int DNUM;\r
23 \r
24 \r
25 /**\r
26 * @brief Determine if an address is local\r
27 *\r
28 * @details\r
29 * Examines an input address to determine if it is a local address\r
30 */\r
31 bool address_is_local (Uint32 addr)\r
32 {\r
33 /* L2 */\r
34 if ((addr >= 0x00800000) && (addr < 0x00898000))\r
35 return (TRUE);\r
36 \r
37 /* L1P */\r
38 if ((addr >= 0x00e00000) && (addr < 0x00e08000))\r
39 return (TRUE);\r
40 \r
41 /* L2D */\r
42 if ((addr >= 0x00f00000) && (addr < 0x00f08000))\r
43 return (TRUE);\r
44 \r
45 return (FALSE);\r
46 \r
47 }\r
48 \r
49 \r
50 /**\r
51 * @brief Convert a local l1d, l1p or l2 address to a global address\r
52 *\r
53 * @details\r
54 * The global address is formed. If the address is not local then\r
55 * the input address is returned\r
56 */\r
57 Uint32 deviceLocalAddrToGlobal (Uint32 addr)\r
58 {\r
59 \r
60 if (address_is_local (addr))\r
61 addr = (1 << 28) | (DNUM << 24) | addr;\r
62 \r
63 return (addr);\r
64 \r
65 }\r
66 \r
67 \r
68 /**\r
69 * @brief Configure the PLLs\r
70 *\r
71 * @details\r
72 * Only the main PLL can be configured here. The DDR pll is enabled by default,\r
73 * and the network PLL is enabled through serdes configuration.\r
74 * the multiplier and dividers.\r
75 */\r
76 void devicePllConfig (void)\r
77 {\r
78 if (ibl.pllConfig[ibl_MAIN_PLL].doEnable == TRUE)\r
79 hwPllSetPll (MAIN_PLL, \r
80 ibl.pllConfig[ibl_MAIN_PLL].prediv,\r
81 ibl.pllConfig[ibl_MAIN_PLL].mult,\r
82 ibl.pllConfig[ibl_MAIN_PLL].postdiv);\r
83 \r
84 }\r
85 \r
86 /**\r
87 * @brief\r
88 * Enable the DDR\r
89 *\r
90 * @details\r
91 * The DDR controller on the c6474 is an emif 3.1. The controller is\r
92 * initialized directly with the supplied values\r
93 */\r
94 void deviceDdrConfig (void)\r
95 {\r
96 if (ibl.ddrConfig.configDdr != 0)\r
97 hwEmif3p1Enable (&ibl.ddrConfig.uEmif.emif3p1);\r
98 \r
99 }\r
100 \r
101 \r
102 /**\r
103 * @brief Power up a peripheral\r
104 *\r
105 * @details\r
106 * Boot peripherals are powered up\r
107 */\r
108 int32 devicePowerPeriph (int32 modNum)\r
109 {\r
110 /* If the input value is < 0 there is nothing to power up */\r
111 if (modNum < 0)\r
112 return (0);\r
113 \r
114 \r
115 if (modNum >= TARGET_PWR_MAX_MOD)\r
116 return (-1);\r
117 \r
118 return ((int32)pscEnableModule(modNum));\r
119 \r
120 }\r
121 \r
122 \r
123 /**\r
124 * @brief Enable the pass through version of the nand controller\r
125 *\r
126 * @details On the evm the nand controller is enabled by setting \r
127 * gpio 14 high\r
128 */\r
129 #if 0\r
130 int32 deviceConfigureForNand(void)\r
131 {\r
132 hwGpioSetDirection(NAND_MODE_GPIO, GPIO_OUT);\r
133 hwGpioSetOutput(NAND_MODE_GPIO);\r
134 return (0);\r
135 \r
136 }\r
137 #endif\r
138 \r
139 \r
140 /**\r
141 * @brief\r
142 * The e-fuse mac address is loaded\r
143 */\r
144 void deviceLoadDefaultEthAddress (uint8 *maddr)\r
145 {\r
146 uint32 macA, macB;\r
147 \r
148 /* Read the e-fuse mac address */\r
149 macA = *((uint32 *)0x2880834);\r
150 macB = *((uint32 *)0x2880838);\r
151 \r
152 maddr[0] = (macB >> 8) & 0xff;\r
153 maddr[1] = (macB >> 0) & 0xff;\r
154 maddr[2] = (macA >> 24) & 0xff;\r
155 maddr[3] = (macA >> 16) & 0xff;\r
156 maddr[4] = (macA >> 8) & 0xff;\r
157 maddr[5] = (macA >> 0) & 0xff;\r
158 }\r
159 \r
160 \r
161 \r
162 \r
163 \r