public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [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