diff mbox series

[U-Boot,u-boot-marvell,v3,04/12] board: turris_mox: Fixup U-Boot's device tree if PCIe connected

Message ID 20180821102209.21474-1-marek.behun@nic.cz
State Accepted
Commit 863949e383a96bc698261ef14b195018fcb0100d
Delegated to: Stefan Roese
Headers show
Series None | expand

Commit Message

Marek BehĂșn Aug. 21, 2018, 10:22 a.m. UTC
If PCIe Mox module is connected we want to have PCIe node enabled
in U-Boot's device tree.

Signed-off-by: Marek Behun <marek.behun@nic.cz>
---
 arch/arm/dts/armada-3720-turris-mox.dts |  7 +++
 board/CZ.NIC/turris_mox/turris_mox.c    | 82 +++++++++++++++++++++++++++++++++
 configs/turris_mox_defconfig            |  1 +
 3 files changed, 90 insertions(+)

Comments

Stefan Roese Sept. 19, 2018, 12:28 p.m. UTC | #1
On 21.08.2018 12:22, Marek BehĂșn wrote:
> If PCIe Mox module is connected we want to have PCIe node enabled
> in U-Boot's device tree.
> 
> Signed-off-by: Marek Behun <marek.behun@nic.cz>
> ---
>   arch/arm/dts/armada-3720-turris-mox.dts |  7 +++
>   board/CZ.NIC/turris_mox/turris_mox.c    | 82 +++++++++++++++++++++++++++++++++
>   configs/turris_mox_defconfig            |  1 +
>   3 files changed, 90 insertions(+)
> 
> diff --git a/arch/arm/dts/armada-3720-turris-mox.dts b/arch/arm/dts/armada-3720-turris-mox.dts
> index bef100afce..a817f20920 100644
> --- a/arch/arm/dts/armada-3720-turris-mox.dts
> +++ b/arch/arm/dts/armada-3720-turris-mox.dts
> @@ -130,3 +130,10 @@
>   	vbus-supply = <&reg_usb3_vbus>;
>   	status = "okay";
>   };
> +
> +&pcie0 {
> +	pinctrl-names = "default";
> +	pinctrl-0 = <&pcie_pins>;
> +	reset-gpio = <&gpiosb 3 GPIO_ACTIVE_HIGH>;
> +	status = "disabled";
> +};
> diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c
> index b6a0ca4626..c4622a49c2 100644
> --- a/board/CZ.NIC/turris_mox/turris_mox.c
> +++ b/board/CZ.NIC/turris_mox/turris_mox.c
> @@ -4,17 +4,99 @@
>    */
>   
>   #include <common.h>
> +#include <asm/io.h>
>   #include <dm.h>
>   #include <clk.h>
>   #include <spi.h>
>   #include <linux/string.h>
> +#include <linux/libfdt.h>
> +#include <fdt_support.h>
>   
>   #ifdef CONFIG_WDT_ARMADA_37XX
>   #include <wdt.h>
>   #endif
>   
> +#define MAX_MOX_MODULES		10
> +
> +#define MOX_MODULE_SFP		0x1
> +#define MOX_MODULE_PCI		0x2
> +#define MOX_MODULE_TOPAZ	0x3
> +#define MOX_MODULE_PERIDOT	0x4
> +#define MOX_MODULE_USB3		0x5
> +#define MOX_MODULE_PASSPCI	0x6
> +
> +#define ARMADA_37XX_NB_GPIO_SEL	0xd0013830
> +#define ARMADA_37XX_SPI_CTRL	0xd0010600
> +#define ARMADA_37XX_SPI_CFG	0xd0010604
> +#define ARMADA_37XX_SPI_DOUT	0xd0010608
> +#define ARMADA_37XX_SPI_DIN	0xd001060c
> +
> +#define PCIE_PATH	"/soc/pcie@d0070000"
> +
>   DECLARE_GLOBAL_DATA_PTR;
>   
> +#if defined(CONFIG_OF_BOARD_FIXUP)
> +int board_fix_fdt(void *blob)
> +{
> +	u8 topology[MAX_MOX_MODULES];
> +	int i, size, node;
> +	bool enable;
> +
> +	/*
> +	 * SPI driver is not loaded in driver model yet, but we have to find out
> +	 * if pcie should be enabled in U-Boot's device tree. Therefore we have
> +	 * to read SPI by reading/writing SPI registers directly
> +	 */
> +
> +	writel(0x563fa, ARMADA_37XX_NB_GPIO_SEL);
> +	writel(0x10df, ARMADA_37XX_SPI_CFG);
> +	writel(0x2005b, ARMADA_37XX_SPI_CTRL);
> +
> +	while (!(readl(ARMADA_37XX_SPI_CTRL) & 0x2))
> +		udelay(1);
> +
> +	for (i = 0; i < MAX_MOX_MODULES; ++i) {
> +		writel(0x0, ARMADA_37XX_SPI_DOUT);
> +
> +		while (!(readl(ARMADA_37XX_SPI_CTRL) & 0x2))
> +			udelay(1);
> +
> +		topology[i] = readl(ARMADA_37XX_SPI_DIN) & 0xff;
> +		if (topology[i] == 0xff)
> +			break;
> +
> +		topology[i] &= 0xf;
> +	}
> +
> +	size = i;
> +
> +	writel(0x5b, ARMADA_37XX_SPI_CTRL);
> +
> +	if (size > 1 && (topology[1] == MOX_MODULE_PCI ||
> +			 topology[1] == MOX_MODULE_USB3 ||
> +			 topology[1] == MOX_MODULE_PASSPCI))
> +		enable = true;
> +	else
> +		enable = false;
> +
> +	node = fdt_path_offset(blob, PCIE_PATH);
> +
> +	if (node < 0) {
> +		printf("Cannot find PCIe node in U-Boot's device tree!\n");
> +		return 0;
> +	}
> +
> +	if (fdt_setprop_string(blob, node, "status",
> +			       enable ? "okay" : "disabled") < 0) {
> +		printf("Cannot %s PCIe in U-Boot's device tree!\n",
> +		       enable ? "enable" : "disable");
> +		return 0;
> +	}
> +
> +	return 0;
> +}
> +#endif
> +
>   #ifdef CONFIG_WDT_ARMADA_37XX
>   static struct udevice *watchdog_dev;
>   
> diff --git a/configs/turris_mox_defconfig b/configs/turris_mox_defconfig
> index de9aedc764..47ab914ce9 100644
> --- a/configs/turris_mox_defconfig
> +++ b/configs/turris_mox_defconfig
> @@ -13,6 +13,7 @@ CONFIG_SYS_CONSOLE_INFO_QUIET=y
>   # CONFIG_DISPLAY_CPUINFO is not set
>   # CONFIG_DISPLAY_BOARDINFO is not set
>   CONFIG_ARCH_EARLY_INIT_R=y
> +CONFIG_OF_BOARD_FIXUP=y
>   CONFIG_CMD_CLK=y
>   # CONFIG_CMD_FLASH is not set
>   CONFIG_CMD_I2C=y
> 

Applied to u-boot-marvell/master

Thanks,
Stefan
diff mbox series

Patch

diff --git a/arch/arm/dts/armada-3720-turris-mox.dts b/arch/arm/dts/armada-3720-turris-mox.dts
index bef100afce..a817f20920 100644
--- a/arch/arm/dts/armada-3720-turris-mox.dts
+++ b/arch/arm/dts/armada-3720-turris-mox.dts
@@ -130,3 +130,10 @@ 
 	vbus-supply = <&reg_usb3_vbus>;
 	status = "okay";
 };
+
+&pcie0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pcie_pins>;
+	reset-gpio = <&gpiosb 3 GPIO_ACTIVE_HIGH>;
+	status = "disabled";
+};
diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c
index b6a0ca4626..c4622a49c2 100644
--- a/board/CZ.NIC/turris_mox/turris_mox.c
+++ b/board/CZ.NIC/turris_mox/turris_mox.c
@@ -4,17 +4,99 @@ 
  */
 
 #include <common.h>
+#include <asm/io.h>
 #include <dm.h>
 #include <clk.h>
 #include <spi.h>
 #include <linux/string.h>
+#include <linux/libfdt.h>
+#include <fdt_support.h>
 
 #ifdef CONFIG_WDT_ARMADA_37XX
 #include <wdt.h>
 #endif
 
+#define MAX_MOX_MODULES		10
+
+#define MOX_MODULE_SFP		0x1
+#define MOX_MODULE_PCI		0x2
+#define MOX_MODULE_TOPAZ	0x3
+#define MOX_MODULE_PERIDOT	0x4
+#define MOX_MODULE_USB3		0x5
+#define MOX_MODULE_PASSPCI	0x6
+
+#define ARMADA_37XX_NB_GPIO_SEL	0xd0013830
+#define ARMADA_37XX_SPI_CTRL	0xd0010600
+#define ARMADA_37XX_SPI_CFG	0xd0010604
+#define ARMADA_37XX_SPI_DOUT	0xd0010608
+#define ARMADA_37XX_SPI_DIN	0xd001060c
+
+#define PCIE_PATH	"/soc/pcie@d0070000"
+
 DECLARE_GLOBAL_DATA_PTR;
 
+#if defined(CONFIG_OF_BOARD_FIXUP)
+int board_fix_fdt(void *blob)
+{
+	u8 topology[MAX_MOX_MODULES];
+	int i, size, node;
+	bool enable;
+
+	/*
+	 * SPI driver is not loaded in driver model yet, but we have to find out
+	 * if pcie should be enabled in U-Boot's device tree. Therefore we have
+	 * to read SPI by reading/writing SPI registers directly
+	 */
+
+	writel(0x563fa, ARMADA_37XX_NB_GPIO_SEL);
+	writel(0x10df, ARMADA_37XX_SPI_CFG);
+	writel(0x2005b, ARMADA_37XX_SPI_CTRL);
+
+	while (!(readl(ARMADA_37XX_SPI_CTRL) & 0x2))
+		udelay(1);
+
+	for (i = 0; i < MAX_MOX_MODULES; ++i) {
+		writel(0x0, ARMADA_37XX_SPI_DOUT);
+
+		while (!(readl(ARMADA_37XX_SPI_CTRL) & 0x2))
+			udelay(1);
+
+		topology[i] = readl(ARMADA_37XX_SPI_DIN) & 0xff;
+		if (topology[i] == 0xff)
+			break;
+
+		topology[i] &= 0xf;
+	}
+
+	size = i;
+
+	writel(0x5b, ARMADA_37XX_SPI_CTRL);
+
+	if (size > 1 && (topology[1] == MOX_MODULE_PCI ||
+			 topology[1] == MOX_MODULE_USB3 ||
+			 topology[1] == MOX_MODULE_PASSPCI))
+		enable = true;
+	else
+		enable = false;
+
+	node = fdt_path_offset(blob, PCIE_PATH);
+
+	if (node < 0) {
+		printf("Cannot find PCIe node in U-Boot's device tree!\n");
+		return 0;
+	}
+
+	if (fdt_setprop_string(blob, node, "status",
+			       enable ? "okay" : "disabled") < 0) {
+		printf("Cannot %s PCIe in U-Boot's device tree!\n",
+		       enable ? "enable" : "disable");
+		return 0;
+	}
+
+	return 0;
+}
+#endif
+
 #ifdef CONFIG_WDT_ARMADA_37XX
 static struct udevice *watchdog_dev;
 
diff --git a/configs/turris_mox_defconfig b/configs/turris_mox_defconfig
index de9aedc764..47ab914ce9 100644
--- a/configs/turris_mox_defconfig
+++ b/configs/turris_mox_defconfig
@@ -13,6 +13,7 @@  CONFIG_SYS_CONSOLE_INFO_QUIET=y
 # CONFIG_DISPLAY_CPUINFO is not set
 # CONFIG_DISPLAY_BOARDINFO is not set
 CONFIG_ARCH_EARLY_INIT_R=y
+CONFIG_OF_BOARD_FIXUP=y
 CONFIG_CMD_CLK=y
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_I2C=y