Skip to content

Commit

Permalink
arm: mvebu: Add Armada A38x DB-88F6820-GP board support
Browse files Browse the repository at this point in the history
This patch adds support for the Marvell DB-88F6820-GP Armada A38x
evaluation board.

Supported peripherals are:
- UART
- Ethernet (mvneta)
- I2C
- SPI (including SPI NOR flash)

Please note that this board support right now only supports the
main U-Boot. Without the bin_hdr integration (DDR training etc). This
will be added in a few days / weeks to complete this board port. But
till then this U-Boot version can be run on the target via the
original Marvell U-Boot via this command:

tftpboot 4000000 db-88f6820-gp/u-boot.bin;go 4000000

Signed-off-by: Stefan Roese <[email protected]>
Tested-by: Kevin Smith <[email protected]>
Tested-by: Dirk Eibach <[email protected]>
  • Loading branch information
stroese authored and lperkov committed May 5, 2015
1 parent 60b7532 commit 2bae75a
Show file tree
Hide file tree
Showing 8 changed files with 233 additions and 0 deletions.
6 changes: 6 additions & 0 deletions arch/arm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,11 @@ config KIRKWOOD
bool "Marvell Kirkwood"
select CPU_ARM926EJS

config TARGET_DB_88F6820_GP
bool "Support DB-88F6820-GP"
select CPU_V7
select SUPPORT_SPL

config TARGET_DB_MV784MP_GP
bool "Support db-mv784mp-gp"
select CPU_V7
Expand Down Expand Up @@ -850,6 +855,7 @@ source "board/BuR/kwb/Kconfig"
source "board/BuR/tseries/Kconfig"
source "board/CarMediaLab/flea3/Kconfig"
source "board/Marvell/aspenite/Kconfig"
source "board/Marvell/db-88f6820-gp/Kconfig"
source "board/Marvell/db-mv784mp-gp/Kconfig"
source "board/Marvell/gplugd/Kconfig"
source "board/altera/socfpga/Kconfig"
Expand Down
15 changes: 15 additions & 0 deletions board/Marvell/db-88f6820-gp/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
if TARGET_DB_88F6820_GP

config SYS_BOARD
default "db-88f6820-gp"

config SYS_VENDOR
default "Marvell"

config SYS_SOC
default "mvebu"

config SYS_CONFIG_NAME
default "db-88f6820-gp"

endif
7 changes: 7 additions & 0 deletions board/Marvell/db-88f6820-gp/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#
# Copyright (C) 2015 Stefan Roese <[email protected]>
#
# SPDX-License-Identifier: GPL-2.0+
#

obj-y := db-88f6820-gp.o
16 changes: 16 additions & 0 deletions board/Marvell/db-88f6820-gp/binary.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
--------
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.

In a few weeks, mainline U-Boot will get support to generate the
bin_hdr with the DDR training code itself. By implementing this code
as SPL U-Boot. Then this file will not be needed any more and will
get removed.
103 changes: 103 additions & 0 deletions board/Marvell/db-88f6820-gp/db-88f6820-gp.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/*
* Copyright (C) 2015 Stefan Roese <[email protected]>
*
* SPDX-License-Identifier: GPL-2.0+
*/

#include <common.h>
#include <i2c.h>
#include <miiphy.h>
#include <asm/io.h>
#include <asm/arch/cpu.h>
#include <asm/arch/soc.h>

DECLARE_GLOBAL_DATA_PTR;

#define BIT(nr) (1UL << (nr))

#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-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 */
};

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;
}
12 changes: 12 additions & 0 deletions board/Marvell/db-88f6820-gp/kwbimage.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#
# Copyright (C) 2014 Stefan Roese <[email protected]>
#

# 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-88f6820-gp/binary.0 0000005b 00000068
2 changes: 2 additions & 0 deletions configs/db-88f6820-gp_defconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
CONFIG_ARM=y
CONFIG_TARGET_DB_88F6820_GP=y
72 changes: 72 additions & 0 deletions include/configs/db-88f6820-gp.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* Copyright (C) 2014 Stefan Roese <[email protected]>
*
* SPDX-License-Identifier: GPL-2.0+
*/

#ifndef _CONFIG_DB_88F6820_GP_H
#define _CONFIG_DB_88F6820_GP_H

/*
* High Level Configuration Options (easy to change)
*/
#define CONFIG_ARMADA_XP /* SOC Family Name */
#define CONFIG_DB_88F6820_GP /* Board target name for DDR training */

#define CONFIG_SYS_L2_PL310

#define CONFIG_SKIP_LOWLEVEL_INIT /* disable board lowlevel_init */
#define CONFIG_SYS_GENERIC_BOARD
#define CONFIG_DISPLAY_BOARDINFO_LATE

#define CONFIG_SYS_TEXT_BASE 0x04000000
#define CONFIG_SYS_TCLK 250000000 /* 250MHz */

/*
* Commands configuration
*/
#define CONFIG_SYS_NO_FLASH /* Declare no flash (NOR/SPI) */
#include <config_cmd_default.h>
#define CONFIG_CMD_CACHE
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_ENV
#define CONFIG_CMD_I2C
#define CONFIG_CMD_PING
#define CONFIG_CMD_SF
#define CONFIG_CMD_SPI
#define CONFIG_CMD_TFTPPUT
#define CONFIG_CMD_TIME

/* I2C */
#define CONFIG_SYS_I2C
#define CONFIG_SYS_I2C_MVTWSI
#define CONFIG_I2C_MVTWSI_BASE0 MVEBU_TWSI_BASE
#define CONFIG_SYS_I2C_SLAVE 0x0
#define CONFIG_SYS_I2C_SPEED 100000

/* SPI NOR flash default params, used by sf commands */
#define CONFIG_SF_DEFAULT_SPEED 1000000
#define CONFIG_SF_DEFAULT_MODE SPI_MODE_3
#define CONFIG_SPI_FLASH_STMICRO

/* Environment in SPI NOR flash */
#define CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_OFFSET (1 << 20) /* 1MiB in */
#define CONFIG_ENV_SIZE (64 << 10) /* 64KiB */
#define CONFIG_ENV_SECT_SIZE (256 << 10) /* 256KiB sectors */

#define CONFIG_PHY_MARVELL /* there is a marvell phy */
#define CONFIG_PHY_ADDR { 1, 0 }
#define CONFIG_SYS_NETA_INTERFACE_TYPE PHY_INTERFACE_MODE_RGMII
#define PHY_ANEG_TIMEOUT 8000 /* PHY needs a longer aneg time */

#define CONFIG_SYS_CONSOLE_INFO_QUIET /* don't print console @ startup */
#define CONFIG_SYS_ALT_MEMTEST

/*
* mv-common.h should be defined after CMD configs since it used them
* to enable certain macros
*/
#include "mv-common.h"

#endif /* _CONFIG_DB_88F6820_GP_H */

0 comments on commit 2bae75a

Please sign in to comment.