Signed-off-by: Albert Aribaud <albert.arib...@free.fr> --- This patch: - adds support in libata for the orion5x MVSATAHC controller; - enables orion5x MVSTAHC port 1 on the edmini board; - adds IDE and EXT2 commands to the edminiv2 command set.
arch/arm/include/asm/arch-orion5x/orion5x.h | 20 ++++++++++++++- board/LaCie/edminiv2/config.mk | 6 ++++- board/LaCie/edminiv2/edminiv2.c | 22 +++++++++++++++++ common/cmd_ide.c | 14 +++++++--- include/configs/edminiv2.h | 35 +++++++++++++++++++++++++- 5 files changed, 88 insertions(+), 9 deletions(-) diff --git a/arch/arm/include/asm/arch-orion5x/orion5x.h b/arch/arm/include/asm/arch-orion5x/orion5x.h index 4008c84..2724a70 100644 --- a/arch/arm/include/asm/arch-orion5x/orion5x.h +++ b/arch/arm/include/asm/arch-orion5x/orion5x.h @@ -38,7 +38,7 @@ #if defined(CONFIG_FEROCEON) #include <asm/arch/cpu.h> -/* SOC specific definations */ +/* SOC specific definitions */ #define ORION5X_REGISTER(x) (ORION5X_REGS_PHY_BASE + x) /* Documented registers */ @@ -54,7 +54,23 @@ #define ORION5X_REG_PCIE_BASE (ORION5X_REGISTER(0x40000)) #define ORION5X_USB20_PORT0_BASE (ORION5X_REGISTER(0x50000)) #define ORION5X_USB20_PORT1_BASE (ORION5X_REGISTER(0xA0000)) -#define ORION5X_EGIGA_BASE (ORION5X_REGISTER(0x72000)) +#define ORION5X_SATA_BASE (ORION5X_REGISTER(0x80000)) +#define ORION5X_SATA_PORT0_OFFSET 0x2000 +#define ORION5X_SATA_PORT1_OFFSET 0x4000 + +/* + * SATA definitions needed for controller initialization + */ +/* SControl register address */ +#define ORION5X_SATA_PORT1_SCONTROL_REG \ + (ORION5X_SATA_BASE+ORION5X_SATA_PORT1_OFFSET+0x308) +/* Mask and values for device DETection and link initialization */ +#define ORION5X_SATA_SCONTROL_DET_MASK 0x0000000F +#define ORION5X_SATA_SCONTROL_DET_NONE 0x00000000 +#define ORION5X_SATA_SCONTROL_DET_INIT 0x00000001 +/* Mask and values for device Interface Power Management */ +#define ORION5X_SATA_SCONTROL_IMP_MASK 0x00000F00 +#define ORION5X_SATA_SCONTROL_IMP_NO_LP_ALLOWED 0x00000300 #define CONFIG_MAX_RAM_BANK_SIZE (64*1024*1024) diff --git a/board/LaCie/edminiv2/config.mk b/board/LaCie/edminiv2/config.mk index 3dec1aa..1606cca 100644 --- a/board/LaCie/edminiv2/config.mk +++ b/board/LaCie/edminiv2/config.mk @@ -24,4 +24,8 @@ # MA 02110-1301 USA # -TEXT_BASE = 0x00100000 +# As the Linux kernel will load from 00008000 up and we cannot tell +# how big it can be, let U-Boot run in the topmost megabyte of the +# ED Mini V2 64 megabyte DRAM. + +TEXT_BASE = 0x03F00000 diff --git a/board/LaCie/edminiv2/edminiv2.c b/board/LaCie/edminiv2/edminiv2.c index 54c0ffe..6b4f0e5 100644 --- a/board/LaCie/edminiv2/edminiv2.c +++ b/board/LaCie/edminiv2/edminiv2.c @@ -80,13 +80,35 @@ ulong board_flash_get_legacy(ulong base, int banknum, flash_info_t *info) } #endif /* CONFIG_SYS_FLASH_CFI */ +/* ED Mini V2 uses SATA PORT1. Initialize this port and disable + * disable low power on it + */ + /* mask for isolating IPM and DET fields in SControl register */ +#define EDMINIV2_SCONTROL_MASK (ORION5X_SATA_SCONTROL_DET_MASK \ + || ORION5X_SATA_SCONTROL_IMP_MASK) +/* IPM and DET values for initializing link */ +#define EDMINIV2_PORT_INIT (ORION5X_SATA_SCONTROL_DET_INIT \ + || ORION5X_SATA_SCONTROL_IMP_NO_LP_ALLOWED) +/* IPM and DET values to use link once initialized */ +#define EDMINIV2_PORT_USE (ORION5X_SATA_SCONTROL_DET_NONE \ + || ORION5X_SATA_SCONTROL_IMP_NO_LP_ALLOWED) + int board_init(void) { + u32 reg; + /* arch number of board */ gd->bd->bi_arch_number = MACH_TYPE_EDMINI_V2; /* boot parameter start at 256th byte of RAM base */ gd->bd->bi_boot_params = gd->bd->bi_dram[0].start + 0x100; + /* reset port 1 of SATAHC controller */ + reg = readl(ORION5X_SATA_PORT1_SCONTROL_REG); + reg = (reg & ~EDMINIV2_SCONTROL_MASK) | EDMINIV2_PORT_INIT; + writel(reg, ORION5X_SATA_PORT1_SCONTROL_REG); + reg = (reg & ~EDMINIV2_SCONTROL_MASK) | EDMINIV2_PORT_USE; + writel(reg, ORION5X_SATA_PORT1_SCONTROL_REG); + return 0; } diff --git a/common/cmd_ide.c b/common/cmd_ide.c index 8bd8920..08ebbf6 100644 --- a/common/cmd_ide.c +++ b/common/cmd_ide.c @@ -45,6 +45,10 @@ #include <mpc5xxx.h> #endif +#ifdef CONFIG_ORION5X +#include <asm/arch/orion5x.h> +#endif + #include <ide.h> #include <ata.h> @@ -854,7 +858,8 @@ input_swap_data(int dev, ulong *sect_buf, int words) #endif /* __LITTLE_ENDIAN || CONFIG_AU1X00 */ -#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA) || defined(CONFIG_SH) +#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA) || defined(CONFIG_SH) \ + || defined(__ARM__) static void output_data(int dev, ulong *sect_buf, int words) { @@ -906,7 +911,8 @@ output_data(int dev, ulong *sect_buf, int words) } #endif /* __PPC__ */ -#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA) || defined(CONFIG_SH) +#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA) || defined(CONFIG_SH) \ + || defined(__ARM__) static void input_data(int dev, ulong *sect_buf, int words) { @@ -1580,7 +1586,7 @@ int ide_device_present(int dev) * ATAPI Support */ -#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA) +#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA) || defined(__ARM__) /* since ATAPI may use commands with not 4 bytes alligned length * we have our own transfer functions, 2 bytes alligned */ static void @@ -1618,7 +1624,7 @@ output_data_shorts(int dev, ushort *sect_buf, int shorts) static void input_data_shorts(int dev, ushort *sect_buf, int shorts) { -#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45) +#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45) || defined(__ARM__) uchar *dbuf; volatile uchar *pbuf_even; volatile uchar *pbuf_odd; diff --git a/include/configs/edminiv2.h b/include/configs/edminiv2.h index c3d95a0..923cca9 100644 --- a/include/configs/edminiv2.h +++ b/include/configs/edminiv2.h @@ -52,6 +52,12 @@ #define CONFIG_SYS_HZ 1000 /* + * __io is necessary for cmd_ide to compile + */ + +#define __io + +/* * Board-specific values for Orion5x MPP low level init: * - MPPs 12 to 15 are SATA LEDs (mode 5) * - Others are GPIO/unused (mode 3 for MPP0, mode 5 for @@ -60,7 +66,7 @@ #define ORION5X_MPP0_7 0x00000003 #define ORION5X_MPP8_15 0x55550000 -#define ORION5X_MPP16_23 0x00000000 +#define ORION5X_MPP16_23 0x00005555 /* * Board-specific values for Orion5x GPIO low level init: @@ -74,7 +80,6 @@ */ #define ORION5X_GPIO_OUT_ENABLE 0x03fcffff -#define ORION5X_GPIO_OUT_VALUE 0x03fcffff /* * NS16550 Configuration @@ -131,6 +136,7 @@ * Commands configuration - using default command set for now */ #include <config_cmd_default.h> + /* * Disabling some default commands for staggered bring-up */ @@ -139,6 +145,25 @@ #undef CONFIG_CMD_NFS /* no NFS since no net */ /* + * ED Mini has a connector for SATA Port 1 + */ + +#define CONFIG_CMD_IDE +#define CONFIG_DOS_PARTITION +#define CONFIG_CMD_EXT2 + +#define CONFIG_LIBATA +#define CONFIG_SYS_IDE_MAXBUS 1 +#define CONFIG_SYS_IDE_MAXDEVICE 1 +#define CONFIG_SYS_ATA_BASE_ADDR ORION5X_SATA_BASE +#define CONFIG_SYS_ATA_IDE0_OFFSET ORION5X_SATA_PORT1_OFFSET +#define CONFIG_SYS_ATA_DATA_OFFSET (0x0100) +#define CONFIG_SYS_ATA_REG_OFFSET (0x0100) +#define CONFIG_SYS_ATA_ALT_OFFSET (0x0100) +#define CONFIG_SYS_ATA_STRIDE 4 +#define CONFIG_LBA48 + +/* * Environment variables configurations */ #define CONFIG_ENV_IS_IN_FLASH 1 @@ -169,4 +194,10 @@ #define CONFIG_SYS_RESET_ADDRESS 0xffff0000 #define CONFIG_SYS_MAXARGS 16 +/* Debugging features */ + +/* #define the following if u-boot will boot from RAM */ +/* #undef it if u-boot will boot from FLASH */ +#undef CONFIG_SKIP_LOWLEVEL_INIT /* disable board lowlevel_init */ + #endif /* _CONFIG_EDMINIV2_H */ -- 1.6.4.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot