diff options
-rw-r--r-- | arch/arm/dts/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/dts/armada-3720-turris-mox.dts | 132 | ||||
-rw-r--r-- | arch/arm/mach-mvebu/Kconfig | 7 | ||||
-rw-r--r-- | arch/arm/mach-mvebu/Makefile | 2 | ||||
-rw-r--r-- | board/CZ.NIC/turris_mox/MAINTAINERS | 6 | ||||
-rw-r--r-- | board/CZ.NIC/turris_mox/Makefile | 5 | ||||
-rw-r--r-- | board/CZ.NIC/turris_mox/turris_mox.c | 127 | ||||
-rw-r--r-- | configs/turris_mox_defconfig | 76 | ||||
-rw-r--r-- | include/configs/turris_mox.h | 108 |
9 files changed, 463 insertions, 1 deletions
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index f94940a7ddd..7bec3d6cfea 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -87,6 +87,7 @@ dtb-$(CONFIG_TEGRA) += tegra20-harmony.dtb \ dtb-$(CONFIG_ARCH_MVEBU) += \ armada-3720-db.dtb \ armada-3720-espressobin.dtb \ + armada-3720-turris-mox.dtb \ armada-375-db.dtb \ armada-388-clearfog.dtb \ armada-388-gp.dtb \ diff --git a/arch/arm/dts/armada-3720-turris-mox.dts b/arch/arm/dts/armada-3720-turris-mox.dts new file mode 100644 index 00000000000..bef100afce2 --- /dev/null +++ b/arch/arm/dts/armada-3720-turris-mox.dts @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: GPL-2.0+ or X11 +/* + * Device Tree file for CZ.NIC Turris Mox Board + * 2018 by Marek Behun <marek.behun@nic.cz> + * + * Based on armada-3720-espressobin.dts by: + * Gregory CLEMENT <gregory.clement@free-electrons.com> + * Konstantin Porotchkin <kostap@marvell.com> + */ + +/dts-v1/; + +#include <dt-bindings/gpio/gpio.h> +#include "armada-372x.dtsi" + +/ { + model = "CZ.NIC Turris Mox Board"; + compatible = "cznic,turris-mox", "marvell,armada3720", + "marvell,armada3710"; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + aliases { + ethernet0 = ð0; + i2c0 = &i2c0; + spi0 = &spi0; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x00000000 0x00000000 0x20000000>; + }; + + reg_usb3_vbus: usb3_vbus@0 { + compatible = "regulator-fixed"; + regulator-name = "usb3-vbus"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + shutdown-delay-us = <1000000>; + gpio = <&gpiosb 0 GPIO_ACTIVE_HIGH>; + regulator-boot-on; + }; + + mdio { + eth_phy1: ethernet-phy@1 { + reg = <1>; + }; + }; +}; + +&comphy { + max-lanes = <3>; + phy0 { + phy-type = <PHY_TYPE_SGMII1>; + phy-speed = <PHY_SPEED_3_125G>; + }; + + phy1 { + phy-type = <PHY_TYPE_PEX0>; + phy-speed = <PHY_SPEED_2_5G>; + }; + + phy2 { + phy-type = <PHY_TYPE_USB3_HOST0>; + phy-speed = <PHY_SPEED_5G>; + }; +}; + +ð0 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&rgmii_pins>, <&smi_pins>; + phy-mode = "rgmii"; + phy = <ð_phy1>; +}; + +&i2c0 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c1_pins>; + status = "okay"; +}; + +&sdhci1 { + bus-width = <4>; + status = "okay"; +}; + +&pinctrl_nb { + spi_cs1_pins: spi-cs1-pins { + groups = "spi_cs1"; + function = "spi"; + }; +}; + +&pinctrl_sb { + smi_pins: smi-pins { + groups = "smi"; + function = "smi"; + }; +}; + +&spi0 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&spi_cs1_pins>; + + spi-flash@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "st,s25fl064l", "spi-flash"; + reg = <0>; + spi-max-frequency = <20000000>; + m25p,fast-read; + }; +}; + +&uart0 { + pinctrl-names = "default"; + pinctrl-0 = <&uart1_pins>; + status = "okay"; +}; + +&usb2 { + status = "okay"; +}; + +&usb3 { + vbus-supply = <®_usb3_vbus>; + status = "okay"; +}; diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig index ec42cf9044e..f431cff9509 100644 --- a/arch/arm/mach-mvebu/Kconfig +++ b/arch/arm/mach-mvebu/Kconfig @@ -96,6 +96,10 @@ config TARGET_TURRIS_OMNIA bool "Support Turris Omnia" select 88F6820 +config TARGET_TURRIS_MOX + bool "Support Turris Mox" + select ARMADA_3700 + config TARGET_MVEBU_ARMADA_8K bool "Support Armada 7k/8k platforms" select ARMADA_8K @@ -133,6 +137,7 @@ config SYS_BOARD default "db-88f6820-gp" if TARGET_DB_88F6820_GP default "db-88f6820-amc" if TARGET_DB_88F6820_AMC default "turris_omnia" if TARGET_TURRIS_OMNIA + default "turris_mox" if TARGET_TURRIS_MOX default "mvebu_armada-8k" if TARGET_MVEBU_ARMADA_8K default "db-mv784mp-gp" if TARGET_DB_MV784MP_GP default "ds414" if TARGET_DS414 @@ -151,6 +156,7 @@ config SYS_CONFIG_NAME default "maxbcm" if TARGET_MAXBCM default "theadorable" if TARGET_THEADORABLE default "turris_omnia" if TARGET_TURRIS_OMNIA + default "turris_mox" if TARGET_TURRIS_MOX config SYS_VENDOR default "Marvell" if TARGET_DB_MV784MP_GP @@ -162,6 +168,7 @@ config SYS_VENDOR default "solidrun" if TARGET_CLEARFOG default "Synology" if TARGET_DS414 default "CZ.NIC" if TARGET_TURRIS_OMNIA + default "CZ.NIC" if TARGET_TURRIS_MOX config SYS_SOC default "mvebu" diff --git a/arch/arm/mach-mvebu/Makefile b/arch/arm/mach-mvebu/Makefile index af4ca03688f..3b9a8116d8e 100644 --- a/arch/arm/mach-mvebu/Makefile +++ b/arch/arm/mach-mvebu/Makefile @@ -7,7 +7,7 @@ ifdef CONFIG_ARM64 obj-$(CONFIG_ARMADA_3700) += armada3700/ obj-$(CONFIG_ARMADA_8K) += armada8k/ obj-y += arm64-common.o -obj-y += sata.o +obj-$(CONFIG_AHCI) += sata.o else # CONFIG_ARM64 diff --git a/board/CZ.NIC/turris_mox/MAINTAINERS b/board/CZ.NIC/turris_mox/MAINTAINERS new file mode 100644 index 00000000000..2b9c1132f5e --- /dev/null +++ b/board/CZ.NIC/turris_mox/MAINTAINERS @@ -0,0 +1,6 @@ +TURRIS OMNIA BOARD +M: Marek BehĂșn <marek.behun@nic.cz> +S: Maintained +F: board/CZ.NIC/turris_mox/ +F: include/configs/turris_mox.h +F: configs/turris_mox_defconfig diff --git a/board/CZ.NIC/turris_mox/Makefile b/board/CZ.NIC/turris_mox/Makefile new file mode 100644 index 00000000000..619704288b3 --- /dev/null +++ b/board/CZ.NIC/turris_mox/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (C) 2018 Marek Behun <marek.behun@nic.cz> + +obj-y := turris_mox.o diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c new file mode 100644 index 00000000000..130d4c606d3 --- /dev/null +++ b/board/CZ.NIC/turris_mox/turris_mox.c @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2018 Marek Behun <marek.behun@nic.cz> + */ + +#include <common.h> +#include <dm.h> +#include <clk.h> +#include <spi.h> +#include <linux/string.h> + +#ifdef CONFIG_WDT_ARMADA_3720 +#include <wdt.h> +#endif + +DECLARE_GLOBAL_DATA_PTR; + +#ifdef CONFIG_WDT_ARMADA_3720 +static struct udevice *watchdog_dev; + +void watchdog_reset(void) +{ + static ulong next_reset; + ulong now; + + if (!watchdog_dev) + return; + + now = timer_get_us(); + + /* Do not reset the watchdog too often */ + if (now > next_reset) { + wdt_reset(watchdog_dev); + next_reset = now + 100000; + } +} +#endif + +int board_init(void) +{ + /* address of boot parameters */ + gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; + +#ifdef CONFIG_WDT_ARMADA_3720 + if (uclass_get_device(UCLASS_WDT, 0, &watchdog_dev)) { + printf("Cannot find Armada 3720 watchdog!\n"); + } else { + printf("Enabling Armada 3720 watchdog (3 minutes timeout).\n"); + wdt_start(watchdog_dev, 180000, 0); + } +#endif + + return 0; +} + +int last_stage_init(void) +{ + struct spi_slave *slave; + struct udevice *dev; + u8 din[10], dout[10]; + int ret, i; + size_t len = 0; + char module_topology[128]; + + ret = spi_get_bus_and_cs(0, 1, 20000000, SPI_CPHA, "spi_generic_drv", + "mox-modules@1", &dev, &slave); + if (ret) + goto fail; + + ret = spi_claim_bus(slave); + if (ret) + goto fail_free; + + memset(din, 0, 10); + memset(dout, 0, 10); + + ret = spi_xfer(slave, 80, dout, din, SPI_XFER_ONCE); + if (ret) + goto fail_release; + + if (din[0] != 0x00 && din[0] != 0xff) + goto fail_release; + + printf("Module Topology:\n"); + for (i = 1; i < 10 && din[i] != 0xff; ++i) { + u8 mid = din[i] & 0xf; + size_t mlen; + const char *mname = ""; + + switch (mid) { + case 0x1: + mname = "sfp-"; + printf("% 4i: SFP Module\n", i); + break; + case 0x2: + mname = "pci-"; + printf("% 4i: Mini-PCIe Module\n", i); + break; + case 0x3: + mname = "topaz-"; + printf("% 4i: Topaz Switch Module\n", i); + break; + default: + printf("% 4i: unknown (ID %i)\n", i, mid); + } + + mlen = strlen(mname); + if (len + mlen < sizeof(module_topology)) { + strcpy(module_topology + len, mname); + len += mlen; + } + } + printf("\n"); + + module_topology[len > 0 ? len - 1 : 0] = '\0'; + + env_set("module_topology", module_topology); + +fail_release: + spi_release_bus(slave); +fail_free: + spi_free_slave(slave); +fail: + if (ret) + printf("Cannot read module topology!\n"); + return ret; +} diff --git a/configs/turris_mox_defconfig b/configs/turris_mox_defconfig new file mode 100644 index 00000000000..7dea7157dcd --- /dev/null +++ b/configs/turris_mox_defconfig @@ -0,0 +1,76 @@ +CONFIG_ARM=y +CONFIG_ARCH_MVEBU=y +CONFIG_SYS_TEXT_BASE=0x00000000 +CONFIG_SYS_MALLOC_F_LEN=0x2000 +CONFIG_TARGET_TURRIS_MOX=y +CONFIG_DEFAULT_DEVICE_TREE="armada-3720-turris-mox" +CONFIG_DEBUG_UART=y +CONFIG_DISTRO_DEFAULTS=y +# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set +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_CMD_FLASH is not set +CONFIG_CMD_CLK=y +CONFIG_CMD_I2C=y +CONFIG_CMD_MMC=y +CONFIG_CMD_SF=y +CONFIG_CMD_SPI=y +CONFIG_CMD_USB=y +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_TFTPPUT=y +CONFIG_CMD_CACHE=y +CONFIG_CMD_TIME=y +CONFIG_CMD_MVEBU_BUBT=y +CONFIG_CMD_BTRFS=y +CONFIG_CMD_EXT4_WRITE=y +CONFIG_MAC_PARTITION=y +CONFIG_ENV_IS_IN_SPI_FLASH=y +CONFIG_BLOCK_CACHE=y +CONFIG_DM_I2C=y +CONFIG_MISC=y +CONFIG_CLK=y +CONFIG_CLK_MVEBU=y +CONFIG_CLK_ARMADA_3720=y +CONFIG_DM_MMC=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_XENON=y +CONFIG_WDT=y +CONFIG_WDT_ARMADA_37XX=y +CONFIG_DM_GPIO=y +# CONFIG_MVEBU_GPIO is not set +CONFIG_PINCTRL=y +CONFIG_PINCTRL_GENERIC=y +CONFIG_PINMUX=y +CONFIG_PINCTRL_ARMADA_37XX=y +CONFIG_SPI_FLASH=y +CONFIG_SPI_FLASH_MACRONIX=y +CONFIG_SPI_FLASH_SPANSION=y +CONFIG_SPI_FLASH_STMICRO=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_PHYLIB=y +CONFIG_PHY_GIGE=y +CONFIG_MVNETA=y +CONFIG_MVEBU_COMPHY_SUPPORT=y +# CONFIG_SPL_SERIAL_PRESENT is not set +CONFIG_DEBUG_MVEBU_A3700_UART=y +CONFIG_DEBUG_UART_BASE=0xd0012000 +CONFIG_DEBUG_UART_CLOCK=25804800 +CONFIG_DEBUG_UART_SHIFT=2 +CONFIG_DEBUG_UART_ANNOUNCE=y +CONFIG_MVEBU_A3700_UART=y +CONFIG_MVEBU_A3700_SPI=y +CONFIG_USB=y +CONFIG_DM_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_STORAGE=y +CONFIG_USB_HOST_ETHER=y +CONFIG_USB_ETHER_ASIX=y +CONFIG_USB_ETHER_MCS7830=y +CONFIG_USB_ETHER_RTL8152=y +CONFIG_USB_ETHER_SMSC95XX=y +CONFIG_SHA1=y +CONFIG_SHA256=y diff --git a/include/configs/turris_mox.h b/include/configs/turris_mox.h new file mode 100644 index 00000000000..5784851271d --- /dev/null +++ b/include/configs/turris_mox.h @@ -0,0 +1,108 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2018 Marek Behun <marek.behun@nic.cz> + * + * Based on mvebu_armada-37xx.h by Stefan Roese <sr@denx.de> + */ + +#ifndef _CONFIG_TURRIS_MOX_H +#define _CONFIG_TURRIS_MOX_H + +#define CONFIG_LAST_STAGE_INIT + +/* + * High Level Configuration Options (easy to change) + */ +#define CONFIG_DISPLAY_BOARDINFO_LATE + +/* additions for new ARM relocation support */ +#define CONFIG_SYS_SDRAM_BASE 0x00000000 + +#define CONFIG_NR_DRAM_BANKS 1 + +/* auto boot */ +#define CONFIG_PREBOOT + +#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, \ + 115200, 230400, 460800, 921600 } + +/* + * For booting Linux, the board info and command line data + * have to be in the first 8 MB of memory, since this is + * the maximum mapped by the Linux kernel during initialization. + */ +#define CONFIG_CMDLINE_TAG /* enable passing of ATAGs */ +#define CONFIG_INITRD_TAG /* enable INITRD tag */ +#define CONFIG_SETUP_MEMORY_TAGS /* enable memory tag */ + +#define CONFIG_SYS_CBSIZE 1024 /* Console I/O Buff Size */ + +/* + * Size of malloc() pool + */ +#define CONFIG_SYS_MALLOC_LEN (4 << 20) /* 4MiB for malloc() */ + +/* + * Other required minimal configurations + */ +#define CONFIG_ARCH_CPU_INIT /* call arch_cpu_init() */ +#define CONFIG_SYS_LOAD_ADDR 0x00800000 /* default load adr- 8M */ +#define CONFIG_SYS_MEMTEST_START 0x00800000 /* 8M */ +#define CONFIG_SYS_MEMTEST_END 0x00ffffff /*(_16M -1) */ +#define CONFIG_SYS_RESET_ADDRESS 0xffff0000 /* Rst Vector Adr */ +#define CONFIG_SYS_MAXARGS 32 /* max number of command args */ + +#define CONFIG_SYS_ALT_MEMTEST + +/* End of 16M scrubbed by training in bootrom */ +#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_TEXT_BASE + 0xFF0000) + +/* + * I2C + */ +#define CONFIG_I2C_MV +#define CONFIG_SYS_I2C_SLAVE 0x0 + +/* + * SPI Flash configuration + */ +#define CONFIG_ENV_SPI_BUS 0 +#define CONFIG_ENV_SPI_CS 0 + +/* SPI NOR flash default params, used by sf commands */ +#define CONFIG_SF_DEFAULT_SPEED 20000000 +#define CONFIG_SF_DEFAULT_MODE SPI_MODE_0 +#define CONFIG_ENV_SPI_MODE CONFIG_SF_DEFAULT_MODE + +/* Environment in SPI NOR flash */ +#define CONFIG_ENV_OFFSET 0x180000 /* as Marvell U-Boot version */ +#define CONFIG_ENV_SIZE (64 << 10) /* 64KiB */ +#define CONFIG_ENV_SECT_SIZE (64 << 10) /* 64KiB sectors */ + +/* + * Ethernet Driver configuration + */ +#define CONFIG_ENV_OVERWRITE /* ethaddr can be reprogrammed */ +#define CONFIG_ARP_TIMEOUT 200 +#define CONFIG_NET_RETRY_COUNT 50 +#define CONFIG_PHY_MARVELL + +#define CONFIG_USB_MAX_CONTROLLER_COUNT (3 + 3) + +#define BOOT_TARGET_DEVICES(func) \ + func(MMC, mmc, 0) \ + func(USB, usb, 0) \ + func(PXE, pxe, na) \ + func(DHCP, dhcp, na) + +#include <config_distro_bootcmd.h> + +#define CONFIG_EXTRA_ENV_SETTINGS \ + "scriptaddr=0x4d00000\0" \ + "pxefile_addr_r=0x4e00000\0" \ + "fdt_addr_r=0x4f00000\0" \ + "kernel_addr_r=0x5000000\0" \ + "ramdisk_addr_r=0x8000000\0" \ + BOOTENV + +#endif /* _CONFIG_TURRIS_MOX_H */ |