aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/cpu/armv8/fsl-layerscape/soc.c')
-rw-r--r--arch/arm/cpu/armv8/fsl-layerscape/soc.c231
1 files changed, 175 insertions, 56 deletions
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/soc.c b/arch/arm/cpu/armv8/fsl-layerscape/soc.c
index bfd663942a..7414215208 100644
--- a/arch/arm/cpu/armv8/fsl-layerscape/soc.c
+++ b/arch/arm/cpu/armv8/fsl-layerscape/soc.c
@@ -1,18 +1,19 @@
1// SPDX-License-Identifier: GPL-2.0+ 1// SPDX-License-Identifier: GPL-2.0+
2/* 2/*
3 * Copyright 2014-2015 Freescale Semiconductor 3 * Copyright 2014-2015 Freescale Semiconductor
4 * Copyright 2019 NXP
4 */ 5 */
5 6
6#include <common.h> 7#include <common.h>
7#include <fsl_immap.h> 8#include <fsl_immap.h>
8#include <fsl_ifc.h> 9#include <fsl_ifc.h>
9#include <ahci.h>
10#include <scsi.h>
11#include <asm/arch/fsl_serdes.h> 10#include <asm/arch/fsl_serdes.h>
12#include <asm/arch/soc.h> 11#include <asm/arch/soc.h>
13#include <asm/io.h> 12#include <asm/io.h>
14#include <asm/global_data.h> 13#include <asm/global_data.h>
15#include <asm/arch-fsl-layerscape/config.h> 14#include <asm/arch-fsl-layerscape/config.h>
15#include <asm/arch-fsl-layerscape/ns_access.h>
16#include <asm/arch-fsl-layerscape/fsl_icid.h>
16#ifdef CONFIG_LAYERSCAPE_NS_ACCESS 17#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
17#include <fsl_csu.h> 18#include <fsl_csu.h>
18#endif 19#endif
@@ -24,6 +25,10 @@
24#include <fsl_validate.h> 25#include <fsl_validate.h>
25#endif 26#endif
26#include <fsl_immap.h> 27#include <fsl_immap.h>
28#ifdef CONFIG_TFABOOT
29#include <environment.h>
30DECLARE_GLOBAL_DATA_PTR;
31#endif
27 32
28bool soc_has_dp_ddr(void) 33bool soc_has_dp_ddr(void)
29{ 34{
@@ -122,6 +127,10 @@ static void erratum_a008997(void)
122 set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB2); 127 set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB2);
123 set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB3); 128 set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB3);
124#endif 129#endif
130#elif defined(CONFIG_ARCH_LS1028A)
131 clrsetbits_le32(DCSR_BASE + DCSR_USB_IOCR1,
132 0x7F << 11,
133 DCSR_USB_PCSTXSWINGFULL << 11);
125#endif 134#endif
126#endif /* CONFIG_SYS_FSL_ERRATUM_A008997 */ 135#endif /* CONFIG_SYS_FSL_ERRATUM_A008997 */
127} 136}
@@ -135,7 +144,8 @@ static void erratum_a008997(void)
135 out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_3); \ 144 out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_3); \
136 out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_4) 145 out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_4)
137 146
138#elif defined(CONFIG_ARCH_LS2080A) || defined(CONFIG_ARCH_LS1088A) 147#elif defined(CONFIG_ARCH_LS2080A) || defined(CONFIG_ARCH_LS1088A) || \
148 defined(CONFIG_ARCH_LS1028A)
139 149
140#define PROGRAM_USB_PHY_RX_OVRD_IN_HI(phy) \ 150#define PROGRAM_USB_PHY_RX_OVRD_IN_HI(phy) \
141 out_le16((phy) + DCSR_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_1); \ 151 out_le16((phy) + DCSR_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_1); \
@@ -159,7 +169,8 @@ static void erratum_a009007(void)
159 usb_phy = (void __iomem *)SCFG_USB_PHY3; 169 usb_phy = (void __iomem *)SCFG_USB_PHY3;
160 PROGRAM_USB_PHY_RX_OVRD_IN_HI(usb_phy); 170 PROGRAM_USB_PHY_RX_OVRD_IN_HI(usb_phy);
161#endif 171#endif
162#elif defined(CONFIG_ARCH_LS2080A) || defined(CONFIG_ARCH_LS1088A) 172#elif defined(CONFIG_ARCH_LS2080A) || defined(CONFIG_ARCH_LS1088A) || \
173 defined(CONFIG_ARCH_LS1028A)
163 void __iomem *dcsr = (void __iomem *)DCSR_BASE; 174 void __iomem *dcsr = (void __iomem *)DCSR_BASE;
164 175
165 PROGRAM_USB_PHY_RX_OVRD_IN_HI(dcsr + DCSR_USB_PHY1); 176 PROGRAM_USB_PHY_RX_OVRD_IN_HI(dcsr + DCSR_USB_PHY1);
@@ -330,36 +341,6 @@ void fsl_lsch3_early_init_f(void)
330#endif 341#endif
331} 342}
332 343
333#ifdef CONFIG_SCSI_AHCI_PLAT
334int sata_init(void)
335{
336 struct ccsr_ahci __iomem *ccsr_ahci;
337
338#ifdef CONFIG_SYS_SATA2
339 ccsr_ahci = (void *)CONFIG_SYS_SATA2;
340 out_le32(&ccsr_ahci->ppcfg, AHCI_PORT_PHY_1_CFG);
341 out_le32(&ccsr_ahci->pp2c, AHCI_PORT_PHY2_CFG);
342 out_le32(&ccsr_ahci->pp3c, AHCI_PORT_PHY3_CFG);
343 out_le32(&ccsr_ahci->ptc, AHCI_PORT_TRANS_CFG);
344 out_le32(&ccsr_ahci->axicc, AHCI_PORT_AXICC_CFG);
345#endif
346
347#ifdef CONFIG_SYS_SATA1
348 ccsr_ahci = (void *)CONFIG_SYS_SATA1;
349 out_le32(&ccsr_ahci->ppcfg, AHCI_PORT_PHY_1_CFG);
350 out_le32(&ccsr_ahci->pp2c, AHCI_PORT_PHY2_CFG);
351 out_le32(&ccsr_ahci->pp3c, AHCI_PORT_PHY3_CFG);
352 out_le32(&ccsr_ahci->ptc, AHCI_PORT_TRANS_CFG);
353 out_le32(&ccsr_ahci->axicc, AHCI_PORT_AXICC_CFG);
354
355 ahci_init((void __iomem *)CONFIG_SYS_SATA1);
356 scsi_scan(false);
357#endif
358
359 return 0;
360}
361#endif
362
363/* Get VDD in the unit mV from voltage ID */ 344/* Get VDD in the unit mV from voltage ID */
364int get_core_volt_from_fuse(void) 345int get_core_volt_from_fuse(void)
365{ 346{
@@ -400,25 +381,6 @@ int get_core_volt_from_fuse(void)
400} 381}
401 382
402#elif defined(CONFIG_FSL_LSCH2) 383#elif defined(CONFIG_FSL_LSCH2)
403#ifdef CONFIG_SCSI_AHCI_PLAT
404int sata_init(void)
405{
406 struct ccsr_ahci __iomem *ccsr_ahci = (void *)CONFIG_SYS_SATA;
407
408 /* Disable SATA ECC */
409 out_le32((void *)CONFIG_SYS_DCSR_DCFG_ADDR + 0x520, 0x80000000);
410 out_le32(&ccsr_ahci->ppcfg, AHCI_PORT_PHY_1_CFG);
411 out_le32(&ccsr_ahci->pp2c, AHCI_PORT_PHY2_CFG);
412 out_le32(&ccsr_ahci->pp3c, AHCI_PORT_PHY3_CFG);
413 out_le32(&ccsr_ahci->ptc, AHCI_PORT_TRANS_CFG);
414 out_le32(&ccsr_ahci->axicc, AHCI_PORT_AXICC_CFG);
415
416 ahci_init((void __iomem *)CONFIG_SYS_SATA);
417 scsi_scan(false);
418
419 return 0;
420}
421#endif
422 384
423static void erratum_a009929(void) 385static void erratum_a009929(void)
424{ 386{
@@ -638,6 +600,9 @@ void fsl_lsch2_early_init_f(void)
638 struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR + 600 struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
639 CONFIG_SYS_CCI400_OFFSET); 601 CONFIG_SYS_CCI400_OFFSET);
640 struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR; 602 struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
603#if defined(CONFIG_FSL_QSPI) && defined(CONFIG_TFABOOT)
604 enum boot_src src;
605#endif
641 606
642#ifdef CONFIG_LAYERSCAPE_NS_ACCESS 607#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
643 enable_layerscape_ns_access(); 608 enable_layerscape_ns_access();
@@ -647,9 +612,15 @@ void fsl_lsch2_early_init_f(void)
647 init_early_memctl_regs(); /* tighten IFC timing */ 612 init_early_memctl_regs(); /* tighten IFC timing */
648#endif 613#endif
649 614
615#if defined(CONFIG_FSL_QSPI) && defined(CONFIG_TFABOOT)
616 src = get_boot_src();
617 if (src != BOOT_SOURCE_QSPI_NOR)
618 out_be32(&scfg->qspi_cfg, SCFG_QSPI_CLKSEL);
619#else
650#if defined(CONFIG_FSL_QSPI) && !defined(CONFIG_QSPI_BOOT) 620#if defined(CONFIG_FSL_QSPI) && !defined(CONFIG_QSPI_BOOT)
651 out_be32(&scfg->qspi_cfg, SCFG_QSPI_CLKSEL); 621 out_be32(&scfg->qspi_cfg, SCFG_QSPI_CLKSEL);
652#endif 622#endif
623#endif
653 /* Make SEC reads and writes snoopable */ 624 /* Make SEC reads and writes snoopable */
654 setbits_be32(&scfg->snpcnfgcr, SCFG_SNPCNFGCR_SECRDSNP | 625 setbits_be32(&scfg->snpcnfgcr, SCFG_SNPCNFGCR_SECRDSNP |
655 SCFG_SNPCNFGCR_SECWRSNP | 626 SCFG_SNPCNFGCR_SECWRSNP |
@@ -665,6 +636,14 @@ void fsl_lsch2_early_init_f(void)
665 CCI400_DVM_MESSAGE_REQ_EN | CCI400_SNOOP_REQ_EN); 636 CCI400_DVM_MESSAGE_REQ_EN | CCI400_SNOOP_REQ_EN);
666 } 637 }
667 638
639 /*
640 * Program Central Security Unit (CSU) to grant access
641 * permission for USB 2.0 controller
642 */
643#if defined(CONFIG_ARCH_LS1012A) && defined(CONFIG_USB_EHCI_FSL)
644 if (current_el() == 3)
645 set_devices_ns_access(CSU_CSLX_USB_2, CSU_ALL_RW);
646#endif
668 /* Erratum */ 647 /* Erratum */
669 erratum_a008850_early(); /* part 1 of 2 */ 648 erratum_a008850_early(); /* part 1 of 2 */
670 erratum_a009929(); 649 erratum_a009929();
@@ -674,6 +653,10 @@ void fsl_lsch2_early_init_f(void)
674 erratum_a009798(); 653 erratum_a009798();
675 erratum_a008997(); 654 erratum_a008997();
676 erratum_a009007(); 655 erratum_a009007();
656
657#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
658 set_icids();
659#endif
677} 660}
678#endif 661#endif
679 662
@@ -716,15 +699,151 @@ int qspi_ahb_init(void)
716} 699}
717#endif 700#endif
718 701
702#ifdef CONFIG_TFABOOT
703#define MAX_BOOTCMD_SIZE 512
704
705int fsl_setenv_bootcmd(void)
706{
707 int ret;
708 enum boot_src src = get_boot_src();
709 char bootcmd_str[MAX_BOOTCMD_SIZE];
710
711 switch (src) {
712#ifdef IFC_NOR_BOOTCOMMAND
713 case BOOT_SOURCE_IFC_NOR:
714 sprintf(bootcmd_str, IFC_NOR_BOOTCOMMAND);
715 break;
716#endif
717#ifdef QSPI_NOR_BOOTCOMMAND
718 case BOOT_SOURCE_QSPI_NOR:
719 sprintf(bootcmd_str, QSPI_NOR_BOOTCOMMAND);
720 break;
721#endif
722#ifdef XSPI_NOR_BOOTCOMMAND
723 case BOOT_SOURCE_XSPI_NOR:
724 sprintf(bootcmd_str, XSPI_NOR_BOOTCOMMAND);
725 break;
726#endif
727#ifdef IFC_NAND_BOOTCOMMAND
728 case BOOT_SOURCE_IFC_NAND:
729 sprintf(bootcmd_str, IFC_NAND_BOOTCOMMAND);
730 break;
731#endif
732#ifdef QSPI_NAND_BOOTCOMMAND
733 case BOOT_SOURCE_QSPI_NAND:
734 sprintf(bootcmd_str, QSPI_NAND_BOOTCOMMAND);
735 break;
736#endif
737#ifdef XSPI_NAND_BOOTCOMMAND
738 case BOOT_SOURCE_XSPI_NAND:
739 sprintf(bootcmd_str, XSPI_NAND_BOOTCOMMAND);
740 break;
741#endif
742#ifdef SD_BOOTCOMMAND
743 case BOOT_SOURCE_SD_MMC:
744 sprintf(bootcmd_str, SD_BOOTCOMMAND);
745 break;
746#endif
747#ifdef SD2_BOOTCOMMAND
748 case BOOT_SOURCE_SD_MMC2:
749 sprintf(bootcmd_str, SD2_BOOTCOMMAND);
750 break;
751#endif
752 default:
753#ifdef QSPI_NOR_BOOTCOMMAND
754 sprintf(bootcmd_str, QSPI_NOR_BOOTCOMMAND);
755#endif
756 break;
757 }
758
759 ret = env_set("bootcmd", bootcmd_str);
760 if (ret) {
761 printf("Failed to set bootcmd: ret = %d\n", ret);
762 return ret;
763 }
764 return 0;
765}
766
767int fsl_setenv_mcinitcmd(void)
768{
769 int ret = 0;
770 enum boot_src src = get_boot_src();
771
772 switch (src) {
773#ifdef IFC_MC_INIT_CMD
774 case BOOT_SOURCE_IFC_NAND:
775 case BOOT_SOURCE_IFC_NOR:
776 ret = env_set("mcinitcmd", IFC_MC_INIT_CMD);
777 break;
778#endif
779#ifdef QSPI_MC_INIT_CMD
780 case BOOT_SOURCE_QSPI_NAND:
781 case BOOT_SOURCE_QSPI_NOR:
782 ret = env_set("mcinitcmd", QSPI_MC_INIT_CMD);
783 break;
784#endif
785#ifdef XSPI_MC_INIT_CMD
786 case BOOT_SOURCE_XSPI_NAND:
787 case BOOT_SOURCE_XSPI_NOR:
788 ret = env_set("mcinitcmd", XSPI_MC_INIT_CMD);
789 break;
790#endif
791#ifdef SD_MC_INIT_CMD
792 case BOOT_SOURCE_SD_MMC:
793 ret = env_set("mcinitcmd", SD_MC_INIT_CMD);
794 break;
795#endif
796#ifdef SD2_MC_INIT_CMD
797 case BOOT_SOURCE_SD_MMC2:
798 ret = env_set("mcinitcmd", SD2_MC_INIT_CMD);
799 break;
800#endif
801 default:
802#ifdef QSPI_MC_INIT_CMD
803 ret = env_set("mcinitcmd", QSPI_MC_INIT_CMD);
804#endif
805 break;
806 }
807
808 if (ret) {
809 printf("Failed to set mcinitcmd: ret = %d\n", ret);
810 return ret;
811 }
812 return 0;
813}
814#endif
815
719#ifdef CONFIG_BOARD_LATE_INIT 816#ifdef CONFIG_BOARD_LATE_INIT
720int board_late_init(void) 817int board_late_init(void)
721{ 818{
722#ifdef CONFIG_SCSI_AHCI_PLAT
723 sata_init();
724#endif
725#ifdef CONFIG_CHAIN_OF_TRUST 819#ifdef CONFIG_CHAIN_OF_TRUST
726 fsl_setenv_chain_of_trust(); 820 fsl_setenv_chain_of_trust();
727#endif 821#endif
822#ifdef CONFIG_TFABOOT
823 /*
824 * check if gd->env_addr is default_environment; then setenv bootcmd
825 * and mcinitcmd.
826 */
827#if !defined(CONFIG_ENV_ADDR) || defined(ENV_IS_EMBEDDED)
828 if (gd->env_addr == (ulong)&default_environment[0]) {
829#else
830 if (gd->env_addr + gd->reloc_off == (ulong)&default_environment[0]) {
831#endif
832 fsl_setenv_bootcmd();
833 fsl_setenv_mcinitcmd();
834 }
835
836 /*
837 * If the boot mode is secure, default environment is not present then
838 * setenv command needs to be run by default
839 */
840#ifdef CONFIG_CHAIN_OF_TRUST
841 if ((fsl_check_boot_mode_secure() == 1)) {
842 fsl_setenv_bootcmd();
843 fsl_setenv_mcinitcmd();
844 }
845#endif
846#endif
728#ifdef CONFIG_QSPI_AHB_INIT 847#ifdef CONFIG_QSPI_AHB_INIT
729 qspi_ahb_init(); 848 qspi_ahb_init();
730#endif 849#endif