blob: 3333eb067cd704ced10ccf60ea7bdfebde315ac7 [file] [log] [blame]
Vitaly Andrianov7bcf4d62014-04-04 13:16:53 -04001/*
2 * K2HK EVM : Board initialization
3 *
4 * (C) Copyright 2012-2014
5 * Texas Instruments Incorporated, <www.ti.com>
6 *
7 * SPDX-License-Identifier: GPL-2.0+
8 */
9
10#include <common.h>
11#include <exports.h>
12#include <fdt_support.h>
13#include <libfdt.h>
14
Khoronzhuk, Ivan50df5cc2014-07-09 19:48:40 +030015#include <asm/arch/ddr3.h>
Vitaly Andrianov7bcf4d62014-04-04 13:16:53 -040016#include <asm/arch/hardware.h>
17#include <asm/arch/clock.h>
18#include <asm/io.h>
19#include <asm/mach-types.h>
Karicheri, Muralidharan657f6b52014-04-01 15:01:13 -040020#include <asm/arch/emac_defs.h>
Vitaly Andrianov7bcf4d62014-04-04 13:16:53 -040021#include <asm/arch/psc_defs.h>
Khoronzhuk, Ivan8062b052014-06-07 05:10:49 +030022#include <asm/ti-common/ti-aemif.h>
Vitaly Andrianov7bcf4d62014-04-04 13:16:53 -040023
24DECLARE_GLOBAL_DATA_PTR;
25
Vitaly Andrianov7bcf4d62014-04-04 13:16:53 -040026unsigned int external_clk[ext_clk_count] = {
27 [sys_clk] = 122880000,
28 [alt_core_clk] = 125000000,
29 [pa_clk] = 122880000,
30 [tetris_clk] = 125000000,
31 [ddr3a_clk] = 100000000,
32 [ddr3b_clk] = 100000000,
33 [mcm_clk] = 312500000,
34 [pcie_clk] = 100000000,
35 [sgmii_srio_clk] = 156250000,
36 [xgmii_clk] = 156250000,
37 [usb_clk] = 100000000,
38 [rp1_clk] = 123456789 /* TODO: cannot find
39 what is that */
40};
41
Khoronzhuk, Ivan8062b052014-06-07 05:10:49 +030042static struct aemif_config aemif_configs[] = {
Vitaly Andrianov7bcf4d62014-04-04 13:16:53 -040043 { /* CS0 */
Khoronzhuk, Ivan8062b052014-06-07 05:10:49 +030044 .mode = AEMIF_MODE_NAND,
Vitaly Andrianov7bcf4d62014-04-04 13:16:53 -040045 .wr_setup = 0xf,
46 .wr_strobe = 0x3f,
47 .wr_hold = 7,
48 .rd_setup = 0xf,
49 .rd_strobe = 0x3f,
50 .rd_hold = 7,
51 .turn_around = 3,
Khoronzhuk, Ivan8062b052014-06-07 05:10:49 +030052 .width = AEMIF_WIDTH_8,
Vitaly Andrianov7bcf4d62014-04-04 13:16:53 -040053 },
54
55};
56
57static struct pll_init_data pll_config[] = {
58 CORE_PLL_1228,
59 PASS_PLL_983,
60 TETRIS_PLL_1200,
61};
62
63int dram_init(void)
64{
Khoronzhuk, Ivan50df5cc2014-07-09 19:48:40 +030065 ddr3_init();
Vitaly Andrianov7bcf4d62014-04-04 13:16:53 -040066
67 gd->ram_size = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE,
68 CONFIG_MAX_RAM_BANK_SIZE);
Khoronzhuk, Ivan8062b052014-06-07 05:10:49 +030069 aemif_init(ARRAY_SIZE(aemif_configs), aemif_configs);
Vitaly Andrianov7bcf4d62014-04-04 13:16:53 -040070 return 0;
71}
72
Karicheri, Muralidharan657f6b52014-04-01 15:01:13 -040073#ifdef CONFIG_DRIVER_TI_KEYSTONE_NET
74struct eth_priv_t eth_priv_cfg[] = {
75 {
76 .int_name = "K2HK_EMAC",
77 .rx_flow = 22,
78 .phy_addr = 0,
79 .slave_port = 1,
80 .sgmii_link_type = SGMII_LINK_MAC_PHY,
81 },
82 {
83 .int_name = "K2HK_EMAC1",
84 .rx_flow = 23,
85 .phy_addr = 1,
86 .slave_port = 2,
87 .sgmii_link_type = SGMII_LINK_MAC_PHY,
88 },
89 {
90 .int_name = "K2HK_EMAC2",
91 .rx_flow = 24,
92 .phy_addr = 2,
93 .slave_port = 3,
94 .sgmii_link_type = SGMII_LINK_MAC_MAC_FORCED,
95 },
96 {
97 .int_name = "K2HK_EMAC3",
98 .rx_flow = 25,
99 .phy_addr = 3,
100 .slave_port = 4,
101 .sgmii_link_type = SGMII_LINK_MAC_MAC_FORCED,
102 },
103};
104
105int get_eth_env_param(char *env_name)
106{
107 char *env;
108 int res = -1;
109
110 env = getenv(env_name);
111 if (env)
112 res = simple_strtol(env, NULL, 0);
113
114 return res;
115}
116
117int board_eth_init(bd_t *bis)
118{
119 int j;
120 int res;
121 char link_type_name[32];
122
123 for (j = 0; j < (sizeof(eth_priv_cfg) / sizeof(struct eth_priv_t));
124 j++) {
125 sprintf(link_type_name, "sgmii%d_link_type", j);
126 res = get_eth_env_param(link_type_name);
127 if (res >= 0)
128 eth_priv_cfg[j].sgmii_link_type = res;
129
130 keystone2_emac_initialize(&eth_priv_cfg[j]);
131 }
132
133 return 0;
134}
135#endif
136
Vitaly Andrianov7bcf4d62014-04-04 13:16:53 -0400137#if defined(CONFIG_BOARD_EARLY_INIT_F)
138int board_early_init_f(void)
139{
140 init_plls(ARRAY_SIZE(pll_config), pll_config);
141 return 0;
142}
143#endif
144
145int board_init(void)
146{
147 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
148
149 return 0;
150}
151
152#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
153#define K2_DDR3_START_ADDR 0x80000000
154void ft_board_setup(void *blob, bd_t *bd)
155{
156 u64 start[2];
157 u64 size[2];
158 char name[32], *env, *endp;
159 int lpae, nodeoffset;
160 u32 ddr3a_size;
161 int nbanks;
162
163 env = getenv("mem_lpae");
164 lpae = env && simple_strtol(env, NULL, 0);
165
166 ddr3a_size = 0;
167 if (lpae) {
168 env = getenv("ddr3a_size");
169 if (env)
170 ddr3a_size = simple_strtol(env, NULL, 10);
171 if ((ddr3a_size != 8) && (ddr3a_size != 4))
172 ddr3a_size = 0;
173 }
174
175 nbanks = 1;
176 start[0] = bd->bi_dram[0].start;
177 size[0] = bd->bi_dram[0].size;
178
179 /* adjust memory start address for LPAE */
180 if (lpae) {
181 start[0] -= K2_DDR3_START_ADDR;
182 start[0] += CONFIG_SYS_LPAE_SDRAM_BASE;
183 }
184
185 if ((size[0] == 0x80000000) && (ddr3a_size != 0)) {
186 size[1] = ((u64)ddr3a_size - 2) << 30;
187 start[1] = 0x880000000;
188 nbanks++;
189 }
190
191 /* reserve memory at start of bank */
192 sprintf(name, "mem_reserve_head");
193 env = getenv(name);
194 if (env) {
195 start[0] += ustrtoul(env, &endp, 0);
196 size[0] -= ustrtoul(env, &endp, 0);
197 }
198
199 sprintf(name, "mem_reserve");
200 env = getenv(name);
201 if (env)
202 size[0] -= ustrtoul(env, &endp, 0);
203
204 fdt_fixup_memory_banks(blob, start, size, nbanks);
205
206 /* Fix up the initrd */
207 if (lpae) {
208 u64 initrd_start, initrd_end;
209 u32 *prop1, *prop2;
210 int err;
211 nodeoffset = fdt_path_offset(blob, "/chosen");
212 if (nodeoffset >= 0) {
213 prop1 = (u32 *)fdt_getprop(blob, nodeoffset,
214 "linux,initrd-start", NULL);
215 prop2 = (u32 *)fdt_getprop(blob, nodeoffset,
216 "linux,initrd-end", NULL);
217 if (prop1 && prop2) {
218 initrd_start = __be32_to_cpu(*prop1);
219 initrd_start -= K2_DDR3_START_ADDR;
220 initrd_start += CONFIG_SYS_LPAE_SDRAM_BASE;
221 initrd_start = __cpu_to_be64(initrd_start);
222 initrd_end = __be32_to_cpu(*prop2);
223 initrd_end -= K2_DDR3_START_ADDR;
224 initrd_end += CONFIG_SYS_LPAE_SDRAM_BASE;
225 initrd_end = __cpu_to_be64(initrd_end);
226
227 err = fdt_delprop(blob, nodeoffset,
228 "linux,initrd-start");
229 if (err < 0)
230 puts("error deleting initrd-start\n");
231
232 err = fdt_delprop(blob, nodeoffset,
233 "linux,initrd-end");
234 if (err < 0)
235 puts("error deleting initrd-end\n");
236
237 err = fdt_setprop(blob, nodeoffset,
238 "linux,initrd-start",
239 &initrd_start,
240 sizeof(initrd_start));
241 if (err < 0)
242 puts("error adding initrd-start\n");
243
244 err = fdt_setprop(blob, nodeoffset,
245 "linux,initrd-end",
246 &initrd_end,
247 sizeof(initrd_end));
248 if (err < 0)
249 puts("error adding linux,initrd-end\n");
250 }
251 }
252 }
253}
254
255void ft_board_setup_ex(void *blob, bd_t *bd)
256{
257 int lpae;
258 char *env;
259 u64 *reserve_start, size;
260
261 env = getenv("mem_lpae");
262 lpae = env && simple_strtol(env, NULL, 0);
263
264 if (lpae) {
265 /*
266 * the initrd and other reserved memory areas are
267 * embedded in in the DTB itslef. fix up these addresses
268 * to 36 bit format
269 */
270 reserve_start = (u64 *)((char *)blob +
271 fdt_off_mem_rsvmap(blob));
272 while (1) {
273 *reserve_start = __cpu_to_be64(*reserve_start);
274 size = __cpu_to_be64(*(reserve_start + 1));
275 if (size) {
276 *reserve_start -= K2_DDR3_START_ADDR;
277 *reserve_start +=
278 CONFIG_SYS_LPAE_SDRAM_BASE;
279 *reserve_start =
280 __cpu_to_be64(*reserve_start);
281 } else {
282 break;
283 }
284 reserve_start += 2;
285 }
286 }
287}
288#endif