All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
@ 2017-06-09 17:28 Marek Behún
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 1/7] driver/ddr: Add support for setting timing in hws_topology_map Marek Behún
                   ` (7 more replies)
  0 siblings, 8 replies; 27+ messages in thread
From: Marek Behún @ 2017-06-09 17:28 UTC (permalink / raw)
  To: u-boot

This is the fourth version of patches for adding support for the
Turris Omnia board, a router developed by the CZ.NIC.

Modifications from last version:
  - Since the new driver model API does not expose the
    watchdog_reset function, only wdt_reset, the watchdog did not
    get restarted and the device rebooted every 2 minutes in U-Boot.
    These patches solve this problem.
  - The SPI flash could not be accessed. I did not notice this since
    during my testing I always uploaded the SPL image via serial
    line. This is now also solved.

The first patch modifies Marvell's DDR3 training code to be more
general, so that board topology map can force 2t timing.

The second patch adds support for the hardware watchdog which
can be found on Omnia. I have modified the driver to use the new
driver model API.

The third patch adds the device tree for Turris Omnia taken from
Linux kernel and also armada-385-turris-omnia-u-boot.dtsi file
with some additions for U-Boot.

The fourth patch adds support for the I2C multiplexer found on
Turris Omnia.

The fifth patch adds support for the ATSHA204A CryptoAuthentication
chip, on which the Turris Omnia stores serial number and device MAC
address.

The sixth patch adds the proper support for the board. I have
modified config to use distro defaults as requested by Andreas
Faerber and also removed unnecessary comments.

Marek Behun

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 1/7] driver/ddr: Add support for setting timing in hws_topology_map
  2017-06-09 17:28 [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Marek Behún
@ 2017-06-09 17:28 ` Marek Behún
  2018-01-10  2:49   ` Chris Packham
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 2/7] orion_wdt: Support for the Orion Watchdog Marek Behún
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 27+ messages in thread
From: Marek Behún @ 2017-06-09 17:28 UTC (permalink / raw)
  To: u-boot

The DDR3 training code for Marvell A38X currently computes 1t timing
when given board topology map of the Turris Omnia, but Omnia needs 2t.

This patch adds support for enforcing the 2t timing in struct
hws_topology_map, through a new enum hws_timing, which can assume
following values:
  HWS_TIM_DEFAULT - default behaviour, compute whether to enable 2t
                    from the number of CSs
  HWS_TIM_1T      - enforce 1t
  HWS_TIM_2T      - enforce 2t

This patch also sets all the board topology maps (db-88f6820-amc,
db-88f6820-gp, controlcenterdc and clearfog) to have timing set to
HWS_TIM_DEFAULT.

Signed-off-by: Marek Behun <marek.behun@nic.cz>
Reviewed-by: Stefan Roese <sr@denx.de>

diff --git a/board/Marvell/db-88f6820-amc/db-88f6820-amc.c b/board/Marvell/db-88f6820-amc/db-88f6820-amc.c
index cade99c8d7..40fa599865 100644
--- a/board/Marvell/db-88f6820-amc/db-88f6820-amc.c
+++ b/board/Marvell/db-88f6820-amc/db-88f6820-amc.c
@@ -69,7 +69,8 @@ static struct hws_topology_map board_topology_map = {
 	    MEM_4G,			/* mem_size */
 	    DDR_FREQ_800,		/* frequency */
 	    0, 0,			/* cas_l cas_wl */
-	    HWS_TEMP_LOW} },		/* temperature */
+	    HWS_TEMP_LOW,		/* temperature */
+	    HWS_TIM_DEFAULT} },		/* timing */
 	5,				/* Num Of Bus Per Interface*/
 	BUS_MASK_32BIT			/* Busses mask */
 };
diff --git a/board/Marvell/db-88f6820-gp/db-88f6820-gp.c b/board/Marvell/db-88f6820-gp/db-88f6820-gp.c
index e700781103..a1974cb4bd 100644
--- a/board/Marvell/db-88f6820-gp/db-88f6820-gp.c
+++ b/board/Marvell/db-88f6820-gp/db-88f6820-gp.c
@@ -90,7 +90,8 @@ static struct hws_topology_map board_topology_map = {
 	    MEM_4G,			/* mem_size */
 	    DDR_FREQ_800,		/* frequency */
 	    0, 0,			/* cas_l cas_wl */
-	    HWS_TEMP_LOW} },		/* temperature */
+	    HWS_TEMP_LOW,		/* temperature */
+	    HWS_TIM_DEFAULT} },		/* timing */
 	5,				/* Num Of Bus Per Interface*/
 	BUS_MASK_32BIT			/* Busses mask */
 };
diff --git a/board/gdsys/a38x/controlcenterdc.c b/board/gdsys/a38x/controlcenterdc.c
index f0efb53447..32168d3576 100644
--- a/board/gdsys/a38x/controlcenterdc.c
+++ b/board/gdsys/a38x/controlcenterdc.c
@@ -53,7 +53,8 @@ static struct hws_topology_map ddr_topology_map = {
 	    MEM_4G,			/* mem_size */
 	    DDR_FREQ_533,		/* frequency */
 	    0, 0,			/* cas_l cas_wl */
-	    HWS_TEMP_LOW} },		/* temperature */
+	    HWS_TEMP_LOW,		/* temperature */
+	    HWS_TIM_DEFAULT} },		/* timing */
 	5,				/* Num Of Bus Per Interface*/
 	BUS_MASK_32BIT			/* Busses mask */
 };
diff --git a/board/solidrun/clearfog/clearfog.c b/board/solidrun/clearfog/clearfog.c
index 3a8257cac3..8906636f76 100644
--- a/board/solidrun/clearfog/clearfog.c
+++ b/board/solidrun/clearfog/clearfog.c
@@ -83,7 +83,8 @@ static struct hws_topology_map board_topology_map = {
 	    MEM_4G,			/* mem_size */
 	    DDR_FREQ_800,		/* frequency */
 	    0, 0,			/* cas_l cas_wl */
-	    HWS_TEMP_LOW} },		/* temperature */
+	    HWS_TEMP_LOW,		/* temperature */
+	    HWS_TIM_DEFAULT} },		/* timing */
 	5,				/* Num Of Bus Per Interface*/
 	BUS_MASK_32BIT			/* Busses mask */
 };
diff --git a/drivers/ddr/marvell/a38x/ddr3_training.c b/drivers/ddr/marvell/a38x/ddr3_training.c
index 7e0749fde3..e70ca4b425 100644
--- a/drivers/ddr/marvell/a38x/ddr3_training.c
+++ b/drivers/ddr/marvell/a38x/ddr3_training.c
@@ -308,6 +308,7 @@ int hws_ddr3_tip_init_controller(u32 dev_num, struct init_cntr_param *init_cntr_
 	enum hws_speed_bin speed_bin_index = SPEED_BIN_DDR_2133N;
 	enum hws_mem_size memory_size = MEM_2G;
 	enum hws_ddr_freq freq = init_freq;
+	enum hws_timing timing;
 	u32 cs_mask = 0;
 	u32 cl_value = 0, cwl_val = 0;
 	u32 refresh_interval_cnt = 0, bus_cnt = 0, adll_tap = 0;
@@ -569,8 +570,13 @@ int hws_ddr3_tip_init_controller(u32 dev_num, struct init_cntr_param *init_cntr_
 				      DUNIT_CONTROL_HIGH_REG,
 				      (init_cntr_prm->msys_init << 7), (1 << 7)));
 
+			timing = tm->interface_params[if_id].timing;
+
 			if (mode2_t != 0xff) {
 				t2t = mode2_t;
+			} else if (timing != HWS_TIM_DEFAULT) {
+				/* Board topology map is forcing timing */
+				t2t = (timing == HWS_TIM_2T) ? 1 : 0;
 			} else {
 				/* calculate number of CS (per interface) */
 				CHECK_STATUS(calc_cs_num
diff --git a/drivers/ddr/marvell/a38x/ddr_topology_def.h b/drivers/ddr/marvell/a38x/ddr_topology_def.h
index f8894e828a..229c3a127a 100644
--- a/drivers/ddr/marvell/a38x/ddr_topology_def.h
+++ b/drivers/ddr/marvell/a38x/ddr_topology_def.h
@@ -37,6 +37,12 @@ enum hws_mem_size {
 	MEM_SIZE_LAST
 };
 
+enum hws_timing {
+	HWS_TIM_DEFAULT,
+	HWS_TIM_1T,
+	HWS_TIM_2T
+};
+
 struct bus_params {
 	/* Chip Select (CS) bitmask (bits 0-CS0, bit 1- CS1 ...) */
 	u8 cs_bitmask;
@@ -84,6 +90,9 @@ struct if_params {
 
 	/* operation temperature */
 	enum hws_temperature interface_temp;
+
+	/* 2T vs 1T mode (by default computed from number of CSs) */
+	enum hws_timing timing;
 };
 
 struct hws_topology_map {
-- 
2.13.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 2/7] orion_wdt: Support for the Orion Watchdog
  2017-06-09 17:28 [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Marek Behún
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 1/7] driver/ddr: Add support for setting timing in hws_topology_map Marek Behún
@ 2017-06-09 17:28 ` Marek Behún
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 3/7] arch/arm/dts: Add Turris Omnia device tree Marek Behún
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2017-06-09 17:28 UTC (permalink / raw)
  To: u-boot

The Orion watchdog can be found on some Marvell Armada chips.

This driver is based on the code by Tomas Hlavacek in the CZ.NIC
turris-omnia-uboot repository, which can be found at
https://gitlab.labs.nic.cz/turris/turris-omnia-uboot, and that
one is based on code by Sylver Bruneau. His code is already in
mainline Linux kernel.

The code uses the new driver model API.

Signed-off-by: Tomas Hlavacek <tomas.hlavacek@nic.cz>
Signed-off-by: Marek Behun <marek.behun@nic.cz>

 create mode 100644 drivers/watchdog/orion_wdt.c

diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index b911233db3..d360a17d4d 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -62,4 +62,11 @@ config WDT_BCM6345
 	  The watchdog timer is stopped when initialized.
 	  It performs full SoC reset.
 
+config WDT_ORION
+	bool "Orion watchdog timer support"
+	depends on WDT
+	help
+	   Select this to enable Orion watchdog timer, which can be found on some
+	   Marvell Armada chips.
+
 endmenu
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index 4b19e4ccf6..3230cbb2ad 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -20,3 +20,4 @@ obj-$(CONFIG_WDT_SANDBOX) += sandbox_wdt.o
 obj-$(CONFIG_WDT_ASPEED) += ast_wdt.o
 obj-$(CONFIG_WDT_BCM6345) += bcm6345_wdt.o
 obj-$(CONFIG_BCM2835_WDT)       += bcm2835_wdt.o
+obj-$(CONFIG_WDT_ORION) += orion_wdt.o
diff --git a/drivers/watchdog/orion_wdt.c b/drivers/watchdog/orion_wdt.c
new file mode 100644
index 0000000000..a0df02d103
--- /dev/null
+++ b/drivers/watchdog/orion_wdt.c
@@ -0,0 +1,177 @@
+/*
+ * drivers/watchdog/orion_wdt.c
+ *
+ * Watchdog driver for Orion/Kirkwood processors
+ *
+ * Authors:	Tomas Hlavacek <tmshlvck@gmail.com>
+ * 		Sylver Bruneau <sylver.bruneau@googlemail.com>
+ * 		Marek Behun <marek.behun@nic.cz>
+ *
+ * This file is licensed under  the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <wdt.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+struct orion_wdt_priv {
+	void __iomem *reg;
+	int wdt_counter_offset;
+	void __iomem *rstout;
+	void __iomem *rstout_mask;
+	u32 timeout;
+};
+
+#define RSTOUT_ENABLE_BIT		BIT(8)
+#define RSTOUT_MASK_BIT			BIT(10)
+#define WDT_ENABLE_BIT			BIT(8)
+
+#define TIMER_CTRL			0x0000
+#define TIMER_A370_STATUS		0x04
+
+#define WDT_AXP_FIXED_ENABLE_BIT	BIT(10)
+#define WDT_A370_EXPIRED		BIT(31)
+
+static int orion_wdt_reset(struct udevice *dev)
+{
+	struct orion_wdt_priv *priv = dev_get_priv(dev);
+
+	/* Reload watchdog duration */
+	writel(priv->timeout, priv->reg + priv->wdt_counter_offset);
+
+	return 0;
+}
+
+static int orion_wdt_start(struct udevice *dev, u64 timeout, ulong flags)
+{
+	struct orion_wdt_priv *priv = dev_get_priv(dev);
+	u32 reg;
+
+	priv->timeout = (u32) timeout;
+
+	/* Enable the fixed watchdog clock input */
+	reg = readl(priv->reg + TIMER_CTRL);
+	reg |= WDT_AXP_FIXED_ENABLE_BIT;
+	writel(reg, priv->reg + TIMER_CTRL);
+
+	/* Set watchdog duration */
+	writel(priv->timeout, priv->reg + priv->wdt_counter_offset);
+
+	/* Clear the watchdog expiration bit */
+	reg = readl(priv->reg + TIMER_A370_STATUS);
+	reg &= ~WDT_A370_EXPIRED;
+	writel(reg, priv->reg + TIMER_A370_STATUS);
+
+	/* Enable watchdog timer */
+	reg = readl(priv->reg + TIMER_CTRL);
+	reg |= WDT_ENABLE_BIT;
+	writel(reg, priv->reg + TIMER_CTRL);
+
+	/* Enable reset on watchdog */
+	reg = readl(priv->rstout);
+	reg |= RSTOUT_ENABLE_BIT;
+	writel(reg, priv->rstout);
+
+	reg = readl(priv->rstout_mask);
+	reg &= ~RSTOUT_MASK_BIT;
+	writel(reg, priv->rstout_mask);
+
+	return 0;
+}
+
+static int orion_wdt_stop(struct udevice *dev)
+{
+	struct orion_wdt_priv *priv = dev_get_priv(dev);
+	u32 reg;
+
+	/* Disable reset on watchdog */
+	reg = readl(priv->rstout_mask);
+	reg |= RSTOUT_MASK_BIT;
+	writel(reg, priv->rstout_mask);
+
+	reg = readl(priv->rstout);
+	reg &= ~RSTOUT_ENABLE_BIT;
+	writel(reg, priv->rstout);
+
+	/* Disable watchdog timer */
+	reg = readl(priv->reg + TIMER_CTRL);
+	reg &= ~WDT_ENABLE_BIT;
+	writel(reg, priv->reg + TIMER_CTRL);
+
+	return 0;
+}
+
+static inline bool save_reg_from_ofdata(struct udevice *dev, int index,
+					void __iomem **reg, int *offset)
+{
+	fdt_addr_t addr;
+	fdt_size_t off;
+
+	addr = fdtdec_get_addr_size_auto_noparent(
+		gd->fdt_blob, dev_of_offset(dev), "reg", index, &off, true);
+
+	if (addr == FDT_ADDR_T_NONE)
+		return false;
+
+	*reg = (void __iomem *) addr;
+	if (offset)
+		*offset = off;
+
+	return true;
+}
+
+static int orion_wdt_ofdata_to_platdata(struct udevice *dev)
+{
+	struct orion_wdt_priv *priv = dev_get_priv(dev);
+
+	if (!save_reg_from_ofdata(dev, 0, &priv->reg,
+				  &priv->wdt_counter_offset))
+		goto err;
+
+	if (!save_reg_from_ofdata(dev, 1, &priv->rstout, NULL))
+		goto err;
+
+	if (!save_reg_from_ofdata(dev, 2, &priv->rstout_mask, NULL))
+		goto err;
+
+	return 0;
+err:
+	debug("%s: Could not determine Orion wdt IO addresses\n", __func__);
+	return -ENXIO;
+}
+
+static int orion_wdt_probe(struct udevice *dev)
+{
+	debug("%s: Probing wdt%u\n", __func__, dev->seq);
+	orion_wdt_stop(dev);
+
+	return 0;
+}
+
+static const struct wdt_ops orion_wdt_ops = {
+	.start = orion_wdt_start,
+	.reset = orion_wdt_reset,
+	.stop = orion_wdt_stop,
+};
+
+static const struct udevice_id orion_wdt_ids[] = {
+	{ .compatible = "marvell,armada-380-wdt" },
+	{}
+};
+
+U_BOOT_DRIVER(orion_wdt) = {
+	.name = "orion_wdt",
+	.id = UCLASS_WDT,
+	.of_match = orion_wdt_ids,
+	.probe = orion_wdt_probe,
+	.priv_auto_alloc_size = sizeof(struct orion_wdt_priv),
+	.ofdata_to_platdata = orion_wdt_ofdata_to_platdata,
+	.ops = &orion_wdt_ops,
+};
-- 
2.13.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 3/7] arch/arm/dts: Add Turris Omnia device tree
  2017-06-09 17:28 [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Marek Behún
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 1/7] driver/ddr: Add support for setting timing in hws_topology_map Marek Behún
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 2/7] orion_wdt: Support for the Orion Watchdog Marek Behún
@ 2017-06-09 17:28 ` Marek Behún
  2017-07-07 11:58   ` Stefan Roese
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 4/7] drivers/i2c/muxes/pca954x: Add pca9547 I2C mux support Marek Behún
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 27+ messages in thread
From: Marek Behún @ 2017-06-09 17:28 UTC (permalink / raw)
  To: u-boot

This device tree is taken from mainline Linux kernel commit
7b7db5ab. Added is also a -u-boot.dtsi file with these additions:

  - aliases for I2C and SPI devices are added, because i2cmux and
    SPI flash doesn't work otherwise
  - spi_flash node has been added so that the new DM API works
  - the ATSHA204A node is added in the i2c at 5 node
  - "u-boot,dm-pre-reloc"s are added in needed nodes for SPL
    build to work correctly

Signed-off-by: Marek Behun <marek.behun@nic.cz>

 create mode 100644 arch/arm/dts/armada-385-turris-omnia-u-boot.dtsi
 create mode 100644 arch/arm/dts/armada-385-turris-omnia.dts

diff --git a/arch/arm/dts/armada-385-turris-omnia-u-boot.dtsi b/arch/arm/dts/armada-385-turris-omnia-u-boot.dtsi
new file mode 100644
index 0000000000..22caf3539c
--- /dev/null
+++ b/arch/arm/dts/armada-385-turris-omnia-u-boot.dtsi
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2017 Marek Behun <marek.behun@nic.cz>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+/ {
+	aliases {
+		i2c0 = &i2c0;
+		i2c1 = &i2cmux;
+		spi0 = &spi0;
+	};
+};
+
+&i2c0 {
+	u-boot,dm-pre-reloc;
+
+	i2cmux: i2cmux at 70 {
+		u-boot,dm-pre-reloc;
+
+		i2c at 0 {
+			u-boot,dm-pre-reloc;
+		};
+
+		i2c at 1 {
+			u-boot,dm-pre-reloc;
+		};
+
+		i2c at 5 {
+			u-boot,dm-pre-reloc;
+
+			/* ATSHA204A at address 0x64 */
+			atsha204a at 64 {
+				u-boot,dm-pre-reloc;
+				compatible = "atmel,atsha204a";
+				reg = <0x64>;
+			};
+		};
+	};
+};
+
+&spi0 {
+	u-boot,dm-pre-reloc;
+
+	spi-flash at 0 {
+		compatible = "spi-flash";
+		reg = <0>;
+		spi-max-frequency = <40000000>;
+		u-boot,dm-pre-reloc;
+	};
+};
+
+&uart0 {
+	u-boot,dm-pre-reloc;
+};
diff --git a/arch/arm/dts/armada-385-turris-omnia.dts b/arch/arm/dts/armada-385-turris-omnia.dts
new file mode 100644
index 0000000000..28eede180e
--- /dev/null
+++ b/arch/arm/dts/armada-385-turris-omnia.dts
@@ -0,0 +1,392 @@
+/*
+ * Device Tree file for the Turris Omnia
+ *
+ * Copyright (C) 2016 Uwe Kleine-König <uwe@kleine-koenig.org>
+ * Copyright (C) 2016 Tomas Hlavacek <tmshlvkc@gmail.com>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This file is licensed under the terms of the GNU General Public
+ *     License version 2.  This program is licensed "as is" without
+ *     any warranty of any kind, whether express or implied.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Schematic available at https://www.turris.cz/doc/_media/rtrom01-schema.pdf
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include "armada-385.dtsi"
+
+/ {
+	model = "Turris Omnia";
+	compatible = "cznic,turris-omnia", "marvell,armada385", "marvell,armada380";
+
+	chosen {
+		stdout-path = &uart0;
+	};
+
+	memory {
+		device_type = "memory";
+		reg = <0x00000000 0x40000000>; /* 1024 MB */
+	};
+
+	soc {
+		ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000
+			  MBUS_ID(0x01, 0x1d) 0 0xfff00000 0x100000
+			  MBUS_ID(0x09, 0x19) 0 0xf1100000 0x10000
+			  MBUS_ID(0x09, 0x15) 0 0xf1110000 0x10000>;
+
+		internal-regs {
+
+			/* USB part of the PCIe2/USB 2.0 port */
+			usb at 58000 {
+				status = "okay";
+			};
+
+			sata at a8000 {
+				status = "okay";
+			};
+
+			sdhci at d8000 {
+				pinctrl-names = "default";
+				pinctrl-0 = <&sdhci_pins>;
+				status = "okay";
+
+				bus-width = <8>;
+				no-1-8-v;
+				non-removable;
+			};
+
+			usb3 at f0000 {
+				status = "okay";
+			};
+
+			usb3 at f8000 {
+				status = "okay";
+			};
+		};
+
+		pcie-controller {
+			status = "okay";
+
+			pcie at 1,0 {
+				/* Port 0, Lane 0 */
+				status = "okay";
+			};
+
+			pcie at 2,0 {
+				/* Port 1, Lane 0 */
+				status = "okay";
+			};
+
+			pcie at 3,0 {
+				/* Port 2, Lane 0 */
+				status = "okay";
+			};
+		};
+	};
+};
+
+/* Connected to 88E6176 switch, port 6 */
+&eth0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&ge0_rgmii_pins>;
+	status = "okay";
+	phy-mode = "rgmii";
+
+	fixed-link {
+		speed = <1000>;
+		full-duplex;
+	};
+};
+
+/* Connected to 88E6176 switch, port 5 */
+&eth1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&ge1_rgmii_pins>;
+	status = "okay";
+	phy-mode = "rgmii";
+
+	fixed-link {
+		speed = <1000>;
+		full-duplex;
+	};
+};
+
+/* WAN port */
+&eth2 {
+	status = "okay";
+	phy-mode = "sgmii";
+	phy = <&phy1>;
+};
+
+&i2c0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&i2c0_pins>;
+	status = "okay";
+
+	i2cmux at 70 {
+		compatible = "nxp,pca9547";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		reg = <0x70>;
+		status = "okay";
+
+		i2c at 0 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			reg = <0>;
+
+			/* STM32F0 command interface at address 0x2a */
+			/* leds device (in STM32F0) at address 0x2b */
+
+			eeprom at 54 {
+				compatible = "at,24c64";
+				reg = <0x54>;
+
+				/* The EEPROM contains data for bootloader.
+				 * Contents:
+				 * 	struct omnia_eeprom {
+				 * 		u32 magic; (=0x0341a034 in LE)
+				 *		u32 ramsize; (in GiB)
+				 * 		char regdomain[4];
+				 * 		u32 crc32;
+				 * 	};
+				 */
+			};
+		};
+
+		i2c at 1 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			reg = <1>;
+
+			/* routed to PCIe0/mSATA connector (CN7A) */
+		};
+
+		i2c at 2 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			reg = <2>;
+
+			/* routed to PCIe1/USB2 connector (CN61A) */
+		};
+
+		i2c at 3 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			reg = <3>;
+
+			/* routed to PCIe2 connector (CN62A) */
+		};
+
+		i2c at 4 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			reg = <4>;
+
+			/* routed to SFP+ */
+		};
+
+		i2c at 5 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			reg = <5>;
+
+			/* ATSHA204A at address 0x64 */
+		};
+
+		i2c at 6 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			reg = <6>;
+
+			/* exposed on pin header */
+		};
+
+		i2c at 7 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			reg = <7>;
+
+			pcawan: gpio at 71 {
+				/*
+				 * GPIO expander for SFP+ signals and
+				 * and phy irq
+				 */
+				compatible = "nxp,pca9538";
+				reg = <0x71>;
+
+				pinctrl-names = "default";
+				pinctrl-0 = <&pcawan_pins>;
+
+				interrupt-parent = <&gpio1>;
+				interrupts = <14 IRQ_TYPE_LEVEL_LOW>;
+
+				gpio-controller;
+				#gpio-cells = <2>;
+			};
+		};
+	};
+};
+
+&mdio {
+	pinctrl-names = "default";
+	pinctrl-0 = <&mdio_pins>;
+	status = "okay";
+
+	phy1: phy at 1 {
+		status = "okay";
+		compatible = "ethernet-phy-id0141.0DD1", "ethernet-phy-ieee802.3-c22";
+		reg = <1>;
+
+		/* irq is connected to &pcawan pin 7 */
+	};
+
+	/* Switch MV88E6176 at address 0x10 */
+	switch at 10 {
+		compatible = "marvell,mv88e6085";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		dsa,member = <0 0>;
+
+		reg = <0x10>;
+
+		ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			ports at 0 {
+				reg = <0>;
+				label = "lan0";
+			};
+
+			ports at 1 {
+				reg = <1>;
+				label = "lan1";
+			};
+
+			ports at 2 {
+				reg = <2>;
+				label = "lan2";
+			};
+
+			ports at 3 {
+				reg = <3>;
+				label = "lan3";
+			};
+
+			ports at 4 {
+				reg = <4>;
+				label = "lan4";
+			};
+
+			ports at 5 {
+				reg = <5>;
+				label = "cpu";
+				ethernet = <&eth1>;
+				phy-mode = "rgmii-id";
+
+				fixed-link {
+					speed = <1000>;
+					full-duplex;
+				};
+			};
+
+			/* port 6 is connected to eth0 */
+		};
+	};
+};
+
+&pinctrl {
+	pcawan_pins: pcawan-pins {
+		marvell,pins = "mpp46";
+		marvell,function = "gpio";
+	};
+
+	spi0cs0_pins: spi0cs0-pins {
+		marvell,pins = "mpp25";
+		marvell,function = "spi0";
+	};
+
+	spi0cs1_pins: spi0cs1-pins {
+		marvell,pins = "mpp26";
+		marvell,function = "spi0";
+	};
+};
+
+&spi0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&spi0_pins &spi0cs0_pins>;
+	status = "okay";
+
+	spi-nor at 0 {
+		compatible = "spansion,s25fl164k", "jedec,spi-nor";
+		#address-cells = <1>;
+		#size-cells = <1>;
+		reg = <0>;
+		spi-max-frequency = <40000000>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition at 0 {
+				reg = <0x0 0x00100000>;
+				label = "U-Boot";
+			};
+
+			partition at 100000 {
+				reg = <0x00100000 0x00700000>;
+				label = "Rescue system";
+			};
+		};
+	};
+
+	/* MISO, MOSI, SCLK and CS1 are routed to pin header CN11 */
+};
+
+&uart0 {
+	/* Pin header CN10 */
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart0_pins>;
+	status = "okay";
+};
+
+&uart1 {
+	/* Pin header CN11 */
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart1_pins>;
+	status = "okay";
+};
-- 
2.13.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 4/7] drivers/i2c/muxes/pca954x: Add pca9547 I2C mux support
  2017-06-09 17:28 [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Marek Behún
                   ` (2 preceding siblings ...)
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 3/7] arch/arm/dts: Add Turris Omnia device tree Marek Behún
@ 2017-06-09 17:28 ` Marek Behún
  2017-09-28 21:27   ` Chris Packham
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 5/7] drivers/misc: Add basic support for ATSHA204A Crypto module Marek Behún
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 27+ messages in thread
From: Marek Behún @ 2017-06-09 17:28 UTC (permalink / raw)
  To: u-boot

This I2C mux is found, for example, on the Turris Omnia board.

Signed-off-by: Marek Behun <marek.behun@nic.cz>
Reviewed-by: Heiko Schocher <hs@denx.de>

diff --git a/drivers/i2c/muxes/pca954x.c b/drivers/i2c/muxes/pca954x.c
index 1a6761858c..383f72f552 100644
--- a/drivers/i2c/muxes/pca954x.c
+++ b/drivers/i2c/muxes/pca954x.c
@@ -13,11 +13,40 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+enum pca_type {
+	PCA9544,
+	PCA9547,
+	PCA9548
+};
+
+struct chip_desc {
+	u8 enable;
+	enum muxtype {
+		pca954x_ismux = 0,
+		pca954x_isswi,
+	} muxtype;
+};
+
 struct pca954x_priv {
 	u32 addr; /* I2C mux address */
 	u32 width; /* I2C mux width - number of busses */
 };
 
+static const struct chip_desc chips[] = {
+	[PCA9544] = {
+		.enable = 0x4,
+		.muxtype = pca954x_ismux,
+	},
+	[PCA9547] = {
+		.enable = 0x8,
+		.muxtype = pca954x_ismux,
+	},
+	[PCA9548] = {
+		.enable = 0x8,
+		.muxtype = pca954x_isswi,
+	},
+};
+
 static int pca954x_deselect(struct udevice *mux, struct udevice *bus,
 			    uint channel)
 {
@@ -31,7 +60,13 @@ static int pca954x_select(struct udevice *mux, struct udevice *bus,
 			  uint channel)
 {
 	struct pca954x_priv *priv = dev_get_priv(mux);
-	uchar byte = 1 << channel;
+	const struct chip_desc *chip = &chips[dev_get_driver_data(mux)];
+	uchar byte;
+
+	if (chip->muxtype == pca954x_ismux)
+		byte = channel | chip->enable;
+	else
+		byte = 1 << channel;
 
 	return dm_i2c_write(mux, priv->addr, &byte, 1);
 }
@@ -42,8 +77,9 @@ static const struct i2c_mux_ops pca954x_ops = {
 };
 
 static const struct udevice_id pca954x_ids[] = {
-	{ .compatible = "nxp,pca9548", .data = (ulong)8 },
-	{ .compatible = "nxp,pca9544", .data = (ulong)4 },
+	{ .compatible = "nxp,pca9544", .data = PCA9544 },
+	{ .compatible = "nxp,pca9547", .data = PCA9547 },
+	{ .compatible = "nxp,pca9548", .data = PCA9548 },
 	{ }
 };
 
-- 
2.13.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 5/7] drivers/misc: Add basic support for ATSHA204A Crypto module
  2017-06-09 17:28 [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Marek Behún
                   ` (3 preceding siblings ...)
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 4/7] drivers/i2c/muxes/pca954x: Add pca9547 I2C mux support Marek Behún
@ 2017-06-09 17:28 ` Marek Behún
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 6/7] marvell: armada385: Add the Turris Omnia board Marek Behún
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2017-06-09 17:28 UTC (permalink / raw)
  To: u-boot

This module can be found on the Turris Omnia board connected
via the I2C interface.

Among some cryptographic functions, the chip has a 512 bit
One Time Programmable memory, 88 byte configuration memory
and 512 byte general purpose memory.

The Turris Omnia stores serial number and device MAC address in
the OTP memory.

This commit adds basic support for reading the EEPROM and also
exposes the chips Random Number Generator.

The driver is based on code by
  Josh Datko, Cryptotronix, jbd at cryptotronix.com
and also
  Tomas Hlavacek, CZ.NIC, tomas.hlavacek at nic.cz

Signed-off-by: Tomas Hlavacek <tomas.hlavacek@nic.cz>
Signed-off-by: Marek Behun <marek.behun@nic.cz>

 create mode 100644 drivers/misc/atsha204a-i2c.c
 create mode 100644 include/atsha204a-i2c.h

diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index ecca159d14..8073cdc628 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -20,6 +20,14 @@ config ALTERA_SYSID
 	  Select this to enable a sysid for Altera devices. Please find
 	  details on the "Embedded Peripherals IP User Guide" of Altera.
 
+config ATSHA204A
+	bool "Support for Atmel ATSHA204A module"
+	depends on MISC
+	help
+	   Enable support for I2C connected Atmel's ATSHA204A
+	   CryptoAuthentication module found for example on the Turris Omnia
+	   board.
+
 config CMD_CROS_EC
 	bool "Enable crosec command"
 	depends on CROS_EC
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index 4543cd647e..bb51f9fafe 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -8,6 +8,7 @@
 obj-$(CONFIG_MISC) += misc-uclass.o
 obj-$(CONFIG_ALI152X) += ali512x.o
 obj-$(CONFIG_ALTERA_SYSID) += altera_sysid.o
+obj-$(CONFIG_ATSHA204A) += atsha204a-i2c.o
 obj-$(CONFIG_DS4510)  += ds4510.o
 obj-$(CONFIG_CBMEM_CONSOLE) += cbmem_console.o
 ifndef CONFIG_SPL_BUILD
diff --git a/drivers/misc/atsha204a-i2c.c b/drivers/misc/atsha204a-i2c.c
new file mode 100644
index 0000000000..934ba5e6b8
--- /dev/null
+++ b/drivers/misc/atsha204a-i2c.c
@@ -0,0 +1,408 @@
+/*
+ * I2C Driver for Atmel ATSHA204 over I2C
+ *
+ * Copyright (C) 2014 Josh Datko, Cryptotronix, jbd at cryptotronix.com
+ * 		 2016 Tomas Hlavacek, CZ.NIC, tmshlvck at gmail.com
+ * 		 2017 Marek Behun, CZ.NIC, marek.behun at nic.cz
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <i2c.h>
+#include <errno.h>
+#include <atsha204a-i2c.h>
+
+#define ATSHA204A_TWLO			60
+#define ATSHA204A_TRANSACTION_TIMEOUT	100000
+#define ATSHA204A_TRANSACTION_RETRY	5
+#define ATSHA204A_EXECTIME		5000
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * The ATSHA204A uses an (to me) unknown CRC-16 algorithm.
+ * The Reveng CRC-16 catalogue does not contain it.
+ *
+ * Because in Atmel's documentation only a primitive implementation
+ * can be found, I have implemented this one with lookup table.
+ */
+
+/*
+ * This is the code that computes the table below:
+ *
+ * int i, j;
+ * for (i = 0; i < 256; ++i) {
+ * 	u8 c = 0;
+ * 	for (j = 0; j < 8; ++j) {
+ * 		c = (c << 1) | ((i >> j) & 1);
+ * 	}
+ * 	bitreverse_table[i] = c;
+ * }
+ */
+
+static u8 const bitreverse_table[256] = {
+	0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+	0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+	0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+	0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+	0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+	0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+	0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+	0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+	0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+	0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+	0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+	0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+	0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+	0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+	0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+	0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+	0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+	0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+	0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+	0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+	0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+	0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+	0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+	0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+	0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+	0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+	0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+	0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+	0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+	0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+	0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+	0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
+};
+
+/*
+ * This is the code that computes the table below:
+ *
+ * int i, j;
+ * for (i = 0; i < 256; ++i) {
+ * 	u16 c = i << 8;
+ * 	for (j = 0; j < 8; ++j) {
+ * 		int b = c >> 15;
+ * 		c <<= 1;
+ * 		if (b)
+ * 			c ^= 0x8005;
+ * 	}
+ * 	crc16_table[i] = c;
+ * }
+ */
+static u16 const crc16_table[256] = {
+	0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
+	0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
+	0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
+	0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
+	0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
+	0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
+	0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
+	0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
+	0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
+	0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
+	0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
+	0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
+	0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
+	0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
+	0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
+	0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
+	0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
+	0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
+	0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
+	0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
+	0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
+	0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
+	0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
+	0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
+	0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
+	0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
+	0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
+	0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
+	0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
+	0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
+	0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
+	0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202,
+};
+
+static inline u16 crc16_byte(u16 crc, const u8 data)
+{
+	u16 t = crc16_table[((crc >> 8) ^ bitreverse_table[data]) & 0xff];
+	return ((crc << 8) ^ t);
+}
+
+static u16 atsha204a_crc16(const u8 *buffer, size_t len)
+{
+	u16 crc = 0;
+
+	while (len--)
+		crc = crc16_byte(crc, *buffer++);
+
+	return cpu_to_le16(crc);
+}
+
+static int atsha204a_send(struct udevice *dev, const u8 *buf, u8 len)
+{
+	fdt_addr_t *priv = dev_get_priv(dev);
+	struct i2c_msg msg;
+
+	msg.addr = *priv;
+	msg.flags = I2C_M_STOP;
+	msg.len = len;
+	msg.buf = (u8 *) buf;
+
+	return dm_i2c_xfer(dev, &msg, 1);
+}
+
+static int atsha204a_recv(struct udevice *dev, u8 *buf, u8 len)
+{
+	fdt_addr_t *priv = dev_get_priv(dev);
+	struct i2c_msg msg;
+
+	msg.addr = *priv;
+	msg.flags = I2C_M_RD | I2C_M_STOP;
+	msg.len = len;
+	msg.buf = (u8 *) buf;
+
+	return dm_i2c_xfer(dev, &msg, 1);
+}
+
+static int atsha204a_recv_resp(struct udevice *dev,
+			       struct atsha204a_resp *resp)
+{
+	int res;
+	u16 resp_crc, computed_crc;
+	u8 *p = (u8 *) resp;
+
+	res = atsha204a_recv(dev, p, 4);
+	if (res)
+		return res;
+
+	if (resp->length > 4) {
+		if (resp->length > sizeof(*resp))
+			return -EMSGSIZE;
+
+		res = atsha204a_recv(dev, p + 4, resp->length - 4);
+		if (res)
+			return res;
+	}
+
+	resp_crc = (u16) p[resp->length - 2]
+		   | (((u16) p[resp->length - 1]) << 8);
+	computed_crc = atsha204a_crc16(p, resp->length - 2);
+
+	if (resp_crc != computed_crc) {
+		debug("Invalid checksum in ATSHA204A response\n");
+		return -EBADMSG;
+	}
+
+	return 0;
+}
+
+int atsha204a_wakeup(struct udevice *dev)
+{
+	u8 req[4];
+	struct atsha204a_resp resp;
+	int try, res;
+
+	debug("Waking up ATSHA204A\n");
+
+	for (try = 1; try <= 10; ++try) {
+		debug("Try %i... ", try);
+
+		memset(req, 0, 4);
+		res = atsha204a_send(dev, req, 4);
+		if (res) {
+			debug("failed on I2C send, trying again\n");
+			continue;
+		}
+
+		udelay(ATSHA204A_TWLO);
+
+		res = atsha204a_recv_resp(dev, &resp);
+		if (res) {
+			debug("failed on receiving response, ending\n");
+			return res;
+		}
+
+		if (resp.code != ATSHA204A_STATUS_AFTER_WAKE) {
+			debug ("failed (responce code = %02x), ending\n",
+			       resp.code);
+			return -EBADMSG;
+		}
+
+		debug("success\n");
+		break;
+	}
+
+	return 0;
+}
+
+int atsha204a_idle(struct udevice *dev)
+{
+	int res;
+	u8 req = ATSHA204A_FUNC_IDLE;
+
+	res = atsha204a_send(dev, &req, 1);
+	if (res)
+		debug("Failed putting ATSHA204A idle\n");
+	return res;
+}
+
+int atsha204a_sleep(struct udevice *dev)
+{
+	int res;
+	u8 req = ATSHA204A_FUNC_IDLE;
+
+	res = atsha204a_send(dev, &req, 1);
+	if (res)
+		debug("Failed putting ATSHA204A to sleep\n");
+	return res;
+}
+
+static int atsha204a_transaction(struct udevice *dev, struct atsha204a_req *req,
+				struct atsha204a_resp *resp)
+{
+	int res, timeout = ATSHA204A_TRANSACTION_TIMEOUT;
+
+	res = atsha204a_send(dev, (u8 *) req, req->length + 1);
+	if (res) {
+		debug("ATSHA204A transaction send failed\n");
+		return -EBUSY;
+	}
+
+	do {
+		res = atsha204a_recv_resp(dev, resp);
+		if (!res || res == -EMSGSIZE || res == -EBADMSG)
+			break;
+
+		debug("ATSHA204A transaction polling for response "
+		      "(timeout = %d)\n", timeout);
+
+		udelay(ATSHA204A_EXECTIME);
+		timeout -= ATSHA204A_EXECTIME;
+	} while (timeout > 0);
+
+	if (timeout <= 0) {
+		debug("ATSHA204A transaction timed out\n");
+		return -ETIMEDOUT;
+	}
+
+	return res;
+}
+
+static void atsha204a_req_crc32(struct atsha204a_req *req)
+{
+	u8 *p = (u8 *) req;
+	u16 computed_crc;
+	u16 *crc_ptr = (u16 *) &p[req->length - 1];
+
+	/* The buffer to crc16 starts at byte 1, not 0 */
+	computed_crc = atsha204a_crc16(p + 1, req->length - 2);
+
+	*crc_ptr = cpu_to_le16(computed_crc);
+}
+
+int atsha204a_read(struct udevice *dev, enum atsha204a_zone zone, bool read32,
+		  u16 addr, u8 *buffer)
+{
+	int res, retry = ATSHA204A_TRANSACTION_RETRY;
+	struct atsha204a_req req;
+	struct atsha204a_resp resp;
+
+	req.function = ATSHA204A_FUNC_COMMAND;
+	req.length = 7;
+	req.command = ATSHA204A_CMD_READ;
+
+	req.param1 = (u8) zone;
+	if (read32)
+		req.param1 |= 0x80;
+
+	req.param2 = cpu_to_le16(addr);
+
+	atsha204a_req_crc32(&req);
+
+	do {
+		res = atsha204a_transaction(dev, &req, &resp);
+		if (!res)
+			break;
+
+		debug("ATSHA204A read retry (%d)\n", retry);
+		retry--;
+		atsha204a_wakeup(dev);
+	} while (retry >= 0);
+	
+	if (res) {
+		debug("ATSHA204A read failed\n");
+		return res;
+	}
+
+	if (resp.length != (read32 ? 32 : 4) + 3) {
+		debug("ATSHA204A read bad response length (%d)\n",
+		      resp.length);
+		return -EBADMSG;
+	}
+
+	memcpy(buffer, ((u8 *) &resp) + 1, read32 ? 32 : 4);
+
+	return 0;
+}
+
+int atsha204a_get_random(struct udevice *dev, u8 *buffer, size_t max)
+{
+	int res;
+	struct atsha204a_req req;
+	struct atsha204a_resp resp;
+
+	req.function = ATSHA204A_FUNC_COMMAND;
+	req.length = 7;
+	req.command = ATSHA204A_CMD_RANDOM;
+
+	req.param1 = 1;
+	req.param2 = 0;
+
+	/* We do not have to compute the checksum dynamically */
+	req.data[0] = 0x27;
+	req.data[1] = 0x47;
+
+	res = atsha204a_transaction(dev, &req, &resp);
+	if (res) {
+		debug("ATSHA204A random transaction failed\n");
+		return res;
+	}
+
+	memcpy(buffer, ((u8 *) &resp) + 1, max >= 32 ? 32 : max);
+	return 0;
+}
+
+static int atsha204a_ofdata_to_platdata(struct udevice *dev)
+{
+	fdt_addr_t *priv = dev_get_priv(dev);
+	fdt_addr_t addr;
+
+	addr = fdtdec_get_addr(gd->fdt_blob, dev_of_offset(dev), "reg");
+	if (addr == FDT_ADDR_T_NONE) {
+		debug("Can't get ATSHA204A I2C base address\n");
+		return -ENXIO;
+	}
+
+	*priv = addr;
+	return 0;
+}
+
+static const struct udevice_id atsha204a_ids[] = {
+	{ .compatible = "atmel,atsha204a" },
+	{ }
+};
+
+U_BOOT_DRIVER(atsha204) = {
+	.name			= "atsha204",
+	.id			= UCLASS_MISC,
+	.of_match		= atsha204a_ids,
+	.ofdata_to_platdata	= atsha204a_ofdata_to_platdata,
+	.priv_auto_alloc_size	= sizeof(fdt_addr_t),
+};
diff --git a/include/atsha204a-i2c.h b/include/atsha204a-i2c.h
new file mode 100644
index 0000000000..344fd8ace7
--- /dev/null
+++ b/include/atsha204a-i2c.h
@@ -0,0 +1,69 @@
+/*
+ * I2C Driver for Atmel ATSHA204 over I2C
+ *
+ * Copyright (C) 2014 Josh Datko, Cryptotronix, jbd at cryptotronix.com
+ * 		 2016 Tomas Hlavacek, CZ.NIC, tmshlvck at gmail.com
+ * 		 2017 Marek Behun, CZ.NIC, marek.behun at nic.cz
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef _ATSHA204_I2C_H_
+#define _ATSHA204_I2C_H_
+
+enum atsha204a_zone
+{
+	ATSHA204A_ZONE_CONFIG	= 0,
+	ATSHA204A_ZONE_OTP	= 1,
+	ATSHA204A_ZONE_DATA	= 2,
+};
+
+enum atsha204a_status
+{
+	ATSHA204A_STATUS_SUCCESS	= 0x00,
+	ATSHA204A_STATUS_MISCOMPARE	= 0x01,
+	ATSHA204A_STATUS_PARSE_ERROR	= 0x03,
+	ATSHA204A_STATUS_EXEC_ERROR	= 0x0F,
+	ATSHA204A_STATUS_AFTER_WAKE	= 0x11,
+	ATSHA204A_STATUS_CRC_ERROR	= 0xFF,
+};
+
+enum atsha204a_func
+{
+	ATSHA204A_FUNC_RESET	= 0x00,
+	ATSHA204A_FUNC_SLEEP	= 0x01,
+	ATSHA204A_FUNC_IDLE	= 0x02,
+	ATSHA204A_FUNC_COMMAND	= 0x03,
+};
+
+enum atsha204a_cmd
+{
+	ATSHA204A_CMD_READ	= 0x02,
+	ATSHA204A_CMD_RANDOM	= 0x1B,
+};
+
+struct atsha204a_resp
+{
+	u8 length;
+	u8 code;
+	u8 data[82];
+} __attribute__ ((packed));
+
+struct atsha204a_req
+{
+	u8 function;
+	u8 length;
+	u8 command;
+	u8 param1;
+	u16 param2;
+	u8 data[78];
+} __attribute__ ((packed));
+
+int atsha204a_wakeup(struct udevice *);
+int atsha204a_idle(struct udevice *);
+int atsha204a_sleep(struct udevice *);
+int atsha204a_read(struct udevice *, enum atsha204a_zone, bool, u16, u8 *);
+int atsha204a_get_random(struct udevice *, u8 *, size_t);
+
+#endif /* _ATSHA204_I2C_H_ */
-- 
2.13.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 6/7] marvell: armada385: Add the Turris Omnia board
  2017-06-09 17:28 [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Marek Behún
                   ` (4 preceding siblings ...)
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 5/7] drivers/misc: Add basic support for ATSHA204A Crypto module Marek Behún
@ 2017-06-09 17:28 ` Marek Behún
  2017-07-12  5:53 ` [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Stefan Roese
  2018-01-17 15:52 ` Andreas Färber
  7 siblings, 0 replies; 27+ messages in thread
From: Marek Behún @ 2017-06-09 17:28 UTC (permalink / raw)
  To: u-boot

The Turris Omnia is a open-source router created by CZ.NIC.

The code is based on the Marvell/db-88f6820-gp by Stefan Roese
with modifications from Tomas Hlavacek in the CZ.NIC turris-omnia-uboot
repository, which can be found at
https://gitlab.labs.nic.cz/turris/turris-omnia-uboot

By default, the Turris Omnia uses btrfs as the main and only filesystem,
and also loads kernel and device tree from this filesystem. Since U-Boot
does not yet support btrfs, you should not flash your Turris Omnia board
with this unless you know what you are doing.

Signed-off-by: Tomas Hlavacek <tomas.hlavacek@nic.cz>
Signed-off-by: Marek Behun <marek.behun@nic.cz>

 create mode 100644 board/CZ.NIC/turris_omnia/Makefile
 create mode 100644 board/CZ.NIC/turris_omnia/kwbimage.cfg
 create mode 100644 board/CZ.NIC/turris_omnia/turris_omnia.c
 create mode 100644 configs/turris_omnia_defconfig
 create mode 100644 include/configs/turris_omnia.h

diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig
index 6ae54ef46a..6b16f57464 100644
--- a/arch/arm/mach-mvebu/Kconfig
+++ b/arch/arm/mach-mvebu/Kconfig
@@ -90,6 +90,10 @@ config TARGET_DB_88F6820_AMC
 	bool "Support DB-88F6820-AMC"
 	select 88F6820
 
+config TARGET_TURRIS_OMNIA
+	bool "Support Turris Omnia"
+	select 88F6820
+
 config TARGET_MVEBU_ARMADA_8K
 	bool "Support Armada 7k/8k platforms"
 	select ARMADA_8K
@@ -124,6 +128,7 @@ config SYS_BOARD
 	default "db-88f6720" if TARGET_DB_88F6720
 	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 "mvebu_armada-8k" if TARGET_MVEBU_ARMADA_8K
 	default "db-mv784mp-gp" if TARGET_DB_MV784MP_GP
 	default "ds414" if TARGET_DS414
@@ -141,6 +146,7 @@ config SYS_CONFIG_NAME
 	default "ds414" if TARGET_DS414
 	default "maxbcm" if TARGET_MAXBCM
 	default "theadorable" if TARGET_THEADORABLE
+	default "turris_omnia" if TARGET_TURRIS_OMNIA
 
 config SYS_VENDOR
 	default "Marvell" if TARGET_DB_MV784MP_GP
@@ -151,10 +157,26 @@ config SYS_VENDOR
 	default "Marvell" if TARGET_MVEBU_ARMADA_8K
 	default "solidrun" if TARGET_CLEARFOG
 	default "Synology" if TARGET_DS414
+	default "CZ.NIC" if TARGET_TURRIS_OMNIA
 
 config SYS_SOC
 	default "mvebu"
 
+if TARGET_TURRIS_OMNIA
+
+choice
+	prompt "Turris Omnia boot method"
+
+config TURRIS_OMNIA_SPL_BOOT_DEVICE_SPI
+	bool "SPI NOR flash"
+
+config TURRIS_OMNIA_SPL_BOOT_DEVICE_MMC
+	bool "SDIO/MMC card"
+
+endchoice
+
+endif
+
 config MVEBU_EFUSE
 	bool "Enable eFuse support"
 	default n
diff --git a/board/CZ.NIC/turris_omnia/Makefile b/board/CZ.NIC/turris_omnia/Makefile
new file mode 100644
index 0000000000..f2ae50654f
--- /dev/null
+++ b/board/CZ.NIC/turris_omnia/Makefile
@@ -0,0 +1,7 @@
+#
+# Copyright (C) 2017 Marek Behun <marek.behun@nic.cz>
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y	:= turris_omnia.o
diff --git a/board/CZ.NIC/turris_omnia/kwbimage.cfg b/board/CZ.NIC/turris_omnia/kwbimage.cfg
new file mode 100644
index 0000000000..cc05792556
--- /dev/null
+++ b/board/CZ.NIC/turris_omnia/kwbimage.cfg
@@ -0,0 +1,12 @@
+#
+# Copyright (C) 2014 Stefan Roese <sr@denx.de>
+#
+
+# Armada XP uses version 1 image format
+VERSION		1
+
+# Boot Media configurations
+BOOT_FROM	spi
+
+# Binary Header (bin_hdr) with DDR3 training code
+BINARY spl/u-boot-spl.bin 0000005b 00000068
diff --git a/board/CZ.NIC/turris_omnia/turris_omnia.c b/board/CZ.NIC/turris_omnia/turris_omnia.c
new file mode 100644
index 0000000000..86926f8050
--- /dev/null
+++ b/board/CZ.NIC/turris_omnia/turris_omnia.c
@@ -0,0 +1,530 @@
+/*
+ * Copyright (C) 2017 Marek Behun <marek.behun@nic.cz>
+ * Copyright (C) 2016 Tomas Hlavacek <tomas.hlavacek@nic.cz>
+ *
+ * Derived from the code for
+ *   Marvell/db-88f6820-gp by Stefan Roese <sr@denx.de>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <miiphy.h>
+#include <netdev.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#include <dm/uclass.h>
+#include <fdt_support.h>
+#include <time.h>
+
+#ifdef CONFIG_ATSHA204A
+# include <atsha204a-i2c.h>
+#endif
+
+#ifdef CONFIG_WDT_ORION
+# include <wdt.h>
+#endif
+
+#include "../drivers/ddr/marvell/a38x/ddr3_a38x_topology.h"
+#include <../serdes/a38x/high_speed_env_spec.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define OMNIA_I2C_EEPROM_DM_NAME	"i2c at 0"
+#define OMNIA_I2C_EEPROM		0x54
+#define OMNIA_I2C_EEPROM_CONFIG_ADDR	0x0
+#define OMNIA_I2C_EEPROM_ADDRLEN	2
+#define OMNIA_I2C_EEPROM_MAGIC		0x0341a034
+
+#define OMNIA_I2C_MCU_DM_NAME		"i2c at 0"
+#define OMNIA_I2C_MCU_ADDR_STATUS	0x1
+#define OMNIA_I2C_MCU_SATA		0x20
+#define OMNIA_I2C_MCU_CARDDET		0x10
+#define OMNIA_I2C_MCU			0x2a
+#define OMNIA_I2C_MCU_WDT_ADDR		0x0b
+
+#define OMNIA_ATSHA204_OTP_VERSION	0
+#define OMNIA_ATSHA204_OTP_SERIAL	1
+#define OMNIA_ATSHA204_OTP_MAC0		3
+#define OMNIA_ATSHA204_OTP_MAC1		4
+
+#define MVTWSI_ARMADA_DEBUG_REG		0x8c
+
+/*
+ * Those values and defines are taken from the Marvell U-Boot version
+ * "u-boot-2013.01-2014_T3.0"
+ */
+#define OMNIA_GPP_OUT_ENA_LOW					\
+	(~(BIT(1)  | BIT(4)  | BIT(6)  | BIT(7)  | BIT(8)  | BIT(9)  |	\
+	   BIT(10) | BIT(11) | BIT(19) | BIT(22) | BIT(23) | BIT(25) |	\
+	   BIT(26) | BIT(27) | BIT(29) | BIT(30) | BIT(31)))
+#define OMNIA_GPP_OUT_ENA_MID					\
+	(~(BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(15) |	\
+	   BIT(16) | BIT(17) | BIT(18)))
+
+#define OMNIA_GPP_OUT_VAL_LOW	0x0
+#define OMNIA_GPP_OUT_VAL_MID	0x0
+#define OMNIA_GPP_POL_LOW	0x0
+#define OMNIA_GPP_POL_MID	0x0
+
+static struct serdes_map board_serdes_map_pex[] = {
+	{PEX0, SERDES_SPEED_5_GBPS, PEX_ROOT_COMPLEX_X1, 0, 0},
+	{USB3_HOST0, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+	{PEX1, SERDES_SPEED_5_GBPS, PEX_ROOT_COMPLEX_X1, 0, 0},
+	{USB3_HOST1, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+	{PEX2, SERDES_SPEED_5_GBPS, PEX_ROOT_COMPLEX_X1, 0, 0},
+	{SGMII2, SERDES_SPEED_1_25_GBPS, SERDES_DEFAULT_MODE, 0, 0}
+};
+
+static struct serdes_map board_serdes_map_sata[] = {
+	{SATA0, SERDES_SPEED_6_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+	{USB3_HOST0, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+	{PEX1, SERDES_SPEED_5_GBPS, PEX_ROOT_COMPLEX_X1, 0, 0},
+	{USB3_HOST1, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+	{PEX2, SERDES_SPEED_5_GBPS, PEX_ROOT_COMPLEX_X1, 0, 0},
+	{SGMII2, SERDES_SPEED_1_25_GBPS, SERDES_DEFAULT_MODE, 0, 0}
+};
+
+static bool omnia_detect_sata(void)
+{
+	struct udevice *bus, *dev;
+	int ret;
+	u16 mode;
+
+	puts("SERDES0 card detect: ");
+
+	if (uclass_get_device_by_name(UCLASS_I2C, OMNIA_I2C_MCU_DM_NAME, &bus)) {
+		puts("Cannot find MCU bus!\n");
+		return false;
+	}
+
+	ret = i2c_get_chip(bus, OMNIA_I2C_MCU, 1, &dev);
+	if (ret) {
+		puts("Cannot get MCU chip!\n");
+		return false;
+	}
+
+	ret = dm_i2c_read(dev, OMNIA_I2C_MCU_ADDR_STATUS, (uchar *) &mode, 2);
+	if (ret) {
+		puts("I2C read failed! Default PEX\n");
+		return false;
+	}
+
+	if (!(mode & OMNIA_I2C_MCU_CARDDET)) {
+		puts("NONE\n");
+		return false;
+	}
+
+	if (mode & OMNIA_I2C_MCU_SATA) {
+		puts("SATA\n");
+		return true;
+	} else {
+		puts("PEX\n");
+		return false;
+	}
+}
+
+int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 *count)
+{
+	if (omnia_detect_sata()) {
+		*serdes_map_array = board_serdes_map_sata;
+		*count = ARRAY_SIZE(board_serdes_map_sata);
+	} else {
+		*serdes_map_array = board_serdes_map_pex;
+		*count = ARRAY_SIZE(board_serdes_map_pex);
+	}
+
+	return 0;
+}
+
+struct omnia_eeprom {
+	u32 magic;
+	u32 ramsize;
+	char region[4];
+	u32 crc;
+};
+
+static bool omnia_read_eeprom(struct omnia_eeprom *oep)
+{
+	struct udevice *bus, *dev;
+	int ret, crc, retry = 3;
+
+	if (uclass_get_device_by_name(UCLASS_I2C, OMNIA_I2C_EEPROM_DM_NAME, &bus)) {
+		puts("Cannot find EEPROM bus\n");
+		return false;
+	}
+
+	ret = i2c_get_chip(bus, OMNIA_I2C_EEPROM, OMNIA_I2C_EEPROM_ADDRLEN, &dev);
+	if (ret) {
+		puts("Cannot get EEPROM chip\n");
+		return false;
+	}
+
+	for (; retry > 0; --retry) {
+		ret = dm_i2c_read(dev, OMNIA_I2C_EEPROM_CONFIG_ADDR, (uchar *) oep, sizeof(struct omnia_eeprom));
+		if (ret)
+			continue;
+
+		if (oep->magic != OMNIA_I2C_EEPROM_MAGIC) {
+			puts("I2C EEPROM missing magic number!\n");
+			continue;
+		}
+
+		crc = crc32(0, (unsigned char *) oep,
+			    sizeof(struct omnia_eeprom) - 4);
+		if (crc == oep->crc) {
+			break;
+		} else {
+			printf("CRC of EEPROM memory config failed! "
+			       "calc=0x%04x saved=0x%04x\n", crc, oep->crc);
+		}
+	}
+
+	if (!retry) {
+		puts("I2C EEPROM read failed!\n");
+		return false;
+	}
+
+	return true;
+}
+
+/*
+ * Define the DDR layout / topology here in the board file. This will
+ * be used by the DDR3 init code in the SPL U-Boot version to configure
+ * the DDR3 controller.
+ */
+static struct hws_topology_map board_topology_map_1g = {
+	0x1, /* active interfaces */
+	/* cs_mask, mirror, dqs_swap, ck_swap X PUPs */
+	{ { { {0x1, 0, 0, 0},
+	      {0x1, 0, 0, 0},
+	      {0x1, 0, 0, 0},
+	      {0x1, 0, 0, 0},
+	      {0x1, 0, 0, 0} },
+	    SPEED_BIN_DDR_1600K,	/* speed_bin */
+	    BUS_WIDTH_16,		/* memory_width */
+	    MEM_4G,			/* mem_size */
+	    DDR_FREQ_800,		/* frequency */
+	    0, 0,			/* cas_l cas_wl */
+	    HWS_TEMP_NORMAL,		/* temperature */
+	    HWS_TIM_2T} },		/* timing (force 2t) */
+	5,				/* Num Of Bus Per Interface*/
+	BUS_MASK_32BIT			/* Busses mask */
+};
+
+static struct hws_topology_map board_topology_map_2g = {
+	0x1, /* active interfaces */
+	/* cs_mask, mirror, dqs_swap, ck_swap X PUPs */
+	{ { { {0x1, 0, 0, 0},
+	      {0x1, 0, 0, 0},
+	      {0x1, 0, 0, 0},
+	      {0x1, 0, 0, 0},
+	      {0x1, 0, 0, 0} },
+	    SPEED_BIN_DDR_1600K,	/* speed_bin */
+	    BUS_WIDTH_16,		/* memory_width */
+	    MEM_8G,			/* mem_size */
+	    DDR_FREQ_800,		/* frequency */
+	    0, 0,			/* cas_l cas_wl */
+	    HWS_TEMP_NORMAL,		/* temperature */
+	    HWS_TIM_2T} },		/* timing (force 2t) */
+	5,				/* Num Of Bus Per Interface*/
+	BUS_MASK_32BIT			/* Busses mask */
+};
+
+struct hws_topology_map *ddr3_get_topology_map(void)
+{
+	static int mem = 0;
+	struct omnia_eeprom oep;
+
+	/* Get the board config from EEPROM */
+	if (mem == 0) {
+		if(!omnia_read_eeprom(&oep))
+			goto out;
+
+		printf("Memory config in EEPROM: 0x%02x\n", oep.ramsize);
+
+		if (oep.ramsize == 0x2)
+			mem = 2;
+		else
+			mem = 1;
+	}
+
+out:
+	/* Hardcoded fallback */
+	if (mem == 0) {
+		puts("WARNING: Memory config from EEPROM read failed.\n");
+		puts("Falling back to default 1GiB map.\n");
+		mem = 1;
+	}
+
+	/* Return the board topology as defined in the board code */
+	if (mem == 1)
+		return &board_topology_map_1g;
+	if (mem == 2)
+		return &board_topology_map_2g;
+
+	return &board_topology_map_1g;
+}
+
+#ifndef CONFIG_SPL_BUILD
+static int set_regdomain(void)
+{
+	struct omnia_eeprom oep;
+	char rd[3] = {' ', ' ', 0};
+
+	if (omnia_read_eeprom(&oep))
+		memcpy(rd, &oep.region, 2);
+	else
+		puts("EEPROM regdomain read failed.\n");
+
+	printf("Regdomain set to %s\n", rd);
+	return setenv("regdomain", rd);
+}
+#endif
+
+int board_early_init_f(void)
+{
+	u32 i2c_debug_reg;
+
+	/* Configure MPP */
+	writel(0x11111111, MVEBU_MPP_BASE + 0x00);
+	writel(0x11111111, MVEBU_MPP_BASE + 0x04);
+	writel(0x11244011, MVEBU_MPP_BASE + 0x08);
+	writel(0x22222111, MVEBU_MPP_BASE + 0x0c);
+	writel(0x22200002, MVEBU_MPP_BASE + 0x10);
+	writel(0x30042022, MVEBU_MPP_BASE + 0x14);
+	writel(0x55550555, MVEBU_MPP_BASE + 0x18);
+	writel(0x00005550, MVEBU_MPP_BASE + 0x1c);
+
+	/* Set GPP Out value */
+	writel(OMNIA_GPP_OUT_VAL_LOW, MVEBU_GPIO0_BASE + 0x00);
+	writel(OMNIA_GPP_OUT_VAL_MID, MVEBU_GPIO1_BASE + 0x00);
+
+	/* Set GPP Polarity */
+	writel(OMNIA_GPP_POL_LOW, MVEBU_GPIO0_BASE + 0x0c);
+	writel(OMNIA_GPP_POL_MID, MVEBU_GPIO1_BASE + 0x0c);
+
+	/* Set GPP Out Enable */
+	writel(OMNIA_GPP_OUT_ENA_LOW, MVEBU_GPIO0_BASE + 0x04);
+	writel(OMNIA_GPP_OUT_ENA_MID, MVEBU_GPIO1_BASE + 0x04);
+
+	/* Disable I2C debug mode blocking 0x64 I2C address */
+	i2c_debug_reg = readl(MVEBU_TWSI_BASE + MVTWSI_ARMADA_DEBUG_REG);
+	i2c_debug_reg &= ~(1<<18);
+	writel(i2c_debug_reg, MVEBU_TWSI_BASE + MVTWSI_ARMADA_DEBUG_REG);
+
+	return 0;
+}
+
+#ifndef CONFIG_SPL_BUILD
+static bool disable_mcu_watchdog(void)
+{
+	struct udevice *bus, *dev;
+	int ret, retry = 3;
+	uchar buf[1] = {0x0};
+
+	if (uclass_get_device_by_name(UCLASS_I2C, OMNIA_I2C_MCU_DM_NAME, &bus)) {
+		puts("Cannot find MCU bus! Can not disable MCU WDT.\n");
+		return false;
+	}
+
+	ret = i2c_get_chip(bus, OMNIA_I2C_MCU, 1, &dev);
+	if (ret) {
+		puts("Cannot get MCU chip! Can not disable MCU WDT.\n");
+		return false;
+	}
+
+	for (; retry > 0; --retry)
+		if (!dm_i2c_write(dev, OMNIA_I2C_MCU_WDT_ADDR, (uchar *) buf, 1))
+			break;
+
+	if (retry <= 0) {
+		puts("I2C MCU watchdog failed to disable!\n");
+		return false;
+	}
+
+	return true;
+}
+#endif
+
+#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT_ORION)
+static struct udevice *watchdog_dev = NULL;
+#endif
+
+int board_init(void)
+{
+	/* adress of boot parameters */
+	gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+
+#ifndef CONFIG_SPL_BUILD
+# ifdef CONFIG_WDT_ORION
+	if (uclass_get_device(UCLASS_WDT, 0, &watchdog_dev)) {
+		puts("Cannot find Armada 385 watchdog!\n");
+	} else {
+		puts("Enabling Armada 385 watchdog.\n");
+		wdt_start(watchdog_dev, (u32) 25000000 * 120, 0);
+	}
+# endif
+
+	if (disable_mcu_watchdog())
+		puts("Disabled MCU startup watchdog.\n");
+
+	set_regdomain();
+#endif
+
+	return 0;
+}
+
+#ifdef CONFIG_WATCHDOG
+/* Called by macro WATCHDOG_RESET */
+void watchdog_reset(void)
+{
+# if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT_ORION)
+	static ulong next_reset = 0;
+	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 + 1000;
+	}
+# endif
+}
+#endif
+
+int board_late_init(void)
+{
+#ifndef CONFIG_SPL_BUILD
+	set_regdomain();
+#endif
+
+	return 0;
+}
+
+#ifdef CONFIG_ATSHA204A
+static struct udevice *get_atsha204a_dev(void)
+{
+	static struct udevice *dev = NULL;
+
+	if (dev != NULL)
+		return dev;
+
+	if (uclass_get_device_by_name(UCLASS_MISC, "atsha204a at 64", &dev)) {
+		puts("Cannot find ATSHA204A on I2C bus!\n");
+		dev = NULL;
+	}
+
+	return dev;
+}
+#endif
+
+int checkboard(void)
+{
+	u32 version_num, serial_num;
+	int err = 1;
+
+#ifdef CONFIG_ATSHA204A
+	struct udevice *dev = get_atsha204a_dev();
+
+	if (dev) {
+		err = atsha204a_wakeup(dev);
+		if (err)
+			goto out;
+
+		err = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
+				     OMNIA_ATSHA204_OTP_VERSION,
+				     (u8 *) &version_num);
+		if (err)
+			goto out;
+
+		err = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
+				     OMNIA_ATSHA204_OTP_SERIAL,
+				     (u8 *) &serial_num);
+		if (err)
+			goto out;
+
+		atsha204a_sleep(dev);
+	}
+
+out:
+#endif
+
+	if (err)
+		printf("Board: Turris Omnia (ver N/A). SN: N/A\n");
+	else
+		printf("Board: Turris Omnia SNL %08X%08X\n",
+		       be32_to_cpu(version_num), be32_to_cpu(serial_num));
+
+	return 0;
+}
+
+static void increment_mac(u8 *mac)
+{
+	int i;
+
+	for (i = 5; i >= 3; i--) {
+		mac[i] += 1;
+		if (mac[i])
+			break;
+	}
+}
+
+int misc_init_r(void)
+{
+#ifdef CONFIG_ATSHA204A
+	int err;
+	struct udevice *dev = get_atsha204a_dev();
+	u8 mac0[4], mac1[4], mac[6];
+
+	if (!dev)
+		goto out;
+
+	err = atsha204a_wakeup(dev);
+	if (err)
+		goto out;
+
+	err = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
+			     OMNIA_ATSHA204_OTP_MAC0, mac0);
+	if (err)
+		goto out;
+
+	err = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
+			     OMNIA_ATSHA204_OTP_MAC1, mac1);
+	if (err)
+		goto out;
+
+	atsha204a_sleep(dev);
+
+	mac[0] = mac0[1];
+	mac[1] = mac0[2];
+	mac[2] = mac0[3];
+	mac[3] = mac1[1];
+	mac[4] = mac1[2];
+	mac[5] = mac1[3];
+
+	if (is_valid_ethaddr(mac))
+		eth_setenv_enetaddr("ethaddr", mac);
+
+	increment_mac(mac);
+
+	if (is_valid_ethaddr(mac))
+		eth_setenv_enetaddr("eth1addr", mac);
+
+	increment_mac(mac);
+
+	if (is_valid_ethaddr(mac))
+		eth_setenv_enetaddr("eth2addr", mac);
+
+out:
+#endif
+
+	return 0;
+}
+
diff --git a/configs/turris_omnia_defconfig b/configs/turris_omnia_defconfig
new file mode 100644
index 0000000000..512b9da74d
--- /dev/null
+++ b/configs/turris_omnia_defconfig
@@ -0,0 +1,62 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MVEBU=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_TARGET_TURRIS_OMNIA=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_SPI_FLASH_SUPPORT=y
+CONFIG_SPL_SPI_SUPPORT=y
+CONFIG_SPL_BOOT_DEVICE_SPI=y
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_DEFAULT_DEVICE_TREE="armada-385-turris-omnia"
+CONFIG_BOOTDELAY=3
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_SPL=y
+CONFIG_SPL_I2C_SUPPORT=y
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_GO=y
+CONFIG_CMD_RUN=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_SAVEENV=y
+CONFIG_CMD_LOADB=y
+CONFIG_CMD_LOADS=y
+CONFIG_CMD_MEMORY=y
+CONFIG_CMD_ECHO=y
+CONFIG_CMD_SETEXPR=y
+# CONFIG_PARTITION_UUIDS is not set
+# CONFIG_SPL_PARTITION_UUIDS is not set
+CONFIG_DOS_PARTITION=y
+CONFIG_SPL_OF_TRANSLATE=y
+CONFIG_MISC=y
+CONFIG_ATSHA204A=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_NS16550=y
+CONFIG_DEBUG_UART_BASE=0xd0012000
+CONFIG_DEBUG_UART_CLOCK=250000000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_SYS_NS16550=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_MV=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI=y
+CONFIG_USB_EHCI_MARVELL=y
+CONFIG_USB_STORAGE=y
+CONFIG_WDT=y
+CONFIG_WDT_ORION=y
+CONFIG_ARCH_MISC_INIT=y
+CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_CMDLINE=y
+CONFIG_HUSH_PARSER=y
+CONFIG_SYS_PROMPT="=> "
+# CONFIG_DISPLAY_BOARDINFO is not set
diff --git a/include/configs/turris_omnia.h b/include/configs/turris_omnia.h
new file mode 100644
index 0000000000..4ad603d2fb
--- /dev/null
+++ b/include/configs/turris_omnia.h
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2017 Marek Behun <marek.behun@nic.cz>
+ * Copyright (C) 2016 Tomas Hlavacek <tomas.hlavacek@nic.cz>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _CONFIG_TURRIS_OMNIA_H
+#define _CONFIG_TURRIS_OMNIA_H
+
+/*
+ * High Level Configuration Options (easy to change)
+ */
+
+#define CONFIG_MISC_INIT_R
+#define CONFIG_DISPLAY_BOARDINFO_LATE
+
+/*
+ * TEXT_BASE needs to be below 16MiB, since this area is scrubbed
+ * for DDR ECC byte filling in the SPL before loading the main
+ * U-Boot into it.
+ */
+#define	CONFIG_SYS_TEXT_BASE	0x00800000
+#define CONFIG_SYS_TCLK		250000000	/* 250MHz */
+
+/*
+ * Commands configuration
+ */
+#define CONFIG_CMD_PCI
+
+/* I2C support */
+#define CONFIG_DM_I2C
+#define CONFIG_I2C_MUX
+#define CONFIG_I2C_MUX_PCA954x
+#define CONFIG_SPL_I2C_MUX
+#define CONFIG_SYS_I2C_MVTWSI
+
+/* Watchdog support */
+#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT_ORION)
+# define CONFIG_WATCHDOG
+#endif
+
+/* SPI NOR flash default params, used by sf commands */
+#define CONFIG_SF_DEFAULT_SPEED		1000000
+#define CONFIG_SF_DEFAULT_MODE		SPI_MODE_3
+#define CONFIG_SPI_FLASH
+#define CONFIG_SPI_FLASH_SPANSION
+
+/*
+ * SDIO/MMC Card Configuration
+ */
+#define CONFIG_SYS_MMC_BASE		MVEBU_SDIO_BASE
+
+/*
+ * SATA/SCSI/AHCI configuration
+ */
+#define CONFIG_LIBATA
+#define CONFIG_SCSI_AHCI
+#define CONFIG_SCSI_AHCI_PLAT
+#define CONFIG_SYS_SCSI_MAX_SCSI_ID	2
+#define CONFIG_SYS_SCSI_MAX_LUN		1
+#define CONFIG_SYS_SCSI_MAX_DEVICE	(CONFIG_SYS_SCSI_MAX_SCSI_ID * \
+					 CONFIG_SYS_SCSI_MAX_LUN)
+
+/* Additional FS support/configuration */
+#define CONFIG_SUPPORT_VFAT
+
+/* USB/EHCI configuration */
+#define CONFIG_EHCI_IS_TDI
+
+/* Environment in SPI NOR flash */
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_OFFSET		(3*(1 << 18)) /* 768KiB in */
+#define CONFIG_ENV_SIZE			(64 << 10) /* 64KiB */
+#define CONFIG_ENV_SECT_SIZE		(256 << 10) /* 256KiB sectors */
+
+#define CONFIG_PHY_MARVELL		/* there is a marvell phy */
+#define PHY_ANEG_TIMEOUT	8000	/* PHY needs a longer aneg time */
+
+/* PCIe support */
+#ifndef CONFIG_SPL_BUILD
+#define CONFIG_PCI_MVEBU
+#define CONFIG_PCI_SCAN_SHOW
+#endif
+
+#define CONFIG_SYS_ALT_MEMTEST
+
+/* Keep device tree and initrd in lower memory so the kernel can access them */
+#define RELOCATION_LIMITS_ENV_SETTINGS	\
+	"fdt_high=0x10000000\0"		\
+	"initrd_high=0x10000000\0"
+
+/* Defines for SPL */
+#define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_SIZE			(140 << 10)
+#define CONFIG_SPL_TEXT_BASE		0x40000030
+#define CONFIG_SPL_MAX_SIZE		(CONFIG_SPL_SIZE - 0x0030)
+
+#define CONFIG_SPL_BSS_START_ADDR	(0x40000000 + CONFIG_SPL_SIZE)
+#define CONFIG_SPL_BSS_MAX_SIZE		(16 << 10)
+
+#ifdef CONFIG_SPL_BUILD
+#define CONFIG_SYS_MALLOC_SIMPLE
+#endif
+
+#define CONFIG_SPL_STACK		(0x40000000 + ((192 - 16) << 10))
+#define CONFIG_SPL_BOOTROM_SAVE		(CONFIG_SPL_STACK + 4)
+#define CONFIG_SPL_DRIVERS_MISC_SUPPORT
+
+#ifdef CONFIG_TURRIS_OMNIA_SPL_BOOT_DEVICE_SPI
+/* SPL related SPI defines */
+# define CONFIG_SPL_SPI_LOAD
+# define CONFIG_SYS_SPI_U_BOOT_OFFS	0x24000
+# define CONFIG_SYS_U_BOOT_OFFS		CONFIG_SYS_SPI_U_BOOT_OFFS
+#endif
+
+#ifdef CONFIG_TURRIS_OMNIA_SPL_BOOT_DEVICE_MMC
+/* SPL related MMC defines */
+# define CONFIG_SYS_MMC_U_BOOT_OFFS		(160 << 10)
+# define CONFIG_SYS_U_BOOT_OFFS			CONFIG_SYS_MMC_U_BOOT_OFFS
+# ifdef CONFIG_SPL_BUILD
+#  define CONFIG_FIXED_SDHCI_ALIGNED_BUFFER	0x00180000	/* in SDRAM */
+# endif
+#endif
+
+/*
+ * mv-common.h should be defined after CMD configs since it used them
+ * to enable certain macros
+ */
+#include "mv-common.h"
+
+/* Include the common distro boot environment */
+#ifndef CONFIG_SPL_BUILD
+#include <config_distro_defaults.h>
+
+#ifdef CONFIG_MMC
+#define BOOT_TARGET_DEVICES_MMC(func) func(MMC, mmc, 0)
+#else
+#define BOOT_TARGET_DEVICES_MMC(func)
+#endif
+
+#ifdef CONFIG_USB_STORAGE
+#define BOOT_TARGET_DEVICES_USB(func) func(USB, usb, 0)
+#else
+#define BOOT_TARGET_DEVICES_USB(func)
+#endif
+
+#define BOOT_TARGET_DEVICES(func) \
+	BOOT_TARGET_DEVICES_MMC(func) \
+	BOOT_TARGET_DEVICES_USB(func) \
+	func(PXE, pxe, na) \
+	func(DHCP, dhcp, na)
+
+#define KERNEL_ADDR_R	__stringify(0x1000000)
+#define FDT_ADDR_R	__stringify(0x2000000)
+#define RAMDISK_ADDR_R	__stringify(0x2200000)
+#define SCRIPT_ADDR_R	__stringify(0x1800000)
+#define PXEFILE_ADDR_R	__stringify(0x1900000)
+
+#define LOAD_ADDRESS_ENV_SETTINGS \
+	"kernel_addr_r=" KERNEL_ADDR_R "\0" \
+	"fdt_addr_r=" FDT_ADDR_R "\0" \
+	"ramdisk_addr_r=" RAMDISK_ADDR_R "\0" \
+	"scriptaddr=" SCRIPT_ADDR_R "\0" \
+	"pxefile_addr_r=" PXEFILE_ADDR_R "\0"
+
+#include <config_distro_bootcmd.h>
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+	RELOCATION_LIMITS_ENV_SETTINGS \
+	LOAD_ADDRESS_ENV_SETTINGS \
+	"fdtfile=" CONFIG_DEFAULT_DEVICE_TREE ".dtb\0" \
+	"console=ttyS0,115200\0" \
+	BOOTENV
+
+#endif /* CONFIG_SPL_BUILD */
+
+#endif /* _CONFIG_TURRIS_OMNIA_H */
-- 
2.13.0

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 3/7] arch/arm/dts: Add Turris Omnia device tree
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 3/7] arch/arm/dts: Add Turris Omnia device tree Marek Behún
@ 2017-07-07 11:58   ` Stefan Roese
  2017-07-07 12:22     ` Marek Behún
  0 siblings, 1 reply; 27+ messages in thread
From: Stefan Roese @ 2017-07-07 11:58 UTC (permalink / raw)
  To: u-boot

Hi Marek,

On 09.06.2017 19:28, Marek Behún wrote:
> This device tree is taken from mainline Linux kernel commit
> 7b7db5ab. Added is also a -u-boot.dtsi file with these additions:
> 
>    - aliases for I2C and SPI devices are added, because i2cmux and
>      SPI flash doesn't work otherwise
>    - spi_flash node has been added so that the new DM API works
>    - the ATSHA204A node is added in the i2c at 5 node
>    - "u-boot,dm-pre-reloc"s are added in needed nodes for SPL
>      build to work correctly
> 
> Signed-off-by: Marek Behun <marek.behun@nic.cz>
> 
>   create mode 100644 arch/arm/dts/armada-385-turris-omnia-u-boot.dtsi
>   create mode 100644 arch/arm/dts/armada-385-turris-omnia.dts

I'm wondering, where the u-boot.dtsi is included? I can't find
any reference to it in this patch.

And usually, the dtb creation is also added to the Makefile in the
dts directory.

Thanks,
Stefan

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 3/7] arch/arm/dts: Add Turris Omnia device tree
  2017-07-07 11:58   ` Stefan Roese
@ 2017-07-07 12:22     ` Marek Behún
  2017-07-07 13:36       ` Stefan Roese
  0 siblings, 1 reply; 27+ messages in thread
From: Marek Behún @ 2017-07-07 12:22 UTC (permalink / raw)
  To: u-boot

> I'm wondering, where the u-boot.dtsi is included? I can't find
> any reference to it in this patch.

Hi Stefan, the include is somehow done automatically by the u-boot build
system. (See in u-boot/scripts/Makefile.lib, search for string "Try
these files in order to find the U-Boot-specific .dtsi include file")

> And usually, the dtb creation is also added to the Makefile in the
> dts directory.

Will include that in next patch version. I thought it wasn't necessary
since the dtb is included in the u-boot binary by the build system
anyway.

Marek

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 3/7] arch/arm/dts: Add Turris Omnia device tree
  2017-07-07 12:22     ` Marek Behún
@ 2017-07-07 13:36       ` Stefan Roese
  0 siblings, 0 replies; 27+ messages in thread
From: Stefan Roese @ 2017-07-07 13:36 UTC (permalink / raw)
  To: u-boot

On 07.07.2017 14:22, Marek Behún wrote:
>> I'm wondering, where the u-boot.dtsi is included? I can't find
>> any reference to it in this patch.
> 
> Hi Stefan, the include is somehow done automatically by the u-boot build
> system. (See in u-boot/scripts/Makefile.lib, search for string "Try
> these files in order to find the U-Boot-specific .dtsi include file")

Ah, I was not aware of an automatic inclusion of the u-boot dtsi
specific part. Very interesting.

>> And usually, the dtb creation is also added to the Makefile in the
>> dts directory.
> 
> Will include that in next patch version. I thought it wasn't necessary
> since the dtb is included in the u-boot binary by the build system
> anyway.

You don't need to resend the patch for this. Its not strictly necessary.

Thanks,
Stefan

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2017-06-09 17:28 [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Marek Behún
                   ` (5 preceding siblings ...)
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 6/7] marvell: armada385: Add the Turris Omnia board Marek Behún
@ 2017-07-12  5:53 ` Stefan Roese
  2018-01-17 15:52 ` Andreas Färber
  7 siblings, 0 replies; 27+ messages in thread
From: Stefan Roese @ 2017-07-12  5:53 UTC (permalink / raw)
  To: u-boot

Hi Marek,

On 09.06.2017 19:28, Marek Behún wrote:
> This is the fourth version of patches for adding support for the
> Turris Omnia board, a router developed by the CZ.NIC.
> 
> Modifications from last version:
>    - Since the new driver model API does not expose the
>      watchdog_reset function, only wdt_reset, the watchdog did not
>      get restarted and the device rebooted every 2 minutes in U-Boot.
>      These patches solve this problem.
>    - The SPI flash could not be accessed. I did not notice this since
>      during my testing I always uploaded the SPL image via serial
>      line. This is now also solved.
> 
> The first patch modifies Marvell's DDR3 training code to be more
> general, so that board topology map can force 2t timing.
> 
> The second patch adds support for the hardware watchdog which
> can be found on Omnia. I have modified the driver to use the new
> driver model API.
> 
> The third patch adds the device tree for Turris Omnia taken from
> Linux kernel and also armada-385-turris-omnia-u-boot.dtsi file
> with some additions for U-Boot.
> 
> The fourth patch adds support for the I2C multiplexer found on
> Turris Omnia.
> 
> The fifth patch adds support for the ATSHA204A CryptoAuthentication
> chip, on which the Turris Omnia stores serial number and device MAC
> address.
> 
> The sixth patch adds the proper support for the board. I have
> modified config to use distro defaults as requested by Andreas
> Faerber and also removed unnecessary comments.

All patches:

Applied to u-boot-marvell/master.

Thanks,
Stefan

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 4/7] drivers/i2c/muxes/pca954x: Add pca9547 I2C mux support
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 4/7] drivers/i2c/muxes/pca954x: Add pca9547 I2C mux support Marek Behún
@ 2017-09-28 21:27   ` Chris Packham
  0 siblings, 0 replies; 27+ messages in thread
From: Chris Packham @ 2017-09-28 21:27 UTC (permalink / raw)
  To: u-boot

Hi All,

On Sat, Jun 10, 2017 at 5:28 AM, Marek Behún <marek.behun@nic.cz> wrote:
> This I2C mux is found, for example, on the Turris Omnia board.
>
> Signed-off-by: Marek Behun <marek.behun@nic.cz>
> Reviewed-by: Heiko Schocher <hs@denx.de>
>
> diff --git a/drivers/i2c/muxes/pca954x.c b/drivers/i2c/muxes/pca954x.c
> index 1a6761858c..383f72f552 100644
> --- a/drivers/i2c/muxes/pca954x.c
> +++ b/drivers/i2c/muxes/pca954x.c
> @@ -13,11 +13,40 @@
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> +enum pca_type {
> +       PCA9544,
> +       PCA9547,
> +       PCA9548
> +};
> +
> +struct chip_desc {
> +       u8 enable;
> +       enum muxtype {
> +               pca954x_ismux = 0,
> +               pca954x_isswi,
> +       } muxtype;
> +};
> +
>  struct pca954x_priv {
>         u32 addr; /* I2C mux address */
>         u32 width; /* I2C mux width - number of busses */
>  };
>
> +static const struct chip_desc chips[] = {
> +       [PCA9544] = {
> +               .enable = 0x4,
> +               .muxtype = pca954x_ismux,
> +       },
> +       [PCA9547] = {
> +               .enable = 0x8,
> +               .muxtype = pca954x_ismux,
> +       },
> +       [PCA9548] = {
> +               .enable = 0x8,
> +               .muxtype = pca954x_isswi,
> +       },
> +};
> +
>  static int pca954x_deselect(struct udevice *mux, struct udevice *bus,
>                             uint channel)
>  {
> @@ -31,7 +60,13 @@ static int pca954x_select(struct udevice *mux, struct udevice *bus,
>                           uint channel)
>  {
>         struct pca954x_priv *priv = dev_get_priv(mux);
> -       uchar byte = 1 << channel;
> +       const struct chip_desc *chip = &chips[dev_get_driver_data(mux)];
> +       uchar byte;
> +
> +       if (chip->muxtype == pca954x_ismux)
> +               byte = channel | chip->enable;
> +       else
> +               byte = 1 << channel;
>
>         return dm_i2c_write(mux, priv->addr, &byte, 1);
>  }
> @@ -42,8 +77,9 @@ static const struct i2c_mux_ops pca954x_ops = {
>  };
>
>  static const struct udevice_id pca954x_ids[] = {
> -       { .compatible = "nxp,pca9548", .data = (ulong)8 },
> -       { .compatible = "nxp,pca9544", .data = (ulong)4 },
> +       { .compatible = "nxp,pca9544", .data = PCA9544 },
> +       { .compatible = "nxp,pca9547", .data = PCA9547 },
> +       { .compatible = "nxp,pca9548", .data = PCA9548 },
>         { }
>  };
>

I think this actually breaks this driver. The problem is in
pca954x_ofdata_to_platdata() where it does

    priv->width = dev_get_driver_data(dev);

Which is now not the width but one of the enum values. It would work
for 9457 or 9548 but I happen to be using a9544 which is 0 in the
enum. I'll post a patch shortly to fix this.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 1/7] driver/ddr: Add support for setting timing in hws_topology_map
  2017-06-09 17:28 ` [U-Boot] [PATCH v4 1/7] driver/ddr: Add support for setting timing in hws_topology_map Marek Behún
@ 2018-01-10  2:49   ` Chris Packham
  0 siblings, 0 replies; 27+ messages in thread
From: Chris Packham @ 2018-01-10  2:49 UTC (permalink / raw)
  To: u-boot

Hi Marek,

On Sat, Jun 10, 2017 at 5:28 AM, Marek Behún <marek.behun@nic.cz> wrote:
> The DDR3 training code for Marvell A38X currently computes 1t timing
> when given board topology map of the Turris Omnia, but Omnia needs 2t.
>
> This patch adds support for enforcing the 2t timing in struct
> hws_topology_map, through a new enum hws_timing, which can assume
> following values:
>   HWS_TIM_DEFAULT - default behaviour, compute whether to enable 2t
>                     from the number of CSs
>   HWS_TIM_1T      - enforce 1t
>   HWS_TIM_2T      - enforce 2t
>
> This patch also sets all the board topology maps (db-88f6820-amc,
> db-88f6820-gp, controlcenterdc and clearfog) to have timing set to
> HWS_TIM_DEFAULT.
>
> Signed-off-by: Marek Behun <marek.behun@nic.cz>
> Reviewed-by: Stefan Roese <sr@denx.de>

Sorry for only noticing this now but I'd like to add to this
discussion that Marvell _unconditionally_ enable 2T mode in their
bootloader (personally I hope they adopt your change). This may be an
indication that we should set HWS_TIM_2T for the clearfog and
db-88f6820 boards.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2017-06-09 17:28 [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Marek Behún
                   ` (6 preceding siblings ...)
  2017-07-12  5:53 ` [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Stefan Roese
@ 2018-01-17 15:52 ` Andreas Färber
  2018-01-18 17:20   ` Stefan Roese
  7 siblings, 1 reply; 27+ messages in thread
From: Andreas Färber @ 2018-01-17 15:52 UTC (permalink / raw)
  To: u-boot

Hi Marek and Stefan,

Am 09.06.2017 um 19:28 schrieb Marek Behún:
> This is the fourth version of patches for adding support for the
> Turris Omnia board, a router developed by the CZ.NIC.

I'm still facing trouble testing turris_omnia on latest v2018.01.

First, that made me notice there's no README for how to test and deploy.
I'm aware of temporary:
sendbeacon /dev/ttyUSBx
./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
# or without -p when s/BOOT_FROM spi/BOOT_FROM uart/
and permanent:
tftpboot 0x1000000 u-boot-spl.kwb
sf probe
sf update 0x1000000 0 $filesize

I used to have the original factory CZ.NIC U-Boot in SPI and booted test
versions only via sendbeacon+kwboot.

With mainline that appears to be broken - the CONFIG_ARMADA_38X code in
arch/arm/mach-mvebu/spl.c seems to run into !boot_device and instead of
UART tries to boot from SPI - nothing happens then and kwboot complains.
I can force it to continue booting from UART by commenting out the if.
So Stefan, it looks like your auto-detection is not working here and the
Kconfig option to force it was dropped prematurely.

When forcing UART, as soon as the progress surpasses 99%, it reboots
into SPI SPL without any error message.
Using the old U-Boot fork I've tried flashing u-boot-spl.kwb - similarly
it gets stuck in the SPL trying to boot on from SPI. After a while it
reboots, and so on in a loop.

So it seems that non-SPL U-Boot 2018.01 is broken, on my 2 GB model.

I also ran into a couple DDR3 training failures when booting via UART.
No such training problems observed booting from SPI.

Any hints appreciated.

Regards,
Andreas

-- 
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2018-01-17 15:52 ` Andreas Färber
@ 2018-01-18 17:20   ` Stefan Roese
  2018-01-18 17:56     ` Andreas Färber
  2018-01-20  1:40     ` Andreas Färber
  0 siblings, 2 replies; 27+ messages in thread
From: Stefan Roese @ 2018-01-18 17:20 UTC (permalink / raw)
  To: u-boot

Hi Andreas,

On 17.01.2018 16:52, Andreas Färber wrote:
> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>> This is the fourth version of patches for adding support for the
>> Turris Omnia board, a router developed by the CZ.NIC.
> 
> I'm still facing trouble testing turris_omnia on latest v2018.01.
> 
> First, that made me notice there's no README for how to test and deploy.
> I'm aware of temporary:
> sendbeacon /dev/ttyUSBx

I have to admit, that don't know anything about this "sendbeacon"
tool.

> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p

This is what I have used, when I tested / debugged images for
Armada XP / 38x. Please note that the init sequence is somewhat
"fragile" - so I added the -q and -s parameters, to optionally
finetune the startup timings:

# kwboot
...
   -q <req-delay>:  use specific request-delay
   -s <resp-timeo>: use specific response-timeout

You might what to play a bit with these parameters as well.

BTW: I don't have access to the Omnia router, so I can't
test anything on this specific platform.

BTW2: Kosta from Marvell just recently added a new tool / script,
to help debug / boot Marvell MVEBU boards:

tools/mrvl_uart.sh

He told me that its better to use than the "old" kwboot tool.
I never found the time to use it up until now, so I have no
personal experience. But I'm pretty sure that Kosta did a
great job here. So please give it a try.

> # or without -p when s/BOOT_FROM spi/BOOT_FROM uart/
> and permanent:
> tftpboot 0x1000000 u-boot-spl.kwb
> sf probe
> sf update 0x1000000 0 $filesize
> 
> I used to have the original factory CZ.NIC U-Boot in SPI and booted test
> versions only via sendbeacon+kwboot.
> 
> With mainline that appears to be broken - the CONFIG_ARMADA_38X code in
> arch/arm/mach-mvebu/spl.c seems to run into !boot_device and instead of
> UART tries to boot from SPI - nothing happens then and kwboot complains.
> I can force it to continue booting from UART by commenting out the if.
> So Stefan, it looks like your auto-detection is not working here and the
> Kconfig option to force it was dropped prematurely.

Hmmm. Then some patch must have broken this UART boot-ability. Could
you by any chance git-bisect, to check which patch broke this
functionality? Perhaps some of the newer patches from Sean Nyekjaer?

> When forcing UART, as soon as the progress surpasses 99%, it reboots
> into SPI SPL without any error message.
> Using the old U-Boot fork I've tried flashing u-boot-spl.kwb - similarly
> it gets stuck in the SPL trying to boot on from SPI. After a while it
> reboots, and so on in a loop.
> 
> So it seems that non-SPL U-Boot 2018.01 is broken, on my 2 GB model.

Hmmm. I can only

> I also ran into a couple DDR3 training failures when booting via UART.
> No such training problems observed booting from SPI.

Using the same U-Boot version, meaning same DDR init code? Thats
strange. I have not really worked with Armada 38x for quite some
time, but I don't remember any such problems that you describe
here. I might need to dig up an Armada 38x board and give it a
try myself...

Thanks,
Stefan

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2018-01-18 17:20   ` Stefan Roese
@ 2018-01-18 17:56     ` Andreas Färber
  2018-01-20  1:40     ` Andreas Färber
  1 sibling, 0 replies; 27+ messages in thread
From: Andreas Färber @ 2018-01-18 17:56 UTC (permalink / raw)
  To: u-boot

Hi Stefan,

Am 18.01.2018 um 18:20 schrieb Stefan Roese:
> On 17.01.2018 16:52, Andreas Färber wrote:
>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>>> This is the fourth version of patches for adding support for the
>>> Turris Omnia board, a router developed by the CZ.NIC.
>>
>> I'm still facing trouble testing turris_omnia on latest v2018.01.
>>
>> First, that made me notice there's no README for how to test and deploy.
>> I'm aware of temporary:
>> sendbeacon /dev/ttyUSBx
> 
> I have to admit, that don't know anything about this "sendbeacon"
> tool.

Quick pointer:
https://gitlab.labs.nic.cz/turris/misc/tree/master/sendbeacon

Regards,
Andreas

-- 
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2018-01-18 17:20   ` Stefan Roese
  2018-01-18 17:56     ` Andreas Färber
@ 2018-01-20  1:40     ` Andreas Färber
  2018-01-20  2:30       ` Andreas Färber
  2018-01-20  3:34       ` Andreas Färber
  1 sibling, 2 replies; 27+ messages in thread
From: Andreas Färber @ 2018-01-20  1:40 UTC (permalink / raw)
  To: u-boot

Hi,

Am 18.01.2018 um 18:20 schrieb Stefan Roese:
> On 17.01.2018 16:52, Andreas Färber wrote:
>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>>> This is the fourth version of patches for adding support for the
>>> Turris Omnia board, a router developed by the CZ.NIC.
>>
>> I'm still facing trouble testing turris_omnia on latest v2018.01.
>>
>> First, that made me notice there's no README for how to test and deploy.
>> I'm aware of temporary:
>> sendbeacon /dev/ttyUSBx
> 
> I have to admit, that don't know anything about this "sendbeacon"
> tool.
> 
>> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
> 
> This is what I have used, when I tested / debugged images for
> Armada XP / 38x. Please note that the init sequence is somewhat
> "fragile" - so I added the -q and -s parameters, to optionally
> finetune the startup timings:
> 
> # kwboot
> ...
>   -q <req-delay>:  use specific request-delay
>   -s <resp-timeo>: use specific response-timeout
> 
> You might what to play a bit with these parameters as well.

I saw them but had no idea what to pass as values. ;)
I did try -a, but it worked with and without.

> BTW: I don't have access to the Omnia router, so I can't
> test anything on this specific platform.
> 
> BTW2: Kosta from Marvell just recently added a new tool / script,
> to help debug / boot Marvell MVEBU boards:
> 
> tools/mrvl_uart.sh
> 
> He told me that its better to use than the "old" kwboot tool.
> I never found the time to use it up until now, so I have no
> personal experience. But I'm pretty sure that Kosta did a
> great job here. So please give it a try.

I did not get it to work ... or was not patient enough.

>> # or without -p when s/BOOT_FROM spi/BOOT_FROM uart/
>> and permanent:
>> tftpboot 0x1000000 u-boot-spl.kwb
>> sf probe
>> sf update 0x1000000 0 $filesize
>>
>> I used to have the original factory CZ.NIC U-Boot in SPI and booted test
>> versions only via sendbeacon+kwboot.
>>
>> With mainline that appears to be broken - the CONFIG_ARMADA_38X code in
>> arch/arm/mach-mvebu/spl.c seems to run into !boot_device and instead of
>> UART tries to boot from SPI - nothing happens then and kwboot complains.
>> I can force it to continue booting from UART by commenting out the if.
>> So Stefan, it looks like your auto-detection is not working here and the
>> Kconfig option to force it was dropped prematurely.
> 
> Hmmm. Then some patch must have broken this UART boot-ability. Could
> you by any chance git-bisect, to check which patch broke this
> functionality? Perhaps some of the newer patches from Sean Nyekjaer?

I've so far found that v2017.11 had UART boot working okay.

>> When forcing UART, as soon as the progress surpasses 99%, it reboots
>> into SPI SPL without any error message.
>> Using the old U-Boot fork I've tried flashing u-boot-spl.kwb - similarly
>> it gets stuck in the SPL trying to boot on from SPI. After a while it
>> reboots, and so on in a loop.
>>
>> So it seems that non-SPL U-Boot 2018.01 is broken, on my 2 GB model.
> 
> Hmmm. I can only

I have reconfirmed (with our GCC 7.2.1) that no version works for me:

v2017.07 did not have turris_omnia defconfig yet
b6ee860b87d8accedfb7a1fd5414f7c483603234 bad (adds turris_omnia)
v2017.09 bad
v2017.11 bad
v2018.01 bad
master bad (c4cb6e64bf068eaa1f7c96cb37da7ae6d40bbbff / arc merge)

So I have nothing to bisect and wonder how Marek tested this...

>> I also ran into a couple DDR3 training failures when booting via UART.
>> No such training problems observed booting from SPI.
> 
> Using the same U-Boot version, meaning same DDR init code?

Yes. Only difference being BOOT_FROM and the spl.c modification.

> Thats
> strange. I have not really worked with Armada 38x for quite some
> time, but I don't remember any such problems that you describe
> here. I might need to dig up an Armada 38x board and give it a
> try myself...

Regards,
Andreas

-- 
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2018-01-20  1:40     ` Andreas Färber
@ 2018-01-20  2:30       ` Andreas Färber
  2018-01-20  9:07         ` Stefan Roese
  2018-01-20  3:34       ` Andreas Färber
  1 sibling, 1 reply; 27+ messages in thread
From: Andreas Färber @ 2018-01-20  2:30 UTC (permalink / raw)
  To: u-boot

Am 20.01.2018 um 02:40 schrieb Andreas Färber:
> Hi,
> 
> Am 18.01.2018 um 18:20 schrieb Stefan Roese:
>> On 17.01.2018 16:52, Andreas Färber wrote:
>>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>>>> This is the fourth version of patches for adding support for the
>>>> Turris Omnia board, a router developed by the CZ.NIC.
>>>
>>> I'm still facing trouble testing turris_omnia on latest v2018.01.
>>>
>>> First, that made me notice there's no README for how to test and deploy.
>>> I'm aware of temporary:
>>> sendbeacon /dev/ttyUSBx
>>
>> I have to admit, that don't know anything about this "sendbeacon"
>> tool.
>>
>>> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
>>
>> This is what I have used, when I tested / debugged images for
>> Armada XP / 38x. Please note that the init sequence is somewhat
>> "fragile" - so I added the -q and -s parameters, to optionally
>> finetune the startup timings:
>>
>> # kwboot
>> ...
>>   -q <req-delay>:  use specific request-delay
>>   -s <resp-timeo>: use specific response-timeout
>>
>> You might what to play a bit with these parameters as well.
> 
> I saw them but had no idea what to pass as values. ;)
> I did try -a, but it worked with and without.
> 
>> BTW: I don't have access to the Omnia router, so I can't
>> test anything on this specific platform.
>>
>> BTW2: Kosta from Marvell just recently added a new tool / script,
>> to help debug / boot Marvell MVEBU boards:
>>
>> tools/mrvl_uart.sh
>>
>> He told me that its better to use than the "old" kwboot tool.
>> I never found the time to use it up until now, so I have no
>> personal experience. But I'm pretty sure that Kosta did a
>> great job here. So please give it a try.
> 
> I did not get it to work ... or was not patient enough.
> 
>>> # or without -p when s/BOOT_FROM spi/BOOT_FROM uart/
>>> and permanent:
>>> tftpboot 0x1000000 u-boot-spl.kwb
>>> sf probe
>>> sf update 0x1000000 0 $filesize
>>>
>>> I used to have the original factory CZ.NIC U-Boot in SPI and booted test
>>> versions only via sendbeacon+kwboot.
>>>
>>> With mainline that appears to be broken - the CONFIG_ARMADA_38X code in
>>> arch/arm/mach-mvebu/spl.c seems to run into !boot_device and instead of
>>> UART tries to boot from SPI - nothing happens then and kwboot complains.
>>> I can force it to continue booting from UART by commenting out the if.
>>> So Stefan, it looks like your auto-detection is not working here and the
>>> Kconfig option to force it was dropped prematurely.
>>
>> Hmmm. Then some patch must have broken this UART boot-ability. Could
>> you by any chance git-bisect, to check which patch broke this
>> functionality? Perhaps some of the newer patches from Sean Nyekjaer?
> 
> I've so far found that v2017.11 had UART boot working okay.

git-bisect pointed to this commit:

e83e2b390038c9075642cb243a6292241beb8d73 is the first bad commit
commit e83e2b390038c9075642cb243a6292241beb8d73
Author: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
Date:   Fri Nov 24 14:01:28 2017 +0100

    arm: mvebu: fix boot from UART when in fallback mode

    It's the first 8 bits of the bootrom error register that
    contain the boot error/fallback error code. Let's check that
    and continue to boot from UART.

    Signed-off-by: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
    Signed-off-by: Stefan Roese <sr@denx.de>

:040000 040000 c4c5cb4287ae8c3ced749a9734213a5844ddf1d9
772ec1e6401cbb2616b1337ff8757b72240458b3 M	arch

Regards,
Andreas

>>> When forcing UART, as soon as the progress surpasses 99%, it reboots
>>> into SPI SPL without any error message.
>>> Using the old U-Boot fork I've tried flashing u-boot-spl.kwb - similarly
>>> it gets stuck in the SPL trying to boot on from SPI. After a while it
>>> reboots, and so on in a loop.
>>>
>>> So it seems that non-SPL U-Boot 2018.01 is broken, on my 2 GB model.
>>
>> Hmmm. I can only
> 
> I have reconfirmed (with our GCC 7.2.1) that no version works for me:
> 
> v2017.07 did not have turris_omnia defconfig yet
> b6ee860b87d8accedfb7a1fd5414f7c483603234 bad (adds turris_omnia)
> v2017.09 bad
> v2017.11 bad
> v2018.01 bad
> master bad (c4cb6e64bf068eaa1f7c96cb37da7ae6d40bbbff / arc merge)
> 
> So I have nothing to bisect and wonder how Marek tested this...
> 
>>> I also ran into a couple DDR3 training failures when booting via UART.
>>> No such training problems observed booting from SPI.
>>
>> Using the same U-Boot version, meaning same DDR init code?
> 
> Yes. Only difference being BOOT_FROM and the spl.c modification.
> 
>> Thats
>> strange. I have not really worked with Armada 38x for quite some
>> time, but I don't remember any such problems that you describe
>> here. I might need to dig up an Armada 38x board and give it a
>> try myself...
> 
> Regards,
> Andreas
> 


-- 
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2018-01-20  1:40     ` Andreas Färber
  2018-01-20  2:30       ` Andreas Färber
@ 2018-01-20  3:34       ` Andreas Färber
  2018-01-20  9:48         ` [U-Boot] [EXT] " Kostya Porotchkin
  1 sibling, 1 reply; 27+ messages in thread
From: Andreas Färber @ 2018-01-20  3:34 UTC (permalink / raw)
  To: u-boot

Am 20.01.2018 um 02:40 schrieb Andreas Färber:
> Hi,
> 
> Am 18.01.2018 um 18:20 schrieb Stefan Roese:
>> On 17.01.2018 16:52, Andreas Färber wrote:
>>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>>>> This is the fourth version of patches for adding support for the
>>>> Turris Omnia board, a router developed by the CZ.NIC.
>>>
>>> I'm still facing trouble testing turris_omnia on latest v2018.01.
>>>
>>> First, that made me notice there's no README for how to test and deploy.
>>> I'm aware of temporary:
>>> sendbeacon /dev/ttyUSBx
>>
>> I have to admit, that don't know anything about this "sendbeacon"
>> tool.

https://gitlab.labs.nic.cz/turris/misc/tree/master/sendbeacon

>>> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
>>
>> This is what I have used, when I tested / debugged images for
>> Armada XP / 38x. Please note that the init sequence is somewhat
>> "fragile" - so I added the -q and -s parameters, to optionally
>> finetune the startup timings:
>>
>> # kwboot
>> ...
>>   -q <req-delay>:  use specific request-delay
>>   -s <resp-timeo>: use specific response-timeout
>>
>> You might what to play a bit with these parameters as well.
> 
> I saw them but had no idea what to pass as values. ;)
> I did try -a, but it worked with and without.
> 
>> BTW: I don't have access to the Omnia router, so I can't
>> test anything on this specific platform.
>>
>> BTW2: Kosta from Marvell just recently added a new tool / script,
>> to help debug / boot Marvell MVEBU boards:
>>
>> tools/mrvl_uart.sh
>>
>> He told me that its better to use than the "old" kwboot tool.
>> I never found the time to use it up until now, so I have no
>> personal experience. But I'm pretty sure that Kosta did a
>> great job here. So please give it a try.
> 
> I did not get it to work ... or was not patient enough.

It seems, just as with kwboot, the tool alone is not enough. If I use
sendbeacon before and in mrvl_uart.sh just press enter without another
reset, then the transfer does work for me, and if in the script I add -b
$default_baudrate to the minicom line, then I also see useful output.

But it does not affect the reported non-SPL boot breakage, i.e. it still
reboots from SPI immediately after loading from UART.

Regards,
Andreas

-- 
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2018-01-20  2:30       ` Andreas Färber
@ 2018-01-20  9:07         ` Stefan Roese
  2018-01-20 14:32           ` Sean Nyekjær
  0 siblings, 1 reply; 27+ messages in thread
From: Stefan Roese @ 2018-01-20  9:07 UTC (permalink / raw)
  To: u-boot

Hi Andreas,

On 20.01.2018 03:30, Andreas Färber wrote:
> Am 20.01.2018 um 02:40 schrieb Andreas Färber:
>> Hi,
>>
>> Am 18.01.2018 um 18:20 schrieb Stefan Roese:
>>> On 17.01.2018 16:52, Andreas Färber wrote:
>>>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>>>>> This is the fourth version of patches for adding support for the
>>>>> Turris Omnia board, a router developed by the CZ.NIC.
>>>>
>>>> I'm still facing trouble testing turris_omnia on latest v2018.01.
>>>>
>>>> First, that made me notice there's no README for how to test and deploy.
>>>> I'm aware of temporary:
>>>> sendbeacon /dev/ttyUSBx
>>>
>>> I have to admit, that don't know anything about this "sendbeacon"
>>> tool.
>>>
>>>> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
>>>
>>> This is what I have used, when I tested / debugged images for
>>> Armada XP / 38x. Please note that the init sequence is somewhat
>>> "fragile" - so I added the -q and -s parameters, to optionally
>>> finetune the startup timings:
>>>
>>> # kwboot
>>> ...
>>>    -q <req-delay>:  use specific request-delay
>>>    -s <resp-timeo>: use specific response-timeout
>>>
>>> You might what to play a bit with these parameters as well.
>>
>> I saw them but had no idea what to pass as values. ;)
>> I did try -a, but it worked with and without.
>>
>>> BTW: I don't have access to the Omnia router, so I can't
>>> test anything on this specific platform.
>>>
>>> BTW2: Kosta from Marvell just recently added a new tool / script,
>>> to help debug / boot Marvell MVEBU boards:
>>>
>>> tools/mrvl_uart.sh
>>>
>>> He told me that its better to use than the "old" kwboot tool.
>>> I never found the time to use it up until now, so I have no
>>> personal experience. But I'm pretty sure that Kosta did a
>>> great job here. So please give it a try.
>>
>> I did not get it to work ... or was not patient enough.
>>
>>>> # or without -p when s/BOOT_FROM spi/BOOT_FROM uart/
>>>> and permanent:
>>>> tftpboot 0x1000000 u-boot-spl.kwb
>>>> sf probe
>>>> sf update 0x1000000 0 $filesize
>>>>
>>>> I used to have the original factory CZ.NIC U-Boot in SPI and booted test
>>>> versions only via sendbeacon+kwboot.
>>>>
>>>> With mainline that appears to be broken - the CONFIG_ARMADA_38X code in
>>>> arch/arm/mach-mvebu/spl.c seems to run into !boot_device and instead of
>>>> UART tries to boot from SPI - nothing happens then and kwboot complains.
>>>> I can force it to continue booting from UART by commenting out the if.
>>>> So Stefan, it looks like your auto-detection is not working here and the
>>>> Kconfig option to force it was dropped prematurely.
>>>
>>> Hmmm. Then some patch must have broken this UART boot-ability. Could
>>> you by any chance git-bisect, to check which patch broke this
>>> functionality? Perhaps some of the newer patches from Sean Nyekjaer?
>>
>> I've so far found that v2017.11 had UART boot working okay.
> 
> git-bisect pointed to this commit:
> 
> e83e2b390038c9075642cb243a6292241beb8d73 is the first bad commit
> commit e83e2b390038c9075642cb243a6292241beb8d73
> Author: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
> Date:   Fri Nov 24 14:01:28 2017 +0100
> 
>      arm: mvebu: fix boot from UART when in fallback mode
> 
>      It's the first 8 bits of the bootrom error register that
>      contain the boot error/fallback error code. Let's check that
>      and continue to boot from UART.
> 
>      Signed-off-by: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
>      Signed-off-by: Stefan Roese <sr@denx.de>
> 
> :040000 040000 c4c5cb4287ae8c3ced749a9734213a5844ddf1d9
> 772ec1e6401cbb2616b1337ff8757b72240458b3 M	arch

Many thanks for digging into this. I'll try to check UART booting
with a A38x board sometime next week. Perhaps Sean already has
some ideas in the meantime...

Thanks,
Stefan

> Regards,
> Andreas
> 
>>>> When forcing UART, as soon as the progress surpasses 99%, it reboots
>>>> into SPI SPL without any error message.
>>>> Using the old U-Boot fork I've tried flashing u-boot-spl.kwb - similarly
>>>> it gets stuck in the SPL trying to boot on from SPI. After a while it
>>>> reboots, and so on in a loop.
>>>>
>>>> So it seems that non-SPL U-Boot 2018.01 is broken, on my 2 GB model.
>>>
>>> Hmmm. I can only
>>
>> I have reconfirmed (with our GCC 7.2.1) that no version works for me:
>>
>> v2017.07 did not have turris_omnia defconfig yet
>> b6ee860b87d8accedfb7a1fd5414f7c483603234 bad (adds turris_omnia)
>> v2017.09 bad
>> v2017.11 bad
>> v2018.01 bad
>> master bad (c4cb6e64bf068eaa1f7c96cb37da7ae6d40bbbff / arc merge)
>>
>> So I have nothing to bisect and wonder how Marek tested this...
>>
>>>> I also ran into a couple DDR3 training failures when booting via UART.
>>>> No such training problems observed booting from SPI.
>>>
>>> Using the same U-Boot version, meaning same DDR init code?
>>
>> Yes. Only difference being BOOT_FROM and the spl.c modification.
>>
>>> Thats
>>> strange. I have not really worked with Armada 38x for quite some
>>> time, but I don't remember any such problems that you describe
>>> here. I might need to dig up an Armada 38x board and give it a
>>> try myself...
>>
>> Regards,
>> Andreas
>>
> 
> 

Viele Grüße,
Stefan

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [EXT] Re: [PATCH v4 0/6] Support for the Turris Omnia router
  2018-01-20  3:34       ` Andreas Färber
@ 2018-01-20  9:48         ` Kostya Porotchkin
  2018-01-20 12:34           ` [U-Boot] mrvl_uart.sh and Turris Omnia (was: [EXT] Re: [PATCH v4 0/6] Support for the Turris Omnia router) Andreas Färber
  0 siblings, 1 reply; 27+ messages in thread
From: Kostya Porotchkin @ 2018-01-20  9:48 UTC (permalink / raw)
  To: u-boot

Hello,

Which Marvell SoC is used on this platform?
The script I added recently covert only the new Armada SoCs like A8K and A8K+.
It will not work with A3K family.

Regards
Kosta



Sent from my Samsung Galaxy smartphone.


-------- Original message --------
From: Andreas Färber <afaerber@suse.de>
Date: 1/20/18 05:34 (GMT+02:00)
To: Stefan Roese <sr@denx.de>, u-boot at lists.denx.de, Kostya Porotchkin <kostap@marvell.com>
Cc: Marek Behún <marek.behun@nic.cz>, Tomas Hlavacek <tomas.hlavacek@nic.cz>
Subject: [EXT] Re: [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router

External Email

----------------------------------------------------------------------
Am 20.01.2018 um 02:40 schrieb Andreas Färber:
> Hi,
>
> Am 18.01.2018 um 18:20 schrieb Stefan Roese:
>> On 17.01.2018 16:52, Andreas Färber wrote:
>>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>>>> This is the fourth version of patches for adding support for the
>>>> Turris Omnia board, a router developed by the CZ.NIC.
>>>
>>> I'm still facing trouble testing turris_omnia on latest v2018.01.
>>>
>>> First, that made me notice there's no README for how to test and deploy.
>>> I'm aware of temporary:
>>> sendbeacon /dev/ttyUSBx
>>
>> I have to admit, that don't know anything about this "sendbeacon"
>> tool.

https://gitlab.labs.nic.cz/turris/misc/tree/master/sendbeacon

>>> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
>>
>> This is what I have used, when I tested / debugged images for
>> Armada XP / 38x. Please note that the init sequence is somewhat
>> "fragile" - so I added the -q and -s parameters, to optionally
>> finetune the startup timings:
>>
>> # kwboot
>> ...
>>   -q <req-delay>:  use specific request-delay
>>   -s <resp-timeo>: use specific response-timeout
>>
>> You might what to play a bit with these parameters as well.
>
> I saw them but had no idea what to pass as values. ;)
> I did try -a, but it worked with and without.
>
>> BTW: I don't have access to the Omnia router, so I can't
>> test anything on this specific platform.
>>
>> BTW2: Kosta from Marvell just recently added a new tool / script,
>> to help debug / boot Marvell MVEBU boards:
>>
>> tools/mrvl_uart.sh
>>
>> He told me that its better to use than the "old" kwboot tool.
>> I never found the time to use it up until now, so I have no
>> personal experience. But I'm pretty sure that Kosta did a
>> great job here. So please give it a try.
>
> I did not get it to work ... or was not patient enough.

It seems, just as with kwboot, the tool alone is not enough. If I use
sendbeacon before and in mrvl_uart.sh just press enter without another
reset, then the transfer does work for me, and if in the script I add -b
$default_baudrate to the minicom line, then I also see useful output.

But it does not affect the reported non-SPL boot breakage, i.e. it still
reboots from SPI immediately after loading from UART.

Regards,
Andreas

--
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] mrvl_uart.sh and Turris Omnia (was: [EXT] Re: [PATCH v4 0/6] Support for the Turris Omnia router)
  2018-01-20  9:48         ` [U-Boot] [EXT] " Kostya Porotchkin
@ 2018-01-20 12:34           ` Andreas Färber
  2018-01-21  9:02             ` Kostya Porotchkin
  0 siblings, 1 reply; 27+ messages in thread
From: Andreas Färber @ 2018-01-20 12:34 UTC (permalink / raw)
  To: u-boot

Hi Kosta,

Am 20.01.2018 um 10:48 schrieb Kostya Porotchkin:
> Which Marvell SoC is used on this platform?

According to Linux DT filename it's an Armada 385.

> The script I added recently covert only the new Armada SoCs like A8K and
> A8K+.
> It will not work with A3K family.

# UART recovery downloader for Armada SoCs

    echo -e "\nMarvell recovery image downloader for Armada SoC family."

    echo -e "- The speed-up option is not awailable in SoC families
prior to A8K+"
    echo -e "- This utility is not compatible with Armada 37xx SoC family\n"

https://patchwork.ozlabs.org/patch/843021/

It doesn't rule out anything other than 37xx, sounding very generic and
making no specific statements about earlier 32-bit models. ;)

If it's known to be 7K/8K only, then you should spell that out please.
Note that I've just sent out some potentially conflicting output
cleanups that I noticed above.

Another comment: The kwboot tool is particularly handy in that -p allows
to send a binary u-boot-spl.kwb (such as from our Open Build Service)
with default of "BOOT_FROM spi" for turris_omnia here, without needing
to rebuild from sources with "BOOT_FROM uart" like I seem to need to for
mrvl_uart.sh. Are you planning to re-implement that for your script?

Regards,
Andreas


> -------- Original message --------
> From: Andreas Färber <afaerber@suse.de>
> Date: 1/20/18 05:34 (GMT+02:00)
> To: Stefan Roese <sr@denx.de>, u-boot at lists.denx.de, Kostya Porotchkin
> <kostap@marvell.com>
> Cc: Marek Behún <marek.behun@nic.cz>, Tomas Hlavacek
> <tomas.hlavacek@nic.cz>
> Subject: [EXT] Re: [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia
> router
> 
> External Email
> 
> ----------------------------------------------------------------------
> Am 20.01.2018 um 02:40 schrieb Andreas Färber:
>> Hi,
>> 
>> Am 18.01.2018 um 18:20 schrieb Stefan Roese:
>>> On 17.01.2018 16:52, Andreas Färber wrote:
>>>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>>>>> This is the fourth version of patches for adding support for the
>>>>> Turris Omnia board, a router developed by the CZ.NIC.
>>>>
>>>> I'm still facing trouble testing turris_omnia on latest v2018.01.
>>>>
>>>> First, that made me notice there's no README for how to test and deploy.
>>>> I'm aware of temporary:
>>>> sendbeacon /dev/ttyUSBx
>>>
>>> I have to admit, that don't know anything about this "sendbeacon"
>>> tool.
> 
> https://gitlab.labs.nic.cz/turris/misc/tree/master/sendbeacon
> 
>>>> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
>>>
>>> This is what I have used, when I tested / debugged images for
>>> Armada XP / 38x. Please note that the init sequence is somewhat
>>> "fragile" - so I added the -q and -s parameters, to optionally
>>> finetune the startup timings:
>>>
>>> # kwboot
>>> ...
>>>   -q <req-delay>:  use specific request-delay
>>>   -s <resp-timeo>: use specific response-timeout
>>>
>>> You might what to play a bit with these parameters as well.
>> 
>> I saw them but had no idea what to pass as values. ;)
>> I did try -a, but it worked with and without.
>> 
>>> BTW: I don't have access to the Omnia router, so I can't
>>> test anything on this specific platform.
>>>
>>> BTW2: Kosta from Marvell just recently added a new tool / script,
>>> to help debug / boot Marvell MVEBU boards:
>>>
>>> tools/mrvl_uart.sh
>>>
>>> He told me that its better to use than the "old" kwboot tool.
>>> I never found the time to use it up until now, so I have no
>>> personal experience. But I'm pretty sure that Kosta did a
>>> great job here. So please give it a try.
>> 
>> I did not get it to work ... or was not patient enough.
> 
> It seems, just as with kwboot, the tool alone is not enough. If I use
> sendbeacon before and in mrvl_uart.sh just press enter without another
> reset, then the transfer does work for me, and if in the script I add -b
> $default_baudrate to the minicom line, then I also see useful output.
> 
> But it does not affect the reported non-SPL boot breakage, i.e. it still
> reboots from SPI immediately after loading from UART.
> 
> Regards,
> Andreas
> 
> -- 
> SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
> GF: Felix Imendörffer, Jane Smithard, Graham Norton
> HRB 21284 (AG Nürnberg)


-- 
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2018-01-20  9:07         ` Stefan Roese
@ 2018-01-20 14:32           ` Sean Nyekjær
  2018-01-21 12:39             ` Andreas Färber
  0 siblings, 1 reply; 27+ messages in thread
From: Sean Nyekjær @ 2018-01-20 14:32 UTC (permalink / raw)
  To: u-boot

Hi

On 20 January 2018 10:07:57 CET, Stefan Roese <sr@denx.de> wrote:
>Hi Andreas,
>
>On 20.01.2018 03:30, Andreas Färber wrote:
>> Am 20.01.2018 um 02:40 schrieb Andreas Färber:
>>> Hi,
>>>
>>> Am 18.01.2018 um 18:20 schrieb Stefan Roese:
>>>> On 17.01.2018 16:52, Andreas Färber wrote:
>>>>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>>>>>> This is the fourth version of patches for adding support for the
>>>>>> Turris Omnia board, a router developed by the CZ.NIC.
>>>>>
>>>>> I'm still facing trouble testing turris_omnia on latest v2018.01.
>>>>>
>>>>> First, that made me notice there's no README for how to test and
>deploy.
>>>>> I'm aware of temporary:
>>>>> sendbeacon /dev/ttyUSBx
>>>>
>>>> I have to admit, that don't know anything about this "sendbeacon"
>>>> tool.
>>>>
>>>>> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
>>>>
>>>> This is what I have used, when I tested / debugged images for
>>>> Armada XP / 38x. Please note that the init sequence is somewhat
>>>> "fragile" - so I added the -q and -s parameters, to optionally
>>>> finetune the startup timings:
>>>>
>>>> # kwboot
>>>> ...
>>>>    -q <req-delay>:  use specific request-delay
>>>>    -s <resp-timeo>: use specific response-timeout
>>>>
>>>> You might what to play a bit with these parameters as well.
>>>
>>> I saw them but had no idea what to pass as values. ;)
>>> I did try -a, but it worked with and without.
>>>
>>>> BTW: I don't have access to the Omnia router, so I can't
>>>> test anything on this specific platform.
>>>>
>>>> BTW2: Kosta from Marvell just recently added a new tool / script,
>>>> to help debug / boot Marvell MVEBU boards:
>>>>
>>>> tools/mrvl_uart.sh
>>>>
>>>> He told me that its better to use than the "old" kwboot tool.
>>>> I never found the time to use it up until now, so I have no
>>>> personal experience. But I'm pretty sure that Kosta did a
>>>> great job here. So please give it a try.
>>>
>>> I did not get it to work ... or was not patient enough.
>>>
>>>>> # or without -p when s/BOOT_FROM spi/BOOT_FROM uart/
>>>>> and permanent:
>>>>> tftpboot 0x1000000 u-boot-spl.kwb
>>>>> sf probe
>>>>> sf update 0x1000000 0 $filesize
>>>>>
>>>>> I used to have the original factory CZ.NIC U-Boot in SPI and
>booted test
>>>>> versions only via sendbeacon+kwboot.
>>>>>
>>>>> With mainline that appears to be broken - the CONFIG_ARMADA_38X
>code in
>>>>> arch/arm/mach-mvebu/spl.c seems to run into !boot_device and
>instead of
>>>>> UART tries to boot from SPI - nothing happens then and kwboot
>complains.
>>>>> I can force it to continue booting from UART by commenting out the
>if.
>>>>> So Stefan, it looks like your auto-detection is not working here
>and the
>>>>> Kconfig option to force it was dropped prematurely.
>>>>
>>>> Hmmm. Then some patch must have broken this UART boot-ability.
>Could
>>>> you by any chance git-bisect, to check which patch broke this
>>>> functionality? Perhaps some of the newer patches from Sean
>Nyekjaer?
>>>
>>> I've so far found that v2017.11 had UART boot working okay.
>> 
>> git-bisect pointed to this commit:
>> 
>> e83e2b390038c9075642cb243a6292241beb8d73 is the first bad commit
>> commit e83e2b390038c9075642cb243a6292241beb8d73
>> Author: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
>> Date:   Fri Nov 24 14:01:28 2017 +0100
>> 
>>      arm: mvebu: fix boot from UART when in fallback mode
>> 
>>      It's the first 8 bits of the bootrom error register that
>>      contain the boot error/fallback error code. Let's check that
>>      and continue to boot from UART.
>> 
>>      Signed-off-by: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
>>      Signed-off-by: Stefan Roese <sr@denx.de>
>> 
>> :040000 040000 c4c5cb4287ae8c3ced749a9734213a5844ddf1d9
>> 772ec1e6401cbb2616b1337ff8757b72240458b3 M	arch
>
>Many thanks for digging into this. I'll try to check UART booting
>with a A38x board sometime next week. Perhaps Sean already has
>some ideas in the meantime...

What device are the Omnia booting from?
I was fixing when booting from uart when the romloader does fallback from other devices.
What value does boot_device contain?

BR
Sean

>
>Thanks,
>Stefan
>
>> Regards,
>> Andreas
>> 
>>>>> When forcing UART, as soon as the progress surpasses 99%, it
>reboots
>>>>> into SPI SPL without any error message.
>>>>> Using the old U-Boot fork I've tried flashing u-boot-spl.kwb -
>similarly
>>>>> it gets stuck in the SPL trying to boot on from SPI. After a while
>it
>>>>> reboots, and so on in a loop.
>>>>>
>>>>> So it seems that non-SPL U-Boot 2018.01 is broken, on my 2 GB
>model.
>>>>
>>>> Hmmm. I can only
>>>
>>> I have reconfirmed (with our GCC 7.2.1) that no version works for
>me:
>>>
>>> v2017.07 did not have turris_omnia defconfig yet
>>> b6ee860b87d8accedfb7a1fd5414f7c483603234 bad (adds turris_omnia)
>>> v2017.09 bad
>>> v2017.11 bad
>>> v2018.01 bad
>>> master bad (c4cb6e64bf068eaa1f7c96cb37da7ae6d40bbbff / arc merge)
>>>
>>> So I have nothing to bisect and wonder how Marek tested this...
>>>
>>>>> I also ran into a couple DDR3 training failures when booting via
>UART.
>>>>> No such training problems observed booting from SPI.
>>>>
>>>> Using the same U-Boot version, meaning same DDR init code?
>>>
>>> Yes. Only difference being BOOT_FROM and the spl.c modification.
>>>
>>>> Thats
>>>> strange. I have not really worked with Armada 38x for quite some
>>>> time, but I don't remember any such problems that you describe
>>>> here. I might need to dig up an Armada 38x board and give it a
>>>> try myself...
>>>
>>> Regards,
>>> Andreas
>>>
>> 
>> 
>
>Viele Grüße,
>Stefan

-- 
Sent from my mobile device. Please excuse my brevity.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] mrvl_uart.sh and Turris Omnia (was: [EXT] Re: [PATCH v4 0/6] Support for the Turris Omnia router)
  2018-01-20 12:34           ` [U-Boot] mrvl_uart.sh and Turris Omnia (was: [EXT] Re: [PATCH v4 0/6] Support for the Turris Omnia router) Andreas Färber
@ 2018-01-21  9:02             ` Kostya Porotchkin
  0 siblings, 0 replies; 27+ messages in thread
From: Kostya Porotchkin @ 2018-01-21  9:02 UTC (permalink / raw)
  To: u-boot

Hi, Andreas,

> -----Original Message-----
> From: Andreas Färber [mailto:afaerber at suse.de]
> Sent: Saturday, January 20, 2018 14:35
> To: Kostya Porotchkin; u-boot at lists.denx.de
> Cc: Stefan Roese; Marek Behún; Tomas Hlavacek
> Subject: mrvl_uart.sh and Turris Omnia (was: [EXT] Re: [U-Boot] [PATCH
> v4 0/6] Support for the Turris Omnia router)
> 
> Hi Kosta,
> 
> Am 20.01.2018 um 10:48 schrieb Kostya Porotchkin:
> > Which Marvell SoC is used on this platform?
> 
> According to Linux DT filename it's an Armada 385.
> 
> > The script I added recently covert only the new Armada SoCs like A8K
> > and
> > A8K+.
> > It will not work with A3K family.
> 
> # UART recovery downloader for Armada SoCs
> 
>     echo -e "\nMarvell recovery image downloader for Armada SoC family."
> 
>     echo -e "- The speed-up option is not awailable in SoC families
> prior to A8K+"
>     echo -e "- This utility is not compatible with Armada 37xx SoC
> family\n"
> 
> https://patchwork.ozlabs.org/patch/843021/
> 
> It doesn't rule out anything other than 37xx, sounding very generic and
> making no specific statements about earlier 32-bit models. ;)
> 
> If it's known to be 7K/8K only, then you should spell that out please.
> Note that I've just sent out some potentially conflicting output
> cleanups that I noticed above.
[Konstantin Porotchkin] 
Basically it will work with any Armada device, even with earlier KW SoCs.
The difference is that 32-bit SoCs are mandating different image formats for different boot devices.
We have removed this requirement from 64-bit models, so flash image format is the same for SPI, UART, or eMMC.
For 32-bit devices you need to get UART image in order to use with this script.
Marvell's A38x/A39x SDK build script always produces "uart recovery" image in addition to the requested boot device, so we never needed to convert the image on the fly as it is done by kwboot utility.
> 
> Another comment: The kwboot tool is particularly handy in that -p allows
> to send a binary u-boot-spl.kwb (such as from our Open Build Service)
> with default of "BOOT_FROM spi" for turris_omnia here, without needing
> to rebuild from sources with "BOOT_FROM uart" like I seem to need to for
> mrvl_uart.sh. Are you planning to re-implement that for your script?
[Konstantin Porotchkin] 
For supporting legacy devices we probably need to define some environment variable
Something like "ARMADA_LEGACY" and if it set, the source flash image should be copied to a temporary location replacing the boot device and the checksum fields in the main header with "UART" and recalculated checksum value respectfully.
Then such image could be used by the script as usual.
I currently a bit busy with implementing support for the new Marvell SoC families, so cannot promise you to add legacy support shortly.
I even do not have older platform boards on my work table for testing such support.

Regards
Kosta
> 
> Regards,
> Andreas
> 
> 
> > -------- Original message --------
> > From: Andreas Färber <afaerber@suse.de>
> > Date: 1/20/18 05:34 (GMT+02:00)
> > To: Stefan Roese <sr@denx.de>, u-boot at lists.denx.de, Kostya Porotchkin
> > <kostap@marvell.com>
> > Cc: Marek Behún <marek.behun@nic.cz>, Tomas Hlavacek
> > <tomas.hlavacek@nic.cz>
> > Subject: [EXT] Re: [U-Boot] [PATCH v4 0/6] Support for the Turris
> > Omnia router
> >
> > External Email
> >
> > ----------------------------------------------------------------------
> > Am 20.01.2018 um 02:40 schrieb Andreas Färber:
> >> Hi,
> >>
> >> Am 18.01.2018 um 18:20 schrieb Stefan Roese:
> >>> On 17.01.2018 16:52, Andreas Färber wrote:
> >>>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
> >>>>> This is the fourth version of patches for adding support for the
> >>>>> Turris Omnia board, a router developed by the CZ.NIC.
> >>>>
> >>>> I'm still facing trouble testing turris_omnia on latest v2018.01.
> >>>>
> >>>> First, that made me notice there's no README for how to test and
> deploy.
> >>>> I'm aware of temporary:
> >>>> sendbeacon /dev/ttyUSBx
> >>>
> >>> I have to admit, that don't know anything about this "sendbeacon"
> >>> tool.
> >
> > https://gitlab.labs.nic.cz/turris/misc/tree/master/sendbeacon
> >
> >>>> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
> >>>
> >>> This is what I have used, when I tested / debugged images for Armada
> >>> XP / 38x. Please note that the init sequence is somewhat "fragile" -
> >>> so I added the -q and -s parameters, to optionally finetune the
> >>> startup timings:
> >>>
> >>> # kwboot
> >>> ...
> >>>   -q <req-delay>:  use specific request-delay
> >>>   -s <resp-timeo>: use specific response-timeout
> >>>
> >>> You might what to play a bit with these parameters as well.
> >>
> >> I saw them but had no idea what to pass as values. ;) I did try -a,
> >> but it worked with and without.
> >>
> >>> BTW: I don't have access to the Omnia router, so I can't test
> >>> anything on this specific platform.
> >>>
> >>> BTW2: Kosta from Marvell just recently added a new tool / script, to
> >>> help debug / boot Marvell MVEBU boards:
> >>>
> >>> tools/mrvl_uart.sh
> >>>
> >>> He told me that its better to use than the "old" kwboot tool.
> >>> I never found the time to use it up until now, so I have no personal
> >>> experience. But I'm pretty sure that Kosta did a great job here. So
> >>> please give it a try.
> >>
> >> I did not get it to work ... or was not patient enough.
> >
> > It seems, just as with kwboot, the tool alone is not enough. If I use
> > sendbeacon before and in mrvl_uart.sh just press enter without another
> > reset, then the transfer does work for me, and if in the script I add
> > -b $default_baudrate to the minicom line, then I also see useful
> output.
> >
> > But it does not affect the reported non-SPL boot breakage, i.e. it
> > still reboots from SPI immediately after loading from UART.
> >
> > Regards,
> > Andreas
> >
> > --
> > SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
> > GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG
> > Nürnberg)
> 
> 
> --
> SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
> GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG
> Nürnberg)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2018-01-20 14:32           ` Sean Nyekjær
@ 2018-01-21 12:39             ` Andreas Färber
  2018-01-21 12:53               ` Sean Nyekjær
  2018-01-22  7:57               ` Sean Nyekjær
  0 siblings, 2 replies; 27+ messages in thread
From: Andreas Färber @ 2018-01-21 12:39 UTC (permalink / raw)
  To: u-boot

Hi,

Am 20.01.2018 um 15:32 schrieb Sean Nyekjær:
> On 20 January 2018 10:07:57 CET, Stefan Roese <sr@denx.de> wrote:
>> On 20.01.2018 03:30, Andreas Färber wrote:
>>> Am 20.01.2018 um 02:40 schrieb Andreas Färber:
>>>> Am 18.01.2018 um 18:20 schrieb Stefan Roese:
>>>>> On 17.01.2018 16:52, Andreas Färber wrote:
>>>>>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>>>>>>> This is the fourth version of patches for adding support for the
>>>>>>> Turris Omnia board, a router developed by the CZ.NIC.
>>>>>>
>>>>>> I'm still facing trouble testing turris_omnia on latest v2018.01.
>>>>>>
>>>>>> First, that made me notice there's no README for how to test and
>> deploy.
>>>>>> I'm aware of temporary:
>>>>>> sendbeacon /dev/ttyUSBx
[...]
>>>>>> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
[...]
>>>>>> # or without -p when s/BOOT_FROM spi/BOOT_FROM uart/
>>>>>> and permanent:
>>>>>> tftpboot 0x1000000 u-boot-spl.kwb
>>>>>> sf probe
>>>>>> sf update 0x1000000 0 $filesize
>>>>>>
>>>>>> I used to have the original factory CZ.NIC U-Boot in SPI and
>> booted test
>>>>>> versions only via sendbeacon+kwboot.
>>>>>>
>>>>>> With mainline that appears to be broken - the CONFIG_ARMADA_38X
>> code in
>>>>>> arch/arm/mach-mvebu/spl.c seems to run into !boot_device and
>> instead of
>>>>>> UART tries to boot from SPI - nothing happens then and kwboot
>> complains.
>>>>>> I can force it to continue booting from UART by commenting out the
>> if.
>>>>>> So Stefan, it looks like your auto-detection is not working here
>> and the
>>>>>> Kconfig option to force it was dropped prematurely.
>>>>>
>>>>> Hmmm. Then some patch must have broken this UART boot-ability.
>> Could
>>>>> you by any chance git-bisect, to check which patch broke this
>>>>> functionality? Perhaps some of the newer patches from Sean
>> Nyekjaer?
>>>>
>>>> I've so far found that v2017.11 had UART boot working okay.
>>>
>>> git-bisect pointed to this commit:
>>>
>>> e83e2b390038c9075642cb243a6292241beb8d73 is the first bad commit
>>> commit e83e2b390038c9075642cb243a6292241beb8d73
>>> Author: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
>>> Date:   Fri Nov 24 14:01:28 2017 +0100
>>>
>>>      arm: mvebu: fix boot from UART when in fallback mode
>>>
>>>      It's the first 8 bits of the bootrom error register that
>>>      contain the boot error/fallback error code. Let's check that
>>>      and continue to boot from UART.
>>>
>>>      Signed-off-by: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
>>>      Signed-off-by: Stefan Roese <sr@denx.de>
>>>
>>> :040000 040000 c4c5cb4287ae8c3ced749a9734213a5844ddf1d9
>>> 772ec1e6401cbb2616b1337ff8757b72240458b3 M	arch
>>
>> Many thanks for digging into this. I'll try to check UART booting
>> with a A38x board sometime next week. Perhaps Sean already has
>> some ideas in the meantime...
> 
> What device are the Omnia booting from?

This is about UART boot not working. The regular boot device is SPI.

> I was fixing when booting from uart when the romloader does fallback from other devices.

I am testing UART boot forced by user via sendbeacon and kwboot tools,
as well as regular SPI based boot.

https://gitlab.labs.nic.cz/turris/misc/tree/master/sendbeacon

> What value does boot_device contain?

Since it's not taking the right return path for A38x, it must be zero.

Regards,
Andreas

-- 
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2018-01-21 12:39             ` Andreas Färber
@ 2018-01-21 12:53               ` Sean Nyekjær
  2018-01-22  7:57               ` Sean Nyekjær
  1 sibling, 0 replies; 27+ messages in thread
From: Sean Nyekjær @ 2018-01-21 12:53 UTC (permalink / raw)
  To: u-boot

Hi

On 21 January 2018 13:39:15 CET, "Andreas Färber" <afaerber@suse.de> wrote:
>Hi,
>
>Am 20.01.2018 um 15:32 schrieb Sean Nyekjær:
>> On 20 January 2018 10:07:57 CET, Stefan Roese <sr@denx.de> wrote:
>>> On 20.01.2018 03:30, Andreas Färber wrote:
>>>> Am 20.01.2018 um 02:40 schrieb Andreas Färber:
>>>>> Am 18.01.2018 um 18:20 schrieb Stefan Roese:
>>>>>> On 17.01.2018 16:52, Andreas Färber wrote:
>>>>>>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>>>>>>>> This is the fourth version of patches for adding support for
>the
>>>>>>>> Turris Omnia board, a router developed by the CZ.NIC.
>>>>>>>
>>>>>>> I'm still facing trouble testing turris_omnia on latest
>v2018.01.
>>>>>>>
>>>>>>> First, that made me notice there's no README for how to test and
>>> deploy.
>>>>>>> I'm aware of temporary:
>>>>>>> sendbeacon /dev/ttyUSBx
>[...]
>>>>>>> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
>[...]
>>>>>>> # or without -p when s/BOOT_FROM spi/BOOT_FROM uart/
>>>>>>> and permanent:
>>>>>>> tftpboot 0x1000000 u-boot-spl.kwb
>>>>>>> sf probe
>>>>>>> sf update 0x1000000 0 $filesize
>>>>>>>
>>>>>>> I used to have the original factory CZ.NIC U-Boot in SPI and
>>> booted test
>>>>>>> versions only via sendbeacon+kwboot.
>>>>>>>
>>>>>>> With mainline that appears to be broken - the CONFIG_ARMADA_38X
>>> code in
>>>>>>> arch/arm/mach-mvebu/spl.c seems to run into !boot_device and
>>> instead of
>>>>>>> UART tries to boot from SPI - nothing happens then and kwboot
>>> complains.
>>>>>>> I can force it to continue booting from UART by commenting out
>the
>>> if.
>>>>>>> So Stefan, it looks like your auto-detection is not working here
>>> and the
>>>>>>> Kconfig option to force it was dropped prematurely.
>>>>>>
>>>>>> Hmmm. Then some patch must have broken this UART boot-ability.
>>> Could
>>>>>> you by any chance git-bisect, to check which patch broke this
>>>>>> functionality? Perhaps some of the newer patches from Sean
>>> Nyekjaer?
>>>>>
>>>>> I've so far found that v2017.11 had UART boot working okay.
>>>>
>>>> git-bisect pointed to this commit:
>>>>
>>>> e83e2b390038c9075642cb243a6292241beb8d73 is the first bad commit
>>>> commit e83e2b390038c9075642cb243a6292241beb8d73
>>>> Author: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
>>>> Date:   Fri Nov 24 14:01:28 2017 +0100
>>>>
>>>>      arm: mvebu: fix boot from UART when in fallback mode
>>>>
>>>>      It's the first 8 bits of the bootrom error register that
>>>>      contain the boot error/fallback error code. Let's check that
>>>>      and continue to boot from UART.
>>>>
>>>>      Signed-off-by: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
>>>>      Signed-off-by: Stefan Roese <sr@denx.de>
>>>>
>>>> :040000 040000 c4c5cb4287ae8c3ced749a9734213a5844ddf1d9
>>>> 772ec1e6401cbb2616b1337ff8757b72240458b3 M	arch
>>>
>>> Many thanks for digging into this. I'll try to check UART booting
>>> with a A38x board sometime next week. Perhaps Sean already has
>>> some ideas in the meantime...
>> 
>> What device are the Omnia booting from?
>
>This is about UART boot not working. The regular boot device is SPI.
>
>> I was fixing when booting from uart when the romloader does fallback
>from other devices.
>
>I am testing UART boot forced by user via sendbeacon and kwboot tools,
>as well as regular SPI based boot.
>
>https://gitlab.labs.nic.cz/turris/misc/tree/master/sendbeacon
>
>> What value does boot_device contain?
>
>Since it's not taking the right return path for A38x, it must be zero.


If you force SoC to boot from uart then the error register should be zero. I guess we need some more handling here...

I have tested this on a custom armada 388 board as well as Marvell development board.

/Sean
>
>Regards,
>Andreas

-- 
Sent from my mobile device. Please excuse my brevity.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router
  2018-01-21 12:39             ` Andreas Färber
  2018-01-21 12:53               ` Sean Nyekjær
@ 2018-01-22  7:57               ` Sean Nyekjær
  1 sibling, 0 replies; 27+ messages in thread
From: Sean Nyekjær @ 2018-01-22  7:57 UTC (permalink / raw)
  To: u-boot

Hi

On 2018-01-21 13:39, Andreas Färber wrote:
> Hi,
>
> Am 20.01.2018 um 15:32 schrieb Sean Nyekjær:
>> On 20 January 2018 10:07:57 CET, Stefan Roese <sr@denx.de> wrote:
>>> On 20.01.2018 03:30, Andreas Färber wrote:
>>>> Am 20.01.2018 um 02:40 schrieb Andreas Färber:
>>>>> Am 18.01.2018 um 18:20 schrieb Stefan Roese:
>>>>>> On 17.01.2018 16:52, Andreas Färber wrote:
>>>>>>> Am 09.06.2017 um 19:28 schrieb Marek Behún:
>>>>>>>> This is the fourth version of patches for adding support for the
>>>>>>>> Turris Omnia board, a router developed by the CZ.NIC.
>>>>>>> I'm still facing trouble testing turris_omnia on latest v2018.01.
>>>>>>>
>>>>>>> First, that made me notice there's no README for how to test and
>>> deploy.
>>>>>>> I'm aware of temporary:
>>>>>>> sendbeacon /dev/ttyUSBx
> [...]
>>>>>>> ./tools/kwboot -t -B 115200 /dev/ttyUSBx -b u-boot-spl.kwb -p
> [...]
>>>>>>> # or without -p when s/BOOT_FROM spi/BOOT_FROM uart/
>>>>>>> and permanent:
>>>>>>> tftpboot 0x1000000 u-boot-spl.kwb
>>>>>>> sf probe
>>>>>>> sf update 0x1000000 0 $filesize
>>>>>>>
>>>>>>> I used to have the original factory CZ.NIC U-Boot in SPI and
>>> booted test
>>>>>>> versions only via sendbeacon+kwboot.
>>>>>>>
>>>>>>> With mainline that appears to be broken - the CONFIG_ARMADA_38X
>>> code in
>>>>>>> arch/arm/mach-mvebu/spl.c seems to run into !boot_device and
>>> instead of
>>>>>>> UART tries to boot from SPI - nothing happens then and kwboot
>>> complains.
>>>>>>> I can force it to continue booting from UART by commenting out the
>>> if.
>>>>>>> So Stefan, it looks like your auto-detection is not working here
>>> and the
>>>>>>> Kconfig option to force it was dropped prematurely.
>>>>>> Hmmm. Then some patch must have broken this UART boot-ability.
>>> Could
>>>>>> you by any chance git-bisect, to check which patch broke this
>>>>>> functionality? Perhaps some of the newer patches from Sean
>>> Nyekjaer?
>>>>> I've so far found that v2017.11 had UART boot working okay.
>>>> git-bisect pointed to this commit:
>>>>
>>>> e83e2b390038c9075642cb243a6292241beb8d73 is the first bad commit
>>>> commit e83e2b390038c9075642cb243a6292241beb8d73
>>>> Author: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
>>>> Date:   Fri Nov 24 14:01:28 2017 +0100
>>>>
>>>>       arm: mvebu: fix boot from UART when in fallback mode
>>>>
>>>>       It's the first 8 bits of the bootrom error register that
>>>>       contain the boot error/fallback error code. Let's check that
>>>>       and continue to boot from UART.
>>>>
>>>>       Signed-off-by: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
>>>>       Signed-off-by: Stefan Roese <sr@denx.de>
>>>>
>>>> :040000 040000 c4c5cb4287ae8c3ced749a9734213a5844ddf1d9
>>>> 772ec1e6401cbb2616b1337ff8757b72240458b3 M	arch
>>> Many thanks for digging into this. I'll try to check UART booting
>>> with a A38x board sometime next week. Perhaps Sean already has
>>> some ideas in the meantime...
>> What device are the Omnia booting from?
> This is about UART boot not working. The regular boot device is SPI.
>
>> I was fixing when booting from uart when the romloader does fallback from other devices.
> I am testing UART boot forced by user via sendbeacon and kwboot tools,
> as well as regular SPI based boot.
>
> https://gitlab.labs.nic.cz/turris/misc/tree/master/sendbeacon
>
>> What value does boot_device contain?
> Since it's not taking the right return path for A38x, it must be zero.
Can you try to enable debug here [1].
I would like to see what device it will boot from.

/Sean

[1]: http://git.denx.de/?p=u-boot.git;a=blob;f=arch/arm/mach-mvebu/spl.c#l46

^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2018-01-22  7:57 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-09 17:28 [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Marek Behún
2017-06-09 17:28 ` [U-Boot] [PATCH v4 1/7] driver/ddr: Add support for setting timing in hws_topology_map Marek Behún
2018-01-10  2:49   ` Chris Packham
2017-06-09 17:28 ` [U-Boot] [PATCH v4 2/7] orion_wdt: Support for the Orion Watchdog Marek Behún
2017-06-09 17:28 ` [U-Boot] [PATCH v4 3/7] arch/arm/dts: Add Turris Omnia device tree Marek Behún
2017-07-07 11:58   ` Stefan Roese
2017-07-07 12:22     ` Marek Behún
2017-07-07 13:36       ` Stefan Roese
2017-06-09 17:28 ` [U-Boot] [PATCH v4 4/7] drivers/i2c/muxes/pca954x: Add pca9547 I2C mux support Marek Behún
2017-09-28 21:27   ` Chris Packham
2017-06-09 17:28 ` [U-Boot] [PATCH v4 5/7] drivers/misc: Add basic support for ATSHA204A Crypto module Marek Behún
2017-06-09 17:28 ` [U-Boot] [PATCH v4 6/7] marvell: armada385: Add the Turris Omnia board Marek Behún
2017-07-12  5:53 ` [U-Boot] [PATCH v4 0/6] Support for the Turris Omnia router Stefan Roese
2018-01-17 15:52 ` Andreas Färber
2018-01-18 17:20   ` Stefan Roese
2018-01-18 17:56     ` Andreas Färber
2018-01-20  1:40     ` Andreas Färber
2018-01-20  2:30       ` Andreas Färber
2018-01-20  9:07         ` Stefan Roese
2018-01-20 14:32           ` Sean Nyekjær
2018-01-21 12:39             ` Andreas Färber
2018-01-21 12:53               ` Sean Nyekjær
2018-01-22  7:57               ` Sean Nyekjær
2018-01-20  3:34       ` Andreas Färber
2018-01-20  9:48         ` [U-Boot] [EXT] " Kostya Porotchkin
2018-01-20 12:34           ` [U-Boot] mrvl_uart.sh and Turris Omnia (was: [EXT] Re: [PATCH v4 0/6] Support for the Turris Omnia router) Andreas Färber
2018-01-21  9:02             ` Kostya Porotchkin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.