Merge branch 'master' of git://git.denx.de/u-boot-sh
[oweals/u-boot.git] / board / freescale / ls1088a / ls1088a.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2017-2018 NXP
4  */
5 #include <common.h>
6 #include <i2c.h>
7 #include <malloc.h>
8 #include <errno.h>
9 #include <netdev.h>
10 #include <fsl_ifc.h>
11 #include <fsl_ddr.h>
12 #include <fsl_sec.h>
13 #include <asm/io.h>
14 #include <fdt_support.h>
15 #include <linux/libfdt.h>
16 #include <fsl-mc/fsl_mc.h>
17 #include <environment.h>
18 #include <asm/arch-fsl-layerscape/soc.h>
19 #include <asm/arch/ppa.h>
20 #include <hwconfig.h>
21 #include <asm/arch/fsl_serdes.h>
22 #include <asm/arch/soc.h>
23
24 #include "../common/qixis.h"
25 #include "ls1088a_qixis.h"
26 #include "../common/vid.h"
27 #include <fsl_immap.h>
28
29 DECLARE_GLOBAL_DATA_PTR;
30
31 #ifdef CONFIG_TARGET_LS1088AQDS
32 #ifdef CONFIG_TFABOOT
33 struct ifc_regs ifc_cfg_ifc_nor_boot[CONFIG_SYS_FSL_IFC_BANK_COUNT] = {
34         {
35                 "nor0",
36                 CONFIG_SYS_NOR0_CSPR_EARLY,
37                 CONFIG_SYS_NOR0_CSPR_EXT,
38                 CONFIG_SYS_NOR_AMASK,
39                 CONFIG_SYS_NOR_CSOR,
40                 {
41                         CONFIG_SYS_NOR_FTIM0,
42                         CONFIG_SYS_NOR_FTIM1,
43                         CONFIG_SYS_NOR_FTIM2,
44                         CONFIG_SYS_NOR_FTIM3
45                 },
46                 0,
47                 CONFIG_SYS_NOR0_CSPR,
48                 0,
49         },
50         {
51                 "nor1",
52                 CONFIG_SYS_NOR1_CSPR_EARLY,
53                 CONFIG_SYS_NOR0_CSPR_EXT,
54                 CONFIG_SYS_NOR_AMASK_EARLY,
55                 CONFIG_SYS_NOR_CSOR,
56                 {
57                         CONFIG_SYS_NOR_FTIM0,
58                         CONFIG_SYS_NOR_FTIM1,
59                         CONFIG_SYS_NOR_FTIM2,
60                         CONFIG_SYS_NOR_FTIM3
61                 },
62                 0,
63                 CONFIG_SYS_NOR1_CSPR,
64                 CONFIG_SYS_NOR_AMASK,
65         },
66         {
67                 "nand",
68                 CONFIG_SYS_NAND_CSPR,
69                 CONFIG_SYS_NAND_CSPR_EXT,
70                 CONFIG_SYS_NAND_AMASK,
71                 CONFIG_SYS_NAND_CSOR,
72                 {
73                         CONFIG_SYS_NAND_FTIM0,
74                         CONFIG_SYS_NAND_FTIM1,
75                         CONFIG_SYS_NAND_FTIM2,
76                         CONFIG_SYS_NAND_FTIM3
77                 },
78         },
79         {
80                 "fpga",
81                 CONFIG_SYS_FPGA_CSPR,
82                 CONFIG_SYS_FPGA_CSPR_EXT,
83                 SYS_FPGA_AMASK,
84                 CONFIG_SYS_FPGA_CSOR,
85                 {
86                         SYS_FPGA_CS_FTIM0,
87                         SYS_FPGA_CS_FTIM1,
88                         SYS_FPGA_CS_FTIM2,
89                         SYS_FPGA_CS_FTIM3
90                 },
91                 0,
92                 SYS_FPGA_CSPR_FINAL,
93                 0,
94         }
95 };
96
97 struct ifc_regs ifc_cfg_qspi_nor_boot[CONFIG_SYS_FSL_IFC_BANK_COUNT] = {
98         {
99                 "nand",
100                 CONFIG_SYS_NAND_CSPR,
101                 CONFIG_SYS_NAND_CSPR_EXT,
102                 CONFIG_SYS_NAND_AMASK,
103                 CONFIG_SYS_NAND_CSOR,
104                 {
105                         CONFIG_SYS_NAND_FTIM0,
106                         CONFIG_SYS_NAND_FTIM1,
107                         CONFIG_SYS_NAND_FTIM2,
108                         CONFIG_SYS_NAND_FTIM3
109                 },
110         },
111         {
112                 "reserved",
113         },
114         {
115                 "fpga",
116                 CONFIG_SYS_FPGA_CSPR,
117                 CONFIG_SYS_FPGA_CSPR_EXT,
118                 SYS_FPGA_AMASK,
119                 CONFIG_SYS_FPGA_CSOR,
120                 {
121                         SYS_FPGA_CS_FTIM0,
122                         SYS_FPGA_CS_FTIM1,
123                         SYS_FPGA_CS_FTIM2,
124                         SYS_FPGA_CS_FTIM3
125                 },
126                 0,
127                 SYS_FPGA_CSPR_FINAL,
128                 0,
129         }
130 };
131
132 void ifc_cfg_boot_info(struct ifc_regs_info *regs_info)
133 {
134         enum boot_src src = get_boot_src();
135
136         if (src == BOOT_SOURCE_QSPI_NOR)
137                 regs_info->regs = ifc_cfg_qspi_nor_boot;
138         else
139                 regs_info->regs = ifc_cfg_ifc_nor_boot;
140
141         regs_info->cs_size = CONFIG_SYS_FSL_IFC_BANK_COUNT;
142 }
143 #endif /* CONFIG_TFABOOT */
144 #endif /* CONFIG_TARGET_LS1088AQDS */
145
146 int board_early_init_f(void)
147 {
148 #if defined(CONFIG_SYS_I2C_EARLY_INIT) && defined(CONFIG_TARGET_LS1088AQDS)
149         i2c_early_init_f();
150 #endif
151         fsl_lsch3_early_init_f();
152         return 0;
153 }
154
155 #ifdef CONFIG_FSL_QIXIS
156 unsigned long long get_qixis_addr(void)
157 {
158         unsigned long long addr;
159
160         if (gd->flags & GD_FLG_RELOC)
161                 addr = QIXIS_BASE_PHYS;
162         else
163                 addr = QIXIS_BASE_PHYS_EARLY;
164
165         /*
166          * IFC address under 256MB is mapped to 0x30000000, any address above
167          * is mapped to 0x5_10000000 up to 4GB.
168          */
169         addr = addr  > 0x10000000 ? addr + 0x500000000ULL : addr + 0x30000000;
170
171         return addr;
172 }
173 #endif
174
175 #if defined(CONFIG_VID)
176 int init_func_vid(void)
177 {
178         if (adjust_vdd(0) < 0)
179                 printf("core voltage not adjusted\n");
180
181         return 0;
182 }
183 #endif
184
185 int is_pb_board(void)
186 {
187         u8 board_id;
188
189         board_id = QIXIS_READ(id);
190         if (board_id == LS1088ARDB_PB_BOARD)
191                 return 1;
192         else
193                 return 0;
194 }
195
196 int fixup_ls1088ardb_pb_banner(void *fdt)
197 {
198         fdt_setprop_string(fdt, 0, "model", "LS1088ARDB-PB Board");
199
200         return 0;
201 }
202
203 #if !defined(CONFIG_SPL_BUILD)
204 int checkboard(void)
205 {
206 #ifdef CONFIG_TFABOOT
207         enum boot_src src = get_boot_src();
208 #endif
209         char buf[64];
210         u8 sw;
211         static const char *const freq[] = {"100", "125", "156.25",
212                                             "100 separate SSCG"};
213         int clock;
214
215 #ifdef CONFIG_TARGET_LS1088AQDS
216         printf("Board: LS1088A-QDS, ");
217 #else
218         if (is_pb_board())
219                 printf("Board: LS1088ARDB-PB, ");
220         else
221                 printf("Board: LS1088A-RDB, ");
222 #endif
223
224         sw = QIXIS_READ(arch);
225         printf("Board Arch: V%d, ", sw >> 4);
226
227 #ifdef CONFIG_TARGET_LS1088AQDS
228         printf("Board version: %c, boot from ", (sw & 0xf) + 'A' - 1);
229 #else
230         printf("Board version: %c, boot from ", (sw & 0xf) + 'A');
231 #endif
232
233         memset((u8 *)buf, 0x00, ARRAY_SIZE(buf));
234
235         sw = QIXIS_READ(brdcfg[0]);
236         sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
237
238 #ifdef CONFIG_TFABOOT
239         if (src == BOOT_SOURCE_SD_MMC)
240                 puts("SD card\n");
241 #else
242 #ifdef CONFIG_SD_BOOT
243         puts("SD card\n");
244 #endif
245 #endif /* CONFIG_TFABOOT */
246         switch (sw) {
247 #ifdef CONFIG_TARGET_LS1088AQDS
248         case 0:
249         case 1:
250         case 2:
251         case 3:
252         case 4:
253         case 5:
254         case 6:
255         case 7:
256                 printf("vBank: %d\n", sw);
257                 break;
258         case 8:
259                 puts("PromJet\n");
260                 break;
261         case 15:
262                 puts("IFCCard\n");
263                 break;
264         case 14:
265 #else
266         case 0:
267 #endif
268                 puts("QSPI:");
269                 sw = QIXIS_READ(brdcfg[0]);
270                 sw = (sw & QIXIS_QMAP_MASK) >> QIXIS_QMAP_SHIFT;
271                 if (sw == 0 || sw == 4)
272                         puts("0\n");
273                 else if (sw == 1)
274                         puts("1\n");
275                 else
276                         puts("EMU\n");
277                 break;
278
279         default:
280                 printf("invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH);
281                 break;
282         }
283
284 #ifdef CONFIG_TARGET_LS1088AQDS
285         printf("FPGA: v%d (%s), build %d",
286                (int)QIXIS_READ(scver), qixis_read_tag(buf),
287                (int)qixis_read_minor());
288         /* the timestamp string contains "\n" at the end */
289         printf(" on %s", qixis_read_time(buf));
290 #else
291         printf("CPLD: v%d.%d\n", QIXIS_READ(scver), QIXIS_READ(tagdata));
292 #endif
293
294         /*
295          * Display the actual SERDES reference clocks as configured by the
296          * dip switches on the board.  Note that the SWx registers could
297          * technically be set to force the reference clocks to match the
298          * values that the SERDES expects (or vice versa).  For now, however,
299          * we just display both values and hope the user notices when they
300          * don't match.
301          */
302         puts("SERDES1 Reference : ");
303         sw = QIXIS_READ(brdcfg[2]);
304         clock = (sw >> 6) & 3;
305         printf("Clock1 = %sMHz ", freq[clock]);
306         clock = (sw >> 4) & 3;
307         printf("Clock2 = %sMHz", freq[clock]);
308
309         puts("\nSERDES2 Reference : ");
310         clock = (sw >> 2) & 3;
311         printf("Clock1 = %sMHz ", freq[clock]);
312         clock = (sw >> 0) & 3;
313         printf("Clock2 = %sMHz\n", freq[clock]);
314
315         return 0;
316 }
317 #endif
318
319 bool if_board_diff_clk(void)
320 {
321 #ifdef CONFIG_TARGET_LS1088AQDS
322         u8 diff_conf = QIXIS_READ(brdcfg[11]);
323         return diff_conf & 0x40;
324 #else
325         u8 diff_conf = QIXIS_READ(dutcfg[11]);
326         return diff_conf & 0x80;
327 #endif
328 }
329
330 unsigned long get_board_sys_clk(void)
331 {
332         u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
333
334         switch (sysclk_conf & 0x0f) {
335         case QIXIS_SYSCLK_83:
336                 return 83333333;
337         case QIXIS_SYSCLK_100:
338                 return 100000000;
339         case QIXIS_SYSCLK_125:
340                 return 125000000;
341         case QIXIS_SYSCLK_133:
342                 return 133333333;
343         case QIXIS_SYSCLK_150:
344                 return 150000000;
345         case QIXIS_SYSCLK_160:
346                 return 160000000;
347         case QIXIS_SYSCLK_166:
348                 return 166666666;
349         }
350
351         return 66666666;
352 }
353
354 unsigned long get_board_ddr_clk(void)
355 {
356         u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
357
358         if (if_board_diff_clk())
359                 return get_board_sys_clk();
360         switch ((ddrclk_conf & 0x30) >> 4) {
361         case QIXIS_DDRCLK_100:
362                 return 100000000;
363         case QIXIS_DDRCLK_125:
364                 return 125000000;
365         case QIXIS_DDRCLK_133:
366                 return 133333333;
367         }
368
369         return 66666666;
370 }
371
372 int select_i2c_ch_pca9547(u8 ch)
373 {
374         int ret;
375
376         ret = i2c_write(I2C_MUX_PCA_ADDR_PRI, 0, 1, &ch, 1);
377         if (ret) {
378                 puts("PCA: failed to select proper channel\n");
379                 return ret;
380         }
381
382         return 0;
383 }
384
385 #if !defined(CONFIG_SPL_BUILD)
386 void board_retimer_init(void)
387 {
388         u8 reg;
389
390         /* Retimer is connected to I2C1_CH5 */
391         select_i2c_ch_pca9547(I2C_MUX_CH5);
392
393         /* Access to Control/Shared register */
394         reg = 0x0;
395         i2c_write(I2C_RETIMER_ADDR, 0xff, 1, &reg, 1);
396
397         /* Read device revision and ID */
398         i2c_read(I2C_RETIMER_ADDR, 1, 1, &reg, 1);
399         debug("Retimer version id = 0x%x\n", reg);
400
401         /* Enable Broadcast. All writes target all channel register sets */
402         reg = 0x0c;
403         i2c_write(I2C_RETIMER_ADDR, 0xff, 1, &reg, 1);
404
405         /* Reset Channel Registers */
406         i2c_read(I2C_RETIMER_ADDR, 0, 1, &reg, 1);
407         reg |= 0x4;
408         i2c_write(I2C_RETIMER_ADDR, 0, 1, &reg, 1);
409
410         /* Set data rate as 10.3125 Gbps */
411         reg = 0x90;
412         i2c_write(I2C_RETIMER_ADDR, 0x60, 1, &reg, 1);
413         reg = 0xb3;
414         i2c_write(I2C_RETIMER_ADDR, 0x61, 1, &reg, 1);
415         reg = 0x90;
416         i2c_write(I2C_RETIMER_ADDR, 0x62, 1, &reg, 1);
417         reg = 0xb3;
418         i2c_write(I2C_RETIMER_ADDR, 0x63, 1, &reg, 1);
419         reg = 0xcd;
420         i2c_write(I2C_RETIMER_ADDR, 0x64, 1, &reg, 1);
421
422         /* Select VCO Divider to full rate (000) */
423         i2c_read(I2C_RETIMER_ADDR, 0x2F, 1, &reg, 1);
424         reg &= 0x0f;
425         reg |= 0x70;
426         i2c_write(I2C_RETIMER_ADDR, 0x2F, 1, &reg, 1);
427
428 #ifdef  CONFIG_TARGET_LS1088AQDS
429         /* Retimer is connected to I2C1_CH5 */
430         select_i2c_ch_pca9547(I2C_MUX_CH5);
431
432         /* Access to Control/Shared register */
433         reg = 0x0;
434         i2c_write(I2C_RETIMER_ADDR2, 0xff, 1, &reg, 1);
435
436         /* Read device revision and ID */
437         i2c_read(I2C_RETIMER_ADDR2, 1, 1, &reg, 1);
438         debug("Retimer version id = 0x%x\n", reg);
439
440         /* Enable Broadcast. All writes target all channel register sets */
441         reg = 0x0c;
442         i2c_write(I2C_RETIMER_ADDR2, 0xff, 1, &reg, 1);
443
444         /* Reset Channel Registers */
445         i2c_read(I2C_RETIMER_ADDR2, 0, 1, &reg, 1);
446         reg |= 0x4;
447         i2c_write(I2C_RETIMER_ADDR2, 0, 1, &reg, 1);
448
449         /* Set data rate as 10.3125 Gbps */
450         reg = 0x90;
451         i2c_write(I2C_RETIMER_ADDR2, 0x60, 1, &reg, 1);
452         reg = 0xb3;
453         i2c_write(I2C_RETIMER_ADDR2, 0x61, 1, &reg, 1);
454         reg = 0x90;
455         i2c_write(I2C_RETIMER_ADDR2, 0x62, 1, &reg, 1);
456         reg = 0xb3;
457         i2c_write(I2C_RETIMER_ADDR2, 0x63, 1, &reg, 1);
458         reg = 0xcd;
459         i2c_write(I2C_RETIMER_ADDR2, 0x64, 1, &reg, 1);
460
461         /* Select VCO Divider to full rate (000) */
462         i2c_read(I2C_RETIMER_ADDR2, 0x2F, 1, &reg, 1);
463         reg &= 0x0f;
464         reg |= 0x70;
465         i2c_write(I2C_RETIMER_ADDR2, 0x2F, 1, &reg, 1);
466 #endif
467         /*return the default channel*/
468         select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
469 }
470
471 #ifdef CONFIG_MISC_INIT_R
472 int misc_init_r(void)
473 {
474 #ifdef CONFIG_TARGET_LS1088ARDB
475         u8 brdcfg5;
476
477         if (hwconfig("esdhc-force-sd")) {
478                 brdcfg5 = QIXIS_READ(brdcfg[5]);
479                 brdcfg5 &= ~BRDCFG5_SPISDHC_MASK;
480                 brdcfg5 |= BRDCFG5_FORCE_SD;
481                 QIXIS_WRITE(brdcfg[5], brdcfg5);
482         }
483 #endif
484         return 0;
485 }
486 #endif
487 #endif
488
489 int i2c_multiplexer_select_vid_channel(u8 channel)
490 {
491         return select_i2c_ch_pca9547(channel);
492 }
493
494 #ifdef CONFIG_TARGET_LS1088AQDS
495 /* read the current value(SVDD) of the LTM Regulator Voltage */
496 int get_serdes_volt(void)
497 {
498         int  ret, vcode = 0;
499         u8 chan = PWM_CHANNEL0;
500
501         /* Select the PAGE 0 using PMBus commands PAGE for VDD */
502         ret = i2c_write(I2C_SVDD_MONITOR_ADDR,
503                         PMBUS_CMD_PAGE, 1, &chan, 1);
504         if (ret) {
505                 printf("VID: failed to select VDD Page 0\n");
506                 return ret;
507         }
508
509         /* Read the output voltage using PMBus command READ_VOUT */
510         ret = i2c_read(I2C_SVDD_MONITOR_ADDR,
511                        PMBUS_CMD_READ_VOUT, 1, (void *)&vcode, 2);
512         if (ret) {
513                 printf("VID: failed to read the volatge\n");
514                 return ret;
515         }
516
517         return vcode;
518 }
519
520 int set_serdes_volt(int svdd)
521 {
522         int ret, vdd_last;
523         u8 buff[5] = {0x04, PWM_CHANNEL0, PMBUS_CMD_VOUT_COMMAND,
524                         svdd & 0xFF, (svdd & 0xFF00) >> 8};
525
526         /* Write the desired voltage code to the SVDD regulator */
527         ret = i2c_write(I2C_SVDD_MONITOR_ADDR,
528                         PMBUS_CMD_PAGE_PLUS_WRITE, 1, (void *)&buff, 5);
529         if (ret) {
530                 printf("VID: I2C failed to write to the volatge regulator\n");
531                 return -1;
532         }
533
534         /* Wait for the volatge to get to the desired value */
535         do {
536                 vdd_last = get_serdes_volt();
537                 if (vdd_last < 0) {
538                         printf("VID: Couldn't read sensor abort VID adjust\n");
539                         return -1;
540                 }
541         } while (vdd_last != svdd);
542
543         return 1;
544 }
545 #else
546 int get_serdes_volt(void)
547 {
548         return 0;
549 }
550
551 int set_serdes_volt(int svdd)
552 {
553         int ret;
554         u8 brdcfg4;
555
556         printf("SVDD changing of RDB\n");
557
558         /* Read the BRDCFG54 via CLPD */
559         ret = i2c_read(CONFIG_SYS_I2C_FPGA_ADDR,
560                        QIXIS_BRDCFG4_OFFSET, 1, (void *)&brdcfg4, 1);
561         if (ret) {
562                 printf("VID: I2C failed to read the CPLD BRDCFG4\n");
563                 return -1;
564         }
565
566         brdcfg4 = brdcfg4 | 0x08;
567
568         /* Write to the BRDCFG4 */
569         ret = i2c_write(CONFIG_SYS_I2C_FPGA_ADDR,
570                         QIXIS_BRDCFG4_OFFSET, 1, (void *)&brdcfg4, 1);
571         if (ret) {
572                 debug("VID: I2C failed to set the SVDD CPLD BRDCFG4\n");
573                 return -1;
574         }
575
576         /* Wait for the volatge to get to the desired value */
577         udelay(10000);
578
579         return 1;
580 }
581 #endif
582
583 /* this function disables the SERDES, changes the SVDD Voltage and enables it*/
584 int board_adjust_vdd(int vdd)
585 {
586         int ret = 0;
587
588         debug("%s: vdd = %d\n", __func__, vdd);
589
590         /* Special settings to be performed when voltage is 900mV */
591         if (vdd == 900) {
592                 ret = setup_serdes_volt(vdd);
593                 if (ret < 0) {
594                         ret = -1;
595                         goto exit;
596                 }
597         }
598 exit:
599         return ret;
600 }
601
602 #if !defined(CONFIG_SPL_BUILD)
603 int board_init(void)
604 {
605         init_final_memctl_regs();
606 #if defined(CONFIG_TARGET_LS1088ARDB) && defined(CONFIG_FSL_MC_ENET)
607         u32 __iomem *irq_ccsr = (u32 __iomem *)ISC_BASE;
608 #endif
609
610         select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
611         board_retimer_init();
612
613 #ifdef CONFIG_ENV_IS_NOWHERE
614         gd->env_addr = (ulong)&default_environment[0];
615 #endif
616
617 #if defined(CONFIG_TARGET_LS1088ARDB) && defined(CONFIG_FSL_MC_ENET)
618         /* invert AQR105 IRQ pins polarity */
619         out_le32(irq_ccsr + IRQCR_OFFSET / 4, AQR105_IRQ_MASK);
620 #endif
621
622 #ifdef CONFIG_FSL_CAAM
623         sec_init();
624 #endif
625 #ifdef CONFIG_FSL_LS_PPA
626         ppa_init();
627 #endif
628         return 0;
629 }
630
631 void detail_board_ddr_info(void)
632 {
633         puts("\nDDR    ");
634         print_size(gd->bd->bi_dram[0].size + gd->bd->bi_dram[1].size, "");
635         print_ddr_info(0);
636 }
637
638 #if defined(CONFIG_ARCH_MISC_INIT)
639 int arch_misc_init(void)
640 {
641         return 0;
642 }
643 #endif
644
645 #ifdef CONFIG_FSL_MC_ENET
646 void board_quiesce_devices(void)
647 {
648         fsl_mc_ldpaa_exit(gd->bd);
649 }
650
651 void fdt_fixup_board_enet(void *fdt)
652 {
653         int offset;
654
655         offset = fdt_path_offset(fdt, "/fsl-mc");
656
657         if (offset < 0)
658                 offset = fdt_path_offset(fdt, "/soc/fsl-mc");
659
660         if (offset < 0) {
661                 printf("%s: ERROR: fsl-mc node not found in device tree (error %d)\n",
662                        __func__, offset);
663                 return;
664         }
665
666         if (get_mc_boot_status() == 0 &&
667             (is_lazy_dpl_addr_valid() || get_dpl_apply_status() == 0))
668                 fdt_status_okay(fdt, offset);
669         else
670                 fdt_status_fail(fdt, offset);
671 }
672 #endif
673
674 #ifdef CONFIG_OF_BOARD_SETUP
675 void fsl_fdt_fixup_flash(void *fdt)
676 {
677         int offset;
678 #ifdef CONFIG_TFABOOT
679         u32 __iomem *dcfg_ccsr = (u32 __iomem *)DCFG_BASE;
680         u32 val;
681 #endif
682
683 /*
684  * IFC-NOR and QSPI are muxed on SoC.
685  * So disable IFC node in dts if QSPI is enabled or
686  * disable QSPI node in dts in case QSPI is not enabled.
687  */
688
689 #ifdef CONFIG_TFABOOT
690         enum boot_src src = get_boot_src();
691         bool disable_ifc = false;
692
693         switch (src) {
694         case BOOT_SOURCE_IFC_NOR:
695                 disable_ifc = false;
696                 break;
697         case BOOT_SOURCE_QSPI_NOR:
698                 disable_ifc = true;
699                 break;
700         default:
701                 val = in_le32(dcfg_ccsr + DCFG_RCWSR15 / 4);
702                 if (DCFG_RCWSR15_IFCGRPABASE_QSPI == (val & (u32)0x3))
703                         disable_ifc = true;
704                 break;
705         }
706
707         if (disable_ifc) {
708                 offset = fdt_path_offset(fdt, "/soc/ifc/nor");
709
710                 if (offset < 0)
711                         offset = fdt_path_offset(fdt, "/ifc/nor");
712         } else {
713                 offset = fdt_path_offset(fdt, "/soc/quadspi");
714
715                 if (offset < 0)
716                         offset = fdt_path_offset(fdt, "/quadspi");
717         }
718
719 #else
720 #ifdef CONFIG_FSL_QSPI
721         offset = fdt_path_offset(fdt, "/soc/ifc/nor");
722
723         if (offset < 0)
724                 offset = fdt_path_offset(fdt, "/ifc/nor");
725 #else
726         offset = fdt_path_offset(fdt, "/soc/quadspi");
727
728         if (offset < 0)
729                 offset = fdt_path_offset(fdt, "/quadspi");
730 #endif
731 #endif
732         if (offset < 0)
733                 return;
734
735         fdt_status_disabled(fdt, offset);
736 }
737
738 int ft_board_setup(void *blob, bd_t *bd)
739 {
740         int i;
741         u64 base[CONFIG_NR_DRAM_BANKS];
742         u64 size[CONFIG_NR_DRAM_BANKS];
743
744         ft_cpu_setup(blob, bd);
745
746         /* fixup DT for the two GPP DDR banks */
747         for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
748                 base[i] = gd->bd->bi_dram[i].start;
749                 size[i] = gd->bd->bi_dram[i].size;
750         }
751
752 #ifdef CONFIG_RESV_RAM
753         /* reduce size if reserved memory is within this bank */
754         if (gd->arch.resv_ram >= base[0] &&
755             gd->arch.resv_ram < base[0] + size[0])
756                 size[0] = gd->arch.resv_ram - base[0];
757         else if (gd->arch.resv_ram >= base[1] &&
758                  gd->arch.resv_ram < base[1] + size[1])
759                 size[1] = gd->arch.resv_ram - base[1];
760 #endif
761
762         fdt_fixup_memory_banks(blob, base, size, CONFIG_NR_DRAM_BANKS);
763
764         fdt_fsl_mc_fixup_iommu_map_entry(blob);
765
766         fsl_fdt_fixup_flash(blob);
767
768 #ifdef CONFIG_FSL_MC_ENET
769         fdt_fixup_board_enet(blob);
770 #endif
771         if (is_pb_board())
772                 fixup_ls1088ardb_pb_banner(blob);
773
774         return 0;
775 }
776 #endif
777 #endif /* defined(CONFIG_SPL_BUILD) */
778
779 #ifdef CONFIG_TFABOOT
780 #ifdef CONFIG_MTD_NOR_FLASH
781 int is_flash_available(void)
782 {
783         char *env_hwconfig = env_get("hwconfig");
784         enum boot_src src = get_boot_src();
785         int is_nor_flash_available = 1;
786
787         switch (src) {
788         case BOOT_SOURCE_IFC_NOR:
789                 is_nor_flash_available = 1;
790                 break;
791         case BOOT_SOURCE_QSPI_NOR:
792                 is_nor_flash_available = 0;
793                 break;
794         /*
795          * In Case of SD boot,if qspi is defined in env_hwconfig
796          * disable nor flash probe.
797          */
798         default:
799                 if (hwconfig_f("qspi", env_hwconfig))
800                         is_nor_flash_available = 0;
801                 break;
802         }
803         return is_nor_flash_available;
804 }
805 #endif
806
807 void *env_sf_get_env_addr(void)
808 {
809         return (void *)(CONFIG_SYS_FSL_QSPI_BASE + CONFIG_ENV_OFFSET);
810 }
811 #endif