[U-Boot] [PATCH v2 2/2] fsl/ls1021qds: Add deep sleep support
Yuantian Tang
Yuantian.Tang at freescale.com
Thu Dec 18 03:47:18 CET 2014
Hello York,
This patch's dependent patch is merged into mainline. So there is no dependency for this patch anymore.
Thanks,
Yuantian
> -----Original Message-----
> From: Tang Yuantian [mailto:Yuantian.Tang at freescale.com]
> Sent: Wednesday, December 17, 2014 12:58 PM
> To: albert.u.boot at aribaud.net; Sun York-R58495
> Cc: u-boot at lists.denx.de; Tang Yuantian-B29983
> Subject: [PATCH v2 2/2] fsl/ls1021qds: Add deep sleep support
>
> Add deep sleep support on Freescale LS1021QDS platform.
>
> Signed-off-by: Tang Yuantian <Yuantian.Tang at freescale.com>
> ---
> based on: u-boot-fsl-qoriq master.
> depends on patch: http://patchwork.ozlabs.org/patch/420999/
> which is applied to u-boot-mpc85xx master, awaiting upstream.
> v2:
> - added sd boot deep sleep support
>
> arch/arm/cpu/armv7/ls102xa/fdt.c | 19 +++++++++++++++++++
> board/freescale/ls1021aqds/ddr.c | 17 +++++++++++++++++
> board/freescale/ls1021aqds/ls1021aqds.c | 26 ++++++++++++++++++++++++++
> include/configs/ls1021aqds.h | 8 +++++++-
> 4 files changed, 69 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/cpu/armv7/ls102xa/fdt.c
> b/arch/arm/cpu/armv7/ls102xa/fdt.c
> index 989780d..4f226e9 100644
> --- a/arch/arm/cpu/armv7/ls102xa/fdt.c
> +++ b/arch/arm/cpu/armv7/ls102xa/fdt.c
> @@ -133,4 +133,23 @@ void ft_cpu_setup(void *blob, bd_t *bd)
>
> do_fixup_by_compat_u32(blob, "fsl, ls1021a-flexcan",
> "clock-frequency", busclk / 2, 1);
> +
> +#if defined(CONFIG_DEEP_SLEEP) && defined(CONFIG_SD_BOOT)
> +#define UBOOT_HEAD_LEN 0x1000
> + /*
> + * Reserved memory in SD boot deep sleep case.
> + * Second stage uboot binary and malloc space should be reserved.
> + * If the memory they occupied has not been reserved, then this
> + * space would be used by kernel and overwritten in uboot when
> + * deep sleep resume, which cause deep sleep failed.
> + * Since second uboot binary has a head, that space need to be
> + * reserved either(assuming its size is less than 0x1000).
> + */
> + off = fdt_add_mem_rsv(blob, CONFIG_SYS_TEXT_BASE -
> UBOOT_HEAD_LEN,
> + CONFIG_SYS_MONITOR_LEN + CONFIG_SYS_SPL_MALLOC_SIZE +
> + UBOOT_HEAD_LEN);
> + if (off < 0)
> + printf("Failed to reserve memory for SD boot deep sleep: %s\n",
> + fdt_strerror(off));
> +#endif
> }
> diff --git a/board/freescale/ls1021aqds/ddr.c b/board/freescale/ls1021aqds/ddr.c
> index a539ff9..6435bf9 100644
> --- a/board/freescale/ls1021aqds/ddr.c
> +++ b/board/freescale/ls1021aqds/ddr.c
> @@ -7,6 +7,7 @@
> #include <common.h>
> #include <fsl_ddr_sdram.h>
> #include <fsl_ddr_dimm_params.h>
> +#include <asm/io.h>
> #include "ddr.h"
>
> DECLARE_GLOBAL_DATA_PTR;
> @@ -149,6 +150,17 @@ int fsl_ddr_get_dimm_params(dimm_params_t
> *pdimm, } #endif
>
> +#if defined(CONFIG_DEEP_SLEEP)
> +void board_mem_sleep_setup(void)
> +{
> + void __iomem *qixis_base = (void *)QIXIS_BASE;
> +
> + /* does not provide HW signals for power management */
> + clrbits_8(qixis_base + 0x21, 0x2);
> + udelay(1);
> +}
> +#endif
> +
> phys_size_t initdram(int board_type)
> {
> phys_size_t dram_size;
> @@ -159,6 +171,11 @@ phys_size_t initdram(int board_type) #else
> dram_size = fsl_ddr_sdram_size();
> #endif
> +
> +#if defined(CONFIG_DEEP_SLEEP) && !defined(CONFIG_SPL_BUILD)
> + fsl_dp_resume();
> +#endif
> +
> return dram_size;
> }
>
> diff --git a/board/freescale/ls1021aqds/ls1021aqds.c
> b/board/freescale/ls1021aqds/ls1021aqds.c
> index f08e54f..97da47d 100644
> --- a/board/freescale/ls1021aqds/ls1021aqds.c
> +++ b/board/freescale/ls1021aqds/ls1021aqds.c
> @@ -20,6 +20,7 @@
> #include <fsl_sec.h>
> #include <spl.h>
>
> +#include "../common/sleep.h"
> #include "../common/qixis.h"
> #include "ls1021aqds_qixis.h"
> #ifdef CONFIG_U_QE
> @@ -195,6 +196,11 @@ int board_early_init_f(void)
> * allow barrier transaction to DDR again */
> out_le32(&cci->ctrl_ord, CCI400_CTRLORD_TERM_BARRIER);
>
> +#if defined(CONFIG_DEEP_SLEEP)
> + if (is_warm_boot())
> + fsl_dp_disable_console();
> +#endif
> +
> return 0;
> }
>
> @@ -231,6 +237,11 @@ void board_init_f(ulong dummy)
>
> get_clocks();
>
> +#if defined(CONFIG_DEEP_SLEEP)
> + if (is_warm_boot())
> + fsl_dp_disable_console();
> +#endif
> +
> preloader_console_init();
>
> #ifdef CONFIG_SPL_I2C_SUPPORT
> @@ -503,6 +514,21 @@ int board_init(void)
> return 0;
> }
>
> +#if defined(CONFIG_DEEP_SLEEP)
> +void board_sleep_prepare(void)
> +{
> + struct ccsr_cci400 __iomem *cci = (void *)CONFIG_SYS_CCI400_ADDR;
> +
> + /* Set CCI-400 control override register to
> + * enable barrier transaction */
> + out_le32(&cci->ctrl_ord, CCI400_CTRLORD_EN_BARRIER);
> +
> +#ifdef CONFIG_LS102XA_NS_ACCESS
> + enable_devices_ns_access(ns_dev, ARRAY_SIZE(ns_dev)); #endif } #endif
> +
> int ft_board_setup(void *blob, bd_t *bd) {
> ft_cpu_setup(blob, bd);
> diff --git a/include/configs/ls1021aqds.h b/include/configs/ls1021aqds.h index
> 8dc04f2..4b434ad 100644
> --- a/include/configs/ls1021aqds.h
> +++ b/include/configs/ls1021aqds.h
> @@ -19,6 +19,11 @@
> #define CONFIG_SKIP_LOWLEVEL_INIT
> #define CONFIG_BOARD_EARLY_INIT_F
>
> +#define CONFIG_DEEP_SLEEP
> +#if defined(CONFIG_DEEP_SLEEP)
> +#define CONFIG_SILENT_CONSOLE
> +#endif
> +
> /*
> * Size of malloc() pool
> */
> @@ -72,7 +77,8 @@ unsigned long get_board_ddr_clk(void);
> #define CONFIG_SPL_PAD_TO 0x1c000
> #define CONFIG_SYS_TEXT_BASE 0x82000000
>
> -#define CONFIG_SYS_SPL_MALLOC_START 0x80200000
> +#define CONFIG_SYS_SPL_MALLOC_START (CONFIG_SYS_TEXT_BASE + \
> + CONFIG_SYS_MONITOR_LEN)
> #define CONFIG_SYS_SPL_MALLOC_SIZE 0x100000
> #define CONFIG_SPL_BSS_START_ADDR 0x80100000
> #define CONFIG_SPL_BSS_MAX_SIZE 0x80000
> --
> 2.1.0.27.g96db324
More information about the U-Boot
mailing list