Message ID | 20180821102209.21474-1-marek.behun@nic.cz |
---|---|
State | Accepted |
Commit | 863949e383a96bc698261ef14b195018fcb0100d |
Delegated to: | Stefan Roese |
Headers | show |
Series | None | expand |
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 = <®_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 --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 = <®_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
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(+)