* [U-Boot] [PATCH 0/5] introduce sata stop
@ 2014-11-21 10:47 Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 1/5] arm: mx6: introduce disable_sata_clock Nikita Kiryanov
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Nikita Kiryanov @ 2014-11-21 10:47 UTC (permalink / raw)
To: u-boot
This series adds the sata stop command, which includes both cmd_sata code and
driver support for resetting sata.
A non-dummy reset_sata() is provided for dwc_ahsata, and a non-default
sata_stop() is provided for cm_fx6.
Finally, we use the new functionality to turn off sata on boot for mx6 devices.
Cc: Stefano Babic <sbabic@denx.de>
Cc: Simon Glass <sjg@chromium.org>
Nikita Kiryanov (5):
arm: mx6: introduce disable_sata_clock
sata: implement reset_sata for dwc_ahsata
cmd_sata: implement sata stop command
arm: mx6: cm_fx6: implement board specific sata stop
arm: imx: stop sata on boot
arch/arm/cpu/armv7/mx6/clock.c | 8 ++++++++
arch/arm/cpu/armv7/omap-common/sata.c | 5 +++++
arch/arm/imx-common/cpu.c | 8 ++++++--
arch/arm/include/asm/arch-mx6/clock.h | 1 +
board/compulab/cm_fx6/cm_fx6.c | 12 +++++++++---
common/cmd_sata.c | 24 +++++++++++++++++++++++-
drivers/block/ata_piix.c | 5 +++++
drivers/block/dwc_ahsata.c | 21 +++++++++++++++++++++
drivers/block/fsl_sata.c | 5 +++++
drivers/block/pata_bfin.c | 5 +++++
drivers/block/sata_dwc.c | 5 +++++
drivers/block/sata_sil.c | 5 +++++
drivers/block/sata_sil3114.c | 5 +++++
include/sata.h | 3 +++
14 files changed, 106 insertions(+), 6 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [U-Boot] [PATCH 1/5] arm: mx6: introduce disable_sata_clock
2014-11-21 10:47 [U-Boot] [PATCH 0/5] introduce sata stop Nikita Kiryanov
@ 2014-11-21 10:47 ` Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 2/5] sata: implement reset_sata for dwc_ahsata Nikita Kiryanov
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Nikita Kiryanov @ 2014-11-21 10:47 UTC (permalink / raw)
To: u-boot
Implement disable_sata_clock for mx6 SoCs.
Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
Cc: Stefano Babic <sbabic@denx.de>
---
arch/arm/cpu/armv7/mx6/clock.c | 8 ++++++++
arch/arm/include/asm/arch-mx6/clock.h | 1 +
2 files changed, 9 insertions(+)
diff --git a/arch/arm/cpu/armv7/mx6/clock.c b/arch/arm/cpu/armv7/mx6/clock.c
index 6c9c78c..3274a5e 100644
--- a/arch/arm/cpu/armv7/mx6/clock.c
+++ b/arch/arm/cpu/armv7/mx6/clock.c
@@ -596,6 +596,14 @@ int enable_sata_clock(void)
ungate_sata_clock();
return enable_enet_pll(BM_ANADIG_PLL_ENET_ENABLE_SATA);
}
+
+void disable_sata_clock(void)
+{
+ struct mxc_ccm_reg *const imx_ccm =
+ (struct mxc_ccm_reg *)CCM_BASE_ADDR;
+
+ clrbits_le32(&imx_ccm->CCGR5, MXC_CCM_CCGR5_SATA_MASK);
+}
#endif
int enable_pcie_clock(void)
diff --git a/arch/arm/include/asm/arch-mx6/clock.h b/arch/arm/include/asm/arch-mx6/clock.h
index 3c58a0a..ff505ab 100644
--- a/arch/arm/include/asm/arch-mx6/clock.h
+++ b/arch/arm/include/asm/arch-mx6/clock.h
@@ -60,6 +60,7 @@ void enable_uart_clk(unsigned char enable);
int enable_cspi_clock(unsigned char enable, unsigned spi_num);
int enable_usdhc_clk(unsigned char enable, unsigned bus_num);
int enable_sata_clock(void);
+void disable_sata_clock(void);
int enable_pcie_clock(void);
int enable_i2c_clk(unsigned char enable, unsigned i2c_num);
int enable_spi_clk(unsigned char enable, unsigned spi_num);
--
1.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [U-Boot] [PATCH 2/5] sata: implement reset_sata for dwc_ahsata
2014-11-21 10:47 [U-Boot] [PATCH 0/5] introduce sata stop Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 1/5] arm: mx6: introduce disable_sata_clock Nikita Kiryanov
@ 2014-11-21 10:47 ` Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 3/5] cmd_sata: implement sata stop command Nikita Kiryanov
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Nikita Kiryanov @ 2014-11-21 10:47 UTC (permalink / raw)
To: u-boot
Add reset_sata() to the sata driver interface and implement it
for dwc_ahsata. This function cleans up after sata_init(), and
therefore accepts a device number like sata_init() does.
A dummy implementation is provided for the rest of the drivers.
Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
Cc: Simon Glass <sjg@chromium.org>
Cc: Stefano Babic <sbabic@denx.de>
---
arch/arm/cpu/armv7/omap-common/sata.c | 5 +++++
drivers/block/ata_piix.c | 5 +++++
drivers/block/dwc_ahsata.c | 21 +++++++++++++++++++++
drivers/block/fsl_sata.c | 5 +++++
drivers/block/pata_bfin.c | 5 +++++
drivers/block/sata_dwc.c | 5 +++++
drivers/block/sata_sil.c | 5 +++++
drivers/block/sata_sil3114.c | 5 +++++
include/sata.h | 1 +
9 files changed, 57 insertions(+)
diff --git a/arch/arm/cpu/armv7/omap-common/sata.c b/arch/arm/cpu/armv7/omap-common/sata.c
index 3b4dd3f..a24baa1 100644
--- a/arch/arm/cpu/armv7/omap-common/sata.c
+++ b/arch/arm/cpu/armv7/omap-common/sata.c
@@ -74,6 +74,11 @@ int init_sata(int dev)
return ret;
}
+int reset_sata(int dev)
+{
+ return 0;
+}
+
/* On OMAP platforms SATA provides the SCSI subsystem */
void scsi_init(void)
{
diff --git a/drivers/block/ata_piix.c b/drivers/block/ata_piix.c
index 5cf91ad..3042684 100644
--- a/drivers/block/ata_piix.c
+++ b/drivers/block/ata_piix.c
@@ -192,6 +192,11 @@ int init_sata(int dev)
return 0;
}
+int reset_sata(int dev)
+{
+ return 0;
+}
+
static inline u8 sata_inb(unsigned long ioaddr)
{
return inb(ioaddr);
diff --git a/drivers/block/dwc_ahsata.c b/drivers/block/dwc_ahsata.c
index c68fd2f..9a2b547 100644
--- a/drivers/block/dwc_ahsata.c
+++ b/drivers/block/dwc_ahsata.c
@@ -592,6 +592,27 @@ int init_sata(int dev)
return 0;
}
+int reset_sata(int dev)
+{
+ struct ahci_probe_ent *probe_ent =
+ (struct ahci_probe_ent *)sata_dev_desc[dev].priv;
+ struct sata_host_regs *host_mmio =
+ (struct sata_host_regs *)probe_ent->mmio_base;
+
+ if (dev < 0 || dev > (CONFIG_SYS_SATA_MAX_DEVICE - 1)) {
+ printf("The sata index %d is out of ranges\n\r", dev);
+ return -1;
+ }
+
+ setbits_le32(&host_mmio->ghc, SATA_HOST_GHC_HR);
+ while (readl(&host_mmio->ghc) & SATA_HOST_GHC_HR)
+ udelay(100);
+
+ disable_sata_clock();
+
+ return 0;
+}
+
static void dwc_ahsata_print_info(int dev)
{
block_dev_desc_t *pdev = &(sata_dev_desc[dev]);
diff --git a/drivers/block/fsl_sata.c b/drivers/block/fsl_sata.c
index ebd6261..71d7cec 100644
--- a/drivers/block/fsl_sata.c
+++ b/drivers/block/fsl_sata.c
@@ -255,6 +255,11 @@ int init_sata(int dev)
return 0;
}
+int reset_sata(int dev)
+{
+ return 0;
+}
+
static void fsl_sata_dump_regs(fsl_sata_reg_t __iomem *reg)
{
printf("\n\rSATA: %08x\n\r", (u32)reg);
diff --git a/drivers/block/pata_bfin.c b/drivers/block/pata_bfin.c
index b7fd1cd..c2673bd 100644
--- a/drivers/block/pata_bfin.c
+++ b/drivers/block/pata_bfin.c
@@ -1009,6 +1009,11 @@ int init_sata(int dev)
return res;
}
+int reset_sata(int dev)
+{
+ return 0;
+}
+
/* Read up to 255 sectors
*
* Returns sectors read
diff --git a/drivers/block/sata_dwc.c b/drivers/block/sata_dwc.c
index efca5ea..9e8b067 100644
--- a/drivers/block/sata_dwc.c
+++ b/drivers/block/sata_dwc.c
@@ -423,6 +423,11 @@ int init_sata(int dev)
return rc;
}
+int reset_sata(int dev)
+{
+ return 0;
+}
+
static u8 ata_check_altstatus(struct ata_port *ap)
{
u8 val = 0;
diff --git a/drivers/block/sata_sil.c b/drivers/block/sata_sil.c
index 1f510cd..ea7d76a 100644
--- a/drivers/block/sata_sil.c
+++ b/drivers/block/sata_sil.c
@@ -571,6 +571,11 @@ int init_sata(int dev)
return 0;
}
+int reset_sata(int dev)
+{
+ return 0;
+}
+
/*
* SATA interface between low level driver and command layer
*/
diff --git a/drivers/block/sata_sil3114.c b/drivers/block/sata_sil3114.c
index 3aa6fc9..61ffb66 100644
--- a/drivers/block/sata_sil3114.c
+++ b/drivers/block/sata_sil3114.c
@@ -702,6 +702,11 @@ int init_sata (int dev)
return res;
}
+int reset_sata(int dev)
+{
+ return 0;
+}
+
/* Check if device is connected to port */
int sata_bus_probe (int portno)
{
diff --git a/include/sata.h b/include/sata.h
index 38f4b4a..c2bbe1a 100644
--- a/include/sata.h
+++ b/include/sata.h
@@ -3,6 +3,7 @@
#include <part.h>
int init_sata(int dev);
+int reset_sata(int dev);
int scan_sata(int dev);
ulong sata_read(int dev, ulong blknr, lbaint_t blkcnt, void *buffer);
ulong sata_write(int dev, ulong blknr, lbaint_t blkcnt, const void *buffer);
--
1.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [U-Boot] [PATCH 3/5] cmd_sata: implement sata stop command
2014-11-21 10:47 [U-Boot] [PATCH 0/5] introduce sata stop Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 1/5] arm: mx6: introduce disable_sata_clock Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 2/5] sata: implement reset_sata for dwc_ahsata Nikita Kiryanov
@ 2014-11-21 10:47 ` Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 4/5] arm: mx6: cm_fx6: implement board specific sata stop Nikita Kiryanov
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Nikita Kiryanov @ 2014-11-21 10:47 UTC (permalink / raw)
To: u-boot
Implement sata stop command.
This introduces the __sata_stop() weak function, which mirrors
the weak __sata_initialize() function, giving users the option of
undoing the custom steps performed in overrides of sata_initialize().
Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
Cc: Marek Vasut <marex@denx.de>
Cc: Tom Rini <trini@ti.com>
---
common/cmd_sata.c | 24 +++++++++++++++++++++++-
include/sata.h | 2 ++
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/common/cmd_sata.c b/common/cmd_sata.c
index fc92131..51f6703 100644
--- a/common/cmd_sata.c
+++ b/common/cmd_sata.c
@@ -48,6 +48,20 @@ int __sata_initialize(void)
}
int sata_initialize(void) __attribute__((weak,alias("__sata_initialize")));
+__weak int __sata_stop(void)
+{
+ int i, err = 0;
+
+ for (i = 0; i < CONFIG_SYS_SATA_MAX_DEVICE; i++)
+ err |= reset_sata(i);
+
+ if (err)
+ printf("Could not reset some SATA devices\n");
+
+ return err;
+}
+int sata_stop(void) __attribute__((weak, alias("__sata_stop")));
+
#ifdef CONFIG_PARTITIONS
block_dev_desc_t *sata_get_dev(int dev)
{
@@ -59,8 +73,15 @@ static int do_sata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int rc = 0;
- if (argc == 2 && strcmp(argv[1], "init") == 0)
+ if (argc == 2 && strcmp(argv[1], "stop") == 0)
+ return sata_stop();
+
+ if (argc == 2 && strcmp(argv[1], "init") == 0) {
+ if (sata_curr_device != -1)
+ sata_stop();
+
return sata_initialize();
+ }
/* If the user has not yet run `sata init`, do it now */
if (sata_curr_device == -1)
@@ -185,6 +206,7 @@ U_BOOT_CMD(
sata, 5, 1, do_sata,
"SATA sub system",
"init - init SATA sub system\n"
+ "sata stop - disable SATA sub system\n"
"sata info - show available SATA devices\n"
"sata device [dev] - show or set current device\n"
"sata part [dev] - print partition table\n"
diff --git a/include/sata.h b/include/sata.h
index c2bbe1a..fa61da8 100644
--- a/include/sata.h
+++ b/include/sata.h
@@ -10,6 +10,8 @@ ulong sata_write(int dev, ulong blknr, lbaint_t blkcnt, const void *buffer);
int sata_initialize(void);
int __sata_initialize(void);
+int sata_stop(void);
+int __sata_stop(void);
int sata_port_status(int dev, int port);
extern block_dev_desc_t sata_dev_desc[];
--
1.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [U-Boot] [PATCH 4/5] arm: mx6: cm_fx6: implement board specific sata stop
2014-11-21 10:47 [U-Boot] [PATCH 0/5] introduce sata stop Nikita Kiryanov
` (2 preceding siblings ...)
2014-11-21 10:47 ` [U-Boot] [PATCH 3/5] cmd_sata: implement sata stop command Nikita Kiryanov
@ 2014-11-21 10:47 ` Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 5/5] arm: imx: stop sata on boot Nikita Kiryanov
2014-11-24 11:05 ` [U-Boot] [PATCH 0/5] introduce sata stop Stefano Babic
5 siblings, 0 replies; 7+ messages in thread
From: Nikita Kiryanov @ 2014-11-21 10:47 UTC (permalink / raw)
To: u-boot
Provide board specific implementation for sata stop command for
cm_fx6.
Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
Cc: Stefano Babic <sbabic@denx.de>
---
board/compulab/cm_fx6/cm_fx6.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/board/compulab/cm_fx6/cm_fx6.c b/board/compulab/cm_fx6/cm_fx6.c
index 0206ae8..09e285b 100644
--- a/board/compulab/cm_fx6/cm_fx6.c
+++ b/board/compulab/cm_fx6/cm_fx6.c
@@ -98,9 +98,6 @@ int sata_initialize(void)
/* Make sure this gpio has logical 0 value */
gpio_direction_output(CM_FX6_SATA_PWLOSS_INT, 0);
udelay(100);
-
- cm_fx6_sata_power(0);
- mdelay(250);
cm_fx6_sata_power(1);
for (i = 0; i < CM_FX6_SATA_INIT_RETRIES; i++) {
@@ -125,6 +122,15 @@ int sata_initialize(void)
return err;
}
+
+int sata_stop(void)
+{
+ __sata_stop();
+ cm_fx6_sata_power(0);
+ mdelay(250);
+
+ return 0;
+}
#else
static int cm_fx6_setup_issd(void) { return 0; }
#endif
--
1.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [U-Boot] [PATCH 5/5] arm: imx: stop sata on boot
2014-11-21 10:47 [U-Boot] [PATCH 0/5] introduce sata stop Nikita Kiryanov
` (3 preceding siblings ...)
2014-11-21 10:47 ` [U-Boot] [PATCH 4/5] arm: mx6: cm_fx6: implement board specific sata stop Nikita Kiryanov
@ 2014-11-21 10:47 ` Nikita Kiryanov
2014-11-24 11:05 ` [U-Boot] [PATCH 0/5] introduce sata stop Stefano Babic
5 siblings, 0 replies; 7+ messages in thread
From: Nikita Kiryanov @ 2014-11-21 10:47 UTC (permalink / raw)
To: u-boot
Ideally, the Linux kernel should get the hardware in its most
untouched state. For the most part, U-Boot does not reset the various
subsystems it touches before boot, and usually Linux deals with it, but
on some boards (cm_fx6) the Linux kernel fails to detect the ssd
correctly if sata is used by U-Boot.
Power off sata on OS boot so that Linux will have a clean state to work
with.
Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
Cc: Stefano Babic <sbabic@denx.de>
---
arch/arm/imx-common/cpu.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/arch/arm/imx-common/cpu.c b/arch/arm/imx-common/cpu.c
index 09fc227..794c307 100644
--- a/arch/arm/imx-common/cpu.c
+++ b/arch/arm/imx-common/cpu.c
@@ -17,6 +17,7 @@
#include <asm/arch/sys_proto.h>
#include <asm/arch/crm_regs.h>
#include <ipu_pixfmt.h>
+#include <sata.h>
#ifdef CONFIG_FSL_ESDHC
#include <fsl_esdhc.h>
@@ -180,10 +181,13 @@ u32 get_ahb_clk(void)
return get_periph_clk() / (ahb_podf + 1);
}
-#if defined(CONFIG_VIDEO_IPUV3)
void arch_preboot_os(void)
{
+#if defined(CONFIG_CMD_SATA)
+ sata_stop();
+#endif
+#if defined(CONFIG_VIDEO_IPUV3)
/* disable video before launching O/S */
ipuv3_fb_shutdown();
-}
#endif
+}
--
1.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [U-Boot] [PATCH 0/5] introduce sata stop
2014-11-21 10:47 [U-Boot] [PATCH 0/5] introduce sata stop Nikita Kiryanov
` (4 preceding siblings ...)
2014-11-21 10:47 ` [U-Boot] [PATCH 5/5] arm: imx: stop sata on boot Nikita Kiryanov
@ 2014-11-24 11:05 ` Stefano Babic
5 siblings, 0 replies; 7+ messages in thread
From: Stefano Babic @ 2014-11-24 11:05 UTC (permalink / raw)
To: u-boot
On 21/11/2014 11:47, Nikita Kiryanov wrote:
> This series adds the sata stop command, which includes both cmd_sata code and
> driver support for resetting sata.
> A non-dummy reset_sata() is provided for dwc_ahsata, and a non-default
> sata_stop() is provided for cm_fx6.
> Finally, we use the new functionality to turn off sata on boot for mx6 devices.
>
> Cc: Stefano Babic <sbabic@denx.de>
> Cc: Simon Glass <sjg@chromium.org>
>
> Nikita Kiryanov (5):
> arm: mx6: introduce disable_sata_clock
> sata: implement reset_sata for dwc_ahsata
> cmd_sata: implement sata stop command
> arm: mx6: cm_fx6: implement board specific sata stop
> arm: imx: stop sata on boot
>
> arch/arm/cpu/armv7/mx6/clock.c | 8 ++++++++
> arch/arm/cpu/armv7/omap-common/sata.c | 5 +++++
> arch/arm/imx-common/cpu.c | 8 ++++++--
> arch/arm/include/asm/arch-mx6/clock.h | 1 +
> board/compulab/cm_fx6/cm_fx6.c | 12 +++++++++---
> common/cmd_sata.c | 24 +++++++++++++++++++++++-
> drivers/block/ata_piix.c | 5 +++++
> drivers/block/dwc_ahsata.c | 21 +++++++++++++++++++++
> drivers/block/fsl_sata.c | 5 +++++
> drivers/block/pata_bfin.c | 5 +++++
> drivers/block/sata_dwc.c | 5 +++++
> drivers/block/sata_sil.c | 5 +++++
> drivers/block/sata_sil3114.c | 5 +++++
> include/sata.h | 3 +++
> 14 files changed, 106 insertions(+), 6 deletions(-)
>
Applied to u-boot-imx, thanks !
Best regards,
Stefano Babic
--
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-11-24 11:05 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-21 10:47 [U-Boot] [PATCH 0/5] introduce sata stop Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 1/5] arm: mx6: introduce disable_sata_clock Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 2/5] sata: implement reset_sata for dwc_ahsata Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 3/5] cmd_sata: implement sata stop command Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 4/5] arm: mx6: cm_fx6: implement board specific sata stop Nikita Kiryanov
2014-11-21 10:47 ` [U-Boot] [PATCH 5/5] arm: imx: stop sata on boot Nikita Kiryanov
2014-11-24 11:05 ` [U-Boot] [PATCH 0/5] introduce sata stop Stefano Babic
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox