1
2
3
4
5
6#include <common.h>
7#include <command.h>
8#include <fdt_support.h>
9#include <hang.h>
10#include <i2c.h>
11#include <asm/cache.h>
12#include <init.h>
13#include <asm/global_data.h>
14#include <asm/io.h>
15#include <asm/arch/clock.h>
16#include <asm/arch/fsl_serdes.h>
17#ifdef CONFIG_FSL_LS_PPA
18#include <asm/arch/ppa.h>
19#endif
20#include <asm/arch/mmu.h>
21#include <asm/arch/soc.h>
22#include <hwconfig.h>
23#include <ahci.h>
24#include <mmc.h>
25#include <scsi.h>
26#include <fsl_esdhc.h>
27#include <env_internal.h>
28#include <fsl_mmdc.h>
29#include <netdev.h>
30#include <fsl_sec.h>
31#include <net/pfe_eth/pfe/pfe_hw.h>
32
33DECLARE_GLOBAL_DATA_PTR;
34
35#define BOOT_FROM_UPPER_BANK 0x2
36#define BOOT_FROM_LOWER_BANK 0x1
37
38int checkboard(void)
39{
40#ifdef CONFIG_TARGET_LS1012ARDB
41 u8 in1;
42 int ret, bus_num = 0;
43
44 puts("Board: LS1012ARDB ");
45
46
47#if CONFIG_IS_ENABLED(DM_I2C)
48 struct udevice *dev;
49
50 ret = i2c_get_chip_for_busnum(bus_num, I2C_MUX_IO_ADDR,
51 1, &dev);
52 if (ret) {
53 printf("%s: Cannot find udev for a bus %d\n", __func__,
54 bus_num);
55 return -ENXIO;
56 }
57 ret = dm_i2c_read(dev, I2C_MUX_IO_1, &in1, 1);
58#else
59 i2c_set_bus_num(bus_num);
60 ret = i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_1, 1, &in1, 1);
61#endif
62 if (ret < 0) {
63 printf("Error reading i2c boot information!\n");
64 return 0;
65 }
66
67 puts("Version");
68 switch (in1 & SW_REV_MASK) {
69 case SW_REV_A:
70 puts(": RevA");
71 break;
72 case SW_REV_B:
73 puts(": RevB");
74 break;
75 case SW_REV_C:
76 puts(": RevC");
77 break;
78 case SW_REV_C1:
79 puts(": RevC1");
80 break;
81 case SW_REV_C2:
82 puts(": RevC2");
83 break;
84 case SW_REV_D:
85 puts(": RevD");
86 break;
87 case SW_REV_E:
88 puts(": RevE");
89 break;
90 default:
91 puts(": unknown");
92 break;
93 }
94
95 printf(", boot from QSPI");
96 if ((in1 & SW_BOOT_MASK) == SW_BOOT_EMU)
97 puts(": emu\n");
98 else if ((in1 & SW_BOOT_MASK) == SW_BOOT_BANK1)
99 puts(": bank1\n");
100 else if ((in1 & SW_BOOT_MASK) == SW_BOOT_BANK2)
101 puts(": bank2\n");
102 else
103 puts("unknown\n");
104#else
105
106 puts("Board: LS1012A2G5RDB ");
107#endif
108 return 0;
109}
110
111#ifdef CONFIG_TFABOOT
112int dram_init(void)
113{
114 gd->ram_size = tfa_get_dram_size();
115 if (!gd->ram_size)
116 gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
117
118 return 0;
119}
120#else
121int dram_init(void)
122{
123#ifndef CONFIG_TFABOOT
124 static const struct fsl_mmdc_info mparam = {
125 0x05180000,
126 0x00030035,
127 0x12554000,
128 0xbabf7954,
129 0xdb328f64,
130 0x01ff00db,
131 0x00001680,
132 0x0f3c8000,
133 0x00002000,
134 0x00bf1023,
135 0x0000003f,
136 0x0000022a,
137 0xa1390003,
138 };
139
140 mmdc_init(&mparam);
141#endif
142
143 gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
144#if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
145
146 update_early_mmu_table();
147#endif
148
149 return 0;
150}
151#endif
152
153
154int board_early_init_f(void)
155{
156 fsl_lsch2_early_init_f();
157
158 return 0;
159}
160
161int board_init(void)
162{
163 struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
164 CONFIG_SYS_CCI400_OFFSET);
165
166
167
168
169 if (current_el() == 3)
170 out_le32(&cci->ctrl_ord, CCI400_CTRLORD_EN_BARRIER);
171
172#ifdef CONFIG_SYS_FSL_ERRATUM_A010315
173 erratum_a010315();
174#endif
175
176#ifdef CONFIG_ENV_IS_NOWHERE
177 gd->env_addr = (ulong)&default_environment[0];
178#endif
179
180#ifdef CONFIG_FSL_CAAM
181 sec_init();
182#endif
183
184#ifdef CONFIG_FSL_LS_PPA
185 ppa_init();
186#endif
187 return 0;
188}
189
190#ifdef CONFIG_FSL_PFE
191void board_quiesce_devices(void)
192{
193 pfe_command_stop(0, NULL);
194}
195#endif
196
197#ifdef CONFIG_TARGET_LS1012ARDB
198int esdhc_status_fixup(void *blob, const char *compat)
199{
200 char esdhc1_path[] = "/soc/esdhc@1580000";
201 bool sdhc2_en = false;
202 u8 mux_sdhc2;
203 u8 io = 0;
204 int ret, bus_num = 0;
205
206#if CONFIG_IS_ENABLED(DM_I2C)
207 struct udevice *dev;
208
209 ret = i2c_get_chip_for_busnum(bus_num, I2C_MUX_IO_ADDR,
210 1, &dev);
211 if (ret) {
212 printf("%s: Cannot find udev for a bus %d\n", __func__,
213 bus_num);
214 return -ENXIO;
215 }
216 ret = dm_i2c_read(dev, I2C_MUX_IO_1, &io, 1);
217#else
218 i2c_set_bus_num(bus_num);
219
220 ret = i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_1, 1, &io, 1);
221#endif
222 if (ret < 0) {
223 printf("Error reading i2c boot information!\n");
224 return 0;
225 }
226
227
228 if ((io & SW_REV_MASK) <= SW_REV_D) {
229#ifdef CONFIG_HWCONFIG
230 if (hwconfig("esdhc1"))
231 sdhc2_en = true;
232#endif
233 } else {
234
235
236
237
238
239
240
241
242
243
244
245#if CONFIG_IS_ENABLED(DM_I2C)
246 ret = dm_i2c_read(dev, I2C_MUX_IO_0, &io, 1);
247#else
248 ret = i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_0, 1, &io, 1);
249#endif
250 if (ret < 0) {
251 printf("Error reading i2c boot information!\n");
252 return 0;
253 }
254
255 mux_sdhc2 = (io & 0x0c) >> 2;
256
257 if (mux_sdhc2 == 2 || mux_sdhc2 == 0)
258 sdhc2_en = true;
259 }
260 if (sdhc2_en)
261 do_fixup_by_path(blob, esdhc1_path, "status", "okay",
262 sizeof("okay"), 1);
263 else
264 do_fixup_by_path(blob, esdhc1_path, "status", "disabled",
265 sizeof("disabled"), 1);
266 return 0;
267}
268#endif
269
270int ft_board_setup(void *blob, struct bd_info *bd)
271{
272 arch_fixup_fdt(blob);
273
274 ft_cpu_setup(blob, bd);
275
276 return 0;
277}
278
279static int switch_to_bank1(void)
280{
281 u8 data = 0xf4, chip_addr = 0x24, offset_addr = 0x03;
282 int ret, bus_num = 0;
283
284#if CONFIG_IS_ENABLED(DM_I2C)
285 struct udevice *dev;
286
287 ret = i2c_get_chip_for_busnum(bus_num, chip_addr,
288 1, &dev);
289 if (ret) {
290 printf("%s: Cannot find udev for a bus %d\n", __func__,
291 bus_num);
292 return -ENXIO;
293 }
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329 ret = dm_i2c_write(dev, offset_addr, &data, 1);
330#else
331 i2c_set_bus_num(bus_num);
332 ret = i2c_write(chip_addr, offset_addr, 1, &data, 1);
333#endif
334
335 if (ret) {
336 printf("i2c write error to chip : %u, addr : %u, data : %u\n",
337 chip_addr, offset_addr, data);
338 }
339
340 return ret;
341}
342
343static int switch_to_bank2(void)
344{
345 u8 data[2] = {0xfc, 0xf5}, offset_addr[2] = {0x7, 0x3};
346 u8 chip_addr = 0x24;
347 int ret, i, bus_num = 0;
348
349#if CONFIG_IS_ENABLED(DM_I2C)
350 struct udevice *dev;
351
352 ret = i2c_get_chip_for_busnum(bus_num, chip_addr,
353 1, &dev);
354 if (ret) {
355 printf("%s: Cannot find udev for a bus %d\n", __func__,
356 bus_num);
357 return -ENXIO;
358 }
359#else
360 i2c_set_bus_num(bus_num);
361#endif
362
363
364
365
366
367
368
369
370
371 for (i = 0; i < sizeof(data); i++) {
372#if CONFIG_IS_ENABLED(DM_I2C)
373 ret = dm_i2c_write(dev, offset_addr[i], &data[i], 1);
374#else
375 ret = i2c_write(chip_addr, offset_addr[i], 1, &data[i], 1);
376#endif
377 if (ret) {
378 printf("i2c write error to chip : %u, addr : %u, data : %u\n",
379 chip_addr, offset_addr[i], data[i]);
380 goto err;
381 }
382 }
383
384err:
385 return ret;
386}
387
388static int convert_flash_bank(int bank)
389{
390 int ret = 0;
391
392 switch (bank) {
393 case BOOT_FROM_UPPER_BANK:
394 ret = switch_to_bank2();
395 break;
396 case BOOT_FROM_LOWER_BANK:
397 ret = switch_to_bank1();
398 break;
399 default:
400 ret = CMD_RET_USAGE;
401 break;
402 };
403
404 return ret;
405}
406
407static int flash_bank_cmd(struct cmd_tbl *cmdtp, int flag, int argc,
408 char *const argv[])
409{
410 if (argc != 2)
411 return CMD_RET_USAGE;
412 if (strcmp(argv[1], "1") == 0)
413 convert_flash_bank(BOOT_FROM_LOWER_BANK);
414 else if (strcmp(argv[1], "2") == 0)
415 convert_flash_bank(BOOT_FROM_UPPER_BANK);
416 else
417 return CMD_RET_USAGE;
418
419 return 0;
420}
421
422U_BOOT_CMD(
423 boot_bank, 2, 0, flash_bank_cmd,
424 "Flash bank Selection Control",
425 "bank[1-lower bank/2-upper bank] (e.g. boot_bank 1)"
426);
427