aboutsummaryrefslogtreecommitdiffstats
path: root/roms/u-boot/board/Marvell
diff options
context:
space:
mode:
Diffstat (limited to 'roms/u-boot/board/Marvell')
-rw-r--r--roms/u-boot/board/Marvell/aspenite/Kconfig15
-rw-r--r--roms/u-boot/board/Marvell/aspenite/MAINTAINERS6
-rw-r--r--roms/u-boot/board/Marvell/aspenite/Makefile8
-rw-r--r--roms/u-boot/board/Marvell/aspenite/aspenite.c45
-rw-r--r--roms/u-boot/board/Marvell/db-88f6720/MAINTAINERS6
-rw-r--r--roms/u-boot/board/Marvell/db-88f6720/Makefile5
-rw-r--r--roms/u-boot/board/Marvell/db-88f6720/db-88f6720.c94
-rw-r--r--roms/u-boot/board/Marvell/db-88f6820-amc/MAINTAINERS6
-rw-r--r--roms/u-boot/board/Marvell/db-88f6820-amc/Makefile5
-rw-r--r--roms/u-boot/board/Marvell/db-88f6820-amc/db-88f6820-amc.c133
-rw-r--r--roms/u-boot/board/Marvell/db-88f6820-gp/MAINTAINERS6
-rw-r--r--roms/u-boot/board/Marvell/db-88f6820-gp/Makefile5
-rw-r--r--roms/u-boot/board/Marvell/db-88f6820-gp/README18
-rw-r--r--roms/u-boot/board/Marvell/db-88f6820-gp/db-88f6820-gp.c160
-rw-r--r--roms/u-boot/board/Marvell/db-mv784mp-gp/MAINTAINERS6
-rw-r--r--roms/u-boot/board/Marvell/db-mv784mp-gp/Makefile5
-rw-r--r--roms/u-boot/board/Marvell/db-mv784mp-gp/db-mv784mp-gp.c121
-rw-r--r--roms/u-boot/board/Marvell/db-xc3-24g4xg/.gitignore1
-rw-r--r--roms/u-boot/board/Marvell/db-xc3-24g4xg/MAINTAINERS7
-rw-r--r--roms/u-boot/board/Marvell/db-xc3-24g4xg/Makefile14
-rw-r--r--roms/u-boot/board/Marvell/db-xc3-24g4xg/README4
-rw-r--r--roms/u-boot/board/Marvell/db-xc3-24g4xg/binary.011
-rw-r--r--roms/u-boot/board/Marvell/db-xc3-24g4xg/db-xc3-24g4xg.c71
-rw-r--r--roms/u-boot/board/Marvell/db-xc3-24g4xg/kwbimage.cfg.in12
-rw-r--r--roms/u-boot/board/Marvell/dreamplug/Kconfig12
-rw-r--r--roms/u-boot/board/Marvell/dreamplug/MAINTAINERS6
-rw-r--r--roms/u-boot/board/Marvell/dreamplug/Makefile10
-rw-r--r--roms/u-boot/board/Marvell/dreamplug/dreamplug.c138
-rw-r--r--roms/u-boot/board/Marvell/dreamplug/dreamplug.h25
-rw-r--r--roms/u-boot/board/Marvell/dreamplug/kwbimage.cfg145
-rw-r--r--roms/u-boot/board/Marvell/gplugd/Kconfig15
-rw-r--r--roms/u-boot/board/Marvell/gplugd/MAINTAINERS6
-rw-r--r--roms/u-boot/board/Marvell/gplugd/Makefile13
-rw-r--r--roms/u-boot/board/Marvell/gplugd/gplugd.c134
-rw-r--r--roms/u-boot/board/Marvell/guruplug/Kconfig12
-rw-r--r--roms/u-boot/board/Marvell/guruplug/MAINTAINERS6
-rw-r--r--roms/u-boot/board/Marvell/guruplug/Makefile7
-rw-r--r--roms/u-boot/board/Marvell/guruplug/guruplug.c141
-rw-r--r--roms/u-boot/board/Marvell/guruplug/guruplug.h22
-rw-r--r--roms/u-boot/board/Marvell/guruplug/kwbimage.cfg144
-rw-r--r--roms/u-boot/board/Marvell/mvebu_armada-37xx/MAINTAINERS16
-rw-r--r--roms/u-boot/board/Marvell/mvebu_armada-37xx/Makefile5
-rw-r--r--roms/u-boot/board/Marvell/mvebu_armada-37xx/board.c436
-rw-r--r--roms/u-boot/board/Marvell/mvebu_armada-8k/MAINTAINERS19
-rw-r--r--roms/u-boot/board/Marvell/mvebu_armada-8k/Makefile5
-rw-r--r--roms/u-boot/board/Marvell/mvebu_armada-8k/board.c182
-rw-r--r--roms/u-boot/board/Marvell/octeon_ebb7304/Kconfig19
-rw-r--r--roms/u-boot/board/Marvell/octeon_ebb7304/MAINTAINERS7
-rw-r--r--roms/u-boot/board/Marvell/octeon_ebb7304/Makefile8
-rw-r--r--roms/u-boot/board/Marvell/octeon_ebb7304/board.c754
-rw-r--r--roms/u-boot/board/Marvell/octeon_ebb7304/board_ddr.h447
-rw-r--r--roms/u-boot/board/Marvell/octeon_nic23/Kconfig19
-rw-r--r--roms/u-boot/board/Marvell/octeon_nic23/MAINTAINERS7
-rw-r--r--roms/u-boot/board/Marvell/octeon_nic23/Makefile8
-rw-r--r--roms/u-boot/board/Marvell/octeon_nic23/board.c106
-rw-r--r--roms/u-boot/board/Marvell/octeon_nic23/board_ddr.h269
-rw-r--r--roms/u-boot/board/Marvell/octeontx/Kconfig14
-rw-r--r--roms/u-boot/board/Marvell/octeontx/MAINTAINERS8
-rw-r--r--roms/u-boot/board/Marvell/octeontx/Makefile9
-rw-r--r--roms/u-boot/board/Marvell/octeontx/board-fdt.c311
-rw-r--r--roms/u-boot/board/Marvell/octeontx/board.c153
-rw-r--r--roms/u-boot/board/Marvell/octeontx/smc.c25
-rw-r--r--roms/u-boot/board/Marvell/octeontx/soc-utils.c50
-rw-r--r--roms/u-boot/board/Marvell/octeontx2/Kconfig14
-rw-r--r--roms/u-boot/board/Marvell/octeontx2/MAINTAINERS8
-rw-r--r--roms/u-boot/board/Marvell/octeontx2/Makefile9
-rw-r--r--roms/u-boot/board/Marvell/octeontx2/board-fdt.c221
-rw-r--r--roms/u-boot/board/Marvell/octeontx2/board.c248
-rw-r--r--roms/u-boot/board/Marvell/octeontx2/smc.c58
-rw-r--r--roms/u-boot/board/Marvell/octeontx2/soc-utils.c49
-rw-r--r--roms/u-boot/board/Marvell/octeontx2_cn913x/MAINTAINERS6
-rw-r--r--roms/u-boot/board/Marvell/octeontx2_cn913x/Makefile8
-rw-r--r--roms/u-boot/board/Marvell/octeontx2_cn913x/README24
-rw-r--r--roms/u-boot/board/Marvell/octeontx2_cn913x/board.c45
-rw-r--r--roms/u-boot/board/Marvell/openrd/Kconfig12
-rw-r--r--roms/u-boot/board/Marvell/openrd/MAINTAINERS8
-rw-r--r--roms/u-boot/board/Marvell/openrd/Makefile12
-rw-r--r--roms/u-boot/board/Marvell/openrd/kwbimage.cfg150
-rw-r--r--roms/u-boot/board/Marvell/openrd/openrd.c163
-rw-r--r--roms/u-boot/board/Marvell/openrd/openrd.h29
-rw-r--r--roms/u-boot/board/Marvell/sheevaplug/Kconfig12
-rw-r--r--roms/u-boot/board/Marvell/sheevaplug/MAINTAINERS6
-rw-r--r--roms/u-boot/board/Marvell/sheevaplug/Makefile7
-rw-r--r--roms/u-boot/board/Marvell/sheevaplug/kwbimage.cfg144
-rw-r--r--roms/u-boot/board/Marvell/sheevaplug/sheevaplug.c136
-rw-r--r--roms/u-boot/board/Marvell/sheevaplug/sheevaplug.h24
86 files changed, 5870 insertions, 0 deletions
diff --git a/roms/u-boot/board/Marvell/aspenite/Kconfig b/roms/u-boot/board/Marvell/aspenite/Kconfig
new file mode 100644
index 000000000..4dd49c445
--- /dev/null
+++ b/roms/u-boot/board/Marvell/aspenite/Kconfig
@@ -0,0 +1,15 @@
+if TARGET_ASPENITE
+
+config SYS_BOARD
+ default "aspenite"
+
+config SYS_VENDOR
+ default "Marvell"
+
+config SYS_SOC
+ default "armada100"
+
+config SYS_CONFIG_NAME
+ default "aspenite"
+
+endif
diff --git a/roms/u-boot/board/Marvell/aspenite/MAINTAINERS b/roms/u-boot/board/Marvell/aspenite/MAINTAINERS
new file mode 100644
index 000000000..a77d30eb7
--- /dev/null
+++ b/roms/u-boot/board/Marvell/aspenite/MAINTAINERS
@@ -0,0 +1,6 @@
+ASPENITE BOARD
+M: Prafulla Wadaskar <prafulla@marvell.com>
+S: Maintained
+F: board/Marvell/aspenite/
+F: include/configs/aspenite.h
+F: configs/aspenite_defconfig
diff --git a/roms/u-boot/board/Marvell/aspenite/Makefile b/roms/u-boot/board/Marvell/aspenite/Makefile
new file mode 100644
index 000000000..f67a978a1
--- /dev/null
+++ b/roms/u-boot/board/Marvell/aspenite/Makefile
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2010
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+# Contributor: Mahavir Jain <mjain@marvell.com>
+
+obj-y := aspenite.o
diff --git a/roms/u-boot/board/Marvell/aspenite/aspenite.c b/roms/u-boot/board/Marvell/aspenite/aspenite.c
new file mode 100644
index 000000000..1f9389c0a
--- /dev/null
+++ b/roms/u-boot/board/Marvell/aspenite/aspenite.c
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2010
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+ * Contributor: Mahavir Jain <mjain@marvell.com>
+ */
+
+#include <common.h>
+#include <init.h>
+#include <mvmfp.h>
+#include <asm/global_data.h>
+#include <asm/mach-types.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/mfp.h>
+#include <asm/arch/armada100.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+ u32 mfp_cfg[] = {
+ /* I2C */
+ MFP105_CI2C_SDA,
+ MFP106_CI2C_SCL,
+
+ /* Enable Console on UART1 */
+ MFP107_UART1_RXD,
+ MFP108_UART1_TXD,
+
+ MFP_EOC /*End of configureation*/
+ };
+ /* configure MFP's */
+ mfp_config(mfp_cfg);
+ return 0;
+}
+
+int board_init(void)
+{
+ /* arch number of Board */
+ gd->bd->bi_arch_number = MACH_TYPE_ASPENITE;
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = armd1_sdram_base(0) + 0x100;
+ return 0;
+}
diff --git a/roms/u-boot/board/Marvell/db-88f6720/MAINTAINERS b/roms/u-boot/board/Marvell/db-88f6720/MAINTAINERS
new file mode 100644
index 000000000..a27d1c2d6
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-88f6720/MAINTAINERS
@@ -0,0 +1,6 @@
+DB_88F6720 BOARD
+M: Stefan Roese <sr@denx.de>
+S: Maintained
+F: board/Marvell/db-88f6720/
+F: include/configs/db-88f6720.h
+F: configs/db-88f6720_defconfig
diff --git a/roms/u-boot/board/Marvell/db-88f6720/Makefile b/roms/u-boot/board/Marvell/db-88f6720/Makefile
new file mode 100644
index 000000000..6c633132d
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-88f6720/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2016 Stefan Roese <sr@denx.de>
+
+obj-y := db-88f6720.o
diff --git a/roms/u-boot/board/Marvell/db-88f6720/db-88f6720.c b/roms/u-boot/board/Marvell/db-88f6720/db-88f6720.c
new file mode 100644
index 000000000..26c30647f
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-88f6720/db-88f6720.c
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2016 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <init.h>
+#include <miiphy.h>
+#include <net.h>
+#include <netdev.h>
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#include <linux/bitops.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Those values and defines are taken from the Marvell U-Boot version
+ * "u-boot-2013.01-2014_T2.0" for the board Armada 375 DB-88F6720
+ */
+#define DB_88F6720_MPP0_7 0x00020020 /* SPI */
+#define DB_88F6720_MPP8_15 0x22000022 /* SPI , I2C */
+#define DB_88F6720_MPP16_23 0x22222222 /* UART, TDM*/
+#define DB_88F6720_MPP24_31 0x33333333 /* SDIO, SPI1*/
+#define DB_88F6720_MPP32_39 0x04403330 /* SPI1, External SMI */
+#define DB_88F6720_MPP40_47 0x22002044 /* UART1, GE0, SATA0 LED */
+#define DB_88F6720_MPP48_55 0x22222222 /* GE0 */
+#define DB_88F6720_MPP56_63 0x04444422 /* GE0 , LED_MATRIX, GPIO */
+#define DB_88F6720_MPP64_67 0x014 /* LED_MATRIX, SATA1 LED*/
+
+#define DB_88F6720_GPP_OUT_ENA_LOW 0xFFFFFFFF
+#define DB_88F6720_GPP_OUT_ENA_MID 0x7FFFFFFF
+#define DB_88F6720_GPP_OUT_ENA_HIGH 0xFFFFFFFF
+#define DB_88F6720_GPP_OUT_VAL_LOW 0x0
+#define DB_88F6720_GPP_OUT_VAL_MID BIT(31) /* SATA Power output enable */
+#define DB_88F6720_GPP_OUT_VAL_HIGH 0x0
+#define DB_88F6720_GPP_POL_LOW 0x0
+#define DB_88F6720_GPP_POL_MID 0x0
+#define DB_88F6720_GPP_POL_HIGH 0x0
+
+int board_early_init_f(void)
+{
+ /* Configure MPP */
+ writel(DB_88F6720_MPP0_7, MVEBU_MPP_BASE + 0x00);
+ writel(DB_88F6720_MPP8_15, MVEBU_MPP_BASE + 0x04);
+ writel(DB_88F6720_MPP16_23, MVEBU_MPP_BASE + 0x08);
+ writel(DB_88F6720_MPP24_31, MVEBU_MPP_BASE + 0x0c);
+ writel(DB_88F6720_MPP32_39, MVEBU_MPP_BASE + 0x10);
+ writel(DB_88F6720_MPP40_47, MVEBU_MPP_BASE + 0x14);
+ writel(DB_88F6720_MPP48_55, MVEBU_MPP_BASE + 0x18);
+ writel(DB_88F6720_MPP56_63, MVEBU_MPP_BASE + 0x1c);
+ writel(DB_88F6720_MPP64_67, MVEBU_MPP_BASE + 0x20);
+
+ /* Configure GPIO */
+ /* Set GPP Out value */
+ writel(DB_88F6720_GPP_OUT_VAL_LOW, MVEBU_GPIO0_BASE + 0x00);
+ writel(DB_88F6720_GPP_OUT_VAL_MID, MVEBU_GPIO1_BASE + 0x00);
+ writel(DB_88F6720_GPP_OUT_VAL_HIGH, MVEBU_GPIO2_BASE + 0x00);
+
+ /* Set GPP Polarity */
+ writel(DB_88F6720_GPP_POL_LOW, MVEBU_GPIO0_BASE + 0x0c);
+ writel(DB_88F6720_GPP_POL_MID, MVEBU_GPIO1_BASE + 0x0c);
+ writel(DB_88F6720_GPP_POL_HIGH, MVEBU_GPIO2_BASE + 0x0c);
+
+ /* Set GPP Out Enable */
+ writel(DB_88F6720_GPP_OUT_ENA_LOW, MVEBU_GPIO0_BASE + 0x04);
+ writel(DB_88F6720_GPP_OUT_ENA_MID, MVEBU_GPIO1_BASE + 0x04);
+ writel(DB_88F6720_GPP_OUT_ENA_HIGH, MVEBU_GPIO2_BASE + 0x04);
+
+ return 0;
+}
+
+int board_init(void)
+{
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+
+ return 0;
+}
+
+int checkboard(void)
+{
+ puts("Board: Marvell DB-88F6720\n");
+
+ return 0;
+}
+
+int board_eth_init(struct bd_info *bis)
+{
+ cpu_eth_init(bis); /* Built in controller(s) come first */
+ return pci_eth_init(bis);
+}
diff --git a/roms/u-boot/board/Marvell/db-88f6820-amc/MAINTAINERS b/roms/u-boot/board/Marvell/db-88f6820-amc/MAINTAINERS
new file mode 100644
index 000000000..abf5b7efd
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-88f6820-amc/MAINTAINERS
@@ -0,0 +1,6 @@
+DB_88F6820_AMC BOARD
+M: Chris Packham <chris.packham@alliedtelesis.co.nz>
+S: Maintained
+F: board/Marvell/db-88f6820-amc/
+F: include/configs/db-88f6820-amc.h
+F: configs/db-88f6820-amc_defconfig
diff --git a/roms/u-boot/board/Marvell/db-88f6820-amc/Makefile b/roms/u-boot/board/Marvell/db-88f6820-amc/Makefile
new file mode 100644
index 000000000..99bdf1a2c
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-88f6820-amc/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2015 Stefan Roese <sr@denx.de>
+
+obj-y := db-88f6820-amc.o
diff --git a/roms/u-boot/board/Marvell/db-88f6820-amc/db-88f6820-amc.c b/roms/u-boot/board/Marvell/db-88f6820-amc/db-88f6820-amc.c
new file mode 100644
index 000000000..122c63d11
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-88f6820-amc/db-88f6820-amc.c
@@ -0,0 +1,133 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2015 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <init.h>
+#include <miiphy.h>
+#include <net.h>
+#include <netdev.h>
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#include <linux/bitops.h>
+
+#include "../drivers/ddr/marvell/a38x/ddr3_init.h"
+#include <../serdes/a38x/high_speed_env_spec.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Those values and defines are taken from the Marvell U-Boot version
+ * "u-boot-2013.01-2016_T1.0.eng_drop_v10"
+ */
+#define DB_AMC_88F68XX_GPP_OUT_ENA_LOW \
+ (~(BIT(29)))
+#define DB_AMC_88F68XX_GPP_OUT_ENA_MID \
+ (~(BIT(12) | BIT(17) | BIT(18) | BIT(20) | BIT(21)))
+#define DB_AMC_88F68XX_GPP_OUT_VAL_LOW (BIT(29))
+#define DB_AMC_88F68XX_GPP_OUT_VAL_MID 0x0
+#define DB_AMC_88F68XX_GPP_OUT_VAL_HIGH 0x0
+#define DB_AMC_88F68XX_GPP_POL_LOW 0x0
+#define DB_AMC_88F68XX_GPP_POL_MID 0x0
+
+static struct serdes_map board_serdes_map[] = {
+ {PEX0, SERDES_SPEED_5_GBPS, PEX_ROOT_COMPLEX_X1, 0, 0},
+ {DEFAULT_SERDES, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+ {DEFAULT_SERDES, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+ {DEFAULT_SERDES, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+ {SGMII1, SERDES_SPEED_1_25_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+ {SGMII2, SERDES_SPEED_1_25_GBPS, SERDES_DEFAULT_MODE, 0, 0}
+};
+
+int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 *count)
+{
+ *serdes_map_array = board_serdes_map;
+ *count = ARRAY_SIZE(board_serdes_map);
+ return 0;
+}
+
+/*
+ * 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 mv_ddr_topology_map board_topology_map = {
+ DEBUG_LEVEL_ERROR,
+ 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_1866L, /* speed_bin */
+ MV_DDR_DEV_WIDTH_8BIT, /* memory_width */
+ MV_DDR_DIE_CAP_2GBIT, /* mem_size */
+ MV_DDR_FREQ_800, /* frequency */
+ 0, 0, /* cas_wl cas_l */
+ MV_DDR_TEMP_LOW, /* temperature */
+ MV_DDR_TIM_DEFAULT} }, /* timing */
+ BUS_MASK_32BIT, /* Busses mask */
+ MV_DDR_CFG_DEFAULT, /* ddr configuration data source */
+ NOT_COMBINED, /* ddr twin-die combined */
+ { {0} }, /* raw spd data */
+ {0} /* timing parameters */
+};
+
+struct mv_ddr_topology_map *mv_ddr_topology_map_get(void)
+{
+ /* Return the board topology as defined in the board code */
+ return &board_topology_map;
+}
+
+int board_early_init_f(void)
+{
+ /* Configure MPP */
+ writel(0x11111111, MVEBU_MPP_BASE + 0x00);
+ writel(0x11111111, MVEBU_MPP_BASE + 0x04);
+ writel(0x55066011, MVEBU_MPP_BASE + 0x08);
+ writel(0x05055550, MVEBU_MPP_BASE + 0x0c);
+ writel(0x05055555, MVEBU_MPP_BASE + 0x10);
+ writel(0x01106565, MVEBU_MPP_BASE + 0x14);
+ writel(0x40000000, MVEBU_MPP_BASE + 0x18);
+ writel(0x00004444, MVEBU_MPP_BASE + 0x1c);
+
+ /* Set GPP Out value */
+ writel(DB_AMC_88F68XX_GPP_OUT_VAL_LOW, MVEBU_GPIO0_BASE + 0x00);
+ writel(DB_AMC_88F68XX_GPP_OUT_VAL_MID, MVEBU_GPIO1_BASE + 0x00);
+
+ /* Set GPP Polarity */
+ writel(DB_AMC_88F68XX_GPP_POL_LOW, MVEBU_GPIO0_BASE + 0x0c);
+ writel(DB_AMC_88F68XX_GPP_POL_MID, MVEBU_GPIO1_BASE + 0x0c);
+
+ /* Set GPP Out Enable */
+ writel(DB_AMC_88F68XX_GPP_OUT_ENA_LOW, MVEBU_GPIO0_BASE + 0x04);
+ writel(DB_AMC_88F68XX_GPP_OUT_ENA_MID, MVEBU_GPIO1_BASE + 0x04);
+
+ return 0;
+}
+
+int board_init(void)
+{
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+
+ return 0;
+}
+
+int checkboard(void)
+{
+ puts("Board: Marvell DB-88F6820-AMC\n");
+
+ return 0;
+}
+
+int board_eth_init(struct bd_info *bis)
+{
+ cpu_eth_init(bis); /* Built in controller(s) come first */
+ return pci_eth_init(bis);
+}
diff --git a/roms/u-boot/board/Marvell/db-88f6820-gp/MAINTAINERS b/roms/u-boot/board/Marvell/db-88f6820-gp/MAINTAINERS
new file mode 100644
index 000000000..f5649400e
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-88f6820-gp/MAINTAINERS
@@ -0,0 +1,6 @@
+DB_88F6820_GP BOARD
+M: Stefan Roese <sr@denx.de>
+S: Maintained
+F: board/Marvell/db-88f6820-gp/
+F: include/configs/db-88f6820-gp.h
+F: configs/db-88f6820-gp_defconfig
diff --git a/roms/u-boot/board/Marvell/db-88f6820-gp/Makefile b/roms/u-boot/board/Marvell/db-88f6820-gp/Makefile
new file mode 100644
index 000000000..afc964851
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-88f6820-gp/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2015 Stefan Roese <sr@denx.de>
+
+obj-y := db-88f6820-gp.o
diff --git a/roms/u-boot/board/Marvell/db-88f6820-gp/README b/roms/u-boot/board/Marvell/db-88f6820-gp/README
new file mode 100644
index 000000000..9bea5b35c
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-88f6820-gp/README
@@ -0,0 +1,18 @@
+Update from original Marvell U-Boot to mainline U-Boot:
+-------------------------------------------------------
+
+The resulting image including the SPL binary with the
+full DDR setup is "u-boot-spl.kwb".
+
+To update the SPI NOR flash, please use the following
+command:
+
+=> sf probe;tftpboot 2000000 db-88f6820-gp/u-boot-spl.kwb;\
+sf update 2000000 0 60000
+
+Note that the original Marvell U-Boot seems to have
+problems with the "sf update" command. This does not
+work reliable. So here this command should be used:
+
+=> sf probe;tftpboot 2000000 db-88f6820-gp/u-boot-spl.kwb;\
+sf erase 0 60000;sf write 2000000 0 60000
diff --git a/roms/u-boot/board/Marvell/db-88f6820-gp/db-88f6820-gp.c b/roms/u-boot/board/Marvell/db-88f6820-gp/db-88f6820-gp.c
new file mode 100644
index 000000000..1edc1cb65
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-88f6820-gp/db-88f6820-gp.c
@@ -0,0 +1,160 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2015 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <init.h>
+#include <miiphy.h>
+#include <net.h>
+#include <netdev.h>
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#include <linux/bitops.h>
+
+#include "../drivers/ddr/marvell/a38x/ddr3_init.h"
+#include <../serdes/a38x/high_speed_env_spec.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Those values and defines are taken from the Marvell U-Boot version
+ * "u-boot-2013.01-2014_T3.0"
+ */
+#define DB_GP_88F68XX_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 DB_GP_88F68XX_GPP_OUT_ENA_MID \
+ (~(BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(15) | \
+ BIT(16) | BIT(17) | BIT(18)))
+
+#define DB_GP_88F68XX_GPP_OUT_VAL_LOW 0x0
+#define DB_GP_88F68XX_GPP_OUT_VAL_MID 0x0
+#define DB_GP_88F68XX_GPP_POL_LOW 0x0
+#define DB_GP_88F68XX_GPP_POL_MID 0x0
+
+/* IO expander on Marvell GP board includes e.g. fan enabling */
+struct marvell_io_exp {
+ u8 chip;
+ u8 addr;
+ u8 val;
+};
+
+static struct marvell_io_exp io_exp[] = {
+ { 0x20, 6, 0x20 }, /* Configuration registers: Bit on --> Input bits */
+ { 0x20, 7, 0xC3 }, /* Configuration registers: Bit on --> Input bits */
+ { 0x20, 2, 0x1D }, /* Output Data, register#0 */
+ { 0x20, 3, 0x18 }, /* Output Data, register#1 */
+ { 0x21, 6, 0xC3 }, /* Configuration registers: Bit on --> Input bits */
+ { 0x21, 7, 0x31 }, /* Configuration registers: Bit on --> Input bits */
+ { 0x21, 2, 0x08 }, /* Output Data, register#0 */
+ { 0x21, 3, 0xC0 } /* Output Data, register#1 */
+};
+
+static struct serdes_map board_serdes_map[] = {
+ {PEX0, SERDES_SPEED_5_GBPS, PEX_ROOT_COMPLEX_X1, 0, 0},
+ {SATA0, SERDES_SPEED_3_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+ {SATA1, SERDES_SPEED_3_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+ {SATA3, SERDES_SPEED_3_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+ {SATA2, SERDES_SPEED_3_GBPS, SERDES_DEFAULT_MODE, 0, 0},
+ {USB3_HOST1, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0}
+};
+
+int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 *count)
+{
+ *serdes_map_array = board_serdes_map;
+ *count = ARRAY_SIZE(board_serdes_map);
+ return 0;
+}
+
+/*
+ * 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 mv_ddr_topology_map board_topology_map = {
+ DEBUG_LEVEL_ERROR,
+ 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_1866L, /* speed_bin */
+ MV_DDR_DEV_WIDTH_8BIT, /* memory_width */
+ MV_DDR_DIE_CAP_4GBIT, /* mem_size */
+ MV_DDR_FREQ_800, /* frequency */
+ 0, 0, /* cas_wl cas_l */
+ MV_DDR_TEMP_LOW, /* temperature */
+ MV_DDR_TIM_DEFAULT} }, /* timing */
+ BUS_MASK_32BIT, /* Busses mask */
+ MV_DDR_CFG_DEFAULT, /* ddr configuration data source */
+ NOT_COMBINED, /* ddr twin-die combined */
+ { {0} }, /* raw spd data */
+ {0} /* timing parameters */
+};
+
+struct mv_ddr_topology_map *mv_ddr_topology_map_get(void)
+{
+ /* Return the board topology as defined in the board code */
+ return &board_topology_map;
+}
+
+int board_early_init_f(void)
+{
+ /* 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(DB_GP_88F68XX_GPP_OUT_VAL_LOW, MVEBU_GPIO0_BASE + 0x00);
+ writel(DB_GP_88F68XX_GPP_OUT_VAL_MID, MVEBU_GPIO1_BASE + 0x00);
+
+ /* Set GPP Polarity */
+ writel(DB_GP_88F68XX_GPP_POL_LOW, MVEBU_GPIO0_BASE + 0x0c);
+ writel(DB_GP_88F68XX_GPP_POL_MID, MVEBU_GPIO1_BASE + 0x0c);
+
+ /* Set GPP Out Enable */
+ writel(DB_GP_88F68XX_GPP_OUT_ENA_LOW, MVEBU_GPIO0_BASE + 0x04);
+ writel(DB_GP_88F68XX_GPP_OUT_ENA_MID, MVEBU_GPIO1_BASE + 0x04);
+
+ return 0;
+}
+
+int board_init(void)
+{
+ int i;
+
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+
+ /* Init I2C IO expanders */
+ for (i = 0; i < ARRAY_SIZE(io_exp); i++)
+ i2c_write(io_exp[i].chip, io_exp[i].addr, 1, &io_exp[i].val, 1);
+
+ return 0;
+}
+
+int checkboard(void)
+{
+ puts("Board: Marvell DB-88F6820-GP\n");
+
+ return 0;
+}
+
+int board_eth_init(struct bd_info *bis)
+{
+ cpu_eth_init(bis); /* Built in controller(s) come first */
+ return pci_eth_init(bis);
+}
diff --git a/roms/u-boot/board/Marvell/db-mv784mp-gp/MAINTAINERS b/roms/u-boot/board/Marvell/db-mv784mp-gp/MAINTAINERS
new file mode 100644
index 000000000..a095f898d
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-mv784mp-gp/MAINTAINERS
@@ -0,0 +1,6 @@
+DB_MV784MP_GP BOARD
+M: Stefan Roese <sr@denx.de>
+S: Maintained
+F: board/Marvell/db-mv784mp-gp/
+F: include/configs/db-mv784mp-gp.h
+F: configs/db-mv784mp-gp_defconfig
diff --git a/roms/u-boot/board/Marvell/db-mv784mp-gp/Makefile b/roms/u-boot/board/Marvell/db-mv784mp-gp/Makefile
new file mode 100644
index 000000000..1bd2388af
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-mv784mp-gp/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2014 Stefan Roese <sr@denx.de>
+
+obj-y := db-mv784mp-gp.o
diff --git a/roms/u-boot/board/Marvell/db-mv784mp-gp/db-mv784mp-gp.c b/roms/u-boot/board/Marvell/db-mv784mp-gp/db-mv784mp-gp.c
new file mode 100644
index 000000000..9e1fdecfc
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-mv784mp-gp/db-mv784mp-gp.c
@@ -0,0 +1,121 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2014 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <init.h>
+#include <miiphy.h>
+#include <net.h>
+#include <netdev.h>
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#include <linux/bitops.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define ETH_PHY_CTRL_REG 0
+#define ETH_PHY_CTRL_POWER_DOWN_BIT 11
+#define ETH_PHY_CTRL_POWER_DOWN_MASK (1 << ETH_PHY_CTRL_POWER_DOWN_BIT)
+
+/*
+ * Those values and defines are taken from the Marvell U-Boot version
+ * "u-boot-2011.12-2014_T1.0" for the board rd78460gp aka
+ * "RD-AXP-GP rev 1.0".
+ *
+ * GPPs
+ * MPP# NAME IN/OUT
+ * ----------------------------------------------
+ * 21 SW_Reset_ OUT
+ * 25 Phy_Int# IN
+ * 28 SDI_WP IN
+ * 29 SDI_Status IN
+ * 54-61 On GPP Connector ?
+ * 62 Switch Interrupt IN
+ * 63-65 Reserved from SW Board ?
+ * 66 SW_BRD connected IN
+ */
+#define RD_78460_GP_GPP_OUT_ENA_LOW (~(BIT(21) | BIT(20)))
+#define RD_78460_GP_GPP_OUT_ENA_MID (~(BIT(26) | BIT(27)))
+#define RD_78460_GP_GPP_OUT_ENA_HIGH (~(0x0))
+
+#define RD_78460_GP_GPP_OUT_VAL_LOW (BIT(21) | BIT(20))
+#define RD_78460_GP_GPP_OUT_VAL_MID (BIT(26) | BIT(27))
+#define RD_78460_GP_GPP_OUT_VAL_HIGH 0x0
+
+int board_early_init_f(void)
+{
+ /* Configure MPP */
+ writel(0x00000000, MVEBU_MPP_BASE + 0x00);
+ writel(0x00000000, MVEBU_MPP_BASE + 0x04);
+ writel(0x33000000, MVEBU_MPP_BASE + 0x08);
+ writel(0x11000000, MVEBU_MPP_BASE + 0x0c);
+ writel(0x11111111, MVEBU_MPP_BASE + 0x10);
+ writel(0x00221100, MVEBU_MPP_BASE + 0x14);
+ writel(0x00000003, MVEBU_MPP_BASE + 0x18);
+ writel(0x00000000, MVEBU_MPP_BASE + 0x1c);
+ writel(0x00000000, MVEBU_MPP_BASE + 0x20);
+
+ /* Configure GPIO */
+ writel(RD_78460_GP_GPP_OUT_VAL_LOW, MVEBU_GPIO0_BASE + 0x00);
+ writel(RD_78460_GP_GPP_OUT_ENA_LOW, MVEBU_GPIO0_BASE + 0x04);
+ writel(RD_78460_GP_GPP_OUT_VAL_MID, MVEBU_GPIO1_BASE + 0x00);
+ writel(RD_78460_GP_GPP_OUT_ENA_MID, MVEBU_GPIO1_BASE + 0x04);
+ writel(RD_78460_GP_GPP_OUT_VAL_HIGH, MVEBU_GPIO2_BASE + 0x00);
+ writel(RD_78460_GP_GPP_OUT_ENA_HIGH, MVEBU_GPIO2_BASE + 0x04);
+
+ return 0;
+}
+
+int board_init(void)
+{
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+
+ return 0;
+}
+
+int checkboard(void)
+{
+ puts("Board: Marvell DB-MV784MP-GP\n");
+
+ return 0;
+}
+
+int board_eth_init(struct bd_info *bis)
+{
+ cpu_eth_init(bis); /* Built in controller(s) come first */
+ return pci_eth_init(bis);
+}
+
+int board_phy_config(struct phy_device *phydev)
+{
+ u16 reg;
+
+ /* Enable QSGMII AN */
+ /* Set page to 4 */
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x16, 4);
+ /* Enable AN */
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x0, 0x1140);
+ /* Set page to 0 */
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x16, 0);
+
+ /* Phy C_ANEG */
+ reg = phy_read(phydev, MDIO_DEVAD_NONE, 0x4);
+ reg |= 0x1E0;
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x4, reg);
+
+ /* Soft-Reset */
+ phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x0000);
+ phy_write(phydev, MDIO_DEVAD_NONE, 0, 0x9140);
+
+ /* Power up the phy */
+ reg = phy_read(phydev, MDIO_DEVAD_NONE, ETH_PHY_CTRL_REG);
+ reg &= ~(ETH_PHY_CTRL_POWER_DOWN_MASK);
+ phy_write(phydev, MDIO_DEVAD_NONE, ETH_PHY_CTRL_REG, reg);
+
+ printf("88E1545 Initialized\n");
+ return 0;
+}
diff --git a/roms/u-boot/board/Marvell/db-xc3-24g4xg/.gitignore b/roms/u-boot/board/Marvell/db-xc3-24g4xg/.gitignore
new file mode 100644
index 000000000..775b9346b
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-xc3-24g4xg/.gitignore
@@ -0,0 +1 @@
+kwbimage.cfg
diff --git a/roms/u-boot/board/Marvell/db-xc3-24g4xg/MAINTAINERS b/roms/u-boot/board/Marvell/db-xc3-24g4xg/MAINTAINERS
new file mode 100644
index 000000000..2b27e4818
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-xc3-24g4xg/MAINTAINERS
@@ -0,0 +1,7 @@
+DB-XC3-24G4XG BOARD
+M: Chris Packham <chris.packham@alliedtelesis.co.nz>
+S: Maintained
+F: board/Marvell/db-xc3-24g4xg/
+F: include/configs/db-xc3-24g4xg.h
+F: configs/db-xc3-24g4xg_defconfig
+F: arch/arm/dts/armada-xp-db-xc3-24g4xg.dts
diff --git a/roms/u-boot/board/Marvell/db-xc3-24g4xg/Makefile b/roms/u-boot/board/Marvell/db-xc3-24g4xg/Makefile
new file mode 100644
index 000000000..24e820000
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-xc3-24g4xg/Makefile
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2015 Stefan Roese <sr@denx.de>
+
+obj-y := db-xc3-24g4xg.o
+extra-y := kwbimage.cfg
+
+quiet_cmd_sed = SED $@
+ cmd_sed = sed $(SEDFLAGS_$(@F)) $< >$(dir $@)$(@F)
+
+SEDFLAGS_kwbimage.cfg =-e "s|^BINARY.*|BINARY $(srctree)/$(@D)/binary.0 0000005b 00000068|"
+$(obj)/kwbimage.cfg: $(src)/kwbimage.cfg.in include/autoconf.mk \
+ include/config/auto.conf
+ $(call if_changed,sed)
diff --git a/roms/u-boot/board/Marvell/db-xc3-24g4xg/README b/roms/u-boot/board/Marvell/db-xc3-24g4xg/README
new file mode 100644
index 000000000..5e479b433
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-xc3-24g4xg/README
@@ -0,0 +1,4 @@
+To generate binary.0 from Marvell's bin_hdr.elf use the following command
+
+ arm-softfloat-linux-gnueabi-objcopy -S -O binary bin_hdr.elf \
+ board/Marvell/db-xc3-24g4xg/binary.0
diff --git a/roms/u-boot/board/Marvell/db-xc3-24g4xg/binary.0 b/roms/u-boot/board/Marvell/db-xc3-24g4xg/binary.0
new file mode 100644
index 000000000..8dd687286
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-xc3-24g4xg/binary.0
@@ -0,0 +1,11 @@
+--------
+WARNING:
+--------
+This file should contain the bin_hdr generated by the original Marvell
+U-Boot implementation. As this is currently not included in this
+U-Boot version, we have added this placeholder, so that the U-Boot
+image can be generated without errors.
+
+If you have a known to be working bin_hdr for your board, then you
+just need to replace this text file here with the binary header
+and recompile U-Boot.
diff --git a/roms/u-boot/board/Marvell/db-xc3-24g4xg/db-xc3-24g4xg.c b/roms/u-boot/board/Marvell/db-xc3-24g4xg/db-xc3-24g4xg.c
new file mode 100644
index 000000000..0abdca1cd
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-xc3-24g4xg/db-xc3-24g4xg.c
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2015 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <init.h>
+#include <asm/global_data.h>
+#include <asm/gpio.h>
+#include <linux/bitops.h>
+#include <linux/mbus.h>
+#include <linux/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * These values and defines are taken from the Marvell U-Boot version
+ * "u-boot-2013.01-2016_T1.0.eng_drop_v6"
+ */
+#define DB_DX_AC3_GPP_OUT_ENA_LOW (~(BIT(0) | BIT(2) | BIT(3) | BIT(4) | BIT(6) | BIT(12) \
+ | BIT(13) | BIT(16) | BIT(17) | BIT(20) | BIT(29) | BIT(30)))
+#define DB_DX_AC3_GPP_OUT_ENA_MID (~(0))
+#define DB_DX_AC3_GPP_OUT_VAL_LOW (BIT(0) | BIT(2) | BIT(3) | BIT(4) | BIT(6) | BIT(12) \
+ | BIT(13) | BIT(16) | BIT(17) | BIT(20) | BIT(29) | BIT(30))
+#define DB_DX_AC3_GPP_OUT_VAL_MID 0x0
+#define DB_DX_AC3_GPP_POL_LOW 0x0
+#define DB_DX_AC3_GPP_POL_MID 0x0
+
+int board_early_init_f(void)
+{
+ /* Configure MPP */
+ writel(0x00142222, MVEBU_MPP_BASE + 0x00);
+ writel(0x11122000, MVEBU_MPP_BASE + 0x04);
+ writel(0x44444004, MVEBU_MPP_BASE + 0x08);
+ writel(0x14444444, MVEBU_MPP_BASE + 0x0c);
+ writel(0x00000001, MVEBU_MPP_BASE + 0x10);
+
+ /* Set GPP Out value */
+ writel(DB_DX_AC3_GPP_OUT_VAL_LOW, MVEBU_GPIO0_BASE + 0x00);
+ writel(DB_DX_AC3_GPP_OUT_VAL_MID, MVEBU_GPIO1_BASE + 0x00);
+
+ /* Set GPP Polarity */
+ writel(DB_DX_AC3_GPP_POL_LOW, MVEBU_GPIO0_BASE + 0x0c);
+ writel(DB_DX_AC3_GPP_POL_MID, MVEBU_GPIO1_BASE + 0x0c);
+
+ /* Set GPP Out Enable */
+ writel(DB_DX_AC3_GPP_OUT_ENA_LOW, MVEBU_GPIO0_BASE + 0x04);
+ writel(DB_DX_AC3_GPP_OUT_ENA_MID, MVEBU_GPIO1_BASE + 0x04);
+
+ return 0;
+}
+
+int board_init(void)
+{
+ /* address of boot parameters */
+ gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+
+ return 0;
+}
+
+#ifdef CONFIG_DISPLAY_BOARDINFO
+int checkboard(void)
+{
+ puts("Board: " CONFIG_SYS_BOARD "\n");
+
+ return 0;
+}
+#endif
diff --git a/roms/u-boot/board/Marvell/db-xc3-24g4xg/kwbimage.cfg.in b/roms/u-boot/board/Marvell/db-xc3-24g4xg/kwbimage.cfg.in
new file mode 100644
index 000000000..b8bb7a6eb
--- /dev/null
+++ b/roms/u-boot/board/Marvell/db-xc3-24g4xg/kwbimage.cfg.in
@@ -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 board/Marvell/db-xc3-24g4xg/binary.0 0000005b 00000068
diff --git a/roms/u-boot/board/Marvell/dreamplug/Kconfig b/roms/u-boot/board/Marvell/dreamplug/Kconfig
new file mode 100644
index 000000000..f65ff7371
--- /dev/null
+++ b/roms/u-boot/board/Marvell/dreamplug/Kconfig
@@ -0,0 +1,12 @@
+if TARGET_DREAMPLUG
+
+config SYS_BOARD
+ default "dreamplug"
+
+config SYS_VENDOR
+ default "Marvell"
+
+config SYS_CONFIG_NAME
+ default "dreamplug"
+
+endif
diff --git a/roms/u-boot/board/Marvell/dreamplug/MAINTAINERS b/roms/u-boot/board/Marvell/dreamplug/MAINTAINERS
new file mode 100644
index 000000000..2561ba813
--- /dev/null
+++ b/roms/u-boot/board/Marvell/dreamplug/MAINTAINERS
@@ -0,0 +1,6 @@
+DREAMPLUG BOARD
+M: Jason Cooper <u-boot@lakedaemon.net>
+S: Maintained
+F: board/Marvell/dreamplug/
+F: include/configs/dreamplug.h
+F: configs/dreamplug_defconfig
diff --git a/roms/u-boot/board/Marvell/dreamplug/Makefile b/roms/u-boot/board/Marvell/dreamplug/Makefile
new file mode 100644
index 000000000..e239d591b
--- /dev/null
+++ b/roms/u-boot/board/Marvell/dreamplug/Makefile
@@ -0,0 +1,10 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2011
+# Jason Cooper <u-boot@lakedaemon.net>
+#
+# Based on work by:
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Siddarth Gore <gores@marvell.com>
+
+obj-y := dreamplug.o
diff --git a/roms/u-boot/board/Marvell/dreamplug/dreamplug.c b/roms/u-boot/board/Marvell/dreamplug/dreamplug.c
new file mode 100644
index 000000000..e1c64b522
--- /dev/null
+++ b/roms/u-boot/board/Marvell/dreamplug/dreamplug.c
@@ -0,0 +1,138 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2011
+ * Jason Cooper <u-boot@lakedaemon.net>
+ *
+ * Based on work by:
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Siddarth Gore <gores@marvell.com>
+ */
+
+#include <common.h>
+#include <init.h>
+#include <miiphy.h>
+#include <net.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#include <asm/arch/mpp.h>
+#include <asm/global_data.h>
+#include "dreamplug.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+ /*
+ * default gpio configuration
+ * There are maximum 64 gpios controlled through 2 sets of registers
+ * the below configuration configures mainly initial LED status
+ */
+ mvebu_config_gpio(DREAMPLUG_OE_VAL_LOW,
+ DREAMPLUG_OE_VAL_HIGH,
+ DREAMPLUG_OE_LOW, DREAMPLUG_OE_HIGH);
+
+ /* Multi-Purpose Pins Functionality configuration */
+ static const u32 kwmpp_config[] = {
+ MPP0_SPI_SCn, /* SPI Flash */
+ MPP1_SPI_MOSI,
+ MPP2_SPI_SCK,
+ MPP3_SPI_MISO,
+ MPP4_NF_IO6,
+ MPP5_NF_IO7,
+ MPP6_SYSRST_OUTn,
+ MPP7_GPO,
+ MPP8_TW_SDA,
+ MPP9_TW_SCK,
+ MPP10_UART0_TXD, /* Serial */
+ MPP11_UART0_RXD,
+ MPP12_SD_CLK, /* SDIO Slot */
+ MPP13_SD_CMD,
+ MPP14_SD_D0,
+ MPP15_SD_D1,
+ MPP16_SD_D2,
+ MPP17_SD_D3,
+ MPP18_NF_IO0,
+ MPP19_NF_IO1,
+ MPP20_GE1_0, /* Gigabit Ethernet */
+ MPP21_GE1_1,
+ MPP22_GE1_2,
+ MPP23_GE1_3,
+ MPP24_GE1_4,
+ MPP25_GE1_5,
+ MPP26_GE1_6,
+ MPP27_GE1_7,
+ MPP28_GE1_8,
+ MPP29_GE1_9,
+ MPP30_GE1_10,
+ MPP31_GE1_11,
+ MPP32_GE1_12,
+ MPP33_GE1_13,
+ MPP34_GE1_14,
+ MPP35_GE1_15,
+ MPP36_GPIO, /* 7 external GPIO pins (36 - 45) */
+ MPP37_GPIO,
+ MPP38_GPIO,
+ MPP39_GPIO,
+ MPP40_TDM_SPI_SCK,
+ MPP41_TDM_SPI_MISO,
+ MPP42_TDM_SPI_MOSI,
+ MPP43_GPIO,
+ MPP44_GPIO,
+ MPP45_GPIO,
+ MPP46_GPIO,
+ MPP47_GPIO, /* Bluetooth LED */
+ MPP48_GPIO, /* Wifi LED */
+ MPP49_GPIO, /* Wifi AP LED */
+ 0
+ };
+ kirkwood_mpp_conf(kwmpp_config, NULL);
+ return 0;
+}
+
+int board_init(void)
+{
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+
+ return 0;
+}
+
+#ifdef CONFIG_RESET_PHY_R
+void mv_phy_88e1116_init(char *name)
+{
+ u16 reg;
+ u16 devadr;
+
+ if (miiphy_set_current_dev(name))
+ return;
+
+ /* command to read PHY dev address */
+ if (miiphy_read(name, 0xEE, 0xEE, (u16 *) &devadr)) {
+ printf("Err..%s could not read PHY dev address\n",
+ __func__);
+ return;
+ }
+
+ /*
+ * Enable RGMII delay on Tx and Rx for CPU port
+ * Ref: sec 4.7.2 of chip datasheet
+ */
+ miiphy_write(name, devadr, MV88E1116_PGADR_REG, 2);
+ miiphy_read(name, devadr, MV88E1116_MAC_CTRL2_REG, &reg);
+ reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL);
+ miiphy_write(name, devadr, MV88E1116_MAC_CTRL2_REG, reg);
+ miiphy_write(name, devadr, MV88E1116_PGADR_REG, 0);
+
+ /* reset the phy */
+ miiphy_reset(name, devadr);
+
+ printf("88E1116 Initialized on %s\n", name);
+}
+
+void reset_phy(void)
+{
+ /* configure and initialize both PHY's */
+ mv_phy_88e1116_init("egiga0");
+ mv_phy_88e1116_init("egiga1");
+}
+#endif /* CONFIG_RESET_PHY_R */
diff --git a/roms/u-boot/board/Marvell/dreamplug/dreamplug.h b/roms/u-boot/board/Marvell/dreamplug/dreamplug.h
new file mode 100644
index 000000000..6f6223898
--- /dev/null
+++ b/roms/u-boot/board/Marvell/dreamplug/dreamplug.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2011
+ * Jason Cooper <u-boot@lakedaemon.net>
+ *
+ * Based on work by:
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Siddarth Gore <gores@marvell.com>
+ */
+
+#ifndef __DREAMPLUG_H
+#define __DREAMPLUG_H
+
+#define DREAMPLUG_OE_LOW (~(0))
+#define DREAMPLUG_OE_HIGH (~(0))
+#define DREAMPLUG_OE_VAL_LOW 0
+#define DREAMPLUG_OE_VAL_HIGH (0xf << 16) /* 4 LED Pins high */
+
+/* PHY related */
+#define MV88E1116_MAC_CTRL2_REG 21
+#define MV88E1116_PGADR_REG 22
+#define MV88E1116_RGMII_TXTM_CTRL (1 << 4)
+#define MV88E1116_RGMII_RXTM_CTRL (1 << 5)
+
+#endif /* __DREAMPLUG_H */
diff --git a/roms/u-boot/board/Marvell/dreamplug/kwbimage.cfg b/roms/u-boot/board/Marvell/dreamplug/kwbimage.cfg
new file mode 100644
index 000000000..f916208c1
--- /dev/null
+++ b/roms/u-boot/board/Marvell/dreamplug/kwbimage.cfg
@@ -0,0 +1,145 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2011
+# Jason Cooper <u-boot@lakedaemon.net>
+#
+# Based on work by:
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Siddarth Gore <gores@marvell.com>
+# Refer doc/README.kwbimage for more details about how-to configure
+# and create kirkwood boot image
+#
+
+# Boot Media configurations
+BOOT_FROM spi
+
+# SOC registers configuration using bootrom header extension
+# Maximum KWBIMAGE_MAX_CONFIG configurations allowed
+
+# Configure RGMII-0/1 interface pad voltage to 1.8V
+DATA 0xFFD100e0 0x1b1b9b9b
+
+#Dram initalization for SINGLE x16 CL=5 @ 400MHz
+DATA 0xFFD01400 0x43000c30 # DDR Configuration register
+# bit13-0: 0xc30 (3120 DDR2 clks refresh rate)
+# bit23-14: zero
+# bit24: 1= enable exit self refresh mode on DDR access
+# bit25: 1 required
+# bit29-26: zero
+# bit31-30: 01
+
+DATA 0xFFD01404 0x37543000 # DDR Controller Control Low
+# bit 4: 0=addr/cmd in smame cycle
+# bit 5: 0=clk is driven during self refresh, we don't care for APX
+# bit 6: 0=use recommended falling edge of clk for addr/cmd
+# bit14: 0=input buffer always powered up
+# bit18: 1=cpu lock transaction enabled
+# bit23-20: 5=recommended value for CL=5 and STARTBURST_DEL disabled bit31=0
+# bit27-24: 7= CL+2, STARTBURST sample stages, for freqs 400MHz, unbuffered DIMM
+# bit30-28: 3 required
+# bit31: 0=no additional STARTBURST delay
+
+DATA 0xFFD01408 0x22125451 # DDR Timing (Low) (active cycles value +1)
+# bit3-0: TRAS lsbs
+# bit7-4: TRCD
+# bit11- 8: TRP
+# bit15-12: TWR
+# bit19-16: TWTR
+# bit20: TRAS msb
+# bit23-21: 0x0
+# bit27-24: TRRD
+# bit31-28: TRTP
+
+DATA 0xFFD0140C 0x00000a33 # DDR Timing (High)
+# bit6-0: TRFC
+# bit8-7: TR2R
+# bit10-9: TR2W
+# bit12-11: TW2W
+# bit31-13: zero required
+
+DATA 0xFFD01410 0x000000cc # DDR Address Control
+# bit1-0: 01, Cs0width=x8
+# bit3-2: 10, Cs0size=1Gb
+# bit5-4: 01, Cs1width=x8
+# bit7-6: 10, Cs1size=1Gb
+# bit9-8: 00, Cs2width=nonexistent
+# bit11-10: 00, Cs2size =nonexistent
+# bit13-12: 00, Cs3width=nonexistent
+# bit15-14: 00, Cs3size =nonexistent
+# bit16: 0, Cs0AddrSel
+# bit17: 0, Cs1AddrSel
+# bit18: 0, Cs2AddrSel
+# bit19: 0, Cs3AddrSel
+# bit31-20: 0 required
+
+DATA 0xFFD01414 0x00000000 # DDR Open Pages Control
+# bit0: 0, OpenPage enabled
+# bit31-1: 0 required
+
+DATA 0xFFD01418 0x00000000 # DDR Operation
+# bit3-0: 0x0, DDR cmd
+# bit31-4: 0 required
+
+DATA 0xFFD0141C 0x00000C52 # DDR Mode
+# bit2-0: 2, BurstLen=2 required
+# bit3: 0, BurstType=0 required
+# bit6-4: 4, CL=5
+# bit7: 0, TestMode=0 normal
+# bit8: 0, DLL reset=0 normal
+# bit11-9: 6, auto-precharge write recovery ????????????
+# bit12: 0, PD must be zero
+# bit31-13: 0 required
+
+DATA 0xFFD01420 0x00000040 # DDR Extended Mode
+# bit0: 0, DDR DLL enabled
+# bit1: 0, DDR drive strenght normal
+# bit2: 0, DDR ODT control lsd (disabled)
+# bit5-3: 000, required
+# bit6: 1, DDR ODT control msb, (disabled)
+# bit9-7: 000, required
+# bit10: 0, differential DQS enabled
+# bit11: 0, required
+# bit12: 0, DDR output buffer enabled
+# bit31-13: 0 required
+
+DATA 0xFFD01424 0x0000F17F # DDR Controller Control High
+# bit2-0: 111, required
+# bit3 : 1 , MBUS Burst Chop disabled
+# bit6-4: 111, required
+# bit7 : 0
+# bit8 : 1 , add writepath sample stage, must be 1 for DDR freq >= 300MHz
+# bit9 : 0 , no half clock cycle addition to dataout
+# bit10 : 0 , 1/4 clock cycle skew enabled for addr/ctl signals
+# bit11 : 0 , 1/4 clock cycle skew disabled for write mesh
+# bit15-12: 1111 required
+# bit31-16: 0 required
+
+DATA 0xFFD01428 0x00085520 # DDR2 ODT Read Timing (default values)
+DATA 0xFFD0147C 0x00008552 # DDR2 ODT Write Timing (default values)
+
+DATA 0xFFD01500 0x00000000 # CS[0]n Base address to 0x0
+DATA 0xFFD01504 0x0FFFFFF1 # CS[0]n Size
+# bit0: 1, Window enabled
+# bit1: 0, Write Protect disabled
+# bit3-2: 00, CS0 hit selected
+# bit23-4: ones, required
+# bit31-24: 0x0F, Size (i.e. 256MB)
+
+DATA 0xFFD01508 0x10000000 # CS[1]n Base address to 256Mb
+DATA 0xFFD0150C 0x0FFFFFF5 # CS[1]n Size 256Mb Window enabled for CS1
+
+DATA 0xFFD01514 0x00000000 # CS[2]n Size, window disabled
+DATA 0xFFD0151C 0x00000000 # CS[3]n Size, window disabled
+
+DATA 0xFFD01494 0x00030000 # DDR ODT Control (Low)
+DATA 0xFFD01498 0x00000000 # DDR ODT Control (High)
+# bit1-0: 00, ODT0 controlled by ODT Control (low) register above
+# bit3-2: 01, ODT1 active NEVER!
+# bit31-4: zero, required
+
+DATA 0xFFD0149C 0x0000E803 # CPU ODT Control
+DATA 0xFFD01480 0x00000001 # DDR Initialization Control
+#bit0=1, enable DDR init upon this register write
+
+# End of Header extension
+DATA 0x0 0x0
diff --git a/roms/u-boot/board/Marvell/gplugd/Kconfig b/roms/u-boot/board/Marvell/gplugd/Kconfig
new file mode 100644
index 000000000..d94481650
--- /dev/null
+++ b/roms/u-boot/board/Marvell/gplugd/Kconfig
@@ -0,0 +1,15 @@
+if TARGET_GPLUGD
+
+config SYS_BOARD
+ default "gplugd"
+
+config SYS_VENDOR
+ default "Marvell"
+
+config SYS_SOC
+ default "armada100"
+
+config SYS_CONFIG_NAME
+ default "gplugd"
+
+endif
diff --git a/roms/u-boot/board/Marvell/gplugd/MAINTAINERS b/roms/u-boot/board/Marvell/gplugd/MAINTAINERS
new file mode 100644
index 000000000..197c6a01d
--- /dev/null
+++ b/roms/u-boot/board/Marvell/gplugd/MAINTAINERS
@@ -0,0 +1,6 @@
+GPLUGD BOARD
+M: Ajay Bhargav <contact@8051projects.net>
+S: Maintained
+F: board/Marvell/gplugd/
+F: include/configs/gplugd.h
+F: configs/gplugd_defconfig
diff --git a/roms/u-boot/board/Marvell/gplugd/Makefile b/roms/u-boot/board/Marvell/gplugd/Makefile
new file mode 100644
index 000000000..6161bf1c8
--- /dev/null
+++ b/roms/u-boot/board/Marvell/gplugd/Makefile
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2011
+# eInfochips Ltd. <www.einfochips.com>
+# Written-by: Ajay Bhargav <contact@8051projects.net>
+#
+# Based on Aspenite:
+# (C) Copyright 2010
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+# Contributor: Mahavir Jain <mjain@marvell.com>
+
+obj-y := gplugd.o
diff --git a/roms/u-boot/board/Marvell/gplugd/gplugd.c b/roms/u-boot/board/Marvell/gplugd/gplugd.c
new file mode 100644
index 000000000..c6376cdf6
--- /dev/null
+++ b/roms/u-boot/board/Marvell/gplugd/gplugd.c
@@ -0,0 +1,134 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2011
+ * eInfochips Ltd. <www.einfochips.com>
+ * Written-by: Ajay Bhargav <contact@8051projects.net>
+ *
+ * Based on Aspenite:
+ * (C) Copyright 2010
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+ * Contributor: Mahavir Jain <mjain@marvell.com>
+ */
+
+#include <common.h>
+#include <init.h>
+#include <log.h>
+#include <mvmfp.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/mfp.h>
+#include <asm/arch/armada100.h>
+#include <asm/global_data.h>
+#include <asm/gpio.h>
+#include <miiphy.h>
+#include <asm/mach-types.h>
+#include <linux/delay.h>
+
+#ifdef CONFIG_ARMADA100_FEC
+#include <net.h>
+#include <netdev.h>
+#endif /* CONFIG_ARMADA100_FEC */
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+ u32 mfp_cfg[] = {
+ /* I2C */
+ MFP105_CI2C_SDA,
+ MFP106_CI2C_SCL,
+
+ /* Enable Console on UART3 */
+ MFPO8_UART3_TXD,
+ MFPO9_UART3_RXD,
+
+ /* Ethernet PHY Interface */
+ MFP086_ETH_TXCLK,
+ MFP087_ETH_TXEN,
+ MFP088_ETH_TXDQ3,
+ MFP089_ETH_TXDQ2,
+ MFP090_ETH_TXDQ1,
+ MFP091_ETH_TXDQ0,
+ MFP092_ETH_CRS,
+ MFP093_ETH_COL,
+ MFP094_ETH_RXCLK,
+ MFP095_ETH_RXER,
+ MFP096_ETH_RXDQ3,
+ MFP097_ETH_RXDQ2,
+ MFP098_ETH_RXDQ1,
+ MFP099_ETH_RXDQ0,
+ MFP100_ETH_MDC,
+ MFP101_ETH_MDIO,
+ MFP103_ETH_RXDV,
+
+ /* SSP2 */
+ MFP107_SSP2_RXD,
+ MFP108_SSP2_TXD,
+ MFP110_SSP2_CS,
+ MFP111_SSP2_CLK,
+
+ MFP_EOC /*End of configuration*/
+ };
+ /* configure MFP's */
+ mfp_config(mfp_cfg);
+ return 0;
+}
+
+int board_init(void)
+{
+ struct armd1apb2_registers *apb2_regs =
+ (struct armd1apb2_registers *)ARMD1_APBC2_BASE;
+
+ /* arch number of Board */
+ gd->bd->bi_arch_number = MACH_TYPE_GPLUGD;
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = armd1_sdram_base(0) + 0x100;
+ /* Assert PHY_RST# */
+ gpio_direction_output(CONFIG_SYS_GPIO_PHY_RST, GPIO_LOW);
+ udelay(10);
+ /* Deassert PHY_RST# */
+ gpio_set_value(CONFIG_SYS_GPIO_PHY_RST, GPIO_HIGH);
+
+ /* Enable SSP2 clock */
+ writel(SSP2_APBCLK | SSP2_FNCLK, &apb2_regs->ssp2_clkrst);
+ return 0;
+}
+
+#ifdef CONFIG_ARMADA100_FEC
+int board_eth_init(struct bd_info *bis)
+{
+ struct armd1apmu_registers *apmu_regs =
+ (struct armd1apmu_registers *)ARMD1_APMU_BASE;
+
+ /* Enable clock of ethernet controller */
+ writel(FE_CLK_RST | FE_CLK_ENA, &apmu_regs->fecrc);
+
+ return armada100_fec_register(ARMD1_FEC_BASE);
+}
+
+#ifdef CONFIG_RESET_PHY_R
+/* Configure and initialize PHY chip 88E3015 */
+void reset_phy(void)
+{
+ u16 phy_adr;
+ const char *name = "armd-fec0";
+
+ if (miiphy_set_current_dev(name))
+ return;
+
+ /* command to read PHY dev address */
+ if (miiphy_read(name, 0xff, 0xff, &phy_adr)) {
+ printf("Err..%s could not read PHY dev address\n", __func__);
+ return;
+ }
+
+ /* Set Ethernet LED in TX blink mode */
+ miiphy_write(name, phy_adr, PHY_LED_MAN_REG, 0x00);
+ miiphy_write(name, phy_adr, PHY_LED_PAR_SEL_REG, PHY_LED_VAL);
+
+ /* reset the phy */
+ miiphy_reset(name, phy_adr);
+ debug("88E3015 Initialized on %s\n", name);
+}
+#endif /* CONFIG_RESET_PHY_R */
+#endif /* CONFIG_ARMADA100_FEC */
diff --git a/roms/u-boot/board/Marvell/guruplug/Kconfig b/roms/u-boot/board/Marvell/guruplug/Kconfig
new file mode 100644
index 000000000..529e6e3b4
--- /dev/null
+++ b/roms/u-boot/board/Marvell/guruplug/Kconfig
@@ -0,0 +1,12 @@
+if TARGET_GURUPLUG
+
+config SYS_BOARD
+ default "guruplug"
+
+config SYS_VENDOR
+ default "Marvell"
+
+config SYS_CONFIG_NAME
+ default "guruplug"
+
+endif
diff --git a/roms/u-boot/board/Marvell/guruplug/MAINTAINERS b/roms/u-boot/board/Marvell/guruplug/MAINTAINERS
new file mode 100644
index 000000000..b5d073483
--- /dev/null
+++ b/roms/u-boot/board/Marvell/guruplug/MAINTAINERS
@@ -0,0 +1,6 @@
+GURUPLUG BOARD
+M: Siddarth Gore <gores@marvell.com>
+S: Maintained
+F: board/Marvell/guruplug/
+F: include/configs/guruplug.h
+F: configs/guruplug_defconfig
diff --git a/roms/u-boot/board/Marvell/guruplug/Makefile b/roms/u-boot/board/Marvell/guruplug/Makefile
new file mode 100644
index 000000000..b0dfc0cd6
--- /dev/null
+++ b/roms/u-boot/board/Marvell/guruplug/Makefile
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2009
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Siddarth Gore <gores@marvell.com>
+
+obj-y := guruplug.o
diff --git a/roms/u-boot/board/Marvell/guruplug/guruplug.c b/roms/u-boot/board/Marvell/guruplug/guruplug.c
new file mode 100644
index 000000000..8e7dbb3f3
--- /dev/null
+++ b/roms/u-boot/board/Marvell/guruplug/guruplug.c
@@ -0,0 +1,141 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Siddarth Gore <gores@marvell.com>
+ */
+
+#include <common.h>
+#include <init.h>
+#include <miiphy.h>
+#include <net.h>
+#include <asm/global_data.h>
+#include <asm/mach-types.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#include <asm/arch/mpp.h>
+#include "guruplug.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+ /*
+ * default gpio configuration
+ * There are maximum 64 gpios controlled through 2 sets of registers
+ * the below configuration configures mainly initial LED status
+ */
+ mvebu_config_gpio(GURUPLUG_OE_VAL_LOW,
+ GURUPLUG_OE_VAL_HIGH,
+ GURUPLUG_OE_LOW, GURUPLUG_OE_HIGH);
+
+ /* Multi-Purpose Pins Functionality configuration */
+ static const u32 kwmpp_config[] = {
+ MPP0_NF_IO2,
+ MPP1_NF_IO3,
+ MPP2_NF_IO4,
+ MPP3_NF_IO5,
+ MPP4_NF_IO6,
+ MPP5_NF_IO7,
+ MPP6_SYSRST_OUTn,
+ MPP7_GPO, /* GPIO_RST */
+ MPP8_TW_SDA,
+ MPP9_TW_SCK,
+ MPP10_UART0_TXD,
+ MPP11_UART0_RXD,
+ MPP12_SD_CLK,
+ MPP13_SD_CMD,
+ MPP14_SD_D0,
+ MPP15_SD_D1,
+ MPP16_SD_D2,
+ MPP17_SD_D3,
+ MPP18_NF_IO0,
+ MPP19_NF_IO1,
+ MPP20_GE1_0,
+ MPP21_GE1_1,
+ MPP22_GE1_2,
+ MPP23_GE1_3,
+ MPP24_GE1_4,
+ MPP25_GE1_5,
+ MPP26_GE1_6,
+ MPP27_GE1_7,
+ MPP28_GE1_8,
+ MPP29_GE1_9,
+ MPP30_GE1_10,
+ MPP31_GE1_11,
+ MPP32_GE1_12,
+ MPP33_GE1_13,
+ MPP34_GE1_14,
+ MPP35_GE1_15,
+ MPP36_GPIO,
+ MPP37_GPIO,
+ MPP38_GPIO,
+ MPP39_GPIO,
+ MPP40_TDM_SPI_SCK,
+ MPP41_TDM_SPI_MISO,
+ MPP42_TDM_SPI_MOSI,
+ MPP43_GPIO,
+ MPP44_GPIO,
+ MPP45_GPIO,
+ MPP46_GPIO, /* M_RLED */
+ MPP47_GPIO, /* M_GLED */
+ MPP48_GPIO, /* B_RLED */
+ MPP49_GPIO, /* B_GLED */
+ 0
+ };
+ kirkwood_mpp_conf(kwmpp_config, NULL);
+ return 0;
+}
+
+int board_init(void)
+{
+ /*
+ * arch number of board
+ */
+ gd->bd->bi_arch_number = MACH_TYPE_GURUPLUG;
+
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+
+ return 0;
+}
+
+#ifdef CONFIG_RESET_PHY_R
+void mv_phy_88e1121_init(char *name)
+{
+ u16 reg;
+ u16 devadr;
+
+ if (miiphy_set_current_dev(name))
+ return;
+
+ /* command to read PHY dev address */
+ if (miiphy_read(name, 0xEE, 0xEE, (u16 *) &devadr)) {
+ printf("Err..%s could not read PHY dev address\n",
+ __FUNCTION__);
+ return;
+ }
+
+ /*
+ * Enable RGMII delay on Tx and Rx for CPU port
+ * Ref: sec 4.7.2 of chip datasheet
+ */
+ miiphy_write(name, devadr, MV88E1121_PGADR_REG, 2);
+ miiphy_read(name, devadr, MV88E1121_MAC_CTRL2_REG, &reg);
+ reg |= (MV88E1121_RGMII_RXTM_CTRL | MV88E1121_RGMII_TXTM_CTRL);
+ miiphy_write(name, devadr, MV88E1121_MAC_CTRL2_REG, reg);
+ miiphy_write(name, devadr, MV88E1121_PGADR_REG, 0);
+
+ /* reset the phy */
+ miiphy_reset(name, devadr);
+
+ printf("88E1121 Initialized on %s\n", name);
+}
+
+void reset_phy(void)
+{
+ /* configure and initialize both PHY's */
+ mv_phy_88e1121_init("egiga0");
+ mv_phy_88e1121_init("egiga1");
+}
+#endif /* CONFIG_RESET_PHY_R */
diff --git a/roms/u-boot/board/Marvell/guruplug/guruplug.h b/roms/u-boot/board/Marvell/guruplug/guruplug.h
new file mode 100644
index 000000000..a70236681
--- /dev/null
+++ b/roms/u-boot/board/Marvell/guruplug/guruplug.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Siddarth Gore <gores@marvell.com>
+ */
+
+#ifndef __GURUPLUG_H
+#define __GURUPLUG_H
+
+#define GURUPLUG_OE_LOW (~(0))
+#define GURUPLUG_OE_HIGH (~(0))
+#define GURUPLUG_OE_VAL_LOW 0
+#define GURUPLUG_OE_VAL_HIGH (0xf << 16) /* 4 LED Pins high */
+
+/* PHY related */
+#define MV88E1121_MAC_CTRL2_REG 21
+#define MV88E1121_PGADR_REG 22
+#define MV88E1121_RGMII_TXTM_CTRL (1 << 4)
+#define MV88E1121_RGMII_RXTM_CTRL (1 << 5)
+
+#endif /* __GURUPLUG_H */
diff --git a/roms/u-boot/board/Marvell/guruplug/kwbimage.cfg b/roms/u-boot/board/Marvell/guruplug/kwbimage.cfg
new file mode 100644
index 000000000..8a0d752c9
--- /dev/null
+++ b/roms/u-boot/board/Marvell/guruplug/kwbimage.cfg
@@ -0,0 +1,144 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2009
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Siddarth Gore <gores@marvell.com>
+# Refer doc/README.kwbimage for more details about how-to configure
+# and create kirkwood boot image
+#
+
+# Boot Media configurations
+BOOT_FROM nand
+NAND_ECC_MODE default
+NAND_PAGE_SIZE 0x0800
+
+# SOC registers configuration using bootrom header extension
+# Maximum KWBIMAGE_MAX_CONFIG configurations allowed
+
+# Configure RGMII-0/1 interface pad voltage to 1.8V
+DATA 0xFFD100e0 0x1b1b9b9b
+
+#Dram initalization for SINGLE x16 CL=5 @ 400MHz
+DATA 0xFFD01400 0x43000c30 # DDR Configuration register
+# bit13-0: 0xc30 (3120 DDR2 clks refresh rate)
+# bit23-14: zero
+# bit24: 1= enable exit self refresh mode on DDR access
+# bit25: 1 required
+# bit29-26: zero
+# bit31-30: 01
+
+DATA 0xFFD01404 0x37543000 # DDR Controller Control Low
+# bit 4: 0=addr/cmd in smame cycle
+# bit 5: 0=clk is driven during self refresh, we don't care for APX
+# bit 6: 0=use recommended falling edge of clk for addr/cmd
+# bit14: 0=input buffer always powered up
+# bit18: 1=cpu lock transaction enabled
+# bit23-20: 5=recommended value for CL=5 and STARTBURST_DEL disabled bit31=0
+# bit27-24: 7= CL+2, STARTBURST sample stages, for freqs 400MHz, unbuffered DIMM
+# bit30-28: 3 required
+# bit31: 0=no additional STARTBURST delay
+
+DATA 0xFFD01408 0x22125451 # DDR Timing (Low) (active cycles value +1)
+# bit3-0: TRAS lsbs
+# bit7-4: TRCD
+# bit11- 8: TRP
+# bit15-12: TWR
+# bit19-16: TWTR
+# bit20: TRAS msb
+# bit23-21: 0x0
+# bit27-24: TRRD
+# bit31-28: TRTP
+
+DATA 0xFFD0140C 0x00000a33 # DDR Timing (High)
+# bit6-0: TRFC
+# bit8-7: TR2R
+# bit10-9: TR2W
+# bit12-11: TW2W
+# bit31-13: zero required
+
+DATA 0xFFD01410 0x000000cc # DDR Address Control
+# bit1-0: 01, Cs0width=x8
+# bit3-2: 10, Cs0size=1Gb
+# bit5-4: 01, Cs1width=x8
+# bit7-6: 10, Cs1size=1Gb
+# bit9-8: 00, Cs2width=nonexistent
+# bit11-10: 00, Cs2size =nonexistent
+# bit13-12: 00, Cs3width=nonexistent
+# bit15-14: 00, Cs3size =nonexistent
+# bit16: 0, Cs0AddrSel
+# bit17: 0, Cs1AddrSel
+# bit18: 0, Cs2AddrSel
+# bit19: 0, Cs3AddrSel
+# bit31-20: 0 required
+
+DATA 0xFFD01414 0x00000000 # DDR Open Pages Control
+# bit0: 0, OpenPage enabled
+# bit31-1: 0 required
+
+DATA 0xFFD01418 0x00000000 # DDR Operation
+# bit3-0: 0x0, DDR cmd
+# bit31-4: 0 required
+
+DATA 0xFFD0141C 0x00000C52 # DDR Mode
+# bit2-0: 2, BurstLen=2 required
+# bit3: 0, BurstType=0 required
+# bit6-4: 4, CL=5
+# bit7: 0, TestMode=0 normal
+# bit8: 0, DLL reset=0 normal
+# bit11-9: 6, auto-precharge write recovery ????????????
+# bit12: 0, PD must be zero
+# bit31-13: 0 required
+
+DATA 0xFFD01420 0x00000040 # DDR Extended Mode
+# bit0: 0, DDR DLL enabled
+# bit1: 0, DDR drive strenght normal
+# bit2: 0, DDR ODT control lsd (disabled)
+# bit5-3: 000, required
+# bit6: 1, DDR ODT control msb, (disabled)
+# bit9-7: 000, required
+# bit10: 0, differential DQS enabled
+# bit11: 0, required
+# bit12: 0, DDR output buffer enabled
+# bit31-13: 0 required
+
+DATA 0xFFD01424 0x0000F17F # DDR Controller Control High
+# bit2-0: 111, required
+# bit3 : 1 , MBUS Burst Chop disabled
+# bit6-4: 111, required
+# bit7 : 0
+# bit8 : 1 , add writepath sample stage, must be 1 for DDR freq >= 300MHz
+# bit9 : 0 , no half clock cycle addition to dataout
+# bit10 : 0 , 1/4 clock cycle skew enabled for addr/ctl signals
+# bit11 : 0 , 1/4 clock cycle skew disabled for write mesh
+# bit15-12: 1111 required
+# bit31-16: 0 required
+
+DATA 0xFFD01428 0x00085520 # DDR2 ODT Read Timing (default values)
+DATA 0xFFD0147C 0x00008552 # DDR2 ODT Write Timing (default values)
+
+DATA 0xFFD01500 0x00000000 # CS[0]n Base address to 0x0
+DATA 0xFFD01504 0x0FFFFFF1 # CS[0]n Size
+# bit0: 1, Window enabled
+# bit1: 0, Write Protect disabled
+# bit3-2: 00, CS0 hit selected
+# bit23-4: ones, required
+# bit31-24: 0x0F, Size (i.e. 256MB)
+
+DATA 0xFFD01508 0x10000000 # CS[1]n Base address to 256Mb
+DATA 0xFFD0150C 0x0FFFFFF5 # CS[1]n Size 256Mb Window enabled for CS1
+
+DATA 0xFFD01514 0x00000000 # CS[2]n Size, window disabled
+DATA 0xFFD0151C 0x00000000 # CS[3]n Size, window disabled
+
+DATA 0xFFD01494 0x00030000 # DDR ODT Control (Low)
+DATA 0xFFD01498 0x00000000 # DDR ODT Control (High)
+# bit1-0: 00, ODT0 controlled by ODT Control (low) register above
+# bit3-2: 01, ODT1 active NEVER!
+# bit31-4: zero, required
+
+DATA 0xFFD0149C 0x0000E803 # CPU ODT Control
+DATA 0xFFD01480 0x00000001 # DDR Initialization Control
+#bit0=1, enable DDR init upon this register write
+
+# End of Header extension
+DATA 0x0 0x0
diff --git a/roms/u-boot/board/Marvell/mvebu_armada-37xx/MAINTAINERS b/roms/u-boot/board/Marvell/mvebu_armada-37xx/MAINTAINERS
new file mode 100644
index 000000000..f2c0a582d
--- /dev/null
+++ b/roms/u-boot/board/Marvell/mvebu_armada-37xx/MAINTAINERS
@@ -0,0 +1,16 @@
+MVEBU_DB_88F3720 BOARD
+M: Stefan Roese <sr@denx.de>
+S: Maintained
+F: board/Marvell/mvebu_armada-37xx/
+F: include/configs/mvebu_armada-37xx.h
+F: configs/mvebu_db-88f3720_defconfig
+
+ESPRESSOBin BOARD
+M: Konstantin Porotchkin <kostap@marvell.com>
+S: Maintained
+F: configs/mvebu_espressobin-88f3720_defconfig
+
+uDPU BOARD
+M: Vladimir Vid <vladimir.vid@sartura.hr>
+S: Maintained
+F: configs/uDPU_defconfig
diff --git a/roms/u-boot/board/Marvell/mvebu_armada-37xx/Makefile b/roms/u-boot/board/Marvell/mvebu_armada-37xx/Makefile
new file mode 100644
index 000000000..27221557c
--- /dev/null
+++ b/roms/u-boot/board/Marvell/mvebu_armada-37xx/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2016 Stefan Roese <sr@denx.de>
+
+obj-y := board.o
diff --git a/roms/u-boot/board/Marvell/mvebu_armada-37xx/board.c b/roms/u-boot/board/Marvell/mvebu_armada-37xx/board.c
new file mode 100644
index 000000000..c630437c0
--- /dev/null
+++ b/roms/u-boot/board/Marvell/mvebu_armada-37xx/board.c
@@ -0,0 +1,436 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2016 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <dm/device-internal.h>
+#include <env.h>
+#include <env_internal.h>
+#include <i2c.h>
+#include <init.h>
+#include <mmc.h>
+#include <phy.h>
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#include <linux/delay.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* IO expander I2C device */
+#define I2C_IO_EXP_ADDR 0x22
+#define I2C_IO_CFG_REG_0 0x6
+#define I2C_IO_DATA_OUT_REG_0 0x2
+#define I2C_IO_REG_0_SATA_OFF 2
+#define I2C_IO_REG_0_USB_H_OFF 1
+
+/* The pin control values are the same for DB and Espressobin */
+#define PINCTRL_NB_REG_VALUE 0x000173fa
+#define PINCTRL_SB_REG_VALUE 0x00007a23
+
+/* Ethernet switch registers */
+/* SMI addresses for multi-chip mode */
+#define MVEBU_PORT_CTRL_SMI_ADDR(p) (16 + (p))
+#define MVEBU_SW_G2_SMI_ADDR (28)
+
+/* Multi-chip mode */
+#define MVEBU_SW_SMI_DATA_REG (1)
+#define MVEBU_SW_SMI_CMD_REG (0)
+ #define SW_SMI_CMD_REG_ADDR_OFF 0
+ #define SW_SMI_CMD_DEV_ADDR_OFF 5
+ #define SW_SMI_CMD_SMI_OP_OFF 10
+ #define SW_SMI_CMD_SMI_MODE_OFF 12
+ #define SW_SMI_CMD_SMI_BUSY_OFF 15
+
+/* Single-chip mode */
+/* Switch Port Registers */
+#define MVEBU_SW_LINK_CTRL_REG (1)
+#define MVEBU_SW_PORT_CTRL_REG (4)
+#define MVEBU_SW_PORT_BASE_VLAN (6)
+
+/* Global 2 Registers */
+#define MVEBU_G2_SMI_PHY_CMD_REG (24)
+#define MVEBU_G2_SMI_PHY_DATA_REG (25)
+
+/*
+ * Memory Controller Registers
+ *
+ * Assembled based on public information:
+ * https://gitlab.nic.cz/turris/mox-boot-builder/-/blob/master/wtmi/main.c#L332-336
+ * https://github.com/MarvellEmbeddedProcessors/mv-ddr-marvell/blob/mv_ddr-armada-18.12/drivers/mv_ddr_mc6.h#L309-L332
+ *
+ * And checked against the written register values for the various topologies:
+ * https://github.com/MarvellEmbeddedProcessors/mv-ddr-marvell/blob/mv_ddr-armada-atf-mainline/a3700/mv_ddr_tim.h
+ */
+#define A3700_CH0_MC_CTRL2_REG MVEBU_REGISTER(0x002c4)
+#define A3700_MC_CTRL2_SDRAM_TYPE_MASK 0xf
+#define A3700_MC_CTRL2_SDRAM_TYPE_OFFS 4
+#define A3700_MC_CTRL2_SDRAM_TYPE_DDR3 2
+#define A3700_MC_CTRL2_SDRAM_TYPE_DDR4 3
+
+int board_early_init_f(void)
+{
+ return 0;
+}
+
+int board_init(void)
+{
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+ return 0;
+}
+
+#ifdef CONFIG_BOARD_LATE_INIT
+int board_late_init(void)
+{
+ char *ptr = (char *)&default_environment[0];
+ struct udevice *dev;
+ struct mmc *mmc_dev;
+ bool ddr4, emmc;
+ const char *mac;
+ char eth[10];
+ int i;
+
+ if (!of_machine_is_compatible("globalscale,espressobin"))
+ return 0;
+
+ /* Find free buffer in default_environment[] for new variables */
+ while (*ptr != '\0' && *(ptr+1) != '\0') ptr++;
+ ptr += 2;
+
+ /*
+ * Ensure that 'env default -a' does not erase permanent MAC addresses
+ * stored in env variables: $ethaddr, $eth1addr, $eth2addr and $eth3addr
+ */
+
+ mac = env_get("ethaddr");
+ if (mac && strlen(mac) <= 17)
+ ptr += sprintf(ptr, "ethaddr=%s", mac) + 1;
+
+ for (i = 1; i <= 3; i++) {
+ sprintf(eth, "eth%daddr", i);
+ mac = env_get(eth);
+ if (mac && strlen(mac) <= 17)
+ ptr += sprintf(ptr, "%s=%s", eth, mac) + 1;
+ }
+
+ /* If the memory controller has been configured for DDR4, we're running on v7 */
+ ddr4 = ((readl(A3700_CH0_MC_CTRL2_REG) >> A3700_MC_CTRL2_SDRAM_TYPE_OFFS)
+ & A3700_MC_CTRL2_SDRAM_TYPE_MASK) == A3700_MC_CTRL2_SDRAM_TYPE_DDR4;
+
+ /* eMMC is mmc dev num 1 */
+ mmc_dev = find_mmc_device(1);
+ emmc = (mmc_dev && mmc_init(mmc_dev) == 0);
+
+ /* if eMMC is not present then remove it from DM */
+ if (!emmc && mmc_dev) {
+ dev = mmc_dev->dev;
+ device_remove(dev, DM_REMOVE_NORMAL);
+ device_unbind(dev);
+ }
+
+ if (env_get("fdtfile"))
+ return 0;
+
+ /* Ensure that 'env default -a' set correct value to $fdtfile */
+ if (ddr4 && emmc)
+ strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin-v7-emmc.dtb");
+ else if (ddr4)
+ strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin-v7.dtb");
+ else if (emmc)
+ strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin-emmc.dtb");
+ else
+ strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin.dtb");
+
+ /* If $fdtfile was not set explicitly by user then set default value */
+ if (!env_get("fdtfile"))
+ env_set("fdtfile", ptr + sizeof("fdtfile="));
+
+ return 0;
+}
+#endif
+
+/* Board specific AHCI / SATA enable code */
+int board_ahci_enable(void)
+{
+ struct udevice *dev;
+ int ret;
+ u8 buf[8];
+
+ /* Only DB requres this configuration */
+ if (!of_machine_is_compatible("marvell,armada-3720-db"))
+ return 0;
+
+ /* Configure IO exander PCA9555: 7bit address 0x22 */
+ ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
+ if (ret) {
+ printf("Cannot find PCA9555: %d\n", ret);
+ return 0;
+ }
+
+ ret = dm_i2c_read(dev, I2C_IO_CFG_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to read IO expander value via I2C\n");
+ return -EIO;
+ }
+
+ /*
+ * Enable SATA power via IO expander connected via I2C by setting
+ * the corresponding bit to output mode to enable power for SATA
+ */
+ buf[0] &= ~(1 << I2C_IO_REG_0_SATA_OFF);
+ ret = dm_i2c_write(dev, I2C_IO_CFG_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to set IO expander via I2C\n");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/* Board specific xHCI enable code */
+int board_xhci_enable(fdt_addr_t base)
+{
+ struct udevice *dev;
+ int ret;
+ u8 buf[8];
+
+ /* Only DB requres this configuration */
+ if (!of_machine_is_compatible("marvell,armada-3720-db"))
+ return 0;
+
+ /* Configure IO exander PCA9555: 7bit address 0x22 */
+ ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
+ if (ret) {
+ printf("Cannot find PCA9555: %d\n", ret);
+ return 0;
+ }
+
+ printf("Enable USB VBUS\n");
+
+ /*
+ * Read configuration (direction) and set VBUS pin as output
+ * (reset pin = output)
+ */
+ ret = dm_i2c_read(dev, I2C_IO_CFG_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to read IO expander value via I2C\n");
+ return -EIO;
+ }
+ buf[0] &= ~(1 << I2C_IO_REG_0_USB_H_OFF);
+ ret = dm_i2c_write(dev, I2C_IO_CFG_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to set IO expander via I2C\n");
+ return -EIO;
+ }
+
+ /* Read VBUS output value and disable it */
+ ret = dm_i2c_read(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to read IO expander value via I2C\n");
+ return -EIO;
+ }
+ buf[0] &= ~(1 << I2C_IO_REG_0_USB_H_OFF);
+ ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to set IO expander via I2C\n");
+ return -EIO;
+ }
+
+ /*
+ * Required delay for configuration to settle - must wait for
+ * power on port is disabled in case VBUS signal was high,
+ * required 3 seconds delay to let VBUS signal fully settle down
+ */
+ mdelay(3000);
+
+ /* Enable VBUS power: Set output value of VBUS pin as enabled */
+ buf[0] |= (1 << I2C_IO_REG_0_USB_H_OFF);
+ ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to set IO expander via I2C\n");
+ return -EIO;
+ }
+
+ mdelay(500); /* required delay to let output value settle */
+
+ return 0;
+}
+
+/* Helper function for accessing switch devices in multi-chip connection mode */
+static int mii_multi_chip_mode_write(struct mii_dev *bus, int dev_smi_addr,
+ int smi_addr, int reg, u16 value)
+{
+ u16 smi_cmd = 0;
+
+ if (bus->write(bus, dev_smi_addr, 0,
+ MVEBU_SW_SMI_DATA_REG, value) != 0) {
+ printf("Error writing to the PHY addr=%02x reg=%02x\n",
+ smi_addr, reg);
+ return -EFAULT;
+ }
+
+ smi_cmd = (1 << SW_SMI_CMD_SMI_BUSY_OFF) |
+ (1 << SW_SMI_CMD_SMI_MODE_OFF) |
+ (1 << SW_SMI_CMD_SMI_OP_OFF) |
+ (smi_addr << SW_SMI_CMD_DEV_ADDR_OFF) |
+ (reg << SW_SMI_CMD_REG_ADDR_OFF);
+ if (bus->write(bus, dev_smi_addr, 0,
+ MVEBU_SW_SMI_CMD_REG, smi_cmd) != 0) {
+ printf("Error writing to the PHY addr=%02x reg=%02x\n",
+ smi_addr, reg);
+ return -EFAULT;
+ }
+
+ return 0;
+}
+
+/* Bring-up board-specific network stuff */
+int board_network_enable(struct mii_dev *bus)
+{
+ if (!of_machine_is_compatible("globalscale,espressobin"))
+ return 0;
+
+ /*
+ * FIXME: remove this code once Topaz driver gets available
+ * A3720 Community Board Only
+ * Configure Topaz switch (88E6341)
+ * Restrict output to ports 1,2,3 only from port 0 (CPU)
+ * Set port 0,1,2,3 to forwarding Mode (through Switch Port registers)
+ */
+ mii_multi_chip_mode_write(bus, 1, MVEBU_PORT_CTRL_SMI_ADDR(1),
+ MVEBU_SW_PORT_BASE_VLAN, BIT(0));
+ mii_multi_chip_mode_write(bus, 1, MVEBU_PORT_CTRL_SMI_ADDR(2),
+ MVEBU_SW_PORT_BASE_VLAN, BIT(0));
+ mii_multi_chip_mode_write(bus, 1, MVEBU_PORT_CTRL_SMI_ADDR(3),
+ MVEBU_SW_PORT_BASE_VLAN, BIT(0));
+
+ mii_multi_chip_mode_write(bus, 1, MVEBU_PORT_CTRL_SMI_ADDR(0),
+ MVEBU_SW_PORT_CTRL_REG, 0x7f);
+ mii_multi_chip_mode_write(bus, 1, MVEBU_PORT_CTRL_SMI_ADDR(1),
+ MVEBU_SW_PORT_CTRL_REG, 0x7f);
+ mii_multi_chip_mode_write(bus, 1, MVEBU_PORT_CTRL_SMI_ADDR(2),
+ MVEBU_SW_PORT_CTRL_REG, 0x7f);
+ mii_multi_chip_mode_write(bus, 1, MVEBU_PORT_CTRL_SMI_ADDR(3),
+ MVEBU_SW_PORT_CTRL_REG, 0x7f);
+
+ /* RGMII Delay on Port 0 (CPU port), force link to 1000Mbps */
+ mii_multi_chip_mode_write(bus, 1, MVEBU_PORT_CTRL_SMI_ADDR(0),
+ MVEBU_SW_LINK_CTRL_REG, 0xe002);
+
+ /* Power up PHY 1, 2, 3 (through Global 2 registers) */
+ mii_multi_chip_mode_write(bus, 1, MVEBU_SW_G2_SMI_ADDR,
+ MVEBU_G2_SMI_PHY_DATA_REG, 0x1140);
+ mii_multi_chip_mode_write(bus, 1, MVEBU_SW_G2_SMI_ADDR,
+ MVEBU_G2_SMI_PHY_CMD_REG, 0x9620);
+ mii_multi_chip_mode_write(bus, 1, MVEBU_SW_G2_SMI_ADDR,
+ MVEBU_G2_SMI_PHY_CMD_REG, 0x9640);
+ mii_multi_chip_mode_write(bus, 1, MVEBU_SW_G2_SMI_ADDR,
+ MVEBU_G2_SMI_PHY_CMD_REG, 0x9660);
+
+ return 0;
+}
+
+#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_ENV_IS_IN_SPI_FLASH)
+int ft_board_setup(void *blob, struct bd_info *bd)
+{
+ int ret;
+ int spi_off;
+ int parts_off;
+ int part_off;
+
+ /* Fill SPI MTD partitions for Linux kernel on Espressobin */
+ if (!of_machine_is_compatible("globalscale,espressobin"))
+ return 0;
+
+ spi_off = fdt_node_offset_by_compatible(blob, -1, "jedec,spi-nor");
+ if (spi_off < 0)
+ return 0;
+
+ /* Do not touch partitions if they are already defined */
+ if (fdt_subnode_offset(blob, spi_off, "partitions") >= 0)
+ return 0;
+
+ parts_off = fdt_add_subnode(blob, spi_off, "partitions");
+ if (parts_off < 0) {
+ printf("Can't add partitions node: %s\n", fdt_strerror(parts_off));
+ return 0;
+ }
+
+ ret = fdt_setprop_string(blob, parts_off, "compatible", "fixed-partitions");
+ if (ret < 0) {
+ printf("Can't set compatible property: %s\n", fdt_strerror(ret));
+ return 0;
+ }
+
+ ret = fdt_setprop_u32(blob, parts_off, "#address-cells", 1);
+ if (ret < 0) {
+ printf("Can't set #address-cells property: %s\n", fdt_strerror(ret));
+ return 0;
+ }
+
+ ret = fdt_setprop_u32(blob, parts_off, "#size-cells", 1);
+ if (ret < 0) {
+ printf("Can't set #size-cells property: %s\n", fdt_strerror(ret));
+ return 0;
+ }
+
+ /* Add u-boot-env partition */
+
+ part_off = fdt_add_subnode(blob, parts_off, "partition@u-boot-env");
+ if (part_off < 0) {
+ printf("Can't add partition@u-boot-env node: %s\n", fdt_strerror(part_off));
+ return 0;
+ }
+
+ ret = fdt_setprop_u32(blob, part_off, "reg", CONFIG_ENV_OFFSET);
+ if (ret < 0) {
+ printf("Can't set partition@u-boot-env reg property: %s\n", fdt_strerror(ret));
+ return 0;
+ }
+
+ ret = fdt_appendprop_u32(blob, part_off, "reg", CONFIG_ENV_SIZE);
+ if (ret < 0) {
+ printf("Can't set partition@u-boot-env reg property: %s\n", fdt_strerror(ret));
+ return 0;
+ }
+
+ ret = fdt_setprop_string(blob, part_off, "label", "u-boot-env");
+ if (ret < 0) {
+ printf("Can't set partition@u-boot-env label property: %s\n", fdt_strerror(ret));
+ return 0;
+ }
+
+ /* Add firmware partition */
+
+ part_off = fdt_add_subnode(blob, parts_off, "partition@firmware");
+ if (part_off < 0) {
+ printf("Can't add partition@firmware node: %s\n", fdt_strerror(part_off));
+ return 0;
+ }
+
+ ret = fdt_setprop_u32(blob, part_off, "reg", 0);
+ if (ret < 0) {
+ printf("Can't set partition@firmware reg property: %s\n", fdt_strerror(ret));
+ return 0;
+ }
+
+ ret = fdt_appendprop_u32(blob, part_off, "reg", CONFIG_ENV_OFFSET);
+ if (ret < 0) {
+ printf("Can't set partition@firmware reg property: %s\n", fdt_strerror(ret));
+ return 0;
+ }
+
+ ret = fdt_setprop_string(blob, part_off, "label", "firmware");
+ if (ret < 0) {
+ printf("Can't set partition@firmware label property: %s\n", fdt_strerror(ret));
+ return 0;
+ }
+
+ return 0;
+}
+#endif
diff --git a/roms/u-boot/board/Marvell/mvebu_armada-8k/MAINTAINERS b/roms/u-boot/board/Marvell/mvebu_armada-8k/MAINTAINERS
new file mode 100644
index 000000000..55e485faa
--- /dev/null
+++ b/roms/u-boot/board/Marvell/mvebu_armada-8k/MAINTAINERS
@@ -0,0 +1,19 @@
+MVEBU_ARMADA_8K BOARD
+M: Stefan Roese <sr@denx.de>
+S: Maintained
+F: board/Marvell/mvebu_armada-8k/
+F: include/configs/mvebu_armada-8k.h
+F: configs/mvebu_db_armada8k_defconfig
+
+
+MACCHIATOBin BOARD
+M: Konstantin Porotchkin <kostap@marvell.com>
+S: Maintained
+F: configs/mvebu_mcbin-88f8040_defconfig
+
+Puzzle-M801 BOARD
+M: Luka Kovacic <luka.kovacic@sartura.hr>
+M: Luka Perkov <luka.perkov@sartura.hr>
+S: Maintained
+F: configs/mvebu_puzzle-m801-88f8040_defconfig
+F: arch/arm/dts/armada-8040-puzzle-m801.dts
diff --git a/roms/u-boot/board/Marvell/mvebu_armada-8k/Makefile b/roms/u-boot/board/Marvell/mvebu_armada-8k/Makefile
new file mode 100644
index 000000000..27221557c
--- /dev/null
+++ b/roms/u-boot/board/Marvell/mvebu_armada-8k/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2016 Stefan Roese <sr@denx.de>
+
+obj-y := board.o
diff --git a/roms/u-boot/board/Marvell/mvebu_armada-8k/board.c b/roms/u-boot/board/Marvell/mvebu_armada-8k/board.c
new file mode 100644
index 000000000..7da5d9f96
--- /dev/null
+++ b/roms/u-boot/board/Marvell/mvebu_armada-8k/board.c
@@ -0,0 +1,182 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2016 Stefan Roese <sr@denx.de>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <i2c.h>
+#include <init.h>
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#include <linux/delay.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Information specific to the DB-88F7040 eval board. We strive to use
+ * DT for such platform specfic configurations. At some point, this
+ * might be removed here and implemented via DT.
+ */
+/* IO expander I2C device */
+#define I2C_IO_EXP_ADDR 0x21
+#define I2C_IO_CFG_REG_0 0x6
+#define I2C_IO_DATA_OUT_REG_0 0x2
+/* VBus enable */
+#define I2C_IO_REG_0_USB_H0_OFF 0
+#define I2C_IO_REG_0_USB_H1_OFF 1
+#define I2C_IO_REG_VBUS ((1 << I2C_IO_REG_0_USB_H0_OFF) | \
+ (1 << I2C_IO_REG_0_USB_H1_OFF))
+/* Current limit */
+#define I2C_IO_REG_0_USB_H0_CL 4
+#define I2C_IO_REG_0_USB_H1_CL 5
+#define I2C_IO_REG_CL ((1 << I2C_IO_REG_0_USB_H0_CL) | \
+ (1 << I2C_IO_REG_0_USB_H1_CL))
+
+/*
+ * Information specific to the iEi Puzzle-M801 board.
+ */
+
+/* Internal configuration registers */
+#define CP1_CONF_REG_BASE 0xf4440000
+#define CONF_REG_MPP0 0x0
+#define CONF_REG_MPP1 0x4
+#define CONF_REG_MPP2 0x8
+#define CONF_REG_MPP3 0xC
+
+static int usb_enabled = 0;
+
+/* Board specific xHCI dis-/enable code */
+
+/*
+ * Set USB VBUS signals (via I2C IO expander/GPIO) as output and set
+ * output value as disabled
+ *
+ * Set USB Current Limit signals (via I2C IO expander/GPIO) as output
+ * and set output value as enabled
+ */
+int board_xhci_config(void)
+{
+ struct udevice *dev;
+ int ret;
+ u8 buf[8];
+
+ if (of_machine_is_compatible("marvell,armada7040-db")) {
+ /* Configure IO exander PCA9555: 7bit address 0x21 */
+ ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
+ if (ret) {
+ printf("Cannot find PCA9555: %d\n", ret);
+ return 0;
+ }
+
+ /*
+ * Read configuration (direction) and set VBUS pin as output
+ * (reset pin = output)
+ */
+ ret = dm_i2c_read(dev, I2C_IO_CFG_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to read IO expander value via I2C\n");
+ return -EIO;
+ }
+ buf[0] &= ~I2C_IO_REG_VBUS;
+ buf[0] &= ~I2C_IO_REG_CL;
+ ret = dm_i2c_write(dev, I2C_IO_CFG_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to set IO expander via I2C\n");
+ return -EIO;
+ }
+
+ /* Read output value and configure it */
+ ret = dm_i2c_read(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to read IO expander value via I2C\n");
+ return -EIO;
+ }
+ buf[0] &= ~I2C_IO_REG_VBUS;
+ buf[0] |= I2C_IO_REG_CL;
+ ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to set IO expander via I2C\n");
+ return -EIO;
+ }
+
+ mdelay(500); /* required delay to let output value settle */
+ }
+
+ return 0;
+}
+
+int board_xhci_enable(fdt_addr_t base)
+{
+ struct udevice *dev;
+ int ret;
+ u8 buf[8];
+
+ if (of_machine_is_compatible("marvell,armada7040-db")) {
+ /*
+ * This function enables all USB ports simultaniously,
+ * it only needs to get called once
+ */
+ if (usb_enabled)
+ return 0;
+
+ /* Configure IO exander PCA9555: 7bit address 0x21 */
+ ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
+ if (ret) {
+ printf("Cannot find PCA9555: %d\n", ret);
+ return 0;
+ }
+
+ /* Read VBUS output value */
+ ret = dm_i2c_read(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to read IO expander value via I2C\n");
+ return -EIO;
+ }
+
+ /* Enable VBUS power: Set output value of VBUS pin as enabled */
+ buf[0] |= I2C_IO_REG_VBUS;
+ ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+ if (ret) {
+ printf("Failed to set IO expander via I2C\n");
+ return -EIO;
+ }
+
+ mdelay(500); /* required delay to let output value settle */
+ usb_enabled = 1;
+ }
+
+ return 0;
+}
+
+int board_early_init_f(void)
+{
+ /* Initialize some platform specific memory locations */
+ if (of_machine_is_compatible("marvell,armada8040-puzzle-m801")) {
+ /* MPP setup */
+ writel(0x00444444, CP1_CONF_REG_BASE + CONF_REG_MPP0);
+ writel(0x00000000, CP1_CONF_REG_BASE + CONF_REG_MPP1);
+ writel(0x00000000, CP1_CONF_REG_BASE + CONF_REG_MPP2);
+ writel(0x08888000, CP1_CONF_REG_BASE + CONF_REG_MPP3);
+ }
+
+ return 0;
+}
+
+int board_init(void)
+{
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+ return 0;
+}
+
+int board_late_init(void)
+{
+ /* Pre-configure the USB ports (overcurrent, VBus) */
+ board_xhci_config();
+
+ return 0;
+}
diff --git a/roms/u-boot/board/Marvell/octeon_ebb7304/Kconfig b/roms/u-boot/board/Marvell/octeon_ebb7304/Kconfig
new file mode 100644
index 000000000..ab54e6dbb
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeon_ebb7304/Kconfig
@@ -0,0 +1,19 @@
+if TARGET_OCTEON_EBB7304
+
+config SYS_BOARD
+ string
+ default "octeon_ebb7304"
+
+config SYS_VENDOR
+ string
+ default "Marvell"
+
+config SYS_CONFIG_NAME
+ string
+ default "octeon_ebb7304"
+
+config DEFAULT_DEVICE_TREE
+ string
+ default "mrvl,octeon-ebb7304"
+
+endif
diff --git a/roms/u-boot/board/Marvell/octeon_ebb7304/MAINTAINERS b/roms/u-boot/board/Marvell/octeon_ebb7304/MAINTAINERS
new file mode 100644
index 000000000..7256f8356
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeon_ebb7304/MAINTAINERS
@@ -0,0 +1,7 @@
+OCTEON_EBB7304 BOARD
+M: Aaron Williams <awilliams@marvell.com>
+S: Maintained
+F: board/Marvell/octeon_ebb7304/*
+F: configs/octeon_ebb7304_defconfig
+F: include/configs/octeon_ebb7304.h
+F: arch/mips/dts/mrvl,octeon-ebb7304.dts
diff --git a/roms/u-boot/board/Marvell/octeon_ebb7304/Makefile b/roms/u-boot/board/Marvell/octeon_ebb7304/Makefile
new file mode 100644
index 000000000..a3ed0c887
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeon_ebb7304/Makefile
@@ -0,0 +1,8 @@
+#
+# Copyright (C) 2020 Stefan Roese <sr@denx.de>
+# Copyright (C) 2019-2020 Marvell International Ltd.
+#
+# SPDX-License-Identifier: GPL-2.0+
+#
+
+obj-y := board.o
diff --git a/roms/u-boot/board/Marvell/octeon_ebb7304/board.c b/roms/u-boot/board/Marvell/octeon_ebb7304/board.c
new file mode 100644
index 000000000..9aac5f0b0
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeon_ebb7304/board.c
@@ -0,0 +1,754 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2020 Stefan Roese <sr@denx.de>
+ */
+
+#include <dm.h>
+#include <fdt_support.h>
+#include <ram.h>
+#include <asm/gpio.h>
+
+#include <mach/octeon_ddr.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+#include <mach/octeon_fdt.h>
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-cfg.h>
+#include <mach/cvmx-helper-util.h>
+#include <mach/cvmx-bgxx-defs.h>
+
+#include "board_ddr.h"
+
+#define MAX_MIX_ENV_VARS 4
+
+#define EBB7304_DEF_DRAM_FREQ 800
+
+static struct ddr_conf board_ddr_conf[] = {
+ OCTEON_EBB7304_DDR_CONFIGURATION
+};
+
+static int no_phy[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+
+struct ddr_conf *octeon_ddr_conf_table_get(int *count, int *def_ddr_freq)
+{
+ *count = ARRAY_SIZE(board_ddr_conf);
+ *def_ddr_freq = EBB7304_DEF_DRAM_FREQ;
+
+ return board_ddr_conf;
+}
+
+/*
+ * parse_env_var: Parse the environment variable ("bgx_for_mix%d") to
+ * extract the lmac it is set to.
+ *
+ * index: Index of environment variable to parse.
+ * environment variable.
+ * env_bgx: Updated with the bgx of the lmac in the environment
+ * variable.
+ * env_lmac: Updated with the index of lmac in the environment
+ * variable.
+ *
+ * returns: Zero on success, error otherwise.
+ */
+static int parse_env_var(int index, int *env_bgx, int *env_lmac)
+{
+ char env_var[20];
+ ulong xipd_port;
+
+ sprintf(env_var, "bgx_for_mix%d", index);
+ xipd_port = env_get_ulong(env_var, 0, 0xffff);
+ if (xipd_port != 0xffff) {
+ int xiface;
+ struct cvmx_xiface xi;
+ struct cvmx_xport xp;
+
+ /*
+ * The environemt variable is set to the xipd port. Convert the
+ * xipd port to numa node, bgx, and lmac.
+ */
+ xiface = cvmx_helper_get_interface_num(xipd_port);
+ xi = cvmx_helper_xiface_to_node_interface(xiface);
+ xp = cvmx_helper_ipd_port_to_xport(xipd_port);
+ *env_bgx = xi.interface;
+ *env_lmac = cvmx_helper_get_interface_index_num(xp.port);
+ return 0;
+ }
+
+ return -1;
+}
+
+/*
+ * get_lmac_fdt_node: Search the device tree for the node corresponding to
+ * a given bgx lmac.
+ *
+ * fdt: Pointer to flat device tree
+ * search_node: Numa node of the lmac to search for.
+ * search_bgx: Bgx of the lmac to search for.
+ * search_lmac: Lmac index to search for.
+ * compat: Compatible string to search for.
+
+ * returns: The device tree node of the lmac if found,
+ * or -1 otherwise.
+ */
+static int get_lmac_fdt_node(const void *fdt, int search_node, int search_bgx, int search_lmac,
+ const char *compat)
+{
+ int node;
+ const fdt32_t *reg;
+ u64 addr;
+ int fdt_node = -1;
+ int fdt_bgx = -1;
+ int fdt_lmac = -1;
+ int len;
+ int parent;
+
+ /* Iterate through all bgx ports */
+ node = -1;
+ while ((node = fdt_node_offset_by_compatible((void *)fdt, node,
+ compat)) >= 0) {
+ /* Get the node and bgx from the physical address */
+ parent = fdt_parent_offset(fdt, node);
+ reg = fdt_getprop(fdt, parent, "reg", &len);
+ if (parent < 0 || !reg)
+ continue;
+
+ addr = fdt_translate_address((void *)fdt, parent, reg);
+ fdt_node = (addr >> 36) & 0x7;
+ fdt_bgx = (addr >> 24) & 0xf;
+
+ /* Get the lmac index from the reg property */
+ reg = fdt_getprop(fdt, node, "reg", &len);
+ if (reg)
+ fdt_lmac = *reg;
+
+ /* Check for a match */
+ if (search_node == fdt_node && search_bgx == fdt_bgx &&
+ search_lmac == fdt_lmac)
+ return node;
+ }
+
+ return -1;
+}
+
+/*
+ * get_mix_fdt_node: Search the device tree for the node corresponding to
+ * a given mix.
+ *
+ * fdt: Pointer to flat device tree
+ * search_node: Mix numa node to search for.
+ * search_index: Mix index to search for.
+ *
+ * returns: The device tree node of the lmac if found,
+ * or -1 otherwise.
+ */
+static int get_mix_fdt_node(const void *fdt, int search_node, int search_index)
+{
+ int node;
+
+ /* Iterate through all the mix fdt nodes */
+ node = -1;
+ while ((node = fdt_node_offset_by_compatible((void *)fdt, node,
+ "cavium,octeon-7890-mix")) >= 0) {
+ int parent;
+ int len;
+ const char *name;
+ int mix_numa_node;
+ const fdt32_t *reg;
+ int mix_index = -1;
+ u64 addr;
+
+ /* Get the numa node of the mix from the parent node name */
+ parent = fdt_parent_offset(fdt, node);
+ if (parent < 0 ||
+ ((name = fdt_get_name(fdt, parent, &len)) == NULL) ||
+ ((name = strchr(name, '@')) == NULL))
+ continue;
+
+ name++;
+ mix_numa_node = simple_strtol(name, NULL, 0) ? 1 : 0;
+
+ /* Get the mix index from the reg property */
+ reg = fdt_getprop(fdt, node, "reg", &len);
+ if (reg) {
+ addr = fdt_translate_address((void *)fdt, parent, reg);
+ mix_index = (addr >> 11) & 1;
+ }
+
+ /* Check for a match */
+ if (mix_numa_node == search_node && mix_index == search_index)
+ return node;
+ }
+
+ return -1;
+}
+
+/*
+ * fdt_fix_mix: Fix the mix nodes in the device tree. Only the mix nodes
+ * configured by the user will be preserved. All other mix
+ * nodes will be trimmed.
+ *
+ * fdt: Pointer to flat device tree
+ *
+ * returns: Zero on success, error otherwise.
+ */
+static int fdt_fix_mix(const void *fdt)
+{
+ int node;
+ int next_node;
+ int len;
+ int i;
+
+ /* Parse all the mix port environment variables */
+ for (i = 0; i < MAX_MIX_ENV_VARS; i++) {
+ int env_node = 0;
+ int env_bgx = -1;
+ int env_lmac = -1;
+ int lmac_fdt_node = -1;
+ int mix_fdt_node = -1;
+ int lmac_phandle;
+ char *compat;
+
+ /* Get the lmac for this environment variable */
+ if (parse_env_var(i, &env_bgx, &env_lmac))
+ continue;
+
+ /* Get the fdt node for this lmac and add a phandle to it */
+ compat = "cavium,octeon-7890-bgx-port";
+ lmac_fdt_node = get_lmac_fdt_node(fdt, env_node, env_bgx,
+ env_lmac, compat);
+ if (lmac_fdt_node < 0) {
+ /* Must check for the xcv compatible string too */
+ compat = "cavium,octeon-7360-xcv";
+ lmac_fdt_node = get_lmac_fdt_node(fdt, env_node,
+ env_bgx, env_lmac,
+ compat);
+ if (lmac_fdt_node < 0) {
+ printf("WARNING: Failed to get lmac fdt node for %d%d%d\n",
+ env_node, env_bgx, env_lmac);
+ continue;
+ }
+ }
+
+ lmac_phandle = fdt_alloc_phandle((void *)fdt);
+ fdt_set_phandle((void *)fdt, lmac_fdt_node, lmac_phandle);
+
+ /* Get the fdt mix node corresponding to this lmac */
+ mix_fdt_node = get_mix_fdt_node(fdt, env_node, env_lmac);
+ if (mix_fdt_node < 0)
+ continue;
+
+ /* Point the mix to the lmac */
+ fdt_getprop(fdt, mix_fdt_node, "cavium,mac-handle", &len);
+ fdt_setprop_inplace((void *)fdt, mix_fdt_node,
+ "cavium,mac-handle", &lmac_phandle, len);
+ }
+
+ /* Trim unused mix'es from the device tree */
+ for (node = fdt_next_node(fdt, -1, NULL); node >= 0; node = next_node) {
+ const char *compat;
+ const fdt32_t *reg;
+
+ next_node = fdt_next_node(fdt, node, NULL);
+
+ compat = fdt_getprop(fdt, node, "compatible", &len);
+ if (compat) {
+ if (strcmp(compat, "cavium,octeon-7890-mix"))
+ continue;
+
+ reg = fdt_getprop(fdt, node, "cavium,mac-handle", &len);
+ if (reg) {
+ if (*reg == 0xffff)
+ fdt_nop_node((void *)fdt, node);
+ }
+ }
+ }
+
+ return 0;
+}
+
+static void kill_fdt_phy(void *fdt, int offset, void *arg)
+{
+ int len, phy_offset;
+ const fdt32_t *php;
+ u32 phandle;
+
+ php = fdt_getprop(fdt, offset, "phy-handle", &len);
+ if (php && len == sizeof(*php)) {
+ phandle = fdt32_to_cpu(*php);
+ fdt_nop_property(fdt, offset, "phy-handle");
+ phy_offset = fdt_node_offset_by_phandle(fdt, phandle);
+ if (phy_offset > 0)
+ fdt_nop_node(fdt, phy_offset);
+ }
+}
+
+void __fixup_xcv(void)
+{
+ unsigned long bgx = env_get_ulong("bgx_for_rgmii", 10,
+ (unsigned long)-1);
+ char fdt_key[16];
+ int i;
+
+ debug("%s: BGX %d\n", __func__, (int)bgx);
+
+ for (i = 0; i < 3; i++) {
+ snprintf(fdt_key, sizeof(fdt_key),
+ bgx == i ? "%d,xcv" : "%d,not-xcv", i);
+ debug("%s: trimming bgx %lu with key %s\n",
+ __func__, bgx, fdt_key);
+
+ octeon_fdt_patch_rename((void *)gd->fdt_blob, fdt_key,
+ "cavium,xcv-trim", true, NULL, NULL);
+ }
+}
+
+/* QLM0 - QLM6 */
+void __fixup_fdt(void)
+{
+ int qlm;
+ int speed = 0;
+
+ for (qlm = 0; qlm < 7; qlm++) {
+ enum cvmx_qlm_mode mode;
+ char fdt_key[16];
+ const char *type_str = "none";
+
+ mode = cvmx_qlm_get_mode(qlm);
+ switch (mode) {
+ case CVMX_QLM_MODE_SGMII:
+ case CVMX_QLM_MODE_RGMII_SGMII:
+ case CVMX_QLM_MODE_RGMII_SGMII_1X1:
+ type_str = "sgmii";
+ break;
+ case CVMX_QLM_MODE_XAUI:
+ case CVMX_QLM_MODE_RGMII_XAUI:
+ speed = (cvmx_qlm_get_gbaud_mhz(qlm) * 8 / 10) * 4;
+ if (speed == 10000)
+ type_str = "xaui";
+ else
+ type_str = "dxaui";
+ break;
+ case CVMX_QLM_MODE_RXAUI:
+ case CVMX_QLM_MODE_RGMII_RXAUI:
+ type_str = "rxaui";
+ break;
+ case CVMX_QLM_MODE_XLAUI:
+ case CVMX_QLM_MODE_RGMII_XLAUI:
+ type_str = "xlaui";
+ break;
+ case CVMX_QLM_MODE_XFI:
+ case CVMX_QLM_MODE_RGMII_XFI:
+ case CVMX_QLM_MODE_RGMII_XFI_1X1:
+ type_str = "xfi";
+ break;
+ case CVMX_QLM_MODE_10G_KR:
+ case CVMX_QLM_MODE_RGMII_10G_KR:
+ type_str = "10G_KR";
+ break;
+ case CVMX_QLM_MODE_40G_KR4:
+ case CVMX_QLM_MODE_RGMII_40G_KR4:
+ type_str = "40G_KR4";
+ break;
+ case CVMX_QLM_MODE_SATA_2X1:
+ type_str = "sata";
+ break;
+ case CVMX_QLM_MODE_SGMII_2X1:
+ case CVMX_QLM_MODE_XFI_1X2:
+ case CVMX_QLM_MODE_10G_KR_1X2:
+ case CVMX_QLM_MODE_RXAUI_1X2:
+ case CVMX_QLM_MODE_MIXED: // special for DLM5 & DLM6
+ {
+ cvmx_bgxx_cmrx_config_t cmr_config;
+ cvmx_bgxx_spux_br_pmd_control_t pmd_control;
+ int mux = cvmx_qlm_mux_interface(2);
+
+ if (mux == 2) { // only dlm6
+ cmr_config.u64 = csr_rd(CVMX_BGXX_CMRX_CONFIG(2, 2));
+ pmd_control.u64 =
+ csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(2, 2));
+ } else {
+ if (qlm == 5) {
+ cmr_config.u64 =
+ csr_rd(CVMX_BGXX_CMRX_CONFIG(0, 2));
+ pmd_control.u64 =
+ csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(0, 2));
+ } else {
+ cmr_config.u64 =
+ csr_rd(CVMX_BGXX_CMRX_CONFIG(2, 2));
+ pmd_control.u64 =
+ csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(2, 2));
+ }
+ }
+ switch (cmr_config.s.lmac_type) {
+ case 0:
+ type_str = "sgmii";
+ break;
+ case 1:
+ type_str = "xaui";
+ break;
+ case 2:
+ type_str = "rxaui";
+ break;
+ case 3:
+ if (pmd_control.s.train_en)
+ type_str = "10G_KR";
+ else
+ type_str = "xfi";
+ break;
+ case 4:
+ if (pmd_control.s.train_en)
+ type_str = "40G_KR4";
+ else
+ type_str = "xlaui";
+ break;
+ default:
+ type_str = "none";
+ break;
+ }
+ break;
+ }
+ default:
+ type_str = "none";
+ break;
+ }
+ sprintf(fdt_key, "%d,%s", qlm, type_str);
+ debug("Patching qlm %d for %s for mode %d%s\n", qlm, fdt_key, mode,
+ no_phy[qlm] ? ", removing PHY" : "");
+ octeon_fdt_patch_rename((void *)gd->fdt_blob, fdt_key, NULL, true,
+ no_phy[qlm] ? kill_fdt_phy : NULL, NULL);
+ }
+}
+
+int board_fix_fdt(void)
+{
+ __fixup_fdt();
+ __fixup_xcv();
+
+ /* Fix the mix ports */
+ fdt_fix_mix(gd->fdt_blob);
+
+ return 0;
+}
+
+/*
+ * Here is the description of the parameters that are passed to QLM
+ * configuration:
+ *
+ * param0 : The QLM to configure
+ * param1 : Speed to configure the QLM at
+ * param2 : Mode the QLM to configure
+ * param3 : 1 = RC, 0 = EP
+ * param4 : 0 = GEN1, 1 = GEN2, 2 = GEN3
+ * param5 : ref clock select, 0 = 100Mhz, 1 = 125MHz, 2 = 156MHz
+ * param6 : ref clock input to use:
+ * 0 - external reference (QLMx_REF_CLK)
+ * 1 = common clock 0 (QLMC_REF_CLK0)
+ * 2 = common_clock 1 (QLMC_REF_CLK1)
+ */
+static void board_configure_qlms(void)
+{
+ int speed[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+ int mode[8] = { -1, -1, -1, -1, -1, -1, -1, -1 };
+ int pcie_rc[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+ int pcie_gen[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+ int ref_clock_sel[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+ int ref_clock_input[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+ struct gpio_desc desc;
+ int rbgx, rqlm;
+ char env_var[16];
+ int qlm;
+ int ret;
+
+ /* RGMII PHY reset GPIO */
+ ret = dm_gpio_lookup_name("gpio-controllerA27", &desc);
+ if (ret)
+ debug("gpio ret=%d\n", ret);
+ ret = dm_gpio_request(&desc, "rgmii_phy_reset");
+ if (ret)
+ debug("gpio_request ret=%d\n", ret);
+ ret = dm_gpio_set_dir_flags(&desc, GPIOD_IS_OUT);
+ if (ret)
+ debug("gpio dir ret=%d\n", ret);
+
+ /* Put RGMII PHY in reset */
+ dm_gpio_set_value(&desc, 0);
+
+ octeon_init_qlm(0);
+
+ rbgx = env_get_ulong("bgx_for_rgmii", 10, (unsigned long)-1);
+ switch (rbgx) {
+ case 0:
+ rqlm = 2;
+ break;
+ case 1:
+ rqlm = 3;
+ break;
+ case 2:
+ rqlm = 5;
+ break;
+ default:
+ rqlm = -1;
+ break;
+ }
+
+ for (qlm = 0; qlm < 7; qlm++) {
+ const char *mode_str;
+ char spd_env[16];
+
+ mode[qlm] = CVMX_QLM_MODE_DISABLED;
+ sprintf(env_var, "qlm%d_mode", qlm);
+ mode_str = env_get(env_var);
+ if (!mode_str)
+ continue;
+
+ if (qlm == 4 && mode[4] != -1 &&
+ mode[4] != CVMX_QLM_MODE_SATA_2X1) {
+ printf("Error: DLM 4 can only be configured for SATA\n");
+ continue;
+ }
+
+ if (strstr(mode_str, ",no_phy"))
+ no_phy[qlm] = 1;
+
+ if (!strncmp(mode_str, "sgmii", 5)) {
+ bool rgmii = false;
+
+ speed[qlm] = 1250;
+ if (rqlm == qlm && qlm < 5) {
+ mode[qlm] = CVMX_QLM_MODE_RGMII_SGMII;
+ rgmii = true;
+ } else if (qlm == 6 || qlm == 5) {
+ if (rqlm == qlm && qlm == 5) {
+ mode[qlm] = CVMX_QLM_MODE_RGMII_SGMII_1X1;
+ rgmii = true;
+ } else if (rqlm == 5 && qlm == 6 &&
+ mode[5] != CVMX_QLM_MODE_RGMII_SGMII_1X1) {
+ mode[qlm] = CVMX_QLM_MODE_RGMII_SGMII_2X1;
+ rgmii = true;
+ } else {
+ mode[qlm] = CVMX_QLM_MODE_SGMII_2X1;
+ }
+ } else {
+ mode[qlm] = CVMX_QLM_MODE_SGMII;
+ }
+ ref_clock_sel[qlm] = 2;
+
+ if (qlm == 5 || qlm == 6)
+ ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+
+ if (no_phy[qlm]) {
+ int i;
+ int start = 0, stop = 2;
+
+ rbgx = 0;
+ switch (qlm) {
+ case 3:
+ rbgx = 1;
+ case 2:
+ for (i = 0; i < 4; i++) {
+ printf("Ignoring PHY for interface: %d, port: %d\n",
+ rbgx, i);
+ cvmx_helper_set_port_force_link_up(rbgx, i, true);
+ }
+ break;
+ case 6:
+ start = 2;
+ stop = 4;
+ case 5:
+ for (i = start; i < stop; i++) {
+ printf("Ignoring PHY for interface: %d, port: %d\n",
+ 2, i);
+ cvmx_helper_set_port_force_link_up(2, i, true);
+ }
+ break;
+ default:
+ printf("SGMII not supported for QLM/DLM %d\n",
+ qlm);
+ break;
+ }
+ }
+ printf("QLM %d: SGMII%s\n",
+ qlm, rgmii ? ", RGMII" : "");
+ } else if (!strncmp(mode_str, "xaui", 4)) {
+ speed[qlm] = 3125;
+ mode[qlm] = CVMX_QLM_MODE_XAUI;
+ ref_clock_sel[qlm] = 2;
+ if (qlm == 5 || qlm == 6)
+ ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+ printf("QLM %d: XAUI\n", qlm);
+ } else if (!strncmp(mode_str, "dxaui", 5)) {
+ speed[qlm] = 6250;
+ mode[qlm] = CVMX_QLM_MODE_XAUI;
+ ref_clock_sel[qlm] = 2;
+ if (qlm == 5 || qlm == 6)
+ ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+ printf("QLM %d: DXAUI\n", qlm);
+ } else if (!strncmp(mode_str, "rxaui", 5)) {
+ bool rgmii = false;
+
+ speed[qlm] = 6250;
+ if (qlm == 5 || qlm == 6) {
+ if (rqlm == qlm && qlm == 5) {
+ mode[qlm] = CVMX_QLM_MODE_RGMII_RXAUI;
+ rgmii = true;
+ } else {
+ mode[qlm] = CVMX_QLM_MODE_RXAUI_1X2;
+ }
+ } else {
+ mode[qlm] = CVMX_QLM_MODE_RXAUI;
+ }
+ ref_clock_sel[qlm] = 2;
+ if (qlm == 5 || qlm == 6)
+ ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+ printf("QLM %d: RXAUI%s\n",
+ qlm, rgmii ? ", rgmii" : "");
+ } else if (!strncmp(mode_str, "xlaui", 5)) {
+ speed[qlm] = 103125;
+ mode[qlm] = CVMX_QLM_MODE_XLAUI;
+ ref_clock_sel[qlm] = 2;
+ if (qlm == 5 || qlm == 6)
+ ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+ sprintf(spd_env, "qlm%d_speed", qlm);
+ if (env_get(spd_env)) {
+ int spd = env_get_ulong(spd_env, 0, 8);
+
+ if (spd)
+ speed[qlm] = spd;
+ else
+ speed[qlm] = 103125;
+ }
+ printf("QLM %d: XLAUI\n", qlm);
+ } else if (!strncmp(mode_str, "xfi", 3)) {
+ bool rgmii = false;
+
+ speed[qlm] = 103125;
+ if (rqlm == qlm) {
+ mode[qlm] = CVMX_QLM_MODE_RGMII_XFI;
+ rgmii = true;
+ } else if (qlm == 5 || qlm == 6) {
+ mode[qlm] = CVMX_QLM_MODE_XFI_1X2;
+ } else {
+ mode[qlm] = CVMX_QLM_MODE_XFI;
+ }
+ ref_clock_sel[qlm] = 2;
+ if (qlm == 5 || qlm == 6)
+ ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+ printf("QLM %d: XFI%s\n", qlm, rgmii ? ", RGMII" : "");
+ } else if (!strncmp(mode_str, "10G_KR", 6)) {
+ speed[qlm] = 103125;
+ if (rqlm == qlm && qlm == 5)
+ mode[qlm] = CVMX_QLM_MODE_RGMII_10G_KR;
+ else if (qlm == 5 || qlm == 6)
+ mode[qlm] = CVMX_QLM_MODE_10G_KR_1X2;
+ else
+ mode[qlm] = CVMX_QLM_MODE_10G_KR;
+ ref_clock_sel[qlm] = 2;
+ if (qlm == 5 || qlm == 6)
+ ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+ printf("QLM %d: 10G_KR\n", qlm);
+ } else if (!strncmp(mode_str, "40G_KR4", 7)) {
+ speed[qlm] = 103125;
+ mode[qlm] = CVMX_QLM_MODE_40G_KR4;
+ ref_clock_sel[qlm] = 2;
+ if (qlm == 5 || qlm == 6)
+ ref_clock_input[qlm] = 2; // use QLMC_REF_CLK1
+ printf("QLM %d: 40G_KR4\n", qlm);
+ } else if (!strcmp(mode_str, "pcie")) {
+ char *pmode;
+ int lanes = 0;
+
+ sprintf(env_var, "pcie%d_mode", qlm);
+ pmode = env_get(env_var);
+ if (pmode && !strcmp(pmode, "ep"))
+ pcie_rc[qlm] = 0;
+ else
+ pcie_rc[qlm] = 1;
+ sprintf(env_var, "pcie%d_gen", qlm);
+ pcie_gen[qlm] = env_get_ulong(env_var, 0, 3);
+ sprintf(env_var, "pcie%d_lanes", qlm);
+ lanes = env_get_ulong(env_var, 0, 8);
+ if (lanes == 8) {
+ mode[qlm] = CVMX_QLM_MODE_PCIE_1X8;
+ } else if (qlm == 5 || qlm == 6) {
+ if (lanes != 2) {
+ printf("QLM%d: Invalid lanes selected, defaulting to 2 lanes\n",
+ qlm);
+ }
+ mode[qlm] = CVMX_QLM_MODE_PCIE_1X2;
+ ref_clock_input[qlm] = 1; // use QLMC_REF_CLK0
+ } else {
+ mode[qlm] = CVMX_QLM_MODE_PCIE;
+ }
+ ref_clock_sel[qlm] = 0;
+ printf("QLM %d: PCIe gen%d %s, x%d lanes\n",
+ qlm, pcie_gen[qlm] + 1,
+ pcie_rc[qlm] ? "root complex" : "endpoint",
+ lanes);
+ } else if (!strcmp(mode_str, "sata")) {
+ mode[qlm] = CVMX_QLM_MODE_SATA_2X1;
+ ref_clock_sel[qlm] = 0;
+ ref_clock_input[qlm] = 1;
+ sprintf(spd_env, "qlm%d_speed", qlm);
+ if (env_get(spd_env)) {
+ int spd = env_get_ulong(spd_env, 0, 8);
+
+ if (spd == 1500 || spd == 3000 || spd == 3000)
+ speed[qlm] = spd;
+ else
+ speed[qlm] = 6000;
+ } else {
+ speed[qlm] = 6000;
+ }
+ } else {
+ printf("QLM %d: disabled\n", qlm);
+ }
+ }
+
+ for (qlm = 0; qlm < 7; qlm++) {
+ int rc;
+
+ if (mode[qlm] == -1)
+ continue;
+
+ debug("Configuring qlm%d with speed(%d), mode(%d), RC(%d), Gen(%d), REF_CLK(%d), CLK_SOURCE(%d)\n",
+ qlm, speed[qlm], mode[qlm], pcie_rc[qlm],
+ pcie_gen[qlm] + 1,
+ ref_clock_sel[qlm], ref_clock_input[qlm]);
+ rc = octeon_configure_qlm(qlm, speed[qlm], mode[qlm],
+ pcie_rc[qlm], pcie_gen[qlm],
+ ref_clock_sel[qlm],
+ ref_clock_input[qlm]);
+
+ if (speed[qlm] == 6250) {
+ if (mode[qlm] == CVMX_QLM_MODE_RXAUI) {
+ octeon_qlm_tune_v3(0, qlm, speed[qlm], 0x12,
+ 0xa0, -1, -1);
+ } else {
+ octeon_qlm_tune_v3(0, qlm, speed[qlm], 0xa,
+ 0xa0, -1, -1);
+ }
+ } else if (speed[qlm] == 103125) {
+ octeon_qlm_tune_v3(0, qlm, speed[qlm], 0xd, 0xd0,
+ -1, -1);
+ }
+
+ if (qlm == 4 && rc != 0)
+ /*
+ * There is a bug with SATA with 73xx. Until it's
+ * fixed we need to strip it from the device tree.
+ */
+ octeon_fdt_patch_rename((void *)gd->fdt_blob, "4,none",
+ NULL, true, NULL, NULL);
+ }
+
+ dm_gpio_set_value(&desc, 0); /* Put RGMII PHY in reset */
+ mdelay(10);
+ dm_gpio_set_value(&desc, 1); /* Take RGMII PHY out of reset */
+}
+
+int board_late_init(void)
+{
+ board_configure_qlms();
+
+ return 0;
+}
diff --git a/roms/u-boot/board/Marvell/octeon_ebb7304/board_ddr.h b/roms/u-boot/board/Marvell/octeon_ebb7304/board_ddr.h
new file mode 100644
index 000000000..f2f3419e5
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeon_ebb7304/board_ddr.h
@@ -0,0 +1,447 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * https://spdx.org/licenses
+ */
+
+#ifndef __BOARD_DDR_H__
+#define __BOARD_DDR_H__
+
+#define OCTEON_EBB7304_DRAM_SOCKET_CONFIGURATION0 \
+ { {0x1050, 0x0}, {NULL, NULL} }, { {0x1051, 0x0}, {NULL, NULL} }
+#define OCTEON_EBB7304_DRAM_SOCKET_CONFIGURATION1 \
+ { {0x1052, 0x0}, {NULL, NULL} }, { {0x1053, 0x0}, {NULL, NULL} }
+
+#define OCTEON_EBB7304_BOARD_EEPROM_TWSI_ADDR 0x56
+
+/*
+ * Local copy of these parameters to allow for customization for this
+ * board design. The generic version resides in lib_octeon_shared.h.
+ */
+
+/* LMC0_MODEREG_PARAMS1 */
+#define OCTEON_EBB7304_MODEREG_PARAMS1_1RANK_1SLOT \
+ { \
+ .cn78xx = { \
+ .pasr_00 = 0, \
+ .asr_00 = 0, \
+ .srt_00 = 0, \
+ .rtt_wr_00 = ddr4_rttwr_80ohm & 3, \
+ .rtt_wr_00_ext = (ddr4_rttwr_80ohm >> 2) & 1, \
+ .dic_00 = ddr4_dic_34ohm, \
+ .rtt_nom_00 = 0, \
+ .pasr_01 = 0, \
+ .asr_01 = 0, \
+ .srt_01 = 0, \
+ .rtt_wr_01 = 0, \
+ .dic_01 = ddr4_dic_34ohm, \
+ .rtt_nom_01 = 0, \
+ .pasr_10 = 0, \
+ .asr_10 = 0, \
+ .srt_10 = 0, \
+ .rtt_wr_10 = 0, \
+ .dic_10 = ddr4_dic_34ohm, \
+ .rtt_nom_10 = 0, \
+ .pasr_11 = 0, \
+ .asr_11 = 0, \
+ .srt_11 = 0, \
+ .rtt_wr_11 = 0, \
+ .dic_11 = ddr4_dic_34ohm, \
+ .rtt_nom_11 = 0, \
+ } \
+ }
+
+#define OCTEON_EBB7304_MODEREG_PARAMS1_1RANK_2SLOT \
+ { \
+ .cn78xx = { \
+ .pasr_00 = 0, \
+ .asr_00 = 0, \
+ .srt_00 = 0, \
+ .rtt_wr_00 = ddr4_rttwr_80ohm & 3, \
+ .rtt_wr_00_ext = (ddr4_rttwr_80ohm >> 2) & 1, \
+ .dic_00 = ddr4_dic_34ohm, \
+ .rtt_nom_00 = 0, \
+ .pasr_01 = 0, \
+ .asr_01 = 0, \
+ .srt_01 = 0, \
+ .rtt_wr_01 = 0, \
+ .dic_01 = ddr4_dic_34ohm, \
+ .rtt_nom_01 = 0, \
+ .pasr_10 = 0, \
+ .asr_10 = 0, \
+ .srt_10 = 0, \
+ .rtt_wr_10 = ddr4_rttwr_80ohm & 3, \
+ .rtt_wr_10_ext = (ddr4_rttwr_80ohm >> 2) & 1, \
+ .dic_10 = ddr4_dic_34ohm, \
+ .rtt_nom_10 = 0, \
+ .pasr_11 = 0, \
+ .asr_11 = 0, \
+ .srt_11 = 0, \
+ .rtt_wr_11 = 0, \
+ .dic_11 = ddr4_dic_34ohm, \
+ .rtt_nom_11 = 0 \
+ } \
+ }
+
+#define OCTEON_EBB7304_MODEREG_PARAMS1_2RANK_1SLOT \
+ { \
+ .cn78xx = { \
+ .pasr_00 = 0, \
+ .asr_00 = 0, \
+ .srt_00 = 0, \
+ .rtt_wr_00 = ddr4_rttwr_240ohm, \
+ .dic_00 = ddr4_dic_34ohm, \
+ .rtt_nom_00 = 0, \
+ .pasr_01 = 0, \
+ .asr_01 = 0, \
+ .srt_01 = 0, \
+ .rtt_wr_01 = ddr4_rttwr_240ohm, \
+ .dic_01 = ddr4_dic_34ohm, \
+ .rtt_nom_01 = 0, \
+ .pasr_10 = 0, \
+ .asr_10 = 0, \
+ .srt_10 = 0, \
+ .dic_10 = ddr4_dic_34ohm, \
+ .rtt_nom_10 = 0, \
+ .pasr_11 = 0, \
+ .asr_11 = 0, \
+ .srt_11 = 0, \
+ .rtt_wr_11 = 0, \
+ .dic_11 = ddr4_dic_34ohm, \
+ .rtt_nom_11 = 0, \
+ } \
+ }
+
+#define OCTEON_EBB7304_MODEREG_PARAMS1_2RANK_2SLOT \
+ { \
+ .cn78xx = { \
+ .pasr_00 = 0, \
+ .asr_00 = 0, \
+ .srt_00 = 0, \
+ .rtt_wr_00 = ddr4_rttwr_240ohm, \
+ .dic_00 = ddr4_dic_34ohm, \
+ .rtt_nom_00 = ddr4_rttnom_120ohm, \
+ .pasr_01 = 0, \
+ .asr_01 = 0, \
+ .srt_01 = 0, \
+ .rtt_wr_01 = ddr4_rttwr_240ohm, \
+ .dic_01 = ddr4_dic_34ohm, \
+ .rtt_nom_01 = ddr4_rttnom_120ohm, \
+ .pasr_10 = 0, \
+ .asr_10 = 0, \
+ .srt_10 = 0, \
+ .rtt_wr_10 = ddr4_rttwr_240ohm, \
+ .dic_10 = ddr4_dic_34ohm, \
+ .rtt_nom_10 = ddr4_rttnom_120ohm, \
+ .pasr_11 = 0, \
+ .asr_11 = 0, \
+ .srt_11 = 0, \
+ .rtt_wr_11 = ddr4_rttwr_240ohm, \
+ .dic_11 = ddr4_dic_34ohm, \
+ .rtt_nom_11 = ddr4_rttnom_120ohm, \
+ } \
+ }
+
+#define OCTEON_EBB7304_MODEREG_PARAMS1_4RANK_1SLOT \
+ { \
+ .cn78xx = { \
+ .pasr_00 = 0, \
+ .asr_00 = 0, \
+ .srt_00 = 0, \
+ .rtt_wr_00 = rttwr_60ohm, \
+ .dic_00 = dic_34ohm, \
+ .rtt_nom_00 = rttnom_20ohm, \
+ .pasr_01 = 0, \
+ .asr_01 = 0, \
+ .srt_01 = 0, \
+ .rtt_wr_01 = rttwr_60ohm, \
+ .dic_01 = dic_34ohm, \
+ .rtt_nom_01 = rttnom_none, \
+ .pasr_10 = 0, \
+ .asr_10 = 0, \
+ .srt_10 = 0, \
+ .rtt_wr_10 = rttwr_60ohm, \
+ .dic_10 = dic_34ohm, \
+ .rtt_nom_10 = rttnom_20ohm, \
+ .pasr_11 = 0, \
+ .asr_11 = 0, \
+ .srt_11 = 0, \
+ .rtt_wr_11 = rttwr_60ohm, \
+ .dic_11 = dic_34ohm, \
+ .rtt_nom_11 = rttnom_none, \
+ } \
+ }
+
+#define OCTEON_EBB7304_MODEREG_PARAMS2_1RANK_1SLOT \
+{ \
+ .cn78xx = { \
+ .rtt_park_00 = ddr4_rttpark_60ohm, \
+ .vref_value_00 = 0x22, \
+ .vref_range_00 = 0, \
+ .rtt_park_01 = 0, \
+ .vref_value_01 = 0, \
+ .vref_range_01 = 0, \
+ .rtt_park_10 = 0, \
+ .vref_value_10 = 0, \
+ .vref_range_10 = 0, \
+ .rtt_park_11 = 0, \
+ .vref_value_11 = 0, \
+ .vref_range_11 = 0 \
+ } \
+}
+
+/* FIX */
+#define OCTEON_EBB7304_MODEREG_PARAMS2_1RANK_2SLOT \
+{ \
+ .cn78xx = { \
+ .rtt_park_00 = ddr4_rttpark_48ohm, \
+ .vref_value_00 = 0x1f, \
+ .vref_range_00 = 0, \
+ .rtt_park_01 = 0, \
+ .vref_value_01 = 0, \
+ .vref_range_01 = 0, \
+ .rtt_park_10 = ddr4_rttpark_48ohm, \
+ .vref_value_10 = 0x1f, \
+ .vref_range_10 = 0, \
+ .rtt_park_11 = 0, \
+ .vref_value_11 = 0, \
+ .vref_range_11 = 0 \
+ } \
+}
+
+#define OCTEON_EBB7304_MODEREG_PARAMS2_2RANK_1SLOT \
+{ \
+ .cn78xx = { \
+ .rtt_park_00 = ddr4_rttpark_120ohm, \
+ .vref_value_00 = 0x19, \
+ .vref_range_00 = 0, \
+ .rtt_park_01 = ddr4_rttpark_120ohm, \
+ .vref_value_01 = 0x19, \
+ .vref_range_01 = 0, \
+ .rtt_park_10 = 0, \
+ .vref_value_10 = 0, \
+ .vref_range_10 = 0, \
+ .rtt_park_11 = 0, \
+ .vref_value_11 = 0, \
+ .vref_range_11 = 0 \
+ } \
+}
+
+#define OCTEON_EBB7304_MODEREG_PARAMS2_2RANK_2SLOT \
+{ \
+ .cn78xx = { \
+ .rtt_park_00 = ddr4_rttpark_60ohm, \
+ .vref_value_00 = 0x19, \
+ .vref_range_00 = 0, \
+ .rtt_park_01 = ddr4_rttpark_60ohm, \
+ .vref_value_01 = 0x19, \
+ .vref_range_01 = 0, \
+ .rtt_park_10 = ddr4_rttpark_60ohm, \
+ .vref_value_10 = 0x19, \
+ .vref_range_10 = 0, \
+ .rtt_park_11 = ddr4_rttpark_60ohm, \
+ .vref_value_11 = 0x19, \
+ .vref_range_11 = 0 \
+ } \
+}
+
+#define OCTEON_EBB7304_MODEREG_PARAMS2_4RANK_1SLOT \
+{ \
+ .cn78xx = { \
+ .rtt_park_00 = ddr4_rttpark_80ohm, \
+ .vref_value_00 = 0x1f, \
+ .vref_range_00 = 0, \
+ .rtt_park_01 = ddr4_rttpark_80ohm, \
+ .vref_value_01 = 0x1f, \
+ .vref_range_01 = 0, \
+ .rtt_park_10 = 0, \
+ .vref_value_10 = 0, \
+ .vref_range_10 = 0, \
+ .rtt_park_11 = 0, \
+ .vref_value_11 = 0, \
+ .vref_range_11 = 0 \
+ } \
+}
+
+#define OCTEON_EBB7304_CN78XX_DRAM_ODT_1RANK_CONFIGURATION \
+ /* 1 */ \
+ { \
+ ddr4_dqx_driver_34_ohm, \
+ 0x00000000ULL, \
+ OCTEON_EBB7304_MODEREG_PARAMS1_1RANK_1SLOT, \
+ OCTEON_EBB7304_MODEREG_PARAMS2_1RANK_1SLOT, \
+ ddr4_rodt_ctl_48_ohm, \
+ 0x00000000ULL, \
+ 0 \
+ }, \
+ /* 2 */ \
+ { \
+ ddr4_dqx_driver_34_ohm, \
+ 0x00000000ULL, \
+ OCTEON_EBB7304_MODEREG_PARAMS1_1RANK_2SLOT, \
+ OCTEON_EBB7304_MODEREG_PARAMS2_1RANK_2SLOT, \
+ ddr4_rodt_ctl_80_ohm, \
+ 0x00000000ULL, \
+ 0 \
+ }
+
+#define OCTEON_EBB7304_CN78XX_DRAM_ODT_2RANK_CONFIGURATION \
+ /* 1 */ \
+ { \
+ ddr4_dqx_driver_34_ohm, \
+ 0x00000000ULL, \
+ OCTEON_EBB7304_MODEREG_PARAMS1_2RANK_1SLOT, \
+ OCTEON_EBB7304_MODEREG_PARAMS2_2RANK_1SLOT, \
+ ddr4_rodt_ctl_80_ohm, \
+ 0x00000000ULL, \
+ 0 \
+ }, \
+ /* 2 */ \
+ { \
+ ddr4_dqx_driver_34_ohm, \
+ 0x0c0c0303ULL, \
+ OCTEON_EBB7304_MODEREG_PARAMS1_2RANK_2SLOT, \
+ OCTEON_EBB7304_MODEREG_PARAMS2_2RANK_2SLOT, \
+ ddr4_rodt_ctl_48_ohm, \
+ 0x04080102ULL, \
+ 0 \
+ }
+
+#define OCTEON_EBB7304_CN78XX_DRAM_ODT_4RANK_CONFIGURATION \
+ /* 1 */ \
+ { \
+ ddr4_dqx_driver_34_ohm, \
+ 0x01030203ULL, \
+ OCTEON_EBB7304_MODEREG_PARAMS1_4RANK_1SLOT, \
+ OCTEON_EBB7304_MODEREG_PARAMS2_4RANK_1SLOT, \
+ ddr4_rodt_ctl_48_ohm, \
+ 0x01010202ULL, \
+ 0 \
+ }
+
+/*
+ * Construct a static initializer for the ddr_configuration_t variable that
+ * holds (almost) all of the information required for DDR initialization.
+ */
+
+/*
+ * The parameters below make up the custom_lmc_config data structure.
+ * This structure is used to customize the way that the LMC DRAM
+ * Controller is configured for a particular board design.
+ *
+ * Refer to the file lib_octeon_board_table_entry.h for a description
+ * of the custom board settings. It is usually kept in the following
+ * location... arch/mips/include/asm/arch-octeon/
+ *
+ */
+
+#define OCTEON_EBB7304_DDR_CONFIGURATION \
+/* Interface 0 */ \
+{ \
+ .custom_lmc_config = { \
+ .min_rtt_nom_idx = 1, \
+ .max_rtt_nom_idx = 7, \
+ .min_rodt_ctl = 1, \
+ .max_rodt_ctl = 7, \
+ .ck_ctl = ddr4_driver_34_ohm, \
+ .cmd_ctl = ddr4_driver_34_ohm, \
+ .ctl_ctl = ddr4_driver_34_ohm, \
+ .min_cas_latency = 0, \
+ .offset_en = 1, \
+ .offset_udimm = 2, \
+ .offset_rdimm = 2, \
+ .ddr_rtt_nom_auto = 0, \
+ .ddr_rodt_ctl_auto = 0, \
+ .rlevel_comp_offset_udimm = 0, \
+ .rlevel_comp_offset_rdimm = 0, \
+ .rlevel_compute = 0, \
+ .ddr2t_udimm = 1, \
+ .ddr2t_rdimm = 1, \
+ .maximum_adjacent_rlevel_delay_increment = 2, \
+ .fprch2 = 2, \
+ .dll_write_offset = NULL, \
+ .dll_read_offset = NULL, \
+ .parity = 0 \
+ }, \
+ .dimm_config_table = { \
+ OCTEON_EBB7304_DRAM_SOCKET_CONFIGURATION0, \
+ DIMM_CONFIG_TERMINATOR \
+ }, \
+ .unbuffered = { \
+ .ddr_board_delay = 0, \
+ .lmc_delay_clk = 0, \
+ .lmc_delay_cmd = 0, \
+ .lmc_delay_dq = 0 \
+ }, \
+ .registered = { \
+ .ddr_board_delay = 0, \
+ .lmc_delay_clk = 0, \
+ .lmc_delay_cmd = 0, \
+ .lmc_delay_dq = 0 \
+ }, \
+ .odt_1rank_config = { \
+ OCTEON_EBB7304_CN78XX_DRAM_ODT_1RANK_CONFIGURATION \
+ }, \
+ .odt_2rank_config = { \
+ OCTEON_EBB7304_CN78XX_DRAM_ODT_2RANK_CONFIGURATION \
+ }, \
+ .odt_4rank_config = { \
+ OCTEON_EBB7304_CN78XX_DRAM_ODT_4RANK_CONFIGURATION \
+ } \
+}, \
+/* Interface 1 */ \
+{ \
+ .custom_lmc_config = { \
+ .min_rtt_nom_idx = 1, \
+ .max_rtt_nom_idx = 7, \
+ .min_rodt_ctl = 1, \
+ .max_rodt_ctl = 7, \
+ .ck_ctl = ddr4_driver_34_ohm, \
+ .cmd_ctl = ddr4_driver_34_ohm, \
+ .ctl_ctl = ddr4_driver_34_ohm, \
+ .min_cas_latency = 0, \
+ .offset_en = 1, \
+ .offset_udimm = 2, \
+ .offset_rdimm = 2, \
+ .ddr_rtt_nom_auto = 0, \
+ .ddr_rodt_ctl_auto = 0, \
+ .rlevel_comp_offset_udimm = 0, \
+ .rlevel_comp_offset_rdimm = 0, \
+ .rlevel_compute = 0, \
+ .ddr2t_udimm = 1, \
+ .ddr2t_rdimm = 1, \
+ .maximum_adjacent_rlevel_delay_increment = 2, \
+ .fprch2 = 2, \
+ .dll_write_offset = NULL, \
+ .dll_read_offset = NULL, \
+ .parity = 0 \
+ }, \
+ .dimm_config_table = { \
+ OCTEON_EBB7304_DRAM_SOCKET_CONFIGURATION1, \
+ DIMM_CONFIG_TERMINATOR \
+ }, \
+ .unbuffered = { \
+ .ddr_board_delay = 0, \
+ .lmc_delay_clk = 0, \
+ .lmc_delay_cmd = 0, \
+ .lmc_delay_dq = 0 \
+ }, \
+ .registered = { \
+ .ddr_board_delay = 0, \
+ .lmc_delay_clk = 0, \
+ .lmc_delay_cmd = 0, \
+ .lmc_delay_dq = 0 \
+ }, \
+ .odt_1rank_config = { \
+ OCTEON_EBB7304_CN78XX_DRAM_ODT_1RANK_CONFIGURATION \
+ }, \
+ .odt_2rank_config = { \
+ OCTEON_EBB7304_CN78XX_DRAM_ODT_2RANK_CONFIGURATION \
+ }, \
+ .odt_4rank_config = { \
+ OCTEON_EBB7304_CN78XX_DRAM_ODT_4RANK_CONFIGURATION \
+ } \
+},
+
+#endif /* __BOARD_DDR_H__ */
diff --git a/roms/u-boot/board/Marvell/octeon_nic23/Kconfig b/roms/u-boot/board/Marvell/octeon_nic23/Kconfig
new file mode 100644
index 000000000..3c42e8acd
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeon_nic23/Kconfig
@@ -0,0 +1,19 @@
+if TARGET_OCTEON_NIC23
+
+config SYS_BOARD
+ string
+ default "octeon_nic23"
+
+config SYS_VENDOR
+ string
+ default "Marvell"
+
+config SYS_CONFIG_NAME
+ string
+ default "octeon_nic23"
+
+config DEFAULT_DEVICE_TREE
+ string
+ default "mrvl,octeon-nic23"
+
+endif
diff --git a/roms/u-boot/board/Marvell/octeon_nic23/MAINTAINERS b/roms/u-boot/board/Marvell/octeon_nic23/MAINTAINERS
new file mode 100644
index 000000000..cd5148dcf
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeon_nic23/MAINTAINERS
@@ -0,0 +1,7 @@
+OCTEON_NIC23 BOARD
+M: Aaron Williams <awilliams@marvell.com>
+S: Maintained
+F: board/Marvell/octeon_nic23/*
+F: configs/octeon_nic23_defconfig
+F: include/configs/octeon_nic23.h
+F: arch/mips/dts/mrvl,octeon-nic23.dts
diff --git a/roms/u-boot/board/Marvell/octeon_nic23/Makefile b/roms/u-boot/board/Marvell/octeon_nic23/Makefile
new file mode 100644
index 000000000..a79b94ec6
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeon_nic23/Makefile
@@ -0,0 +1,8 @@
+#
+# Copyright (C) 2021 Stefan Roese <sr@denx.de>
+# Copyright (C) 2019-2020 Marvell International Ltd.
+#
+# SPDX-License-Identifier: GPL-2.0+
+#
+
+obj-y := board.o
diff --git a/roms/u-boot/board/Marvell/octeon_nic23/board.c b/roms/u-boot/board/Marvell/octeon_nic23/board.c
new file mode 100644
index 000000000..9f5eb2e2a
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeon_nic23/board.c
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2021 Stefan Roese <sr@denx.de>
+ */
+
+#include <dm.h>
+#include <ram.h>
+
+#include <mach/octeon_ddr.h>
+#include <mach/cvmx-qlm.h>
+#include <mach/octeon_qlm.h>
+#include <mach/octeon_fdt.h>
+#include <mach/cvmx-helper.h>
+#include <mach/cvmx-helper-cfg.h>
+#include <mach/cvmx-helper-util.h>
+#include <mach/cvmx-bgxx-defs.h>
+
+#include "board_ddr.h"
+
+#define NIC23_DEF_DRAM_FREQ 800
+
+static u8 octeon_nic23_cfg0_spd_values[512] = {
+ OCTEON_NIC23_CFG0_SPD_VALUES
+};
+
+static struct ddr_conf board_ddr_conf[] = {
+ OCTEON_NIC23_DDR_CONFIGURATION
+};
+
+struct ddr_conf *octeon_ddr_conf_table_get(int *count, int *def_ddr_freq)
+{
+ *count = ARRAY_SIZE(board_ddr_conf);
+ *def_ddr_freq = NIC23_DEF_DRAM_FREQ;
+
+ return board_ddr_conf;
+}
+
+int board_fix_fdt(void *fdt)
+{
+ u32 range_data[5 * 8];
+ bool rev4;
+ int node;
+ int rc;
+
+ /*
+ * ToDo:
+ * Read rev4 info from EEPROM or where the original U-Boot does
+ * and don't hard-code it here.
+ */
+ rev4 = true;
+
+ debug("%s() rev4: %s\n", __func__, rev4 ? "true" : "false");
+ /* Patch the PHY configuration based on board revision */
+ rc = octeon_fdt_patch_rename(fdt,
+ rev4 ? "4,nor-flash" : "4,no-nor-flash",
+ "cavium,board-trim", false, NULL, NULL);
+ if (!rev4) {
+ /* Modify the ranges for CS 0 */
+ node = fdt_node_offset_by_compatible(fdt, -1,
+ "cavium,octeon-3860-bootbus");
+ if (node < 0) {
+ printf("%s: Error: cannot find boot bus in device tree!\n",
+ __func__);
+ return -1;
+ }
+
+ rc = fdtdec_get_int_array(fdt, node, "ranges",
+ range_data, 5 * 8);
+ if (rc) {
+ printf("%s: Error reading ranges from boot bus FDT\n",
+ __func__);
+ return -1;
+ }
+ range_data[2] = cpu_to_fdt32(0x10000);
+ range_data[3] = 0;
+ range_data[4] = 0;
+ rc = fdt_setprop(fdt, node, "ranges", range_data,
+ sizeof(range_data));
+ if (rc) {
+ printf("%s: Error updating boot bus ranges in fdt\n",
+ __func__);
+ }
+ }
+ return rc;
+}
+
+void board_configure_qlms(void)
+{
+ octeon_configure_qlm(4, 3000, CVMX_QLM_MODE_SATA_2X1, 0, 0, 0, 0);
+ octeon_configure_qlm(5, 103125, CVMX_QLM_MODE_XFI_1X2, 0, 0, 2, 0);
+ /* Apply amplitude tuning to 10G interface */
+ octeon_qlm_tune_v3(0, 4, 3000, -1, -1, 7, -1);
+ octeon_qlm_tune_v3(0, 5, 103125, 0x19, 0x0, -1, -1);
+ octeon_qlm_set_channel_v3(0, 5, 0);
+ octeon_qlm_dfe_disable(0, 5, -1, 103125, CVMX_QLM_MODE_XFI_1X2);
+ debug("QLM 4 reference clock: %d\n"
+ "DLM 5 reference clock: %d\n",
+ cvmx_qlm_measure_clock(4), cvmx_qlm_measure_clock(5));
+}
+
+int board_late_init(void)
+{
+ board_configure_qlms();
+
+ return 0;
+}
diff --git a/roms/u-boot/board/Marvell/octeon_nic23/board_ddr.h b/roms/u-boot/board/Marvell/octeon_nic23/board_ddr.h
new file mode 100644
index 000000000..eac877faf
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeon_nic23/board_ddr.h
@@ -0,0 +1,269 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Marvell International Ltd.
+ *
+ * https://spdx.org/licenses
+ */
+
+#ifndef __BOARD_DDR_H__
+#define __BOARD_DDR_H__
+
+#define OCTEON_NIC23_DRAM_SOCKET_CONFIGURATION0 \
+ { {0x0, 0x0}, {octeon_nic23_cfg0_spd_values, NULL} }
+
+#define NIC23_MTA8ATF51264AZ2G3_SPD_VALUES \
+ 0x23, 0x10, 0x0c, 0x02, 0x84, 0x19, 0x00, 0x08, \
+ 0x00, 0x00, 0x00, 0x03, 0x01, 0x0b, 0x80, 0x00, \
+ 0x00, 0x00, 0x08, 0x0c, 0xf4, 0x1b, 0x00, 0x00, \
+ 0x6c, 0x6c, 0x6c, 0x11, 0x08, 0x74, 0x20, 0x08, \
+ 0x00, 0x05, 0x70, 0x03, 0x00, 0xa8, 0x1e, 0x2b, \
+ 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x2c, 0x15, 0x35, \
+ 0x15, 0x35, 0x0b, 0x2c, 0x15, 0x35, 0x0b, 0x35, \
+ 0x0b, 0x2c, 0x0b, 0x35, 0x15, 0x36, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xb5, 0xce, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x30, 0x0e, \
+ 0x11, 0x11, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x2e, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x80, 0x2c, 0x0f, 0x14, 0x50, 0x0e, 0x08, 0x18, \
+ 0xc8, 0x31, 0x38, 0x41, 0x53, 0x46, 0x31, 0x47, \
+ 0x37, 0x32, 0x41, 0x5a, 0x2d, 0x32, 0x47, 0x31, \
+ 0x41, 0x31, 0x20, 0x20, 0x20, 0x31, 0x80, 0x2c, \
+ 0x41, 0x44, 0x50, 0x41, 0x45, 0x4e, 0x43, 0x39, \
+ 0x30, 0x30, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+
+#define OCTEON_NIC23_CFG0_SPD_VALUES NIC23_MTA8ATF51264AZ2G3_SPD_VALUES
+
+#define OCTEON_NIC23_BOARD_EEPROM_TWSI_ADDR 0x56
+
+#define OCTEON_NIC23_MODEREG_PARAMS1_1RANK_1SLOT \
+{ \
+ .cn78xx = { \
+ .pasr_00 = 0, \
+ .asr_00 = 0, \
+ .srt_00 = 0, \
+ .rtt_wr_00 = ddr4_rttwr_80ohm & 3, \
+ .rtt_wr_00_ext = (ddr4_rttwr_80ohm >> 2) & 1, \
+ .dic_00 = ddr4_dic_34ohm, \
+ .rtt_nom_00 = 0, \
+ .pasr_01 = 0, \
+ .asr_01 = 0, \
+ .srt_01 = 0, \
+ .rtt_wr_01 = 0, \
+ .dic_01 = ddr4_dic_34ohm, \
+ .rtt_nom_01 = 0, \
+ .pasr_10 = 0, \
+ .asr_10 = 0, \
+ .srt_10 = 0, \
+ .rtt_wr_10 = 0, \
+ .dic_10 = ddr4_dic_34ohm, \
+ .rtt_nom_10 = 0, \
+ .pasr_11 = 0, \
+ .asr_11 = 0, \
+ .srt_11 = 0, \
+ .rtt_wr_11 = 0, \
+ .dic_11 = ddr4_dic_34ohm, \
+ .rtt_nom_11 = 0, \
+ } \
+ }
+
+#define OCTEON_NIC23_MODEREG_PARAMS1_1RANK_2SLOT \
+{ \
+ .cn78xx = { \
+ .pasr_00 = 0, \
+ .asr_00 = 0, \
+ .srt_00 = 0, \
+ .rtt_wr_00 = ddr4_rttwr_80ohm & 3, \
+ .rtt_wr_00_ext = (ddr4_rttwr_80ohm >> 2) & 1, \
+ .dic_00 = ddr4_dic_34ohm, \
+ .rtt_nom_00 = 0, \
+ .pasr_01 = 0, \
+ .asr_01 = 0, \
+ .srt_01 = 0, \
+ .rtt_wr_01 = 0, \
+ .dic_01 = ddr4_dic_34ohm, \
+ .rtt_nom_01 = 0, \
+ .pasr_10 = 0, \
+ .asr_10 = 0, \
+ .srt_10 = 0, \
+ .rtt_wr_10 = ddr4_rttwr_80ohm & 3, \
+ .rtt_wr_10_ext = (ddr4_rttwr_80ohm >> 2) & 1, \
+ .dic_10 = ddr4_dic_34ohm, \
+ .rtt_nom_10 = 0, \
+ .pasr_11 = 0, \
+ .asr_11 = 0, \
+ .srt_11 = 0, \
+ .rtt_wr_11 = 0, \
+ .dic_11 = ddr4_dic_34ohm, \
+ .rtt_nom_11 = 0 \
+ } \
+}
+
+#define OCTEON_NIC23_MODEREG_PARAMS2_1RANK_1SLOT \
+{ \
+ .cn78xx = { \
+ .rtt_park_00 = ddr4_rttpark_60ohm, \
+ .vref_value_00 = 0x22, \
+ .vref_range_00 = 0, \
+ .rtt_park_01 = 0, \
+ .vref_value_01 = 0, \
+ .vref_range_01 = 0, \
+ .rtt_park_10 = 0, \
+ .vref_value_10 = 0, \
+ .vref_range_10 = 0, \
+ .rtt_park_11 = 0, \
+ .vref_value_11 = 0, \
+ .vref_range_11 = 0 \
+ } \
+}
+
+#define OCTEON_NIC23_MODEREG_PARAMS2_1RANK_2SLOT \
+{ \
+ .cn78xx = { \
+ .rtt_park_00 = ddr4_rttpark_48ohm, \
+ .vref_value_00 = 0x1f, \
+ .vref_range_00 = 0, \
+ .rtt_park_01 = 0, \
+ .vref_value_01 = 0, \
+ .vref_range_01 = 0, \
+ .rtt_park_10 = ddr4_rttpark_48ohm, \
+ .vref_value_10 = 0x1f, \
+ .vref_range_10 = 0, \
+ .rtt_park_11 = 0, \
+ .vref_value_11 = 0, \
+ .vref_range_11 = 0 \
+ } \
+}
+
+#define OCTEON_NIC23_CN73XX_DRAM_ODT_1RANK_CONFIGURATION \
+ /* 1 */ \
+ { \
+ ddr4_dqx_driver_34_ohm, \
+ 0x00000000ULL, \
+ OCTEON_NIC23_MODEREG_PARAMS1_1RANK_1SLOT, \
+ OCTEON_NIC23_MODEREG_PARAMS2_1RANK_1SLOT, \
+ ddr4_rodt_ctl_48_ohm, \
+ 0x00000000ULL, \
+ 0 \
+ }, \
+ /* 2 */ \
+ { \
+ ddr4_dqx_driver_34_ohm, \
+ 0x00000000ULL, \
+ OCTEON_NIC23_MODEREG_PARAMS1_1RANK_2SLOT, \
+ OCTEON_NIC23_MODEREG_PARAMS2_1RANK_2SLOT, \
+ ddr4_rodt_ctl_80_ohm, \
+ 0x00000000ULL, \
+ 0 \
+ }
+
+/*
+ * Construct a static initializer for the ddr_configuration_t variable that
+ * holds (almost) all of the information required for DDR initialization.
+ */
+
+/*
+ * The parameters below make up the custom_lmc_config data structure.
+ * This structure is used to customize the way that the LMC DRAM
+ * Controller is configured for a particular board design.
+ *
+ * Refer to the file lib_octeon_board_table_entry.h for a description
+ * of the custom board settings. It is usually kept in the following
+ * location... arch/mips/include/asm/arch-octeon/
+ *
+ */
+
+#define OCTEON_NIC23_DDR_CONFIGURATION \
+/* Interface 0 */ \
+{ \
+ .custom_lmc_config = { \
+ .min_rtt_nom_idx = 2, \
+ .max_rtt_nom_idx = 5, \
+ .min_rodt_ctl = 2, \
+ .max_rodt_ctl = 4, \
+ .ck_ctl = ddr4_driver_34_ohm, \
+ .cmd_ctl = ddr4_driver_34_ohm, \
+ .ctl_ctl = ddr4_driver_34_ohm, \
+ .min_cas_latency = 7, \
+ .offset_en = 1, \
+ .offset_udimm = 2, \
+ .offset_rdimm = 2, \
+ .ddr_rtt_nom_auto = 0, \
+ .ddr_rodt_ctl_auto = 0, \
+ .rlevel_compute = 0, \
+ .ddr2t_udimm = 1, \
+ .ddr2t_rdimm = 1, \
+ .maximum_adjacent_rlevel_delay_increment = 2, \
+ .fprch2 = 2, \
+ .dll_write_offset = NULL, \
+ .dll_read_offset = NULL, \
+ .disable_sequential_delay_check = 1, \
+ .parity = 0 \
+ }, \
+ .dimm_config_table = { \
+ OCTEON_NIC23_DRAM_SOCKET_CONFIGURATION0, \
+ DIMM_CONFIG_TERMINATOR \
+ }, \
+ .unbuffered = { \
+ .ddr_board_delay = 0, \
+ .lmc_delay_clk = 0, \
+ .lmc_delay_cmd = 0, \
+ .lmc_delay_dq = 0 \
+ }, \
+ .registered = { \
+ .ddr_board_delay = 0, \
+ .lmc_delay_clk = 0, \
+ .lmc_delay_cmd = 0, \
+ .lmc_delay_dq = 0 \
+ }, \
+ .odt_1rank_config = { \
+ OCTEON_NIC23_CN73XX_DRAM_ODT_1RANK_CONFIGURATION \
+ }, \
+},
+
+#endif /* __BOARD_DDR_H__ */
diff --git a/roms/u-boot/board/Marvell/octeontx/Kconfig b/roms/u-boot/board/Marvell/octeontx/Kconfig
new file mode 100644
index 000000000..45d115916
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx/Kconfig
@@ -0,0 +1,14 @@
+if TARGET_OCTEONTX_81XX || TARGET_OCTEONTX_83XX
+
+config SYS_VENDOR
+ string
+ default "Marvell"
+
+config SYS_BOARD
+ string
+ default "octeontx"
+
+config SYS_CONFIG_NAME
+ default "octeontx_common"
+
+endif
diff --git a/roms/u-boot/board/Marvell/octeontx/MAINTAINERS b/roms/u-boot/board/Marvell/octeontx/MAINTAINERS
new file mode 100644
index 000000000..1f3b12b1a
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx/MAINTAINERS
@@ -0,0 +1,8 @@
+OCTEONTX BOARD
+M: Aaron Williams <awilliams@marvell.com>
+S: Maintained
+F: board/Marvell/octeontx/
+F: include/configs/octeontx_81xx.h
+F: include/configs/octeontx_83xx.h
+F: configs/octeontx_81xx_defconfig
+F: configs/octeontx_83xx_defconfig
diff --git a/roms/u-boot/board/Marvell/octeontx/Makefile b/roms/u-boot/board/Marvell/octeontx/Makefile
new file mode 100644
index 000000000..fbe32ae00
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx/Makefile
@@ -0,0 +1,9 @@
+#/*
+# * Copyright (C) 2018 Marvell International Ltd.
+# *
+# * SPDX-License-Identifier: GPL-2.0
+# * https://spdx.org/licenses
+# */
+
+obj-y := board.o smc.o soc-utils.o
+obj-$(CONFIG_OF_LIBFDT) += board-fdt.o
diff --git a/roms/u-boot/board/Marvell/octeontx/board-fdt.c b/roms/u-boot/board/Marvell/octeontx/board-fdt.c
new file mode 100644
index 000000000..0b05ef11e
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx/board-fdt.c
@@ -0,0 +1,311 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Marvell International Ltd.
+ *
+ * https://spdx.org/licenses
+ */
+
+#include <errno.h>
+#include <env.h>
+#include <log.h>
+#include <net.h>
+#include <asm/io.h>
+#include <linux/compiler.h>
+#include <linux/libfdt.h>
+#include <fdtdec.h>
+#include <fdt_support.h>
+#include <asm/arch/board.h>
+#include <asm/global_data.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static int fdt_get_mdio_bus(const void *fdt, int phy_offset)
+{
+ int node, bus = -1;
+ const u64 *reg;
+ u64 addr;
+
+ if (phy_offset < 0)
+ return -1;
+ /* obtain mdio node and get the reg prop */
+ node = fdt_parent_offset(fdt, phy_offset);
+ if (node < 0)
+ return -1;
+
+ reg = fdt_getprop(fdt, node, "reg", NULL);
+ addr = fdt64_to_cpu(*reg);
+ bus = (addr & (1 << 7)) ? 1 : 0;
+ return bus;
+}
+
+static int fdt_get_phy_addr(const void *fdt, int phy_offset)
+{
+ const u32 *reg;
+ int addr = -1;
+
+ if (phy_offset < 0)
+ return -1;
+ reg = fdt_getprop(fdt, phy_offset, "reg", NULL);
+ addr = fdt32_to_cpu(*reg);
+ return addr;
+}
+
+void fdt_parse_phy_info(void)
+{
+ const void *fdt = gd->fdt_blob;
+ int offset = 0, node, bgx_id = 0, lmacid = 0;
+ const u32 *val;
+ char bgxname[24];
+ int len, rgx_id = 0, eth_id = 0;
+ int phandle, phy_offset;
+ int subnode, i;
+ int bdknode;
+
+ bdknode = fdt_path_offset(fdt, "/cavium,bdk");
+ if (bdknode < 0) {
+ printf("%s: bdk node is missing from device tree: %s\n",
+ __func__, fdt_strerror(bdknode));
+ }
+
+ offset = fdt_node_offset_by_compatible(fdt, -1, "pci-bridge");
+ if (offset < 1)
+ return;
+
+ for (bgx_id = 0; bgx_id < MAX_BGX_PER_NODE; bgx_id++) {
+ int phy_addr[LMAC_CNT] = {[0 ... LMAC_CNT - 1] = -1};
+ bool autoneg_dis[LMAC_CNT] = {[0 ... LMAC_CNT - 1] = 0};
+ int mdio_bus[LMAC_CNT] = {[0 ... LMAC_CNT - 1] = -1};
+ bool lmac_reg[LMAC_CNT] = {[0 ... LMAC_CNT - 1] = 0};
+ bool lmac_enable[LMAC_CNT] = {[0 ... LMAC_CNT - 1] = 0};
+
+ snprintf(bgxname, sizeof(bgxname), "bgx%d", bgx_id);
+ node = fdt_subnode_offset(fdt, offset, bgxname);
+ if (node < 0) {
+ /* check if it is rgx node */
+ snprintf(bgxname, sizeof(bgxname), "rgx%d", rgx_id);
+ node = fdt_subnode_offset(fdt, offset, bgxname);
+ if (node < 0) {
+ debug("bgx%d/rgx0 node not found\n", bgx_id);
+ return;
+ }
+ }
+ debug("bgx%d node found\n", bgx_id);
+
+ /*
+ * loop through each of the bgx/rgx nodes
+ * to find PHY nodes
+ */
+ fdt_for_each_subnode(subnode, fdt, node) {
+ /* Check for reg property */
+ val = fdt_getprop(fdt, subnode, "reg", &len);
+ if (val) {
+ debug("lmacid = %d\n", lmacid);
+ lmac_reg[lmacid] = 1;
+ }
+ /* check for phy-handle property */
+ val = fdt_getprop(fdt, subnode, "phy-handle", &len);
+ if (val) {
+ phandle = fdt32_to_cpu(*val);
+ if (!phandle) {
+ debug("phandle not valid %d\n", lmacid);
+ } else {
+ phy_offset = fdt_node_offset_by_phandle
+ (fdt, phandle);
+ phy_addr[lmacid] = fdt_get_phy_addr
+ (fdt, phy_offset);
+ mdio_bus[lmacid] = fdt_get_mdio_bus
+ (fdt, phy_offset);
+ }
+ } else {
+ debug("phy-handle prop not found %d\n",
+ lmacid);
+ }
+ /* check for autonegotiation property */
+ val = fdt_getprop(fdt, subnode,
+ "cavium,disable-autonegotiation",
+ &len);
+ if (val)
+ autoneg_dis[lmacid] = 1;
+
+ eth_id++;
+ lmacid++;
+ }
+
+ for (i = 0; i < MAX_LMAC_PER_BGX; i++) {
+ const char *str;
+
+ snprintf(bgxname, sizeof(bgxname),
+ "BGX-ENABLE.N0.BGX%d.P%d", bgx_id, i);
+ if (bdknode >= 0) {
+ str = fdt_getprop(fdt, bdknode,
+ bgxname, &len);
+ if (str)
+ lmac_enable[i] =
+ simple_strtol(str, NULL,
+ 10);
+ }
+ }
+
+ lmacid = 0;
+ bgx_set_board_info(bgx_id, mdio_bus, phy_addr,
+ autoneg_dis, lmac_reg, lmac_enable);
+ }
+}
+
+static int fdt_get_bdk_node(void)
+{
+ int node, ret;
+ const void *fdt = gd->fdt_blob;
+
+ if (!fdt) {
+ printf("ERROR: %s: no valid device tree found\n", __func__);
+ return 0;
+ }
+
+ ret = fdt_check_header(fdt);
+ if (ret < 0) {
+ printf("fdt: %s\n", fdt_strerror(ret));
+ return 0;
+ }
+
+ node = fdt_path_offset(fdt, "/cavium,bdk");
+ if (node < 0) {
+ printf("%s: /cavium,bdk is missing from device tree: %s\n",
+ __func__, fdt_strerror(node));
+ return 0;
+ }
+ return node;
+}
+
+const char *fdt_get_board_serial(void)
+{
+ const void *fdt = gd->fdt_blob;
+ int node, len = 64;
+ const char *str = NULL;
+
+ node = fdt_get_bdk_node();
+ if (!node)
+ return NULL;
+
+ str = fdt_getprop(fdt, node, "BOARD-SERIAL", &len);
+ if (!str)
+ printf("Error: cannot retrieve board serial from fdt\n");
+ return str;
+}
+
+const char *fdt_get_board_revision(void)
+{
+ const void *fdt = gd->fdt_blob;
+ int node, len = 64;
+ const char *str = NULL;
+
+ node = fdt_get_bdk_node();
+ if (!node)
+ return NULL;
+
+ str = fdt_getprop(fdt, node, "BOARD-REVISION", &len);
+ if (!str)
+ printf("Error: cannot retrieve board revision from fdt\n");
+ return str;
+}
+
+const char *fdt_get_board_model(void)
+{
+ const void *fdt = gd->fdt_blob;
+ int node, len = 16;
+ const char *str = NULL;
+
+ node = fdt_get_bdk_node();
+ if (!node)
+ return NULL;
+
+ str = fdt_getprop(fdt, node, "BOARD-MODEL", &len);
+ if (!str)
+ printf("Error: cannot retrieve board model from fdt\n");
+ return str;
+}
+
+void fdt_board_get_ethaddr(int bgx, int lmac, unsigned char *eth)
+{
+ const void *fdt = gd->fdt_blob;
+ const char *mac = NULL;
+ int offset = 0, node, len;
+ int subnode, i = 0;
+ char bgxname[24];
+
+ offset = fdt_node_offset_by_compatible(fdt, -1, "pci-bridge");
+ if (offset < 0) {
+ printf("%s couldn't find mrml bridge node in fdt\n",
+ __func__);
+ return;
+ }
+ if (bgx == 2 && otx_is_soc(CN81XX)) {
+ snprintf(bgxname, sizeof(bgxname), "rgx%d", 0);
+ lmac = 0;
+ } else {
+ snprintf(bgxname, sizeof(bgxname), "bgx%d", bgx);
+ }
+
+ node = fdt_subnode_offset(fdt, offset, bgxname);
+
+ fdt_for_each_subnode(subnode, fdt, node) {
+ if (i++ != lmac)
+ continue;
+ /* check for local-mac-address */
+ mac = fdt_getprop(fdt, subnode, "local-mac-address", &len);
+ if (mac) {
+ debug("%s mac %pM\n", __func__, mac);
+ memcpy(eth, mac, ARP_HLEN);
+ } else {
+ memset(eth, 0, ARP_HLEN);
+ }
+ debug("%s eth %pM\n", __func__, eth);
+ return;
+ }
+}
+
+int arch_fixup_memory_node(void *blob)
+{
+ return 0;
+}
+
+int ft_board_setup(void *blob, struct bd_info *bd)
+{
+ /* remove "cavium, bdk" node from DT */
+ int ret = 0, offset;
+
+ ret = fdt_check_header(blob);
+ if (ret < 0) {
+ printf("ERROR: %s\n", fdt_strerror(ret));
+ return ret;
+ }
+
+ if (blob) {
+ offset = fdt_path_offset(blob, "/cavium,bdk");
+ if (offset < 0) {
+ printf("ERROR: FDT BDK node not found\n");
+ return offset;
+ }
+
+ /* delete node */
+ ret = fdt_del_node(blob, offset);
+ if (ret < 0) {
+ printf("WARNING : could not remove bdk node\n");
+ return ret;
+ }
+
+ debug("%s deleted bdk node\n", __func__);
+ }
+
+ return 0;
+}
+
+/**
+ * Return the FDT base address that was passed by ATF
+ *
+ * @return FDT base address received from ATF in x1 register
+ */
+void *board_fdt_blob_setup(void)
+{
+ return (void *)fdt_base_addr;
+}
diff --git a/roms/u-boot/board/Marvell/octeontx/board.c b/roms/u-boot/board/Marvell/octeontx/board.c
new file mode 100644
index 000000000..059ebf8f1
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx/board.c
@@ -0,0 +1,153 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Marvell International Ltd.
+ *
+ * https://spdx.org/licenses
+ */
+
+#include <dm.h>
+#include <malloc.h>
+#include <errno.h>
+#include <env.h>
+#include <init.h>
+#include <log.h>
+#include <netdev.h>
+#include <pci_ids.h>
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <linux/compiler.h>
+#include <linux/libfdt.h>
+#include <fdt_support.h>
+#include <asm/arch/smc.h>
+#include <asm/arch/soc.h>
+#include <asm/arch/board.h>
+#include <dm/util.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void octeontx_cleanup_ethaddr(void)
+{
+ char ename[32];
+
+ for (int i = 0; i < 20; i++) {
+ sprintf(ename, i ? "eth%daddr" : "ethaddr", i);
+ if (env_get(ename))
+ env_set(ename, NULL);
+ }
+}
+
+int octeontx_board_has_pmp(void)
+{
+ return (otx_is_board("sff8104") || otx_is_board("nas8104"));
+}
+
+int board_early_init_r(void)
+{
+ pci_init();
+ return 0;
+}
+
+int board_init(void)
+{
+ if (IS_ENABLED(CONFIG_NET_OCTEONTX))
+ fdt_parse_phy_info();
+
+ return 0;
+}
+
+int timer_init(void)
+{
+ return 0;
+}
+
+int dram_init(void)
+{
+ gd->ram_size = smc_dram_size(0);
+ gd->ram_size -= CONFIG_SYS_SDRAM_BASE;
+ mem_map_fill();
+
+ return 0;
+}
+
+void board_late_probe_devices(void)
+{
+ struct udevice *dev;
+ int err, bgx_cnt, i;
+
+ /* Probe MAC(BGX) and NIC PF devices before Network stack init */
+ bgx_cnt = otx_is_soc(CN81XX) ? 2 : 4;
+ for (i = 0; i < bgx_cnt; i++) {
+ err = dm_pci_find_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_BGX, i, &dev);
+ if (err)
+ debug("%s BGX%d device not found\n", __func__, i);
+ }
+ if (otx_is_soc(CN81XX)) {
+ err = dm_pci_find_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_RGX, 0, &dev);
+ if (err)
+ debug("%s RGX device not found\n", __func__);
+ }
+ err = dm_pci_find_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_NIC, 0, &dev);
+ if (err)
+ debug("NIC PF device not found\n");
+}
+
+/**
+ * Board late initialization routine.
+ */
+int board_late_init(void)
+{
+ char boardname[32];
+ char boardserial[150], boardrev[150];
+ bool save_env = false;
+ const char *str;
+
+ /*
+ * Try to cleanup ethaddr env variables, this is needed
+ * as with each boot, configuration of network interfaces can change.
+ */
+ octeontx_cleanup_ethaddr();
+
+ snprintf(boardname, sizeof(boardname), "%s> ", fdt_get_board_model());
+ env_set("prompt", boardname);
+
+ set_working_fdt_addr(env_get_hex("fdtcontroladdr", fdt_base_addr));
+
+ str = fdt_get_board_revision();
+ if (str) {
+ snprintf(boardrev, sizeof(boardrev), "%s", str);
+ if (env_get("boardrev") &&
+ strcmp(boardrev, env_get("boardrev")))
+ save_env = true;
+ env_set("boardrev", boardrev);
+ }
+
+ str = fdt_get_board_serial();
+ if (str) {
+ snprintf(boardserial, sizeof(boardserial), "%s", str);
+ if (env_get("serial#") &&
+ strcmp(boardserial, env_get("serial#")))
+ save_env = true;
+ env_set("serial#", boardserial);
+ }
+
+ if (IS_ENABLED(CONFIG_NET_OCTEONTX))
+ board_late_probe_devices();
+
+ if (save_env)
+ env_save();
+
+ return 0;
+}
+
+/*
+ * Invoked before relocation, so limit to stack variables.
+ */
+int checkboard(void)
+{
+ printf("Board: %s\n", fdt_get_board_model());
+
+ return 0;
+}
diff --git a/roms/u-boot/board/Marvell/octeontx/smc.c b/roms/u-boot/board/Marvell/octeontx/smc.c
new file mode 100644
index 000000000..5eeba2358
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx/smc.c
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Marvell International Ltd.
+ *
+ * https://spdx.org/licenses
+ */
+
+#include <asm/global_data.h>
+#include <asm/ptrace.h>
+#include <asm/system.h>
+#include <asm/arch/smc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+ssize_t smc_dram_size(unsigned int node)
+{
+ struct pt_regs regs;
+
+ regs.regs[0] = OCTEONTX_DRAM_SIZE;
+ regs.regs[1] = node;
+ smc_call(&regs);
+
+ return regs.regs[0];
+}
+
diff --git a/roms/u-boot/board/Marvell/octeontx/soc-utils.c b/roms/u-boot/board/Marvell/octeontx/soc-utils.c
new file mode 100644
index 000000000..5fd5afd48
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx/soc-utils.c
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Marvell International Ltd.
+ *
+ * https://spdx.org/licenses
+ */
+
+#include <dm.h>
+#include <dm/util.h>
+#include <errno.h>
+#include <malloc.h>
+#include <asm/io.h>
+#include <asm/arch/soc.h>
+#include <asm/arch/board.h>
+
+int read_platform(void)
+{
+ int plat = PLATFORM_HW;
+
+ const char *model = fdt_get_board_model();
+
+ if (model && !strncmp(model, "ASIM-", 5))
+ plat = PLATFORM_ASIM;
+ if (model && !strncmp(model, "EMUL-", 5))
+ plat = PLATFORM_EMULATOR;
+ return plat;
+}
+
+static inline u64 read_midr(void)
+{
+ u64 result;
+
+ asm ("mrs %[rd],MIDR_EL1" : [rd] "=r" (result));
+ return result;
+}
+
+u8 read_partnum(void)
+{
+ return ((read_midr() >> 4) & 0xFF);
+}
+
+const char *read_board_name(void)
+{
+ return fdt_get_board_model();
+}
+
+bool read_alt_pkg(void)
+{
+ return false;
+}
diff --git a/roms/u-boot/board/Marvell/octeontx2/Kconfig b/roms/u-boot/board/Marvell/octeontx2/Kconfig
new file mode 100644
index 000000000..99291d795
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx2/Kconfig
@@ -0,0 +1,14 @@
+if TARGET_OCTEONTX2_95XX || TARGET_OCTEONTX2_96XX
+
+config SYS_VENDOR
+ string
+ default "Marvell"
+
+config SYS_BOARD
+ string
+ default "octeontx2"
+
+config SYS_CONFIG_NAME
+ default "octeontx2_common"
+
+endif
diff --git a/roms/u-boot/board/Marvell/octeontx2/MAINTAINERS b/roms/u-boot/board/Marvell/octeontx2/MAINTAINERS
new file mode 100644
index 000000000..eec1d77dd
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx2/MAINTAINERS
@@ -0,0 +1,8 @@
+OCTEONTX2 BOARD
+M: Aaron Williams <awilliams@marvell.com>
+S: Maintained
+F: board/Marvell/octeontx2/
+F: include/configs/octeontx2_96xx.h
+F: include/configs/octeontx2_95xx.h
+F: configs/octeontx2_96xx_defconfig
+F: configs/octeontx2_95xx_defconfig
diff --git a/roms/u-boot/board/Marvell/octeontx2/Makefile b/roms/u-boot/board/Marvell/octeontx2/Makefile
new file mode 100644
index 000000000..1f763b197
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx2/Makefile
@@ -0,0 +1,9 @@
+#/* SPDX-License-Identifier: GPL-2.0
+# *
+# * Copyright (C) 2018 Marvell International Ltd.
+# *
+# * https://spdx.org/licenses
+# */
+
+obj-y := board.o smc.o soc-utils.o
+obj-$(CONFIG_OF_LIBFDT) += board-fdt.o
diff --git a/roms/u-boot/board/Marvell/octeontx2/board-fdt.c b/roms/u-boot/board/Marvell/octeontx2/board-fdt.c
new file mode 100644
index 000000000..a4771af4c
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx2/board-fdt.c
@@ -0,0 +1,221 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Marvell International Ltd.
+ *
+ * https://spdx.org/licenses
+ */
+
+#include <errno.h>
+#include <fdtdec.h>
+#include <fdt_support.h>
+#include <log.h>
+
+#include <linux/compiler.h>
+#include <linux/libfdt.h>
+
+#include <asm/arch/board.h>
+#include <asm/arch/smc.h>
+#include <asm/global_data.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static int fdt_get_bdk_node(void)
+{
+ int node, ret;
+ const void *fdt = gd->fdt_blob;
+
+ if (!fdt) {
+ printf("ERROR: %s: no valid device tree found\n", __func__);
+ return 0;
+ }
+
+ ret = fdt_check_header(fdt);
+ if (ret < 0) {
+ printf("fdt: %s\n", fdt_strerror(ret));
+ return 0;
+ }
+
+ node = fdt_path_offset(fdt, "/cavium,bdk");
+ if (node < 0) {
+ printf("%s: /cavium,bdk is missing from device tree: %s\n",
+ __func__, fdt_strerror(node));
+ return 0;
+ }
+ return node;
+}
+
+u64 fdt_get_board_mac_addr(void)
+{
+ int node, len = 16;
+ const char *str = NULL;
+ const void *fdt = gd->fdt_blob;
+ u64 mac_addr = 0;
+
+ node = fdt_get_bdk_node();
+ if (!node)
+ return mac_addr;
+ str = fdt_getprop(fdt, node, "BOARD-MAC-ADDRESS", &len);
+ if (str)
+ mac_addr = simple_strtol(str, NULL, 16);
+ return mac_addr;
+}
+
+int fdt_get_board_mac_cnt(void)
+{
+ int node, len = 16;
+ const char *str = NULL;
+ const void *fdt = gd->fdt_blob;
+ int mac_count = 0;
+
+ node = fdt_get_bdk_node();
+ if (!node)
+ return mac_count;
+ str = fdt_getprop(fdt, node, "BOARD-MAC-ADDRESS-NUM", &len);
+ if (str) {
+ mac_count = simple_strtol(str, NULL, 10);
+ if (!mac_count)
+ mac_count = simple_strtol(str, NULL, 16);
+ debug("fdt: MAC_NUM %d\n", mac_count);
+ } else {
+ printf("Error: cannot retrieve mac count prop from fdt\n");
+ }
+ str = fdt_getprop(gd->fdt_blob, node, "BOARD-MAC-ADDRESS-NUM-OVERRIDE",
+ &len);
+ if (str) {
+ if (simple_strtol(str, NULL, 10) >= 0)
+ mac_count = simple_strtol(str, NULL, 10);
+ debug("fdt: MAC_NUM %d\n", mac_count);
+ } else {
+ printf("Error: cannot retrieve mac num override prop\n");
+ }
+ return mac_count;
+}
+
+const char *fdt_get_board_serial(void)
+{
+ const void *fdt = gd->fdt_blob;
+ int node, len = 64;
+ const char *str = NULL;
+
+ node = fdt_get_bdk_node();
+ if (!node)
+ return NULL;
+
+ str = fdt_getprop(fdt, node, "BOARD-SERIAL", &len);
+ if (!str)
+ printf("Error: cannot retrieve board serial from fdt\n");
+ return str;
+}
+
+const char *fdt_get_board_revision(void)
+{
+ const void *fdt = gd->fdt_blob;
+ int node, len = 64;
+ const char *str = NULL;
+
+ node = fdt_get_bdk_node();
+ if (!node)
+ return NULL;
+
+ str = fdt_getprop(fdt, node, "BOARD-REVISION", &len);
+ if (!str)
+ printf("Error: cannot retrieve board revision from fdt\n");
+ return str;
+}
+
+const char *fdt_get_board_model(void)
+{
+ int node, len = 16;
+ const char *str = NULL;
+ const void *fdt = gd->fdt_blob;
+
+ node = fdt_get_bdk_node();
+ if (!node)
+ return NULL;
+ str = fdt_getprop(fdt, node, "BOARD-MODEL", &len);
+ if (!str)
+ printf("Error: cannot retrieve board model from fdt\n");
+ return str;
+}
+
+int arch_fixup_memory_node(void *blob)
+{
+ return 0;
+}
+
+int ft_board_setup(void *blob, struct bd_info *bd)
+{
+ int nodeoff, node, ret, i;
+ const char *temp;
+
+ static const char * const
+ octeontx_brd_nodes[] = {"BOARD-MODEL",
+ "BOARD-SERIAL",
+ "BOARD-MAC-ADDRESS",
+ "BOARD-REVISION",
+ "BOARD-MAC-ADDRESS-NUM"
+ };
+ char nodes[ARRAY_SIZE(octeontx_brd_nodes)][32];
+
+ ret = fdt_check_header(blob);
+ if (ret < 0) {
+ printf("ERROR: %s\n", fdt_strerror(ret));
+ return ret;
+ }
+
+ if (blob) {
+ nodeoff = fdt_path_offset(blob, "/cavium,bdk");
+ if (nodeoff < 0) {
+ printf("ERROR: FDT BDK node not found\n");
+ return nodeoff;
+ }
+
+ /* Read properties in temporary variables */
+ for (i = 0; i < ARRAY_SIZE(octeontx_brd_nodes); i++) {
+ temp = fdt_getprop(blob, nodeoff,
+ octeontx_brd_nodes[i], NULL);
+ strncpy(nodes[i], temp, sizeof(nodes[i]));
+ }
+
+ /* Delete cavium,bdk node */
+ ret = fdt_del_node(blob, nodeoff);
+ if (ret < 0) {
+ printf("WARNING : could not remove cavium, bdk node\n");
+ return ret;
+ }
+ debug("%s deleted 'cavium,bdk' node\n", __func__);
+ /*
+ * Add a new node at root level which would have
+ * necessary info
+ */
+ node = fdt_add_subnode(blob, 0, "octeontx_brd");
+ if (node < 0) {
+ printf("Cannot create node octeontx_brd: %s\n",
+ fdt_strerror(node));
+ return -EIO;
+ }
+
+ /* Populate properties in node */
+ for (i = 0; i < ARRAY_SIZE(octeontx_brd_nodes); i++) {
+ if (fdt_setprop_string(blob, node,
+ octeontx_brd_nodes[i],
+ nodes[i])) {
+ printf("Can't set %s\n", nodes[i]);
+ return -EIO;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/**
+ * Return the FDT base address that was passed by ATF
+ *
+ * @return FDT base address received from ATF in x1 register
+ */
+void *board_fdt_blob_setup(void)
+{
+ return (void *)fdt_base_addr;
+}
diff --git a/roms/u-boot/board/Marvell/octeontx2/board.c b/roms/u-boot/board/Marvell/octeontx2/board.c
new file mode 100644
index 000000000..9b973a4ac
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx2/board.c
@@ -0,0 +1,248 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Marvell International Ltd.
+ *
+ * https://spdx.org/licenses
+ */
+
+#include <command.h>
+#include <console.h>
+#include <cpu_func.h>
+#include <dm.h>
+#include <asm/global_data.h>
+#include <dm/uclass-internal.h>
+#include <env.h>
+#include <init.h>
+#include <malloc.h>
+#include <net.h>
+#include <pci_ids.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <linux/compiler.h>
+#include <linux/delay.h>
+#include <linux/libfdt.h>
+#include <fdt_support.h>
+#include <asm/arch/smc.h>
+#include <asm/arch/soc.h>
+#include <asm/arch/board.h>
+#include <dm/util.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void cleanup_env_ethaddr(void)
+{
+ char ename[32];
+
+ for (int i = 0; i < 20; i++) {
+ sprintf(ename, i ? "eth%daddr" : "ethaddr", i);
+ if (env_get(ename))
+ env_set(ename, NULL);
+ }
+}
+
+void octeontx2_board_get_mac_addr(u8 index, u8 *mac_addr)
+{
+ u64 tmp_mac, board_mac_addr = fdt_get_board_mac_addr();
+ static int board_mac_num;
+
+ board_mac_num = fdt_get_board_mac_cnt();
+ if ((!is_zero_ethaddr((u8 *)&board_mac_addr)) && board_mac_num) {
+ tmp_mac = board_mac_addr;
+ tmp_mac += index;
+ tmp_mac = swab64(tmp_mac) >> 16;
+ memcpy(mac_addr, (u8 *)&tmp_mac, ARP_HLEN);
+ board_mac_num--;
+ } else {
+ memset(mac_addr, 0, ARP_HLEN);
+ }
+ debug("%s mac %pM\n", __func__, mac_addr);
+}
+
+void board_quiesce_devices(void)
+{
+ struct uclass *uc_dev;
+ int ret;
+
+ /* Removes all RVU PF devices */
+ ret = uclass_get(UCLASS_ETH, &uc_dev);
+ if (uc_dev)
+ ret = uclass_destroy(uc_dev);
+ if (ret)
+ printf("couldn't remove rvu pf devices\n");
+
+ if (IS_ENABLED(CONFIG_OCTEONTX2_CGX_INTF)) {
+ /* Bring down all cgx lmac links */
+ cgx_intf_shutdown();
+ }
+
+ /* Removes all CGX and RVU AF devices */
+ ret = uclass_get(UCLASS_MISC, &uc_dev);
+ if (uc_dev)
+ ret = uclass_destroy(uc_dev);
+ if (ret)
+ printf("couldn't remove misc (cgx/rvu_af) devices\n");
+
+ /* SMC call - removes all LF<->PF mappings */
+ smc_disable_rvu_lfs(0);
+}
+
+int board_early_init_r(void)
+{
+ pci_init();
+ return 0;
+}
+
+int board_init(void)
+{
+ return 0;
+}
+
+int timer_init(void)
+{
+ return 0;
+}
+
+int dram_init(void)
+{
+ gd->ram_size = smc_dram_size(0);
+ gd->ram_size -= CONFIG_SYS_SDRAM_BASE;
+
+ mem_map_fill();
+
+ return 0;
+}
+
+void board_late_probe_devices(void)
+{
+ struct udevice *dev;
+ int err, cgx_cnt = 3, i;
+
+ /* Probe MAC(CGX) and NIC AF devices before Network stack init */
+ for (i = 0; i < cgx_cnt; i++) {
+ err = dm_pci_find_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_CGX, i, &dev);
+ if (err)
+ debug("%s CGX%d device not found\n", __func__, i);
+ }
+ err = dm_pci_find_device(PCI_VENDOR_ID_CAVIUM,
+ PCI_DEVICE_ID_CAVIUM_RVU_AF, 0, &dev);
+ if (err)
+ debug("NIC AF device not found\n");
+}
+
+/**
+ * Board late initialization routine.
+ */
+int board_late_init(void)
+{
+ char boardname[32];
+ char boardserial[150], boardrev[150];
+ long val;
+ bool save_env = false;
+ const char *str;
+
+ debug("%s()\n", __func__);
+
+ /*
+ * Now that pci_init initializes env device.
+ * Try to cleanup ethaddr env variables, this is needed
+ * as with each boot, configuration of QLM can change.
+ */
+ cleanup_env_ethaddr();
+
+ snprintf(boardname, sizeof(boardname), "%s> ", fdt_get_board_model());
+ env_set("prompt", boardname);
+ set_working_fdt_addr(env_get_hex("fdtcontroladdr", fdt_base_addr));
+
+ str = fdt_get_board_revision();
+ if (str) {
+ snprintf(boardrev, sizeof(boardrev), "%s", str);
+ if (env_get("boardrev") &&
+ strcmp(boardrev, env_get("boardrev")))
+ save_env = true;
+ env_set("boardrev", boardrev);
+ }
+
+ str = fdt_get_board_serial();
+ if (str) {
+ snprintf(boardserial, sizeof(boardserial), "%s", str);
+ if (env_get("serial#") &&
+ strcmp(boardserial, env_get("serial#")))
+ save_env = true;
+ env_set("serial#", boardserial);
+ }
+
+ val = env_get_hex("disable_ooo", 0);
+ smc_configure_ooo(val);
+
+ if (IS_ENABLED(CONFIG_NET_OCTEONTX2))
+ board_late_probe_devices();
+
+ if (save_env)
+ env_save();
+
+ return 0;
+}
+
+/*
+ * Invoked before relocation, so limit to stack variables.
+ */
+int checkboard(void)
+{
+ printf("Board: %s\n", fdt_get_board_model());
+
+ return 0;
+}
+
+void board_acquire_flash_arb(bool acquire)
+{
+ union cpc_boot_ownerx ownerx;
+
+ if (!acquire) {
+ ownerx.u = readl(CPC_BOOT_OWNERX(3));
+ ownerx.s.boot_req = 0;
+ writel(ownerx.u, CPC_BOOT_OWNERX(3));
+ } else {
+ ownerx.u = 0;
+ ownerx.s.boot_req = 1;
+ writel(ownerx.u, CPC_BOOT_OWNERX(3));
+ udelay(1);
+ do {
+ ownerx.u = readl(CPC_BOOT_OWNERX(3));
+ } while (ownerx.s.boot_wait);
+ }
+}
+
+int last_stage_init(void)
+{
+ (void)smc_flsf_fw_booted();
+ return 0;
+}
+
+static int do_go_uboot(struct cmd_tbl *cmdtp, int flag, int argc,
+ char *const argv[])
+{
+ typedef void __noreturn (*uboot_entry_t)(ulong, void *);
+ uboot_entry_t entry;
+ ulong addr;
+ void *fdt;
+
+ if (argc < 2)
+ return CMD_RET_USAGE;
+
+ addr = simple_strtoul(argv[1], NULL, 16);
+ fdt = board_fdt_blob_setup();
+ entry = (uboot_entry_t)addr;
+ flush_cache((ulong)addr, 1 << 20); /* 1MiB should be enough */
+ dcache_disable();
+
+ printf("## Starting U-Boot at %p (FDT at %p)...\n", entry, fdt);
+
+ entry(0, fdt);
+
+ return 0;
+}
+
+U_BOOT_CMD(go_uboot, 2, 0, do_go_uboot,
+ "Start U-Boot from RAM (pass FDT via x1 register)",
+ "");
diff --git a/roms/u-boot/board/Marvell/octeontx2/smc.c b/roms/u-boot/board/Marvell/octeontx2/smc.c
new file mode 100644
index 000000000..9e3169576
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx2/smc.c
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Marvell International Ltd.
+ *
+ * https://spdx.org/licenses
+ */
+
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <asm/psci.h>
+#include <asm/ptrace.h>
+#include <asm/system.h>
+#include <asm/arch/smc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+ssize_t smc_dram_size(unsigned int node)
+{
+ struct pt_regs regs;
+
+ regs.regs[0] = OCTEONTX2_DRAM_SIZE;
+ regs.regs[1] = node;
+ smc_call(&regs);
+
+ return regs.regs[0];
+}
+
+ssize_t smc_disable_rvu_lfs(unsigned int node)
+{
+ struct pt_regs regs;
+
+ regs.regs[0] = OCTEONTX2_DISABLE_RVU_LFS;
+ regs.regs[1] = node;
+ smc_call(&regs);
+
+ return regs.regs[0];
+}
+
+ssize_t smc_configure_ooo(unsigned int val)
+{
+ struct pt_regs regs;
+
+ regs.regs[0] = OCTEONTX2_CONFIG_OOO;
+ regs.regs[1] = val;
+ smc_call(&regs);
+
+ return regs.regs[0];
+}
+
+ssize_t smc_flsf_fw_booted(void)
+{
+ struct pt_regs regs;
+
+ regs.regs[0] = OCTEONTX2_FSAFE_PR_BOOT_SUCCESS;
+ smc_call(&regs);
+
+ return regs.regs[0];
+}
diff --git a/roms/u-boot/board/Marvell/octeontx2/soc-utils.c b/roms/u-boot/board/Marvell/octeontx2/soc-utils.c
new file mode 100644
index 000000000..1cba7fb59
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx2/soc-utils.c
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Marvell International Ltd.
+ *
+ * https://spdx.org/licenses
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <malloc.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <linux/compiler.h>
+#include <asm/arch/soc.h>
+#include <asm/arch/board.h>
+#include <dm/util.h>
+
+int read_platform(void)
+{
+ int plat = PLATFORM_HW;
+
+ const char *model = fdt_get_board_model();
+
+ if (model && !strncmp(model, "ASIM-", 5))
+ plat = PLATFORM_ASIM;
+ if (model && !strncmp(model, "EMUL-", 5))
+ plat = PLATFORM_EMULATOR;
+
+ return plat;
+}
+
+static inline u64 read_midr(void)
+{
+ u64 result;
+
+ asm ("mrs %[rd],MIDR_EL1" : [rd] "=r" (result));
+ return result;
+}
+
+u8 read_partnum(void)
+{
+ return ((read_midr() >> 4) & 0xFF);
+}
+
+const char *read_board_name(void)
+{
+ return fdt_get_board_model();
+}
+
diff --git a/roms/u-boot/board/Marvell/octeontx2_cn913x/MAINTAINERS b/roms/u-boot/board/Marvell/octeontx2_cn913x/MAINTAINERS
new file mode 100644
index 000000000..74c5fd16e
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx2_cn913x/MAINTAINERS
@@ -0,0 +1,6 @@
+OCTEONTX2_CN913x BOARD
+M: Kostya Porotchkin <kostap@marvell.com>
+S: Maintained
+F: board/Marvell/octeontx2_cn913x/
+F: configs/mvebu_crb_cn9130_defconfig
+F: configs/mvebu_db_cn9130_defconfig
diff --git a/roms/u-boot/board/Marvell/octeontx2_cn913x/Makefile b/roms/u-boot/board/Marvell/octeontx2_cn913x/Makefile
new file mode 100644
index 000000000..8c6ffb932
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx2_cn913x/Makefile
@@ -0,0 +1,8 @@
+#
+# Copyright (C) 2016 Stefan Roese <sr@denx.de>
+# Copyright (C) 2019 Marvell International Ltd.
+#
+# SPDX-License-Identifier: GPL-2.0+
+#
+
+obj-y := board.o
diff --git a/roms/u-boot/board/Marvell/octeontx2_cn913x/README b/roms/u-boot/board/Marvell/octeontx2_cn913x/README
new file mode 100644
index 000000000..3d0c8b31e
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx2_cn913x/README
@@ -0,0 +1,24 @@
+Not all board variants are represented with a specific defconfig in
+mainline U-Boot. Here a small documentation on how to generate U-Boot
+images for all other board variants, available via different dts
+files and defconfigs.
+
+Use a different dts than in the defconfig:
+
+make DEVICE_TREE=cn9131-db-B
+
+Use a different boot device (e.g. MMC or NAND instead of SPI NOR):
+
+For MMC, please make the following changes to the defconfig via
+e.g. "make menuconfig":
+Remove CONFIG_MVEBU_SPI_BOOT
+Select CONFIG_MVEBU_MMC_BOOT
+Remove CONFIG_ENV_IS_IN_SPI_FLASH
+Select CONFIG_ENV_IS_IN_MMC
+
+For NAND, please make the following changes to the defconfig via
+e.g. "make menuconfig":
+Remove CONFIG_MVEBU_SPI_BOOT
+Select CONFIG_MVEBU_NAND_BOOT
+Remove CONFIG_ENV_IS_IN_SPI_FLASH
+Select CONFIG_ENV_IS_IN_NAND
diff --git a/roms/u-boot/board/Marvell/octeontx2_cn913x/board.c b/roms/u-boot/board/Marvell/octeontx2_cn913x/board.c
new file mode 100644
index 000000000..953e9db9c
--- /dev/null
+++ b/roms/u-boot/board/Marvell/octeontx2_cn913x/board.c
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2016 Stefan Roese <sr@denx.de>
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#include <dm.h>
+#include <power/regulator.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+__weak int soc_early_init_f(void)
+{
+ return 0;
+}
+
+int board_early_init_f(void)
+{
+ soc_early_init_f();
+
+ return 0;
+}
+
+int board_early_init_r(void)
+{
+ if (CONFIG_IS_ENABLED(DM_REGULATOR)) {
+ /* Check if any existing regulator should be turned down */
+ regulators_enable_boot_off(false);
+ }
+
+ return 0;
+}
+
+int board_init(void)
+{
+ /* address of boot parameters */
+ gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+ return 0;
+}
+
+int board_late_init(void)
+{
+ return 0;
+}
diff --git a/roms/u-boot/board/Marvell/openrd/Kconfig b/roms/u-boot/board/Marvell/openrd/Kconfig
new file mode 100644
index 000000000..124b66da0
--- /dev/null
+++ b/roms/u-boot/board/Marvell/openrd/Kconfig
@@ -0,0 +1,12 @@
+if TARGET_OPENRD
+
+config SYS_BOARD
+ default "openrd"
+
+config SYS_VENDOR
+ default "Marvell"
+
+config SYS_CONFIG_NAME
+ default "openrd"
+
+endif
diff --git a/roms/u-boot/board/Marvell/openrd/MAINTAINERS b/roms/u-boot/board/Marvell/openrd/MAINTAINERS
new file mode 100644
index 000000000..8170452b4
--- /dev/null
+++ b/roms/u-boot/board/Marvell/openrd/MAINTAINERS
@@ -0,0 +1,8 @@
+OPENRD / OPENRD_CLIENT BOARD
+M: Stefan Roese <sr@denx.de>
+S: Maintained
+F: board/Marvell/openrd/
+F: include/configs/openrd.h
+F: configs/openrd_base_defconfig
+F: configs/openrd_client_defconfig
+F: configs/openrd_ultimate_defconfig
diff --git a/roms/u-boot/board/Marvell/openrd/Makefile b/roms/u-boot/board/Marvell/openrd/Makefile
new file mode 100644
index 000000000..ecebb421f
--- /dev/null
+++ b/roms/u-boot/board/Marvell/openrd/Makefile
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2009
+# Net Insight <www.netinsight.net>
+# Written-by: Simon Kagstrom <simon.kagstrom@netinsight.net>
+#
+# Based on sheevaplug:
+# (C) Copyright 2009
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+
+obj-y := openrd.o
diff --git a/roms/u-boot/board/Marvell/openrd/kwbimage.cfg b/roms/u-boot/board/Marvell/openrd/kwbimage.cfg
new file mode 100644
index 000000000..356fd46f9
--- /dev/null
+++ b/roms/u-boot/board/Marvell/openrd/kwbimage.cfg
@@ -0,0 +1,150 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2009
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+# Refer doc/README.kwbimage for more details about how-to configure
+# and create kirkwood boot image
+#
+
+# Boot Media configurations
+BOOT_FROM nand
+NAND_ECC_MODE default
+NAND_PAGE_SIZE 0x0800
+
+# SOC registers configuration using bootrom header extension
+# Maximum KWBIMAGE_MAX_CONFIG configurations allowed
+
+# Configure RGMII-0 interface pad voltage to 1.8V
+DATA 0xFFD100e0 0x1b1b1b9b
+
+#Dram initalization for SINGLE x16 CL=5 @ 400MHz
+DATA 0xFFD01400 0x43000c30 # DDR Configuration register
+# bit13-0: 0xc30 (3120 DDR2 clks refresh rate)
+# bit23-14: zero
+# bit24: 1= enable exit self refresh mode on DDR access
+# bit25: 1 required
+# bit29-26: zero
+# bit31-30: 01
+
+DATA 0xFFD01404 0x37543000 # DDR Controller Control Low
+# bit 4: 0=addr/cmd in smame cycle
+# bit 5: 0=clk is driven during self refresh, we don't care for APX
+# bit 6: 0=use recommended falling edge of clk for addr/cmd
+# bit14: 0=input buffer always powered up
+# bit18: 1=cpu lock transaction enabled
+# bit23-20: 5=recommended value for CL=5 and STARTBURST_DEL disabled bit31=0
+# bit27-24: 7= CL+2, STARTBURST sample stages, for freqs 400MHz, unbuffered DIMM
+# bit30-28: 3 required
+# bit31: 0=no additional STARTBURST delay
+
+DATA 0xFFD01408 0x22125451 # DDR Timing (Low) (active cycles value +1)
+# bit3-0: TRAS lsbs
+# bit7-4: TRCD
+# bit11- 8: TRP
+# bit15-12: TWR
+# bit19-16: TWTR
+# bit20: TRAS msb
+# bit23-21: 0x0
+# bit27-24: TRRD
+# bit31-28: TRTP
+
+DATA 0xFFD0140C 0x00000a33 # DDR Timing (High)
+# bit6-0: TRFC
+# bit8-7: TR2R
+# bit10-9: TR2W
+# bit12-11: TW2W
+# bit31-13: zero required
+
+DATA 0xFFD01410 0x000000cc # DDR Address Control
+# bit1-0: 00, Cs0width=x8
+# bit3-2: 11, Cs0size=1Gb
+# bit5-4: 00, Cs1width=x8
+# bit7-6: 11, Cs1size=1Gb
+# bit9-8: 00, Cs2width=nonexistent
+# bit11-10: 00, Cs2size =nonexistent
+# bit13-12: 00, Cs3width=nonexistent
+# bit15-14: 00, Cs3size =nonexistent
+# bit16: 0, Cs0AddrSel
+# bit17: 0, Cs1AddrSel
+# bit18: 0, Cs2AddrSel
+# bit19: 0, Cs3AddrSel
+# bit31-20: 0 required
+
+DATA 0xFFD01414 0x00000000 # DDR Open Pages Control
+# bit0: 0, OpenPage enabled
+# bit31-1: 0 required
+
+DATA 0xFFD01418 0x00000000 # DDR Operation
+# bit3-0: 0x0, DDR cmd
+# bit31-4: 0 required
+
+DATA 0xFFD0141C 0x00000C52 # DDR Mode
+# bit2-0: 2, BurstLen=2 required
+# bit3: 0, BurstType=0 required
+# bit6-4: 4, CL=5
+# bit7: 0, TestMode=0 normal
+# bit8: 0, DLL reset=0 normal
+# bit11-9: 6, auto-precharge write recovery ????????????
+# bit12: 0, PD must be zero
+# bit31-13: 0 required
+
+DATA 0xFFD01420 0x00000042 # DDR Extended Mode
+# bit0: 0, DDR DLL enabled
+# bit1: 1, DDR drive strength reduced
+# bit2: 0, DDR ODT control lsd (disabled)
+# bit5-3: 000, required
+# bit6: 1, DDR ODT control msb, (disabled)
+# bit9-7: 000, required
+# bit10: 0, differential DQS enabled
+# bit11: 0, required
+# bit12: 0, DDR output buffer enabled
+# bit31-13: 0 required
+
+DATA 0xFFD01424 0x0000F17F # DDR Controller Control High
+# bit2-0: 111, required
+# bit3 : 1 , MBUS Burst Chop disabled
+# bit6-4: 111, required
+# bit7 : 0
+# bit8 : 1 , add writepath sample stage, must be 1 for DDR freq >= 300MHz
+# bit9 : 0 , no half clock cycle addition to dataout
+# bit10 : 0 , 1/4 clock cycle skew enabled for addr/ctl signals
+# bit11 : 0 , 1/4 clock cycle skew disabled for write mesh
+# bit15-12: 1111 required
+# bit31-16: 0 required
+
+DATA 0xFFD01428 0x00085520 # DDR2 ODT Read Timing (default values)
+DATA 0xFFD0147C 0x00008552 # DDR2 ODT Write Timing (default values)
+
+DATA 0xFFD01500 0x00000000 # CS[0]n Base address to 0x0
+DATA 0xFFD01504 0x0FFFFFF1 # CS[0]n Size
+# bit0: 1, Window enabled
+# bit1: 0, Write Protect disabled
+# bit3-2: 00, CS0 hit selected
+# bit23-4: ones, required
+# bit31-24: 0x0F, Size (i.e. 256MB)
+
+DATA 0xFFD01508 0x10000000 # CS[1]n Base address to 256Mb
+DATA 0xFFD0150C 0x0FFFFFF5 # CS[1]n Size 256Mb Window enabled for CS1
+
+DATA 0xFFD01514 0x00000000 # CS[2]n Size, window disabled
+DATA 0xFFD0151C 0x00000000 # CS[3]n Size, window disabled
+
+DATA 0xFFD01494 0x00120012 # DDR ODT Control (Low)
+# bit3-0: 0010, (read) M_ODT[0] is asserted during read from DRAM CS1
+# bit7-4: 0001, (read) M_ODT[1] is asserted during read from DRAM CS0
+# bit19-16: 0010, (write) M_ODT[0] is asserted during write to DRAM CS1.
+# bit23-20: 0001, (write) M_ODT[1] is asserted during write to DRAM CS0.
+DATA 0xFFD01498 0x00000000 # DDR ODT Control (High)
+
+DATA 0xFFD0149C 0x0000E40f # CPU ODT Control
+# bit3-0: 1111, internal ODT is asserted during read from DRAM bank 0-3
+# bit11-10: 01, M_DQ, M_DM, and M_DQS I/O buffer ODT Select: 150 ohm
+# bit13-12: 10, M_STARTBURST_IN I/O buffer ODT Select: 75 ohm
+# bit14: 1, M_STARTBURST_IN ODT: Enabled
+# bit15: 1, DDR IO ODT Unit: Use ODT block
+DATA 0xFFD01480 0x00000001 # DDR Initialization Control
+#bit0=1, enable DDR init upon this register write
+
+# End of Header extension
+DATA 0x0 0x0
diff --git a/roms/u-boot/board/Marvell/openrd/openrd.c b/roms/u-boot/board/Marvell/openrd/openrd.c
new file mode 100644
index 000000000..f44ac3315
--- /dev/null
+++ b/roms/u-boot/board/Marvell/openrd/openrd.c
@@ -0,0 +1,163 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2009
+ * Net Insight <www.netinsight.net>
+ * Written-by: Simon Kagstrom <simon.kagstrom@netinsight.net>
+ *
+ * Based on sheevaplug.c:
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+ */
+
+#include <common.h>
+#include <init.h>
+#include <miiphy.h>
+#include <net.h>
+#include <asm/global_data.h>
+#include <asm/mach-types.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#include <asm/arch/mpp.h>
+#include "openrd.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+ /*
+ * default gpio configuration
+ * There are maximum 64 gpios controlled through 2 sets of registers
+ * the below configuration configures mainly initial LED status
+ */
+ mvebu_config_gpio(OPENRD_OE_VAL_LOW,
+ OPENRD_OE_VAL_HIGH,
+ OPENRD_OE_LOW, OPENRD_OE_HIGH);
+
+ /* Multi-Purpose Pins Functionality configuration */
+ static const u32 kwmpp_config[] = {
+ MPP0_NF_IO2,
+ MPP1_NF_IO3,
+ MPP2_NF_IO4,
+ MPP3_NF_IO5,
+ MPP4_NF_IO6,
+ MPP5_NF_IO7,
+ MPP6_SYSRST_OUTn,
+ MPP7_GPO,
+ MPP8_TW_SDA,
+ MPP9_TW_SCK,
+ MPP10_UART0_TXD,
+ MPP11_UART0_RXD,
+ MPP12_SD_CLK,
+ MPP13_SD_CMD, /* Alt UART1_TXD */
+ MPP14_SD_D0, /* Alt UART1_RXD */
+ MPP15_SD_D1,
+ MPP16_SD_D2,
+ MPP17_SD_D3,
+ MPP18_NF_IO0,
+ MPP19_NF_IO1,
+ MPP20_GE1_0,
+ MPP21_GE1_1,
+ MPP22_GE1_2,
+ MPP23_GE1_3,
+ MPP24_GE1_4,
+ MPP25_GE1_5,
+ MPP26_GE1_6,
+ MPP27_GE1_7,
+ MPP28_GPIO,
+ MPP29_TSMP9,
+ MPP30_GE1_10,
+ MPP31_GE1_11,
+ MPP32_GE1_12,
+ MPP33_GE1_13,
+ MPP34_GPIO, /* UART1 / SD sel */
+ MPP35_TDM_CH0_TX_QL,
+ MPP36_TDM_SPI_CS1,
+ MPP37_TDM_CH2_TX_QL,
+ MPP38_TDM_CH2_RX_QL,
+ MPP39_AUDIO_I2SBCLK,
+ MPP40_AUDIO_I2SDO,
+ MPP41_AUDIO_I2SLRC,
+ MPP42_AUDIO_I2SMCLK,
+ MPP43_AUDIO_I2SDI,
+ MPP44_AUDIO_EXTCLK,
+ MPP45_TDM_PCLK,
+ MPP46_TDM_FS,
+ MPP47_TDM_DRX,
+ MPP48_TDM_DTX,
+ MPP49_TDM_CH0_RX_QL,
+ 0
+ };
+
+ kirkwood_mpp_conf(kwmpp_config, NULL);
+ return 0;
+}
+
+int board_init(void)
+{
+ /*
+ * arch number of board
+ */
+#if defined(CONFIG_BOARD_IS_OPENRD_BASE)
+ gd->bd->bi_arch_number = MACH_TYPE_OPENRD_BASE;
+#elif defined(CONFIG_BOARD_IS_OPENRD_CLIENT)
+ gd->bd->bi_arch_number = MACH_TYPE_OPENRD_CLIENT;
+#elif defined(CONFIG_BOARD_IS_OPENRD_ULTIMATE)
+ gd->bd->bi_arch_number = MACH_TYPE_OPENRD_ULTIMATE;
+#endif
+
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+ return 0;
+}
+
+#ifdef CONFIG_RESET_PHY_R
+/* Configure and enable MV88E1116/88E1121 PHY */
+void mv_phy_init(char *name)
+{
+ u16 reg;
+ u16 devadr;
+
+ if (miiphy_set_current_dev(name))
+ return;
+
+ /* command to read PHY dev address */
+ if (miiphy_read(name, 0xEE, 0xEE, (u16 *)&devadr)) {
+ printf("Err..%s could not read PHY dev address\n", __func__);
+ return;
+ }
+
+ /*
+ * Enable RGMII delay on Tx and Rx for CPU port
+ * Ref: sec 4.7.2 of chip datasheet
+ */
+ miiphy_write(name, devadr, MV88E1116_PGADR_REG, 2);
+ miiphy_read(name, devadr, MV88E1116_MAC_CTRL_REG, &reg);
+ reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL);
+ miiphy_write(name, devadr, MV88E1116_MAC_CTRL_REG, reg);
+ miiphy_write(name, devadr, MV88E1116_PGADR_REG, 0);
+
+ /* reset the phy */
+ miiphy_reset(name, devadr);
+
+ printf(PHY_NO" Initialized on %s\n", name);
+}
+
+void reset_phy(void)
+{
+ mv_phy_init("egiga0");
+
+#ifdef CONFIG_BOARD_IS_OPENRD_CLIENT
+ /* Kirkwood ethernet driver is written with the assumption that in case
+ * of multiple PHYs, their addresses are consecutive. But unfortunately
+ * in case of OpenRD-Client, PHY addresses are not consecutive.*/
+ miiphy_write("egiga1", 0xEE, 0xEE, 24);
+#endif
+
+#if defined(CONFIG_BOARD_IS_OPENRD_CLIENT) || \
+ defined(CONFIG_BOARD_IS_OPENRD_ULTIMATE)
+ /* configure and initialize both PHY's */
+ mv_phy_init("egiga1");
+#endif
+}
+#endif /* CONFIG_RESET_PHY_R */
diff --git a/roms/u-boot/board/Marvell/openrd/openrd.h b/roms/u-boot/board/Marvell/openrd/openrd.h
new file mode 100644
index 000000000..ade8d2739
--- /dev/null
+++ b/roms/u-boot/board/Marvell/openrd/openrd.h
@@ -0,0 +1,29 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2009
+ * Net Insight <www.netinsight.net>
+ * Written-by: Simon Kagstrom <simon.kagstrom@netinsight.net>
+ *
+ * Based on sheevaplug.h:
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+ */
+
+#ifndef __OPENRD_BASE_H
+#define __OPENRD_BASE_H
+
+#define OPENRD_OE_LOW (~(1<<28)) /* RS232 / RS485 */
+#define OPENRD_OE_HIGH (~(1<<2)) /* SD / UART1 */
+#define OPENRD_OE_VAL_LOW (0) /* Sel RS232 */
+#define OPENRD_OE_VAL_HIGH (1 << 2) /* Sel SD */
+
+/* PHY related */
+#define MV88E1116_LED_FCTRL_REG 10
+#define MV88E1116_CPRSP_CR3_REG 21
+#define MV88E1116_MAC_CTRL_REG 21
+#define MV88E1116_PGADR_REG 22
+#define MV88E1116_RGMII_TXTM_CTRL (1 << 4)
+#define MV88E1116_RGMII_RXTM_CTRL (1 << 5)
+
+#endif /* __OPENRD_BASE_H */
diff --git a/roms/u-boot/board/Marvell/sheevaplug/Kconfig b/roms/u-boot/board/Marvell/sheevaplug/Kconfig
new file mode 100644
index 000000000..e5f928472
--- /dev/null
+++ b/roms/u-boot/board/Marvell/sheevaplug/Kconfig
@@ -0,0 +1,12 @@
+if TARGET_SHEEVAPLUG
+
+config SYS_BOARD
+ default "sheevaplug"
+
+config SYS_VENDOR
+ default "Marvell"
+
+config SYS_CONFIG_NAME
+ default "sheevaplug"
+
+endif
diff --git a/roms/u-boot/board/Marvell/sheevaplug/MAINTAINERS b/roms/u-boot/board/Marvell/sheevaplug/MAINTAINERS
new file mode 100644
index 000000000..2b0103d07
--- /dev/null
+++ b/roms/u-boot/board/Marvell/sheevaplug/MAINTAINERS
@@ -0,0 +1,6 @@
+SHEEVAPLUG BOARD
+M: Prafulla Wadaskar <prafulla@marvell.com>
+S: Maintained
+F: board/Marvell/sheevaplug/
+F: include/configs/sheevaplug.h
+F: configs/sheevaplug_defconfig
diff --git a/roms/u-boot/board/Marvell/sheevaplug/Makefile b/roms/u-boot/board/Marvell/sheevaplug/Makefile
new file mode 100644
index 000000000..c39dd03e2
--- /dev/null
+++ b/roms/u-boot/board/Marvell/sheevaplug/Makefile
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2009
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+
+obj-y := sheevaplug.o
diff --git a/roms/u-boot/board/Marvell/sheevaplug/kwbimage.cfg b/roms/u-boot/board/Marvell/sheevaplug/kwbimage.cfg
new file mode 100644
index 000000000..f5206451d
--- /dev/null
+++ b/roms/u-boot/board/Marvell/sheevaplug/kwbimage.cfg
@@ -0,0 +1,144 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2009
+# Marvell Semiconductor <www.marvell.com>
+# Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+# Refer to doc/README.kwbimage for more details about how-to
+# configure and create kirkwood boot images.
+#
+
+# Boot Media configurations
+BOOT_FROM nand
+NAND_ECC_MODE default
+NAND_PAGE_SIZE 0x0800
+
+# SOC registers configuration using bootrom header extension
+# Maximum KWBIMAGE_MAX_CONFIG configurations allowed
+
+# Configure RGMII-0 interface pad voltage to 1.8V
+DATA 0xFFD100e0 0x1b1b1b9b
+
+#Dram initalization for SINGLE x16 CL=5 @ 400MHz
+DATA 0xFFD01400 0x43000c30 # DDR Configuration register
+# bit13-0: 0xc30 (3120 DDR2 clks refresh rate)
+# bit23-14: zero
+# bit24: 1= enable exit self refresh mode on DDR access
+# bit25: 1 required
+# bit29-26: zero
+# bit31-30: 01
+
+DATA 0xFFD01404 0x37543000 # DDR Controller Control Low
+# bit 4: 0=addr/cmd in smame cycle
+# bit 5: 0=clk is driven during self refresh, we don't care for APX
+# bit 6: 0=use recommended falling edge of clk for addr/cmd
+# bit14: 0=input buffer always powered up
+# bit18: 1=cpu lock transaction enabled
+# bit23-20: 5=recommended value for CL=5 and STARTBURST_DEL disabled bit31=0
+# bit27-24: 7= CL+2, STARTBURST sample stages, for freqs 400MHz, unbuffered DIMM
+# bit30-28: 3 required
+# bit31: 0=no additional STARTBURST delay
+
+DATA 0xFFD01408 0x22125451 # DDR Timing (Low) (active cycles value +1)
+# bit3-0: TRAS lsbs
+# bit7-4: TRCD
+# bit11- 8: TRP
+# bit15-12: TWR
+# bit19-16: TWTR
+# bit20: TRAS msb
+# bit23-21: 0x0
+# bit27-24: TRRD
+# bit31-28: TRTP
+
+DATA 0xFFD0140C 0x00000a33 # DDR Timing (High)
+# bit6-0: TRFC
+# bit8-7: TR2R
+# bit10-9: TR2W
+# bit12-11: TW2W
+# bit31-13: zero required
+
+DATA 0xFFD01410 0x000000cc # DDR Address Control
+# bit1-0: 00, Cs0width=x8
+# bit3-2: 11, Cs0size=1Gb
+# bit5-4: 00, Cs1width=x8
+# bit7-6: 11, Cs1size=1Gb
+# bit9-8: 00, Cs2width=nonexistent
+# bit11-10: 00, Cs2size =nonexistent
+# bit13-12: 00, Cs3width=nonexistent
+# bit15-14: 00, Cs3size =nonexistent
+# bit16: 0, Cs0AddrSel
+# bit17: 0, Cs1AddrSel
+# bit18: 0, Cs2AddrSel
+# bit19: 0, Cs3AddrSel
+# bit31-20: 0 required
+
+DATA 0xFFD01414 0x00000000 # DDR Open Pages Control
+# bit0: 0, OpenPage enabled
+# bit31-1: 0 required
+
+DATA 0xFFD01418 0x00000000 # DDR Operation
+# bit3-0: 0x0, DDR cmd
+# bit31-4: 0 required
+
+DATA 0xFFD0141C 0x00000C52 # DDR Mode
+# bit2-0: 2, BurstLen=2 required
+# bit3: 0, BurstType=0 required
+# bit6-4: 4, CL=5
+# bit7: 0, TestMode=0 normal
+# bit8: 0, DLL reset=0 normal
+# bit11-9: 6, auto-precharge write recovery ????????????
+# bit12: 0, PD must be zero
+# bit31-13: 0 required
+
+DATA 0xFFD01420 0x00000040 # DDR Extended Mode
+# bit0: 0, DDR DLL enabled
+# bit1: 0, DDR drive strenght normal
+# bit2: 0, DDR ODT control lsd (disabled)
+# bit5-3: 000, required
+# bit6: 1, DDR ODT control msb, (disabled)
+# bit9-7: 000, required
+# bit10: 0, differential DQS enabled
+# bit11: 0, required
+# bit12: 0, DDR output buffer enabled
+# bit31-13: 0 required
+
+DATA 0xFFD01424 0x0000F17F # DDR Controller Control High
+# bit2-0: 111, required
+# bit3 : 1 , MBUS Burst Chop disabled
+# bit6-4: 111, required
+# bit7 : 0
+# bit8 : 1 , add writepath sample stage, must be 1 for DDR freq >= 300MHz
+# bit9 : 0 , no half clock cycle addition to dataout
+# bit10 : 0 , 1/4 clock cycle skew enabled for addr/ctl signals
+# bit11 : 0 , 1/4 clock cycle skew disabled for write mesh
+# bit15-12: 1111 required
+# bit31-16: 0 required
+
+DATA 0xFFD01428 0x00085520 # DDR2 ODT Read Timing (default values)
+DATA 0xFFD0147C 0x00008552 # DDR2 ODT Write Timing (default values)
+
+DATA 0xFFD01500 0x00000000 # CS[0]n Base address to 0x0
+DATA 0xFFD01504 0x0FFFFFF1 # CS[0]n Size
+# bit0: 1, Window enabled
+# bit1: 0, Write Protect disabled
+# bit3-2: 00, CS0 hit selected
+# bit23-4: ones, required
+# bit31-24: 0x0F, Size (i.e. 256MB)
+
+DATA 0xFFD01508 0x10000000 # CS[1]n Base address to 256Mb
+DATA 0xFFD0150C 0x0FFFFFF5 # CS[1]n Size 256Mb Window enabled for CS1
+
+DATA 0xFFD01514 0x00000000 # CS[2]n Size, window disabled
+DATA 0xFFD0151C 0x00000000 # CS[3]n Size, window disabled
+
+DATA 0xFFD01494 0x00030000 # DDR ODT Control (Low)
+DATA 0xFFD01498 0x00000000 # DDR ODT Control (High)
+# bit1-0: 00, ODT0 controlled by ODT Control (low) register above
+# bit3-2: 01, ODT1 active NEVER!
+# bit31-4: zero, required
+
+DATA 0xFFD0149C 0x0000E803 # CPU ODT Control
+DATA 0xFFD01480 0x00000001 # DDR Initialization Control
+#bit0=1, enable DDR init upon this register write
+
+# End of Header extension
+DATA 0x0 0x0
diff --git a/roms/u-boot/board/Marvell/sheevaplug/sheevaplug.c b/roms/u-boot/board/Marvell/sheevaplug/sheevaplug.c
new file mode 100644
index 000000000..0cc7f2b39
--- /dev/null
+++ b/roms/u-boot/board/Marvell/sheevaplug/sheevaplug.c
@@ -0,0 +1,136 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+ */
+
+#include <common.h>
+#include <init.h>
+#include <miiphy.h>
+#include <net.h>
+#include <asm/global_data.h>
+#include <asm/mach-types.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#include <asm/arch/mpp.h>
+#include "sheevaplug.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+ /*
+ * default gpio configuration
+ * There are maximum 64 gpios controlled through 2 sets of registers
+ * the below configuration configures mainly initial LED status
+ */
+ mvebu_config_gpio(SHEEVAPLUG_OE_VAL_LOW,
+ SHEEVAPLUG_OE_VAL_HIGH,
+ SHEEVAPLUG_OE_LOW, SHEEVAPLUG_OE_HIGH);
+
+ /* Multi-Purpose Pins Functionality configuration */
+ static const u32 kwmpp_config[] = {
+ MPP0_NF_IO2,
+ MPP1_NF_IO3,
+ MPP2_NF_IO4,
+ MPP3_NF_IO5,
+ MPP4_NF_IO6,
+ MPP5_NF_IO7,
+ MPP6_SYSRST_OUTn,
+ MPP7_GPO,
+ MPP8_UART0_RTS,
+ MPP9_UART0_CTS,
+ MPP10_UART0_TXD,
+ MPP11_UART0_RXD,
+ MPP12_SD_CLK,
+ MPP13_SD_CMD,
+ MPP14_SD_D0,
+ MPP15_SD_D1,
+ MPP16_SD_D2,
+ MPP17_SD_D3,
+ MPP18_NF_IO0,
+ MPP19_NF_IO1,
+ MPP20_GPIO,
+ MPP21_GPIO,
+ MPP22_GPIO,
+ MPP23_GPIO,
+ MPP24_GPIO,
+ MPP25_GPIO,
+ MPP26_GPIO,
+ MPP27_GPIO,
+ MPP28_GPIO,
+ MPP29_TSMP9,
+ MPP30_GPIO,
+ MPP31_GPIO,
+ MPP32_GPIO,
+ MPP33_GPIO,
+ MPP34_GPIO,
+ MPP35_GPIO,
+ MPP36_GPIO,
+ MPP37_GPIO,
+ MPP38_GPIO,
+ MPP39_GPIO,
+ MPP40_GPIO,
+ MPP41_GPIO,
+ MPP42_GPIO,
+ MPP43_GPIO,
+ MPP44_GPIO,
+ MPP45_GPIO,
+ MPP46_GPIO,
+ MPP47_GPIO,
+ MPP48_GPIO,
+ MPP49_GPIO,
+ 0
+ };
+ kirkwood_mpp_conf(kwmpp_config, NULL);
+ return 0;
+}
+
+int board_init(void)
+{
+ /*
+ * arch number of board
+ */
+ gd->bd->bi_arch_number = MACH_TYPE_SHEEVAPLUG;
+
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+
+ return 0;
+}
+
+#ifdef CONFIG_RESET_PHY_R
+/* Configure and enable MV88E1116 PHY */
+void reset_phy(void)
+{
+ u16 reg;
+ u16 devadr;
+ char *name = "egiga0";
+
+ if (miiphy_set_current_dev(name))
+ return;
+
+ /* command to read PHY dev address */
+ if (miiphy_read(name, 0xEE, 0xEE, (u16 *) &devadr)) {
+ printf("Err..%s could not read PHY dev address\n",
+ __FUNCTION__);
+ return;
+ }
+
+ /*
+ * Enable RGMII delay on Tx and Rx for CPU port
+ * Ref: sec 4.7.2 of chip datasheet
+ */
+ miiphy_write(name, devadr, MV88E1116_PGADR_REG, 2);
+ miiphy_read(name, devadr, MV88E1116_MAC_CTRL_REG, &reg);
+ reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL);
+ miiphy_write(name, devadr, MV88E1116_MAC_CTRL_REG, reg);
+ miiphy_write(name, devadr, MV88E1116_PGADR_REG, 0);
+
+ /* reset the phy */
+ miiphy_reset(name, devadr);
+
+ printf("88E1116 Initialized on %s\n", name);
+}
+#endif /* CONFIG_RESET_PHY_R */
diff --git a/roms/u-boot/board/Marvell/sheevaplug/sheevaplug.h b/roms/u-boot/board/Marvell/sheevaplug/sheevaplug.h
new file mode 100644
index 000000000..e026c1b53
--- /dev/null
+++ b/roms/u-boot/board/Marvell/sheevaplug/sheevaplug.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2009
+ * Marvell Semiconductor <www.marvell.com>
+ * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
+ */
+
+#ifndef __SHEEVAPLUG_H
+#define __SHEEVAPLUG_H
+
+#define SHEEVAPLUG_OE_LOW (~(0))
+#define SHEEVAPLUG_OE_HIGH (~(0))
+#define SHEEVAPLUG_OE_VAL_LOW (1 << 29) /* USB_PWEN low */
+#define SHEEVAPLUG_OE_VAL_HIGH (1 << 17) /* LED pin high */
+
+/* PHY related */
+#define MV88E1116_LED_FCTRL_REG 10
+#define MV88E1116_CPRSP_CR3_REG 21
+#define MV88E1116_MAC_CTRL_REG 21
+#define MV88E1116_PGADR_REG 22
+#define MV88E1116_RGMII_TXTM_CTRL (1 << 4)
+#define MV88E1116_RGMII_RXTM_CTRL (1 << 5)
+
+#endif /* __SHEEVAPLUG_H */