]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
board: sl28: add SATA support
authorMichael Walle <michael@walle.cc>
Thu, 7 Jan 2021 23:08:59 +0000 (00:08 +0100)
committerPriyanka Jain <priyanka.jain@nxp.com>
Mon, 8 Feb 2021 08:31:16 +0000 (14:01 +0530)
Enable SATA support. Although not supported by the usual SATA pins on
the SMARC baseboard connector, SATA mode is supported on a PCIe lane.
This way one can use a mSATA card in a Mini PCI slot.

We need to invert the received data because in this mode the polarity of
the SerDes lane is swapped. Provide a fixup in board_early_init_f() for
the SPL. board_early_init_f() is then not common between SPL and u-boot
proper anymore, thus common.c is removed, as it just contained said
function.

Signed-off-by: Michael Walle <michael@walle.cc>
Reviewed-by: Priyanka Jain <priyanka.jain@nxp.com>
arch/arm/dts/fsl-ls1028a-kontron-sl28.dts
board/kontron/sl28/Makefile
board/kontron/sl28/common.c [deleted file]
board/kontron/sl28/sl28.c
board/kontron/sl28/spl.c
configs/kontron_sl28_defconfig
include/configs/kontron_sl28.h

index 9561a585628b30c79f770f981160c78ad0e0105f..ea77a83d2fea3fe60cafa915b687aca9abfe4dbe 100644 (file)
        };
 };
 
+&sata {
+       status = "okay";
+};
+
 &serial0 {
        status = "okay";
 };
index 5d220f07447e4c3b516664ff0e5e512fcebff2c8..147ef9872b89c79c7ec7ce33fb7d3e6cd6f84236 100644 (file)
@@ -4,7 +4,7 @@ ifndef CONFIG_SPL_BUILD
 obj-y += sl28.o cmds.o
 endif
 
-obj-y += common.o ddr.o
+obj-y += ddr.o
 
 ifdef CONFIG_SPL_BUILD
 obj-y += spl.o
diff --git a/board/kontron/sl28/common.c b/board/kontron/sl28/common.c
deleted file mode 100644 (file)
index 14704f7..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-
-#include <common.h>
-#include <asm/arch-fsl-layerscape/soc.h>
-
-int board_early_init_f(void)
-{
-       fsl_lsch3_early_init_f();
-       return 0;
-}
index 34f17b486bd4f2b5b61563ab4b787bf2465c290e..28e8c4c9543a6a3e8c7c4dc5e9020614c1e38708 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
+int board_early_init_f(void)
+{
+       fsl_lsch3_early_init_f();
+       return 0;
+}
+
 int board_init(void)
 {
        if (CONFIG_IS_ENABLED(FSL_CAAM))
index 0ef67e2886ac6bafc69b7263d41c7d667b47b8cf..0e6ad5f37e18069818d462a6bc0dd24bbd7dd767 100644 (file)
@@ -3,10 +3,36 @@
 #include <common.h>
 #include <asm/io.h>
 #include <asm/spl.h>
+#include <asm/arch-fsl-layerscape/fsl_serdes.h>
+#include <asm/arch-fsl-layerscape/soc.h>
 
 #define DCFG_RCWSR25 0x160
 #define GPINFO_HW_VARIANT_MASK 0xff
 
+#define SERDES_LNDGCR0         0x1ea08c0
+#define   LNDGCR0_PROTS_MASK   GENMASK(11, 7)
+#define   LNDGCR0_PROTS_SATA   (0x2 << 7)
+#define SERDES_LNDGCR1         0x1ea08c4
+#define   LNDGCR1_RDAT_INV     BIT(31)
+
+/*
+ * On this board the SMARC PCIe lane D might be switched to SATA mode. This
+ * makes sense if this lane is connected to a Mini PCI slot and a mSATA card
+ * is plugged in. In this case, the RX pair is swapped and we need to invert
+ * the received data.
+ */
+static void fixup_sata_rx_polarity(void)
+{
+       u32 prot = in_le32(SERDES_LNDGCR0) & LNDGCR0_PROTS_MASK;
+       u32 tmp;
+
+       if (prot == LNDGCR0_PROTS_SATA) {
+               tmp = in_le32(SERDES_LNDGCR1);
+               tmp |= LNDGCR1_RDAT_INV;
+               out_le32(SERDES_LNDGCR1, tmp);
+       }
+}
+
 int sl28_variant(void)
 {
        return in_le32(DCFG_BASE + DCFG_RCWSR25) & GPINFO_HW_VARIANT_MASK;
@@ -34,3 +60,11 @@ void board_boot_order(u32 *spl_boot_list)
 {
        spl_boot_list[0] = BOOT_DEVICE_SPI;
 }
+
+int board_early_init_f(void)
+{
+       fixup_sata_rx_polarity();
+       fsl_lsch3_early_init_f();
+
+       return 0;
+}
index 12720f343e06dc413db4796a640073798abc8bb5..1759d5e1b92ead1c746990f4af21e0480dbb86ed 100644 (file)
@@ -62,6 +62,7 @@ CONFIG_DM=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SCSI_AHCI=y
+CONFIG_SATA_CEVA=y
 CONFIG_FSL_CAAM=y
 CONFIG_SYS_FSL_DDR3=y
 CONFIG_DM_I2C=y
index 442fb58b979e75f5bc8a7099fb286f7751dcc111..5d818a708d069c75b38bdb7aacb5b85626c777c4 100644 (file)
@@ -93,6 +93,7 @@
        func(MMC, mmc, 1) \
        func(NVME, nvme, 0) \
        func(USB, usb, 0) \
+       func(SCSI, scsi, 0) \
        func(DHCP, dhcp, 0) \
        func(PXE, pxe, 0)
 #include <config_distro_bootcmd.h>