[PATCH] arm: kirkwood: Add nas440 board, Marvell 88SE6121 AHCI
Tony Dinh
mibodhi at gmail.com
Thu Mar 24 23:04:47 CET 2022
Hi Hajo,
I've added Stefan.
When you send patches for Kirkwood or other Marvell boards, please
also send it directly to Stefan (Stefan is the maintainer of Marvell
u-boots).
Tony
On Thu, Mar 24, 2022 at 3:11 AM Pali Rohár <pali at kernel.org> wrote:
>
> Hello!
>
> On Thursday 24 March 2022 10:55:38 Hajo Noerenberg wrote:
> > This adds support for the Seagate Blackarmor NAS440 (4-bay Kirkwood NAS box).
> >
> > Does it make sense to include support for a 10+ year old device?
>
> If these old devices are still in use and you would like to maintain
> this support then I think that there is no issue with it.
>
> > If yes, I would be willing to discuss and finalize this patch. If no, it will be archived here for the public, which is fine with me.
> >
> > For the NAS440 is the something special that hard disk drives 1 and 2 are connected to a 88SE6121 SATA-II controller, which is connected via PCIe. Hard disk drives 3 and 4 are directly connected to the 88F6281 SoC.
> >
> > - Add NAS440 dtb and associated files/configs
> > * Includes support for HD44780 front LCD
> > * Includes support for device LEDs (via 74AHC164 shift register)
> > - Add Marvell 88SE6121 AHCI support. Thanks to Pali Rohár for recently adding the necessary Kirkwood PCIe driver. It works :)
>
> Perfect!
>
> > - Tested with my NAS440 hardware: ETH/USB/SATA/AHCI-SCSI/GPIO/LCD/LEDs ok
> >
> > As far as I can see this fully implements the support for this board within U-Boot. With the Linux kernel however there are problems, the kernel AHCI driver fails with "failed to IDENTIFY" messages for the 88SE6121 drive ports, which I could not solve yet despite comparison with the GPL sources from Seagate.
> >
> > Note: I am collecting various information and patches for the family of Blackarmor NAS boards at https://github.com/hn/seagate-blackarmor-nas
> >
> > Hajo
> >
> >
> > ---
> > arch/arm/dts/kirkwood-blackarmor-nas440.dts | 166 +++++++++
> > board/Seagate/nas440/Kconfig | 12 +
> > board/Seagate/nas440/MAINTAINERS | 7 +
> > board/Seagate/nas440/Makefile | 7 +
> > board/Seagate/nas440/kwbimage.cfg | 156 ++++++++
> > board/Seagate/nas440/nas440.c | 378 ++++++++++++++++++++
> > configs/nas440_defconfig | 89 +++++
> > drivers/ata/ahci-pci.c | 1 +
> > include/configs/nas440.h | 50 +++
> > 9 files changed, 866 insertions(+)
> > create mode 100644 arch/arm/dts/kirkwood-blackarmor-nas440.dts
> > create mode 100644 board/Seagate/nas440/Kconfig
> > create mode 100644 board/Seagate/nas440/MAINTAINERS
> > create mode 100644 board/Seagate/nas440/Makefile
> > create mode 100644 board/Seagate/nas440/kwbimage.cfg
> > create mode 100644 board/Seagate/nas440/nas440.c
> > create mode 100644 configs/nas440_defconfig
> > create mode 100644 include/configs/nas440.h
> >
> > diff --git a/arch/arm/dts/kirkwood-blackarmor-nas440.dts b/arch/arm/dts/kirkwood-blackarmor-nas440.dts
> > new file mode 100644
> > index 0000000000..60e3fe6f0d
> > --- /dev/null
> > +++ b/arch/arm/dts/kirkwood-blackarmor-nas440.dts
> > @@ -0,0 +1,166 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +/*
> > + * Device Tree file for Seagate Blackarmor NAS440
> > + *
> > + * Copyright (C) 2021 Hajo Noerenberg <www.github.com/hn>
> > + * Copyright (C) 2015 Andreas Fischer <af at bantuX.org>
> > + * Copyright (C) 2014 Evgeni Dobrev <evgeni at studio-punkt.com>
> > + */
> > +
> > +/dts-v1/;
> > +
> > +#include <dt-bindings/gpio/gpio.h>
> > +#include <dt-bindings/input/input.h>
> > +#include "kirkwood.dtsi"
> > +#include "kirkwood-6281.dtsi"
> > +
> > +/ {
> > + model = "Seagate Blackarmor NAS440";
> > + compatible = "seagate,blackarmor-nas440","marvell,kirkwood-88f6281",
> > + "marvell,kirkwood";
> > +
> > + memory { /* 256 MB */
> > + device_type = "memory";
> > + reg = <0x00000000 0x10000000>;
> > + };
> > +
> > + chosen {
> > + bootargs = "console=ttyS0,115200n8";
> > + stdout-path = &uart0;
> > + };
> > +
> > + gpio_poweroff {
> > + compatible = "gpio-poweroff";
> > + gpios = <&gpio1 16 GPIO_ACTIVE_LOW>; /* GPIO1-16 is MPP48 */
> > + };
> > +
> > + gpio_keys {
> > + compatible = "gpio-keys";
> > +
> > + reset {
> > + label = "Reset";
> > + linux,code = <KEY_POWER>;
> > + gpios = <&gpio0 29 GPIO_ACTIVE_LOW>;
> > + };
> > +
> > + button {
> > + label = "Power";
> > + linux,code = <KEY_SLEEP>;
> > + gpios = <&gpio1 17 GPIO_ACTIVE_LOW>; /* GPIO1-17 is MPP49 */
> > + };
> > + };
> > +
> > + regulators {
> > + compatible = "simple-bus";
> > + #address-cells = <1>;
> > + #size-cells = <0>;
> > + pinctrl-0 = <&pmx_power_socsata>;
> > + pinctrl-names = "default";
> > +
> > + socsata_power: regulator at 1 {
> > + compatible = "regulator-fixed";
> > + reg = <1>;
> > + regulator-name = "SoC SATA Power";
> > + regulator-min-microvolt = <12000000>;
> > + regulator-max-microvolt = <12000000>;
> > + enable-active-high;
> > + regulator-always-on;
> > + regulator-boot-on;
> > + gpio = <&gpio0 28 GPIO_ACTIVE_HIGH>;
> > + };
> > + };
> > +};
> > +
> > +/*
> > + * Serial port routed to connector CN4
> > + *
> > + * pin 1 - TX (CPU's TX)
> > + * pin 4 - RX (CPU's RX)
> > + * pin 6 - GND
> > + */
> > +&uart0 {
> > + status = "okay";
> > +};
> > +
> > +&pinctrl {
> > + pinctrl-0 = <&pmx_button_reset &pmx_button_power>;
> > + pinctrl-names = "default";
> > +
> > + pmx_act_sata0: pmx-act-sata0 {
> > + marvell,pins = "mpp15";
> > + marvell,function = "sata0";
> > + };
> > +
> > + pmx_act_sata1: pmx-act-sata1 {
> > + marvell,pins = "mpp16";
> > + marvell,function = "sata1";
> > + };
> > +
> > + pmx_power_socsata: pmx-power-socsata {
> > + marvell,pins = "mpp28";
> > + marvell,function = "gpio";
> > + };
> > +
> > + pmx_button_reset: pmx-button-reset {
> > + marvell,pins = "mpp29";
> > + marvell,function = "gpio";
> > + };
> > +
> > + pmx_button_power: pmx-button-power {
> > + marvell,pins = "mpp49";
> > + marvell,function = "gpio";
> > + };
> > +};
> > +
> > +&sata {
> > + status = "okay";
> > + nr-ports = <2>;
> > +};
> > +
> > +&pciec {
> > + status = "okay";
> > +};
> > +
> > +&pcie0 {
> > + status = "okay";
> > +};
> > +
> > +&i2c0 {
> > + status = "okay";
> > +
> > + adt7473: thermal at 2e {
> > + compatible = "adi,adt7473";
> > + reg = <0x2e>;
> > + };
> > +};
> > +
> > +&nand {
> > + status = "okay";
> > +};
> > +
> > +&mdio {
> > + status = "okay";
> > +
> > + ethphy0: ethernet-phy at 8 {
> > + reg = <8>;
> > + };
> > + ethphy1: ethernet-phy at 9 {
> > + reg = <9>;
> > + };
> > +};
> > +
> > +ð0 {
> > + status = "okay";
> > +
> > + ethernet0-port at 0 {
> > + phy-handle = <ðphy0>;
> > + };
> > +};
> > +
> > +ð1 {
> > + status = "okay";
> > +
> > + ethernet1-port at 0 {
> > + phy-handle = <ðphy1>;
> > + };
> > +};
> > diff --git a/board/Seagate/nas440/Kconfig b/board/Seagate/nas440/Kconfig
> > new file mode 100644
> > index 0000000000..3f93d75cd4
> > --- /dev/null
> > +++ b/board/Seagate/nas440/Kconfig
> > @@ -0,0 +1,12 @@
> > +if TARGET_NAS440
> > +
> > +config SYS_BOARD
> > + default "nas440"
> > +
> > +config SYS_VENDOR
> > + default "Seagate"
> > +
> > +config SYS_CONFIG_NAME
> > + default "nas440"
> > +
> > +endif
> > diff --git a/board/Seagate/nas440/MAINTAINERS b/board/Seagate/nas440/MAINTAINERS
> > new file mode 100644
> > index 0000000000..dcea1316c5
> > --- /dev/null
> > +++ b/board/Seagate/nas440/MAINTAINERS
> > @@ -0,0 +1,7 @@
> > +NAS440 BOARD
> > +M: Hajo Noerenberg <hajo-uboot at noerenberg.de>
> > +S: Maintained
> > +F: board/Seagate/nas440/
> > +F: include/configs/nas440.h
> > +F: configs/nas440_defconfig
> > +F: arch/arm/dts/kirkwood-blackarmor-nas440.dts
> > diff --git a/board/Seagate/nas440/Makefile b/board/Seagate/nas440/Makefile
> > new file mode 100644
> > index 0000000000..2a3ef746d3
> > --- /dev/null
> > +++ b/board/Seagate/nas440/Makefile
> > @@ -0,0 +1,7 @@
> > +#
> > +# Copyright (C) 2014 Evgeni Dobrev <evgeni at studio-punkt.com>
> > +#
> > +# SPDX-License-Identifier: GPL-2.0+
> > +#
> > +
> > +obj-y := nas440.o
> > diff --git a/board/Seagate/nas440/kwbimage.cfg b/board/Seagate/nas440/kwbimage.cfg
> > new file mode 100644
> > index 0000000000..e71da11694
> > --- /dev/null
> > +++ b/board/Seagate/nas440/kwbimage.cfg
> > @@ -0,0 +1,156 @@
> > +#
> > +# Copyright (C) 2021 Hajo Noerenberg <hajo-uboot at noerenberg.de>
> > +#
> > +# Based on nas220/kwbimage.cfg originally written by
> > +# Evgeni Dobrev <evgeni at studio-punkt.com>
> > +#
> > +# Based on sheevaplug/kwbimage.cfg originally written by
> > +# Prafulla Wadaskar <prafulla at marvell.com>
> > +# (C) Copyright 2009
> > +# Marvell Semiconductor <www.marvell.com>
> > +#
> > +# SPDX-License-Identifier: GPL-2.0+
> > +#
> > +# 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 0x0200
> > +
> > +# 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
> > +
> > +DATA 0xFFD20134 0xBBBBBBBB
> > +DATA 0xFFD20138 0x00BBBBBB
> > +
> > +#Dram initalization for SINGLE x16 CL=5 @ 400MHz
> > +DATA 0xFFD01400 0x43000C30 # DDR Configuration register
> > +# bit13-0: 0xa00 (2560 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 0x39543000 # 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: 8= CL+3, 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)
> > +# 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 0x00000833 # DDR Timing (High)
> > +# bit6-0: TRFC
> > +# bit8-7: TR2R
> > +# bit10-9: TR2W
> > +# bit12-11: TW2W
> > +# bit31-13: zero required
> > +
> > +DATA 0xFFD01410 0x0000000C # DDR Address Control
> > +# bit1-0: 00, Cs0width=x8
> > +# bit3-2: 11, Cs0size=1Gb
> > +# bit5-4: 00, Cs1width=nonexistent
> > +# bit7-6: 00, Cs1size =nonexistent
> > +# 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: 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 0x0000F1FF # DDR Controller Control High
> > +# bit2-0: 111, required
> > +# bit3 : 1 , MBUS Burst Chop disabled
> > +# bit6-4: 111, required
> > +# bit7 : 0
> > +# bit8 : 0
> > +# 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
> > +DATA 0xFFD0147C 0x00008552
> > +
> > +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: 0x07, Size (i.e. 128MB)
> > +
> > +DATA 0xFFD01508 0x00000000 # CS[1]n Base address to 0x0
> > +
> > +DATA 0xFFD0150C 0x00000000 # CS[1]n Size, window disabled
> > +
> > +DATA 0xFFD01514 0x00000000 # CS[2]n Size, window disabled
> > +DATA 0xFFD0151C 0x00000000 # CS[3]n Size, window disabled
> > +
> > +DATA 0xFFD01494 0x003C0000 # 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 0x0000F80F # 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/board/Seagate/nas440/nas440.c b/board/Seagate/nas440/nas440.c
> > new file mode 100644
> > index 0000000000..43a08e61bf
> > --- /dev/null
> > +++ b/board/Seagate/nas440/nas440.c
> > @@ -0,0 +1,378 @@
> > +/*
> > + * Copyright (C) 2022 Hajo Noerenberg <hajo-uboot at noerenberg.de>
> > + *
> > + * Based on nas220.c originally written by
> > + * Evgeni Dobrev <evgeni at studio-punkt.com>
> > + *
> > + * Based on sheevaplug.c originally written by
> > + * Prafulla Wadaskar <prafulla at marvell.com>
> > + * (C) Copyright 2009
> > + * Marvell Semiconductor <www.marvell.com>
> > + *
> > + * SPDX-License-Identifier: GPL-2.0+
> > + */
> > +
> > +#include <common.h>
> > +#include <init.h>
> > +#include <netdev.h>
> > +#include <asm/arch/cpu.h>
> > +#include <asm/arch/soc.h>
> > +#include <asm/arch/mpp.h>
> > +#include <asm/global_data.h>
> > +#include <asm/mach-types.h>
> > +#include <linux/bitops.h>
> > +#include <bootstage.h>
> > +#include <linux/delay.h>
> > +#include <asm/arch/gpio.h>
> > +#include <version.h>
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +/*
> > + * GPIO pin names, input/output direction and default values
> > + *
> > + * NAS440_GPIO_BUTTON_LCD_LOWER, NAS440_GPIO_BUTTON_LCD_UPPER
> > + * Buttons next to LC display, LOW if pressed
> > + *
> > + * NAS440_GPIO_BUTTON_POWER
> > + * Power button at front of case, LOW if pressed
> > + *
> > + * NAS440_GPIO_BUTTON_RESET
> > + * Reset button at back of case, LOW if pressed
> > + *
> > + * NAS440_GPIO_LCD_HD44780_*
> > + * HD44780-compatible LC display, control via 8bit parallel data transfer
> > + *
> > + * NAS440_GPIO_LED_74AHC164_*
> > + * Control front panel LEDs via 74AHC164 8bit shift register
> > + *
> > + * NAS440_GPIO_SOCSATA_POWER
> > + * 12V Power for SoC SATA ports (NAS drives 3 and 4)
> > + *
> > + * NAS440_GPIO_BOARD_POWER
> > + * Shutdown board if LOW
> > + *
> > + */
> > +
> > +#define NAS440_GPIO_LCD_HD44780_BACKLIGHT 7
> > +#define NAS440_GPIO_LED_74AHC164_DATA 12
> > +#define NAS440_GPIO_LED_74AHC164_CLK 13
> > +#define NAS440_GPIO_SOCSATA_POWER 28
> > +#define NAS440_GPIO_BUTTON_RESET 29
> > +#define NAS440_GPIO_BUTTON_LCD_LOWER 34
> > +#define NAS440_GPIO_LCD_HD44780_RS 35
> > +#define NAS440_GPIO_LCD_HD44780_D0 36
> > +#define NAS440_GPIO_LCD_HD44780_D1 37
> > +#define NAS440_GPIO_LCD_HD44780_D2 38
> > +#define NAS440_GPIO_LCD_HD44780_D3 39
> > +#define NAS440_GPIO_LCD_HD44780_D4 40
> > +#define NAS440_GPIO_LCD_HD44780_D5 41
> > +#define NAS440_GPIO_LCD_HD44780_D6 42
> > +#define NAS440_GPIO_LCD_HD44780_D7 43
> > +#define NAS440_GPIO_LCD_HD44780_RW 44
> > +#define NAS440_GPIO_LCD_HD44780_E 45
> > +#define NAS440_GPIO_BUTTON_LCD_UPPER 47
> > +#define NAS440_GPIO_BOARD_POWER 48
> > +#define NAS440_GPIO_BUTTON_POWER 49
> > +
> > +/*
> > + * GPIO output enable, pins 0-31 to LOW, pins 31-49 to HIGH config register
> > + */
> > +#define NAS440_GE_OE_LOW (~(BIT(NAS440_GPIO_LCD_HD44780_BACKLIGHT) \
> > + | BIT(NAS440_GPIO_LED_74AHC164_DATA) \
> > + | BIT(NAS440_GPIO_LED_74AHC164_CLK) \
> > + | BIT(NAS440_GPIO_SOCSATA_POWER)))
> > +#define NAS440_GE_OE_HIGH (~(BIT_MASK(NAS440_GPIO_BOARD_POWER) \
> > + | BIT_MASK(NAS440_GPIO_LCD_HD44780_RS) \
> > + | BIT_MASK(NAS440_GPIO_LCD_HD44780_D0) \
> > + | BIT_MASK(NAS440_GPIO_LCD_HD44780_D1) \
> > + | BIT_MASK(NAS440_GPIO_LCD_HD44780_D2) \
> > + | BIT_MASK(NAS440_GPIO_LCD_HD44780_D3) \
> > + | BIT_MASK(NAS440_GPIO_LCD_HD44780_D4) \
> > + | BIT_MASK(NAS440_GPIO_LCD_HD44780_D5) \
> > + | BIT_MASK(NAS440_GPIO_LCD_HD44780_D6) \
> > + | BIT_MASK(NAS440_GPIO_LCD_HD44780_D7) \
> > + | BIT_MASK(NAS440_GPIO_LCD_HD44780_RW) \
> > + | BIT_MASK(NAS440_GPIO_LCD_HD44780_E)))
> > +
> > +/*
> > + * GPIO output default values
> > + */
> > +#define NAS440_GE_OE_VAL_LOW BIT(NAS440_GPIO_LCD_HD44780_BACKLIGHT)
> > +
> > +#define NAS440_GE_OE_VAL_HIGH BIT_MASK(NAS440_GPIO_BOARD_POWER)
> > +
> > +int board_early_init_f(void)
> > +{
> > + /*
> > + * default gpio configuration
> > + */
> > + mvebu_config_gpio(NAS440_GE_OE_VAL_LOW, NAS440_GE_OE_VAL_HIGH,
> > + NAS440_GE_OE_LOW, NAS440_GE_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, /* NAS440_GPIO_LCD_HD44780_BACKLIGHT */
> > + MPP8_TW_SDA,
> > + MPP9_TW_SCK,
> > + MPP10_UART0_TXD,
> > + MPP11_UART0_RXD,
> > + MPP12_GPO, /* NAS440_GPIO_LED_74AHC164_DATA */
> > + MPP13_GPIO, /* NAS440_GPIO_LED_74AHC164_CLK */
> > + MPP14_SATA1_PRESENTn,
> > + MPP15_SATA0_ACTn,
> > + MPP16_SATA1_ACTn,
> > + MPP17_SATA0_PRESENTn,
> > + MPP18_NF_IO0,
> > + MPP19_NF_IO1,
> > + MPP20_GE1_0, /* GbE Port1, RGMII mode (12 pins GE1_0-7, GE1_10-13) */
> > + MPP21_GE1_1,
> > + MPP22_GE1_2,
> > + MPP23_GE1_3,
> > + MPP24_GE1_4,
> > + MPP25_GE1_5,
> > + MPP26_GE1_6,
> > + MPP27_GE1_7,
> > + MPP28_GPIO, /* NAS440_GPIO_SOCSATA_POWER */
> > + MPP29_GPIO, /* NAS440_GPIO_BUTTON_RESET */
> > + MPP30_GE1_10,
> > + MPP31_GE1_11,
> > + MPP32_GE1_12,
> > + MPP33_GE1_13,
> > + MPP34_GPIO, /* NAS440_GPIO_BUTTON_LCD_LOWER */
> > + MPP35_GPIO, /* NAS440_GPIO_LCD_HD44780_RS */
> > + MPP36_GPIO, /* NAS440_GPIO_LCD_HD44780_D0 */
> > + MPP37_GPIO, /* NAS440_GPIO_LCD_HD44780_D1 */
> > + MPP38_GPIO, /* NAS440_GPIO_LCD_HD44780_D2 */
> > + MPP39_GPIO, /* NAS440_GPIO_LCD_HD44780_D3 */
> > + MPP40_GPIO, /* NAS440_GPIO_LCD_HD44780_D4 */
> > + MPP41_GPIO, /* NAS440_GPIO_LCD_HD44780_D5 */
> > + MPP42_GPIO, /* NAS440_GPIO_LCD_HD44780_D6 */
> > + MPP43_GPIO, /* NAS440_GPIO_LCD_HD44780_D7 */
> > + MPP44_GPIO, /* NAS440_GPIO_LCD_HD44780_RW */
> > + MPP45_GPIO, /* NAS440_GPIO_LCD_HD44780_E */
> > + MPP46_GPIO,
> > + MPP47_GPIO, /* NAS440_GPIO_BUTTON_LCD_UPPER */
> > + MPP48_GPIO, /* NAS440_GPIO_BOARD_POWER */
> > + MPP49_GPIO, /* NAS440_GPIO_BUTTON_POWER */
> > + 0
> > + };
> > + kirkwood_mpp_conf(kwmpp_config, NULL);
> > + return 0;
> > +}
> > +
> > +/* HD44780 pins, data bits first, backlight last */
> > +static int hd44780_pins[12] = {
> > + NAS440_GPIO_LCD_HD44780_D0,
> > + NAS440_GPIO_LCD_HD44780_D1,
> > + NAS440_GPIO_LCD_HD44780_D2,
> > + NAS440_GPIO_LCD_HD44780_D3,
> > + NAS440_GPIO_LCD_HD44780_D4,
> > + NAS440_GPIO_LCD_HD44780_D5,
> > + NAS440_GPIO_LCD_HD44780_D6,
> > + NAS440_GPIO_LCD_HD44780_D7,
> > + NAS440_GPIO_LCD_HD44780_E,
> > + NAS440_GPIO_LCD_HD44780_RW,
> > + NAS440_GPIO_LCD_HD44780_RS,
> > + NAS440_GPIO_LCD_HD44780_BACKLIGHT
> > +};
> > +
> > +#define HD44780_NUM_COL 16
> > +#define HD44780_BUF_COL 40
> > +#define HD44780_NUM_ROW 2
> > +
> > +#define HD44780_PIN_NUM (sizeof(hd44780_pins)/sizeof(int))
> > +
> > +/*
> > + * HD44780 LCD display commands - adapted from hd44780.h by Joerg Wunsch
> > + *
> > + * ----------------------------------------------------------------------------
> > + * "THE BEER-WARE LICENSE" (Revision 42):
> > + * <joerg at FreeBSD.ORG> wrote this file. As long as you retain this notice you
> > + * can do whatever you want with this stuff. If we meet some day, and you think
> > + * this stuff is worth it, you can buy me a beer in return. Joerg Wunsch
> > + * ----------------------------------------------------------------------------
> > + */
> > +
> > +#define HD44780_CMD_CLR \
> > + 0x01
> > +#define HD44780_CMD_HOME \
> > + 0x02
> > +#define HD44780_CMD_ENTMODE(inc, shift) \
> > + (0x04 | ((inc)? 0x02: 0) | ((shift)? 1: 0))
> > +#define HD44780_CMD_DISPCTL(disp, cursor, blink) \
> > + (0x08 | ((disp)? 0x04: 0) | ((cursor)? 0x02: 0) | ((blink)? 1: 0))
> > +#define HD44780_CMD_SHIFT(shift, right) \
> > + (0x10 | ((shift)? 0x08: 0) | ((right)? 0x04: 0))
> > +#define HD44780_CMD_FNSET(if8bit, twoline, font5x10) \
> > + (0x20 | ((if8bit)? 0x10: 0) | ((twoline)? 0x08: 0) | \
> > + ((font5x10)? 0x04: 0))
> > +#define HD44780_CMD_CGADDR(addr) \
> > + (0x40 | ((addr) & 0x3f))
> > +#define HD44780_CMD_DDADDR(addr) \
> > + (0x80 | ((addr) & 0x7f))
> > +
> > +static void lcd_send(unsigned int val, int mode)
> > +{
> > + udelay(1);
> > + kw_gpio_set_value(NAS440_GPIO_LCD_HD44780_RS, mode);
> > + udelay(1);
> > +
> > + kw_gpio_set_value(NAS440_GPIO_LCD_HD44780_E, 0);
> > + for (int i=0; i<8; i++) {
> > + kw_gpio_set_value(hd44780_pins[i], (val&(1<<i))>>i );
> > + }
> > + udelay(1);
> > + kw_gpio_set_value(NAS440_GPIO_LCD_HD44780_E, 1);
> > + udelay(1);
> > + kw_gpio_set_value(NAS440_GPIO_LCD_HD44780_E, 0);
> > + udelay(50);
> > +}
> > +
> > +void lcd_init(void)
> > +{
> > + for (int i=0; i<HD44780_PIN_NUM; i++) {
> > + kw_gpio_set_valid(hd44780_pins[i], GPIO_OUTPUT_OK);
> > + kw_gpio_direction_output(hd44780_pins[i], i == (HD44780_PIN_NUM-1));
> > + }
> > +
> > + lcd_send(HD44780_CMD_FNSET(1, 1, 0), 0);
> > + udelay(50);
> > + lcd_send(HD44780_CMD_FNSET(1, 1, 0), 0);
> > + udelay(50);
> > + lcd_send(HD44780_CMD_FNSET(1, 1, 0), 0);
> > + udelay(50);
> > + lcd_send(HD44780_CMD_DISPCTL(1, 0, 0), 0);
> > + udelay(50);
> > + lcd_send(HD44780_CMD_CLR, 0);
> > + udelay(50);
> > + lcd_send(HD44780_CMD_ENTMODE(1, 0), 0);
> > +
> > + udelay(2000);
> > +}
> > +
> > +void lcd_row(int row, char *buf)
> > +{
> > + int p = 0;
> > +
> > + if (row >= HD44780_NUM_ROW) {
> > + return;
> > + }
> > +
> > + lcd_send(HD44780_CMD_DDADDR(HD44780_BUF_COL * row + 0), 0);
> > + for (int i=0; i<HD44780_NUM_COL; i++) {
> > + if (buf[i] == 0) {
> > + p++;
> > + }
> > + lcd_send(p ? 32 : buf[i], 1);
> > + }
> > +}
> > +
> > +enum led_disk {
> > + LED_DSK_OFF,
> > + LED_DSK_RED
> > + /* LED_DSK_GREEN disk activity led is controlled directly by the hardware */
> > +};
> > +
> > +enum led_system {
> > + LED_SYS_OFF,
> > + LED_SYS_BLUE,
> > + LED_SYS_RED
> > +};
> > +
> > +void led_init(void)
> > +{
> > + kw_gpio_set_valid(NAS440_GPIO_LED_74AHC164_DATA, GPIO_OUTPUT_OK);
> > + kw_gpio_direction_output(NAS440_GPIO_LED_74AHC164_DATA, 0);
> > + kw_gpio_set_valid(NAS440_GPIO_LED_74AHC164_CLK, GPIO_OUTPUT_OK);
> > + kw_gpio_direction_output(NAS440_GPIO_LED_74AHC164_CLK, 0);
> > +}
> > +
> > +void led_set(enum led_disk disk1, enum led_disk disk2, enum led_disk disk3,
> > + enum led_disk disk4, enum led_system front1 )
> > +{
> > + int ledbits = (0x81 | ((front1==LED_SYS_RED)? 0x08 : 0) | ((front1==LED_SYS_BLUE)? 0x04 : 0) \
> > + | ((disk1==LED_DSK_RED)? 0 : 0x02) | ((disk2==LED_DSK_RED)? 0 : 0x40) \
> > + | ((disk3==LED_DSK_RED)? 0 : 0x20) | ((disk4==LED_DSK_RED)? 0 : 0x10));
> > +
> > + for (int i=0; i<8; i++) {
> > + kw_gpio_set_value(NAS440_GPIO_LED_74AHC164_DATA, (ledbits >> i) & 1);
> > + udelay(1);
> > + kw_gpio_set_value(NAS440_GPIO_LED_74AHC164_CLK, 1);
> > + kw_gpio_set_value(NAS440_GPIO_LED_74AHC164_CLK, 0);
> > + }
> > +}
> > +
> > +/* factory firmware delays hard disk spinup, presumably to avoid power peaks */
> > +void delay_hdd_spinup(void)
> > +{
> > + lcd_row(1, "Delay HDD spinup");
> > +
> > + for (int i = 0; i<2500; i++) {
> > + udelay(1000);
> > + }
> > +
> > + kw_gpio_set_valid(NAS440_GPIO_SOCSATA_POWER, GPIO_OUTPUT_OK);
> > + kw_gpio_direction_output(NAS440_GPIO_SOCSATA_POWER, 1);
> > +}
> > +
> > +#if CONFIG_IS_ENABLED(BOOTSTAGE)
> > +void show_boot_progress(int val)
> > +{
> > + switch (val) {
> > +/* 0123456789abcdef */
> > + case BOOTSTAGE_ID_BOARD_INIT_DONE:
> > + lcd_row(1, "Board init done");
> > + break;
> > + case BOOTSTAGE_ID_USB_START:
> > + lcd_row(1, "Init USB");
> > + break;
> > + case BOOTSTAGE_ID_ETH_START:
> > + lcd_row(1, "Init ethernet");
> > + break;
> > + case BOOTSTAGE_ID_MAIN_LOOP:
> > + lcd_row(1, "Wait for input");
> > + break;
> > + case BOOTSTAGE_ID_RUN_OS:
> > + lcd_row(1, "Starting Linux");
> > + break;
> > + default:
> > + if (val < 0) /* error */
> > + lcd_row(1, "Error");
> > + break;
> > + }
> > +}
> > +#endif
> > +
> > +int board_eth_init(struct bd_info *bis)
> > +{
> > + return cpu_eth_init(bis);
> > +}
> > +
> > +int board_init(void)
> > +{
> > + /*
> > + * arch number of board
> > + */
> > + gd->bd->bi_arch_number = MACH_TYPE_DB88F6281_BP;
> > +
> > + /* adress of boot parameters */
> > + gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
> > +
> > + led_init();
> > + led_set(LED_DSK_OFF, LED_DSK_OFF, LED_DSK_OFF, LED_DSK_OFF, LED_SYS_BLUE);
> > +
> > + lcd_init();
> > + lcd_row(0, U_BOOT_VERSION "");
> > +
> > + delay_hdd_spinup();
> > +
> > + return 0;
> > +}
> > diff --git a/configs/nas440_defconfig b/configs/nas440_defconfig
> > new file mode 100644
> > index 0000000000..74faf1a24b
> > --- /dev/null
> > +++ b/configs/nas440_defconfig
> > @@ -0,0 +1,89 @@
> > +CONFIG_ARM=y
> > +CONFIG_SKIP_LOWLEVEL_INIT=y
> > +CONFIG_SYS_DCACHE_OFF=y
> > +CONFIG_ARCH_CPU_INIT=y
> > +CONFIG_ARCH_KIRKWOOD=y
> > +CONFIG_SUPPORT_PASSING_ATAGS=y
> > +CONFIG_CMDLINE_TAG=y
> > +CONFIG_INITRD_TAG=y
> > +CONFIG_SYS_KWD_CONFIG="board/Seagate/nas440/kwbimage.cfg"
> > +CONFIG_SYS_TEXT_BASE=0x600000
> > +CONFIG_NR_DRAM_BANKS=2
> > +CONFIG_TARGET_NAS440=y
> > +CONFIG_ENV_SIZE=0x10000
> > +CONFIG_ENV_OFFSET=0xA0000
> > +CONFIG_DEFAULT_DEVICE_TREE="kirkwood-blackarmor-nas440"
> > +CONFIG_IDENT_STRING="\nNAS 440"
> > +# CONFIG_SYS_MALLOC_F is not set
> > +CONFIG_SYS_LOAD_ADDR=0x800000
> > +CONFIG_SHOW_BOOT_PROGRESS=y
> > +CONFIG_BOOTSTAGE=y
> > +CONFIG_BOOTDELAY=3
> > +CONFIG_USE_PREBOOT=y
> > +CONFIG_PREBOOT="pci enum; "
> > +# CONFIG_DISPLAY_BOARDINFO is not set
> > +CONFIG_HUSH_PARSER=y
> > +CONFIG_SYS_PROMPT="nas440> "
> > +# CONFIG_CMD_FLASH is not set
> > +CONFIG_CMD_SATA=y
> > +CONFIG_CMD_PCI=y
> > +CONFIG_CMD_DM=y
> > +CONFIG_CMD_SCSI=y
> > +CONFIG_CMD_NAND=y
> > +CONFIG_CMD_USB=y
> > +# CONFIG_CMD_SETEXPR is not set
> > +CONFIG_CMD_DHCP=y
> > +CONFIG_CMD_MII=y
> > +CONFIG_CMD_PING=y
> > +CONFIG_CMD_EXT2=y
> > +CONFIG_CMD_EXT4=y
> > +CONFIG_CMD_FAT=y
> > +CONFIG_CMD_JFFS2=y
> > +CONFIG_CMD_MTDPARTS=y
> > +CONFIG_MTDPARTS_DEFAULT="mtdparts=orion_nand:0xa0000 at 0x0(uboot),0x010000 at 0xa0000(env),0x500000 at 0xc0000(uimage),0x1a40000 at 0x5c0000(rootfs)"
> > +CONFIG_CMD_UBI=y
> > +CONFIG_ISO_PARTITION=y
> > +CONFIG_EFI_PARTITION=y
> > +# CONFIG_PARTITION_UUIDS is not set
> > +CONFIG_OF_CONTROL=y
> > +CONFIG_ENV_OVERWRITE=y
> > +CONFIG_ENV_IS_IN_NAND=y
> > +CONFIG_SYS_RELOC_GD_ENV_ADDR=y
> > +CONFIG_NETCONSOLE=y
> > +CONFIG_DM=y
> > +CONFIG_SYS_ATA_STRIDE=4
> > +CONFIG_SYS_ATA_DATA_OFFSET=0x100
> > +CONFIG_SYS_ATA_REG_OFFSET=0x100
> > +CONFIG_SYS_ATA_ALT_OFFSET=0x100
> > +CONFIG_KIRKWOOD_GPIO=y
> > +CONFIG_MVEBU_GPIO=y
> > +CONFIG_GPIO_EXTRA_HEADER=y
> > +CONFIG_DM_GPIO=y
> > +CONFIG_CMD_GPIO=y
> > +CONFIG_GPIO=y
> > +CONFIG_DM_GPIO_LOOKUP_LABEL=y
> > +# CONFIG_MMC is not set
> > +CONFIG_MTD=y
> > +CONFIG_MTD_RAW_NAND=y
> > +CONFIG_PHY_MARVELL=y
> > +CONFIG_DM_ETH=y
> > +CONFIG_MVGBE=y
> > +CONFIG_MII=y
> > +CONFIG_SATA_MV=y
> > +CONFIG_SYS_SATA_MAX_DEVICE=2
> > +CONFIG_DM_RTC=y
> > +CONFIG_RTC_MV=y
> > +CONFIG_SYS_NS16550=y
> > +CONFIG_USB=y
> > +CONFIG_DM_USB=y
> > +CONFIG_USB_EHCI_HCD=y
> > +CONFIG_USB_STORAGE=y
> > +
> > +CONFIG_PCI=y
> > +CONFIG_DM_PCI_COMPAT=y
> > +CONFIG_PCI_MVEBU=y
> > +CONFIG_AHCI_PCI=y
> > +
> > +CONFIG_SCSI=y
> > +CONFIG_SCSI_AHCI=y
> > +CONFIG_DM_SCSI=y
> > diff --git a/drivers/ata/ahci-pci.c b/drivers/ata/ahci-pci.c
> > index b1d231e0f9..af7e97dc4a 100644
> > --- a/drivers/ata/ahci-pci.c
> > +++ b/drivers/ata/ahci-pci.c
> > @@ -38,6 +38,7 @@ U_BOOT_DRIVER(ahci_pci) = {
> > static struct pci_device_id ahci_pci_supported[] = {
> > { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_SATA_AHCI, ~0) },
> > { PCI_DEVICE(0x1b21, 0x0611) },
> > + { PCI_DEVICE(0x11ab, 0x6121) },
> > {},
> > };
> >
> > diff --git a/include/configs/nas440.h b/include/configs/nas440.h
> > new file mode 100644
> > index 0000000000..58e6afb2c3
> > --- /dev/null
> > +++ b/include/configs/nas440.h
> > @@ -0,0 +1,50 @@
> > +/*
> > + * Copyright (C) 2022 Hajo Noerenberg <hajo-uboot at noerenberg.de>
> > + *
> > + * based on work from:
> > + * (C) Copyright 2009
> > + * Marvell Semiconductor <www.marvell.com>
> > + * Written-by: Prafulla Wadaskar <prafulla at marvell.com>
> > + *
> > + * SPDX-License-Identifier: GPL-2.0+
> > + */
> > +
> > +#ifndef _CONFIG_NAS440_H
> > +#define _CONFIG_NAS440_H
> > +
> > +/*
> > + * mv-common.h should be defined after CMD configs since it used them
> > + * to enable certain macros
> > + */
> > +
> > +#include "mv-common.h"
> > +
> > +/*
> > + * Default environment variables
> > + */
> > +
> > +#define CONFIG_EXTRA_ENV_SETTINGS \
> > + "bootargs=console=ttyS0,115200\0" \
> > + "mtdids=nand0=orion_nand\0"\
> > + "mtdparts=" CONFIG_MTDPARTS_DEFAULT \
> > + "autostart=no\0"\
> > + "autoload=no\0"
> > +
> > +/*
> > + * Ethernet Driver configuration
> > + */
> > +#ifdef CONFIG_MVGBE
> > +#define CONFIG_MVGBE_PORTS {1, 1} /* enable both ports */
> > +#define CONFIG_PHY_BASE_ADR 8
> > +#ifdef CONFIG_RESET_PHY_R
> > +#undef CONFIG_RESET_PHY_R /* remove legacy reset_phy() */
> > +#endif
> > +#endif /* CONFIG_MVGBE */
> > +
> > +/*
> > + * SATA driver configuration
> > + */
> > +#define CONFIG_LBA48
> > +#define CONFIG_SYS_64BIT_LBA
> > +
> > +#endif /* _CONFIG_NAS440_H */
> > --
> > 2.20.1
> >
More information about the U-Boot
mailing list