diff mbox

[1/4] SMDK5250: Convert lowlevel_init.S to lowlevel_init_c.c

Message ID 1356696525-21001-2-git-send-email-rajeshwari.s@samsung.com
State New
Headers show

Commit Message

Rajeshwari Shinde Dec. 28, 2012, 12:08 p.m. UTC
This patch converts lowlevel_init.S to lowlevel_init_c.c for
SMDK5250.

Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
---
 board/samsung/smdk5250/Makefile          |    1 +
 board/samsung/smdk5250/dmc_common.c      |    4 +-
 board/samsung/smdk5250/dmc_init_ddr3.c   |    6 ++-
 board/samsung/smdk5250/lowlevel_init.S   |   69 ++---------------------------
 board/samsung/smdk5250/lowlevel_init_c.c |   70 ++++++++++++++++++++++++++++++
 board/samsung/smdk5250/setup.h           |   17 ++++++-
 board/samsung/smdk5250/spl_boot.c        |   52 ++++++++++++++++++----
 spl/Makefile                             |    4 ++
 8 files changed, 142 insertions(+), 81 deletions(-)
 create mode 100644 board/samsung/smdk5250/lowlevel_init_c.c

Comments

Simon Glass Dec. 28, 2012, 3:17 p.m. UTC | #1
Hi Rajeshwari,

On Fri, Dec 28, 2012 at 4:08 AM, Rajeshwari Shinde
<rajeshwari.s@samsung.com> wrote:
> This patch converts lowlevel_init.S to lowlevel_init_c.c for
> SMDK5250.
>
> Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
> ---
>  board/samsung/smdk5250/Makefile          |    1 +
>  board/samsung/smdk5250/dmc_common.c      |    4 +-
>  board/samsung/smdk5250/dmc_init_ddr3.c   |    6 ++-
>  board/samsung/smdk5250/lowlevel_init.S   |   69 ++---------------------------
>  board/samsung/smdk5250/lowlevel_init_c.c |   70 ++++++++++++++++++++++++++++++
>  board/samsung/smdk5250/setup.h           |   17 ++++++-
>  board/samsung/smdk5250/spl_boot.c        |   52 ++++++++++++++++++----
>  spl/Makefile                             |    4 ++
>  8 files changed, 142 insertions(+), 81 deletions(-)
>  create mode 100644 board/samsung/smdk5250/lowlevel_init_c.c

Great to see this!

>
> diff --git a/board/samsung/smdk5250/Makefile b/board/samsung/smdk5250/Makefile
> index 47c6a5a..b99ac7f 100644
> --- a/board/samsung/smdk5250/Makefile
> +++ b/board/samsung/smdk5250/Makefile
> @@ -37,6 +37,7 @@ endif
>
>  ifdef CONFIG_SPL_BUILD
>  COBJS  += spl_boot.o
> +COBJS  += lowlevel_init_c.o
>  endif
>
>  SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
> diff --git a/board/samsung/smdk5250/dmc_common.c b/board/samsung/smdk5250/dmc_common.c
> index 109602a..6a26822 100644
> --- a/board/samsung/smdk5250/dmc_common.c
> +++ b/board/samsung/smdk5250/dmc_common.c
> @@ -175,7 +175,7 @@ void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc)
>         writel(DMC_MEMBASECONFIG1_VAL, &dmc->membaseconfig1);
>  }
>
> -void mem_ctrl_init()
> +void mem_ctrl_init(int mem_reset)
>  {
>         struct spl_machine_param *param = spl_get_machine_params();
>         struct mem_timings *mem;
> @@ -185,7 +185,7 @@ void mem_ctrl_init()
>
>         /* If there are any other memory variant, add their init call below */
>         if (param->mem_type == DDR_MODE_DDR3) {
> -               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size);
> +               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size, mem_reset);
>                 if (ret) {
>                         /* will hang if failed to init memory control */
>                         while (1)
> diff --git a/board/samsung/smdk5250/dmc_init_ddr3.c b/board/samsung/smdk5250/dmc_init_ddr3.c
> index e050790..4e0693d 100644
> --- a/board/samsung/smdk5250/dmc_init_ddr3.c
> +++ b/board/samsung/smdk5250/dmc_init_ddr3.c
> @@ -40,7 +40,8 @@ static void reset_phy_ctrl(void)
>         writel(DDR3PHY_CTRL_PHY_RESET, &clk->lpddr3phy_ctrl);
>  }
>
> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
> +                       int mem_reset)
>  {
>         unsigned int val;
>         struct exynos5_phy_control *phy0_ctrl, *phy1_ctrl;
> @@ -51,7 +52,8 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
>         phy1_ctrl = (struct exynos5_phy_control *)EXYNOS5_DMC_PHY1_BASE;
>         dmc = (struct exynos5_dmc *)EXYNOS5_DMC_CTRL_BASE;
>
> -       reset_phy_ctrl();
> +       if (mem_reset)
> +               reset_phy_ctrl();
>
>         /* Set Impedance Output Driver */
>         val = (mem->impedance << CA_CK_DRVR_DS_OFFSET) |
> diff --git a/board/samsung/smdk5250/lowlevel_init.S b/board/samsung/smdk5250/lowlevel_init.S
> index bc6cb6f..469126d 100644
> --- a/board/samsung/smdk5250/lowlevel_init.S
> +++ b/board/samsung/smdk5250/lowlevel_init.S
> @@ -23,74 +23,13 @@
>   */
>
>  #include <config.h>
> -#include <version.h>
>  #include <asm/arch/cpu.h>
>
> -_TEXT_BASE:
> -       .word   CONFIG_SYS_TEXT_BASE
> -
>         .globl lowlevel_init
>  lowlevel_init:
> -
> -       /* use iRAM stack in bl2 */
> -       ldr     sp, =CONFIG_IRAM_STACK
> -       stmdb   r13!, {ip,lr}
> -
> -       /* check reset status */
> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM1_OFFSET)
> -       ldr     r1, [r0]
> -
> -       /* AFTR wakeup reset */
> -       ldr     r2, =S5P_CHECK_DIDLE
> -       cmp     r1, r2
> -       beq     exit_wakeup
> -
> -       /* LPA wakeup reset */
> -       ldr     r2, =S5P_CHECK_LPA
> -       cmp     r1, r2
> -       beq     exit_wakeup
> -
> -       /* Sleep wakeup reset */
> -       ldr     r2, =S5P_CHECK_SLEEP
> -       cmp     r1, r2
> -       beq     wakeup_reset
> -
>         /*
> -        * If U-boot is already running in RAM, no need to relocate U-Boot.
> -        * Memory controller must be configured before relocating U-Boot
> -        * in ram.
> +        * Set the stack pointer, although it will be overwriten by the caller

overwritten

> +        * It seems we will not boot if this function is empty.
>          */
> -       ldr     r0, =0x0ffffff          /* r0 <- Mask Bits*/
> -       bic     r1, pc, r0              /* pc <- current addr of code */
> -                                       /* r1 <- unmasked bits of pc */
> -       ldr     r2, _TEXT_BASE          /* r2 <- original base addr in ram */
> -       bic     r2, r2, r0              /* r2 <- unmasked bits of r2*/
> -       cmp     r1, r2                  /* compare r1, r2 */
> -       beq     1f                      /* r0 == r1 then skip sdram init */
> -
> -       /* init system clock */
> -       bl      system_clock_init
> -
> -       /* Memory initialize */
> -       bl      mem_ctrl_init
> -
> -1:
> -       bl      tzpc_init
> -       ldmia   r13!, {ip,pc}
> -
> -wakeup_reset:
> -       bl      system_clock_init
> -       bl      mem_ctrl_init
> -       bl      tzpc_init
> -
> -exit_wakeup:
> -       /* Load return address and jump to kernel */
> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM0_OFFSET)
> -
> -       /* r1 = physical address of exynos5_cpu_resume function*/
> -       ldr     r1, [r0]
> -
> -       /* Jump to kernel */
> -       mov     pc, r1
> -       nop
> -       nop
> +       ldr     sp, =CONFIG_IRAM_STACK
> +       mov     pc, lr
> diff --git a/board/samsung/smdk5250/lowlevel_init_c.c b/board/samsung/smdk5250/lowlevel_init_c.c
> new file mode 100644
> index 0000000..fdb98cf
> --- /dev/null
> +++ b/board/samsung/smdk5250/lowlevel_init_c.c
> @@ -0,0 +1,70 @@
> +/*
> + * Lowlevel setup for SMDK5250 board based on S5PC520
> + *
> + * Copyright (C) 2012 Samsung Electronics
> + * Copyright (c) 2012 The Chromium OS Authors.
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <config.h>
> +#include <asm/arch/cpu.h>
> +#include <asm/arch/dmc.h>
> +#include <asm/arch/power.h>
> +#include <asm/arch/tzpc.h>
> +#include "setup.h"
> +
> +/* These are the things we can do during low-level init */
> +enum {
> +       DO_WAKEUP       = 1 << 0,
> +       DO_CLOCKS       = 1 << 1,
> +       DO_MEM_RESET    = 1 << 2,

No early serial support yet?

> +};
> +
> +int lowlevel_init_subsystems(void)
> +{
> +       uint32_t reset_status;
> +       int actions = 0;
> +
> +       arch_cpu_init();
> +
> +       reset_status = power_read_reset_status();
> +
> +       switch (reset_status) {
> +       case EXYNOS_CHECK_SLEEP:
> +               actions = DO_CLOCKS | DO_WAKEUP;
> +               break;
> +       case EXYNOS_CHECK_DIDLE:
> +       case EXYNOS_CHECK_LPA:
> +               actions = DO_WAKEUP;
> +               break;
> +       default:
> +               /* This is a normal boot (not a wake from sleep) */
> +               actions = DO_CLOCKS | DO_MEM_RESET;
> +       }
> +
> +       if (actions & DO_CLOCKS) {
> +               system_clock_init();
> +               mem_ctrl_init(actions & DO_MEM_RESET);
> +               tzpc_init();
> +       }
> +
> +       return actions & DO_WAKEUP;
> +}
> diff --git a/board/samsung/smdk5250/setup.h b/board/samsung/smdk5250/setup.h
> index a159601..d64e385 100644
> --- a/board/samsung/smdk5250/setup.h
> +++ b/board/samsung/smdk5250/setup.h
> @@ -28,6 +28,11 @@
>  #include <config.h>
>  #include <asm/arch/dmc.h>
>
> +/* Power Down Modes */
> +#define EXYNOS_CHECK_SLEEP     0x00000BAD
> +#define EXYNOS_CHECK_DIDLE     0xBAD00000
> +#define EXYNOS_CHECK_LPA       0xABAD0000

Are these used in this patch? Are these register values? Please can
you add a comment as to what these values are for?

> +
>  /* TZPC : Register Offsets */
>  #define TZPC0_BASE             0x10100000
>  #define TZPC1_BASE             0x10110000
> @@ -539,7 +544,8 @@ enum {
>   *                     accesses; may vary across boards.
>   * @return 0 if ok, SETUP_ERR_... if there is a problem
>   */
> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size);
> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
> +                       int mem_reset);
>
>  /*
>   * Configure ZQ I/O interface
> @@ -588,7 +594,14 @@ void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc);
>  void update_reset_dll(struct exynos5_dmc *, enum ddr_mode);
>
>  void sdelay(unsigned long);
> -void mem_ctrl_init(void);
> +void mem_ctrl_init(int mem_reset);

Please add a comment for this parameter

>  void system_clock_init(void);
>  void tzpc_init(void);
> +
> +/**
> + * Init subsystems according to the reset status
> + *
> + * @return 0 for a normal boot, non-zero for a resume
> + */
> +int lowlevel_init_subsystems(void);
>  #endif
> diff --git a/board/samsung/smdk5250/spl_boot.c b/board/samsung/smdk5250/spl_boot.c
> index d8f3c1e..66bce5b 100644
> --- a/board/samsung/smdk5250/spl_boot.c
> +++ b/board/samsung/smdk5250/spl_boot.c
> @@ -20,18 +20,16 @@
>   * MA 02111-1307 USA
>   */
>
> -#include<common.h>
> -#include<config.h>
> +#include <common.h>
> +#include <config.h>
> +#include <asm/arch/spl.h>
> +#include <asm/arch/cpu.h>
> +#include <asm/arch/power.h>
> +#include "setup.h"
>
> -enum boot_mode {
> -       BOOT_MODE_MMC = 4,
> -       BOOT_MODE_SERIAL = 20,
> -       /* Boot based on Operating Mode pin settings */
> -       BOOT_MODE_OM = 32,
> -       BOOT_MODE_USB,  /* Boot using USB download */
> -};
> +DECLARE_GLOBAL_DATA_PTR;
>
> -       typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
> +typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>
>  /*
>  * Copy U-boot from mmc to RAM:
> @@ -62,15 +60,49 @@ void copy_uboot_to_ram(void)
>         }
>  }
>
> +void memzero(void *s, size_t n)
> +{
> +       char *ptr = s;
> +       size_t i;
> +
> +       for (i = 0; i < n; i++)
> +               *ptr++ = '\0';
> +}
> +
> +/**
> + * Set up the U-Boot global_data pointer
> + *
> + * This sets the address of the global data, and sets up basic values.
> + *
> + * @param gdp   Value to give to gd
> + */
> +static void setup_global_data(gd_t *gdp)
> +{
> +       gd = gdp;
> +       memzero((void *)gd, sizeof(gd_t));
> +       gd->flags |= GD_FLG_RELOC;
> +       gd->baudrate = CONFIG_BAUDRATE;
> +       gd->have_console = 1;
> +}
> +
>  void board_init_f(unsigned long bootflag)
>  {
> +       __attribute__((aligned(8))) gd_t local_gd;
>         __attribute__((noreturn)) void (*uboot)(void);
> +
> +       setup_global_data(&local_gd);
> +
> +       if (lowlevel_init_subsystems())
> +               power_exit_wakeup();

Does this function exist in this patch?

> +
>         copy_uboot_to_ram();
>
>         /* Jump to U-Boot image */
>         uboot = (void *)CONFIG_SYS_TEXT_BASE;
>         (*uboot)();
> +
>         /* Never returns Here */
> +       panic("%s: u-boot jump failed", __func__);
>  }
>
>  /* Place Holders */
> diff --git a/spl/Makefile b/spl/Makefile
> index 6dbb105..3aab466 100644
> --- a/spl/Makefile
> +++ b/spl/Makefile
> @@ -86,6 +86,10 @@ ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
>  LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
>  endif
>
> +ifneq ($(CONFIG_EXYNOS4)$(CONFIG_EXYNOS5),)
> +LIBS-y += $(CPUDIR)/s5p-common/libs5p-common.o
> +endif
> +
>  ifeq ($(SOC),tegra20)
>  LIBS-y += arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
>  LIBS-y += arch/$(ARCH)/cpu/tegra-common/libcputegra-common.o
> --
> 1.7.4.4
>

Regards,
Simon
Rajeshwari Birje Dec. 31, 2012, 5:09 a.m. UTC | #2
Hi Simon Glass,

Thank you for comments.

On Fri, Dec 28, 2012 at 8:47 PM, Simon Glass <sjg@chromium.org> wrote:
>
> Hi Rajeshwari,
>
> On Fri, Dec 28, 2012 at 4:08 AM, Rajeshwari Shinde
> <rajeshwari.s@samsung.com> wrote:
> > This patch converts lowlevel_init.S to lowlevel_init_c.c for
> > SMDK5250.
> >
> > Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
> > ---
> >  board/samsung/smdk5250/Makefile          |    1 +
> >  board/samsung/smdk5250/dmc_common.c      |    4 +-
> >  board/samsung/smdk5250/dmc_init_ddr3.c   |    6 ++-
> >  board/samsung/smdk5250/lowlevel_init.S   |   69 ++---------------------------
> >  board/samsung/smdk5250/lowlevel_init_c.c |   70 ++++++++++++++++++++++++++++++
> >  board/samsung/smdk5250/setup.h           |   17 ++++++-
> >  board/samsung/smdk5250/spl_boot.c        |   52 ++++++++++++++++++----
> >  spl/Makefile                             |    4 ++
> >  8 files changed, 142 insertions(+), 81 deletions(-)
> >  create mode 100644 board/samsung/smdk5250/lowlevel_init_c.c
>
> Great to see this!
>
> >
> > diff --git a/board/samsung/smdk5250/Makefile b/board/samsung/smdk5250/Makefile
> > index 47c6a5a..b99ac7f 100644
> > --- a/board/samsung/smdk5250/Makefile
> > +++ b/board/samsung/smdk5250/Makefile
> > @@ -37,6 +37,7 @@ endif
> >
> >  ifdef CONFIG_SPL_BUILD
> >  COBJS  += spl_boot.o
> > +COBJS  += lowlevel_init_c.o
> >  endif
> >
> >  SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
> > diff --git a/board/samsung/smdk5250/dmc_common.c b/board/samsung/smdk5250/dmc_common.c
> > index 109602a..6a26822 100644
> > --- a/board/samsung/smdk5250/dmc_common.c
> > +++ b/board/samsung/smdk5250/dmc_common.c
> > @@ -175,7 +175,7 @@ void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc)
> >         writel(DMC_MEMBASECONFIG1_VAL, &dmc->membaseconfig1);
> >  }
> >
> > -void mem_ctrl_init()
> > +void mem_ctrl_init(int mem_reset)
> >  {
> >         struct spl_machine_param *param = spl_get_machine_params();
> >         struct mem_timings *mem;
> > @@ -185,7 +185,7 @@ void mem_ctrl_init()
> >
> >         /* If there are any other memory variant, add their init call below */
> >         if (param->mem_type == DDR_MODE_DDR3) {
> > -               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size);
> > +               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size, mem_reset);
> >                 if (ret) {
> >                         /* will hang if failed to init memory control */
> >                         while (1)
> > diff --git a/board/samsung/smdk5250/dmc_init_ddr3.c b/board/samsung/smdk5250/dmc_init_ddr3.c
> > index e050790..4e0693d 100644
> > --- a/board/samsung/smdk5250/dmc_init_ddr3.c
> > +++ b/board/samsung/smdk5250/dmc_init_ddr3.c
> > @@ -40,7 +40,8 @@ static void reset_phy_ctrl(void)
> >         writel(DDR3PHY_CTRL_PHY_RESET, &clk->lpddr3phy_ctrl);
> >  }
> >
> > -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
> > +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
> > +                       int mem_reset)
> >  {
> >         unsigned int val;
> >         struct exynos5_phy_control *phy0_ctrl, *phy1_ctrl;
> > @@ -51,7 +52,8 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
> >         phy1_ctrl = (struct exynos5_phy_control *)EXYNOS5_DMC_PHY1_BASE;
> >         dmc = (struct exynos5_dmc *)EXYNOS5_DMC_CTRL_BASE;
> >
> > -       reset_phy_ctrl();
> > +       if (mem_reset)
> > +               reset_phy_ctrl();
> >
> >         /* Set Impedance Output Driver */
> >         val = (mem->impedance << CA_CK_DRVR_DS_OFFSET) |
> > diff --git a/board/samsung/smdk5250/lowlevel_init.S b/board/samsung/smdk5250/lowlevel_init.S
> > index bc6cb6f..469126d 100644
> > --- a/board/samsung/smdk5250/lowlevel_init.S
> > +++ b/board/samsung/smdk5250/lowlevel_init.S
> > @@ -23,74 +23,13 @@
> >   */
> >
> >  #include <config.h>
> > -#include <version.h>
> >  #include <asm/arch/cpu.h>
> >
> > -_TEXT_BASE:
> > -       .word   CONFIG_SYS_TEXT_BASE
> > -
> >         .globl lowlevel_init
> >  lowlevel_init:
> > -
> > -       /* use iRAM stack in bl2 */
> > -       ldr     sp, =CONFIG_IRAM_STACK
> > -       stmdb   r13!, {ip,lr}
> > -
> > -       /* check reset status */
> > -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM1_OFFSET)
> > -       ldr     r1, [r0]
> > -
> > -       /* AFTR wakeup reset */
> > -       ldr     r2, =S5P_CHECK_DIDLE
> > -       cmp     r1, r2
> > -       beq     exit_wakeup
> > -
> > -       /* LPA wakeup reset */
> > -       ldr     r2, =S5P_CHECK_LPA
> > -       cmp     r1, r2
> > -       beq     exit_wakeup
> > -
> > -       /* Sleep wakeup reset */
> > -       ldr     r2, =S5P_CHECK_SLEEP
> > -       cmp     r1, r2
> > -       beq     wakeup_reset
> > -
> >         /*
> > -        * If U-boot is already running in RAM, no need to relocate U-Boot.
> > -        * Memory controller must be configured before relocating U-Boot
> > -        * in ram.
> > +        * Set the stack pointer, although it will be overwriten by the caller
>
> overwritten

- Will correct this.
>
>
> > +        * It seems we will not boot if this function is empty.
> >          */
> > -       ldr     r0, =0x0ffffff          /* r0 <- Mask Bits*/
> > -       bic     r1, pc, r0              /* pc <- current addr of code */
> > -                                       /* r1 <- unmasked bits of pc */
> > -       ldr     r2, _TEXT_BASE          /* r2 <- original base addr in ram */
> > -       bic     r2, r2, r0              /* r2 <- unmasked bits of r2*/
> > -       cmp     r1, r2                  /* compare r1, r2 */
> > -       beq     1f                      /* r0 == r1 then skip sdram init */
> > -
> > -       /* init system clock */
> > -       bl      system_clock_init
> > -
> > -       /* Memory initialize */
> > -       bl      mem_ctrl_init
> > -
> > -1:
> > -       bl      tzpc_init
> > -       ldmia   r13!, {ip,pc}
> > -
> > -wakeup_reset:
> > -       bl      system_clock_init
> > -       bl      mem_ctrl_init
> > -       bl      tzpc_init
> > -
> > -exit_wakeup:
> > -       /* Load return address and jump to kernel */
> > -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM0_OFFSET)
> > -
> > -       /* r1 = physical address of exynos5_cpu_resume function*/
> > -       ldr     r1, [r0]
> > -
> > -       /* Jump to kernel */
> > -       mov     pc, r1
> > -       nop
> > -       nop
> > +       ldr     sp, =CONFIG_IRAM_STACK
> > +       mov     pc, lr
> > diff --git a/board/samsung/smdk5250/lowlevel_init_c.c b/board/samsung/smdk5250/lowlevel_init_c.c
> > new file mode 100644
> > index 0000000..fdb98cf
> > --- /dev/null
> > +++ b/board/samsung/smdk5250/lowlevel_init_c.c
> > @@ -0,0 +1,70 @@
> > +/*
> > + * Lowlevel setup for SMDK5250 board based on S5PC520
> > + *
> > + * Copyright (C) 2012 Samsung Electronics
> > + * Copyright (c) 2012 The Chromium OS Authors.
> > + *
> > + * See file CREDITS for list of people who contributed to this
> > + * project.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License as
> > + * published by the Free Software Foundation; either version 2 of
> > + * the License, or (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program; if not, write to the Free Software
> > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> > + * MA 02111-1307 USA
> > + */
> > +
> > +#include <common.h>
> > +#include <config.h>
> > +#include <asm/arch/cpu.h>
> > +#include <asm/arch/dmc.h>
> > +#include <asm/arch/power.h>
> > +#include <asm/arch/tzpc.h>
> > +#include "setup.h"
> > +
> > +/* These are the things we can do during low-level init */
> > +enum {
> > +       DO_WAKEUP       = 1 << 0,
> > +       DO_CLOCKS       = 1 << 1,
> > +       DO_MEM_RESET    = 1 << 2,
>
> No early serial support yet?

- OK will add it in next version of patch set.
>
>
> > +};
> > +
> > +int lowlevel_init_subsystems(void)
> > +{
> > +       uint32_t reset_status;
> > +       int actions = 0;
> > +
> > +       arch_cpu_init();
> > +
> > +       reset_status = power_read_reset_status();
> > +
> > +       switch (reset_status) {
> > +       case EXYNOS_CHECK_SLEEP:
> > +               actions = DO_CLOCKS | DO_WAKEUP;
> > +               break;
> > +       case EXYNOS_CHECK_DIDLE:
> > +       case EXYNOS_CHECK_LPA:
> > +               actions = DO_WAKEUP;
> > +               break;
> > +       default:
> > +               /* This is a normal boot (not a wake from sleep) */
> > +               actions = DO_CLOCKS | DO_MEM_RESET;
> > +       }
> > +
> > +       if (actions & DO_CLOCKS) {
> > +               system_clock_init();
> > +               mem_ctrl_init(actions & DO_MEM_RESET);
> > +               tzpc_init();
> > +       }
> > +
> > +       return actions & DO_WAKEUP;
> > +}
> > diff --git a/board/samsung/smdk5250/setup.h b/board/samsung/smdk5250/setup.h
> > index a159601..d64e385 100644
> > --- a/board/samsung/smdk5250/setup.h
> > +++ b/board/samsung/smdk5250/setup.h
> > @@ -28,6 +28,11 @@
> >  #include <config.h>
> >  #include <asm/arch/dmc.h>
> >
> > +/* Power Down Modes */
> > +#define EXYNOS_CHECK_SLEEP     0x00000BAD
> > +#define EXYNOS_CHECK_DIDLE     0xBAD00000
> > +#define EXYNOS_CHECK_LPA       0xABAD0000
>
> Are these used in this patch? Are these register values? Please can
> you add a comment as to what these values are for?
- Yes they are used in lowlevel_init_c.c. Will add comments.
>
> > +
> >  /* TZPC : Register Offsets */
> >  #define TZPC0_BASE             0x10100000
> >  #define TZPC1_BASE             0x10110000
> > @@ -539,7 +544,8 @@ enum {
> >   *                     accesses; may vary across boards.
> >   * @return 0 if ok, SETUP_ERR_... if there is a problem
> >   */
> > -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size);
> > +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
> > +                       int mem_reset);
> >
> >  /*
> >   * Configure ZQ I/O interface
> > @@ -588,7 +594,14 @@ void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc);
> >  void update_reset_dll(struct exynos5_dmc *, enum ddr_mode);
> >
> >  void sdelay(unsigned long);
> > -void mem_ctrl_init(void);
> > +void mem_ctrl_init(int mem_reset);
>
> Please add a comment for this parameter
- OK
>
> >  void system_clock_init(void);
> >  void tzpc_init(void);
> > +
> > +/**
> > + * Init subsystems according to the reset status
> > + *
> > + * @return 0 for a normal boot, non-zero for a resume
> > + */
> > +int lowlevel_init_subsystems(void);
> >  #endif
> > diff --git a/board/samsung/smdk5250/spl_boot.c b/board/samsung/smdk5250/spl_boot.c
> > index d8f3c1e..66bce5b 100644
> > --- a/board/samsung/smdk5250/spl_boot.c
> > +++ b/board/samsung/smdk5250/spl_boot.c
> > @@ -20,18 +20,16 @@
> >   * MA 02111-1307 USA
> >   */
> >
> > -#include<common.h>
> > -#include<config.h>
> > +#include <common.h>
> > +#include <config.h>
> > +#include <asm/arch/spl.h>
> > +#include <asm/arch/cpu.h>
> > +#include <asm/arch/power.h>
> > +#include "setup.h"
> >
> > -enum boot_mode {
> > -       BOOT_MODE_MMC = 4,
> > -       BOOT_MODE_SERIAL = 20,
> > -       /* Boot based on Operating Mode pin settings */
> > -       BOOT_MODE_OM = 32,
> > -       BOOT_MODE_USB,  /* Boot using USB download */
> > -};
> > +DECLARE_GLOBAL_DATA_PTR;
> >
> > -       typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
> > +typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
> >
> >  /*
> >  * Copy U-boot from mmc to RAM:
> > @@ -62,15 +60,49 @@ void copy_uboot_to_ram(void)
> >         }
> >  }
> >
> > +void memzero(void *s, size_t n)
> > +{
> > +       char *ptr = s;
> > +       size_t i;
> > +
> > +       for (i = 0; i < n; i++)
> > +               *ptr++ = '\0';
> > +}
> > +
> > +/**
> > + * Set up the U-Boot global_data pointer
> > + *
> > + * This sets the address of the global data, and sets up basic values.
> > + *
> > + * @param gdp   Value to give to gd
> > + */
> > +static void setup_global_data(gd_t *gdp)
> > +{
> > +       gd = gdp;
> > +       memzero((void *)gd, sizeof(gd_t));
> > +       gd->flags |= GD_FLG_RELOC;
> > +       gd->baudrate = CONFIG_BAUDRATE;
> > +       gd->have_console = 1;
> > +}
> > +
> >  void board_init_f(unsigned long bootflag)
> >  {
> > +       __attribute__((aligned(8))) gd_t local_gd;
> >         __attribute__((noreturn)) void (*uboot)(void);
> > +
> > +       setup_global_data(&local_gd);
> > +
> > +       if (lowlevel_init_subsystems())
> > +               power_exit_wakeup();
>
> Does this function exist in this patch?
- I have added the power related functions in patch 2.
>
> > +
> >         copy_uboot_to_ram();
> >
> >         /* Jump to U-Boot image */
> >         uboot = (void *)CONFIG_SYS_TEXT_BASE;
> >         (*uboot)();
> > +
> >         /* Never returns Here */
> > +       panic("%s: u-boot jump failed", __func__);
> >  }
> >
> >  /* Place Holders */
> > diff --git a/spl/Makefile b/spl/Makefile
> > index 6dbb105..3aab466 100644
> > --- a/spl/Makefile
> > +++ b/spl/Makefile
> > @@ -86,6 +86,10 @@ ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
> >  LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
> >  endif
> >
> > +ifneq ($(CONFIG_EXYNOS4)$(CONFIG_EXYNOS5),)
> > +LIBS-y += $(CPUDIR)/s5p-common/libs5p-common.o
> > +endif
> > +
> >  ifeq ($(SOC),tegra20)
> >  LIBS-y += arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
> >  LIBS-y += arch/$(ARCH)/cpu/tegra-common/libcputegra-common.o
> > --
> > 1.7.4.4
> >
>
> Regards,
> Simon
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

--
Regards,
Rajeshwari Shinde
Kyungmin Park Dec. 31, 2012, 12:32 p.m. UTC | #3
On Fri, Dec 28, 2012 at 9:08 PM, Rajeshwari Shinde
<rajeshwari.s@samsung.com> wrote:
> This patch converts lowlevel_init.S to lowlevel_init_c.c for
> SMDK5250.
>
> Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
> ---
>  board/samsung/smdk5250/Makefile          |    1 +
>  board/samsung/smdk5250/dmc_common.c      |    4 +-
>  board/samsung/smdk5250/dmc_init_ddr3.c   |    6 ++-
>  board/samsung/smdk5250/lowlevel_init.S   |   69 ++---------------------------
>  board/samsung/smdk5250/lowlevel_init_c.c |   70 ++++++++++++++++++++++++++++++
>  board/samsung/smdk5250/setup.h           |   17 ++++++-
>  board/samsung/smdk5250/spl_boot.c        |   52 ++++++++++++++++++----
>  spl/Makefile                             |    4 ++
>  8 files changed, 142 insertions(+), 81 deletions(-)
>  create mode 100644 board/samsung/smdk5250/lowlevel_init_c.c
>
> diff --git a/board/samsung/smdk5250/Makefile b/board/samsung/smdk5250/Makefile
> index 47c6a5a..b99ac7f 100644
> --- a/board/samsung/smdk5250/Makefile
> +++ b/board/samsung/smdk5250/Makefile
> @@ -37,6 +37,7 @@ endif
>
>  ifdef CONFIG_SPL_BUILD
>  COBJS  += spl_boot.o
> +COBJS  += lowlevel_init_c.o
>  endif
>
>  SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
> diff --git a/board/samsung/smdk5250/dmc_common.c b/board/samsung/smdk5250/dmc_common.c
> index 109602a..6a26822 100644
> --- a/board/samsung/smdk5250/dmc_common.c
> +++ b/board/samsung/smdk5250/dmc_common.c
> @@ -175,7 +175,7 @@ void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc)
>         writel(DMC_MEMBASECONFIG1_VAL, &dmc->membaseconfig1);
>  }
>
> -void mem_ctrl_init()
> +void mem_ctrl_init(int mem_reset)
does 'reset' is enough?
>  {
>         struct spl_machine_param *param = spl_get_machine_params();
>         struct mem_timings *mem;
> @@ -185,7 +185,7 @@ void mem_ctrl_init()
>
>         /* If there are any other memory variant, add their init call below */
>         if (param->mem_type == DDR_MODE_DDR3) {
> -               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size);
> +               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size, mem_reset);
>                 if (ret) {
>                         /* will hang if failed to init memory control */
>                         while (1)
> diff --git a/board/samsung/smdk5250/dmc_init_ddr3.c b/board/samsung/smdk5250/dmc_init_ddr3.c
> index e050790..4e0693d 100644
> --- a/board/samsung/smdk5250/dmc_init_ddr3.c
> +++ b/board/samsung/smdk5250/dmc_init_ddr3.c
> @@ -40,7 +40,8 @@ static void reset_phy_ctrl(void)
>         writel(DDR3PHY_CTRL_PHY_RESET, &clk->lpddr3phy_ctrl);
>  }
>
> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
> +                       int mem_reset)
ditto
>  {
>         unsigned int val;
>         struct exynos5_phy_control *phy0_ctrl, *phy1_ctrl;
> @@ -51,7 +52,8 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
>         phy1_ctrl = (struct exynos5_phy_control *)EXYNOS5_DMC_PHY1_BASE;
>         dmc = (struct exynos5_dmc *)EXYNOS5_DMC_CTRL_BASE;
>
> -       reset_phy_ctrl();
> +       if (mem_reset)
if (reset)
> +               reset_phy_ctrl();
>
>         /* Set Impedance Output Driver */
>         val = (mem->impedance << CA_CK_DRVR_DS_OFFSET) |
> diff --git a/board/samsung/smdk5250/lowlevel_init.S b/board/samsung/smdk5250/lowlevel_init.S
> index bc6cb6f..469126d 100644
> --- a/board/samsung/smdk5250/lowlevel_init.S
> +++ b/board/samsung/smdk5250/lowlevel_init.S
> @@ -23,74 +23,13 @@
>   */
>
>  #include <config.h>
> -#include <version.h>
>  #include <asm/arch/cpu.h>
>
> -_TEXT_BASE:
> -       .word   CONFIG_SYS_TEXT_BASE
> -
>         .globl lowlevel_init
>  lowlevel_init:
> -
> -       /* use iRAM stack in bl2 */
> -       ldr     sp, =CONFIG_IRAM_STACK
> -       stmdb   r13!, {ip,lr}
> -
> -       /* check reset status */
> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM1_OFFSET)
> -       ldr     r1, [r0]
> -
> -       /* AFTR wakeup reset */
> -       ldr     r2, =S5P_CHECK_DIDLE
> -       cmp     r1, r2
> -       beq     exit_wakeup
> -
> -       /* LPA wakeup reset */
> -       ldr     r2, =S5P_CHECK_LPA
> -       cmp     r1, r2
> -       beq     exit_wakeup
> -
> -       /* Sleep wakeup reset */
> -       ldr     r2, =S5P_CHECK_SLEEP
> -       cmp     r1, r2
> -       beq     wakeup_reset
> -
>         /*
> -        * If U-boot is already running in RAM, no need to relocate U-Boot.
> -        * Memory controller must be configured before relocating U-Boot
> -        * in ram.
> +        * Set the stack pointer, although it will be overwriten by the caller
> +        * It seems we will not boot if this function is empty.
>          */
> -       ldr     r0, =0x0ffffff          /* r0 <- Mask Bits*/
> -       bic     r1, pc, r0              /* pc <- current addr of code */
> -                                       /* r1 <- unmasked bits of pc */
> -       ldr     r2, _TEXT_BASE          /* r2 <- original base addr in ram */
> -       bic     r2, r2, r0              /* r2 <- unmasked bits of r2*/
> -       cmp     r1, r2                  /* compare r1, r2 */
> -       beq     1f                      /* r0 == r1 then skip sdram init */
> -
> -       /* init system clock */
> -       bl      system_clock_init
> -
> -       /* Memory initialize */
> -       bl      mem_ctrl_init
> -
> -1:
> -       bl      tzpc_init
> -       ldmia   r13!, {ip,pc}
> -
> -wakeup_reset:
> -       bl      system_clock_init
> -       bl      mem_ctrl_init
> -       bl      tzpc_init
> -
> -exit_wakeup:
> -       /* Load return address and jump to kernel */
> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM0_OFFSET)
> -
> -       /* r1 = physical address of exynos5_cpu_resume function*/
> -       ldr     r1, [r0]
> -
> -       /* Jump to kernel */
> -       mov     pc, r1
> -       nop
> -       nop
> +       ldr     sp, =CONFIG_IRAM_STACK
> +       mov     pc, lr
> diff --git a/board/samsung/smdk5250/lowlevel_init_c.c b/board/samsung/smdk5250/lowlevel_init_c.c
> new file mode 100644
> index 0000000..fdb98cf
> --- /dev/null
> +++ b/board/samsung/smdk5250/lowlevel_init_c.c
lowlevel_init.c?
> @@ -0,0 +1,70 @@
> +/*
> + * Lowlevel setup for SMDK5250 board based on S5PC520
> + *
> + * Copyright (C) 2012 Samsung Electronics
> + * Copyright (c) 2012 The Chromium OS Authors.
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <config.h>
> +#include <asm/arch/cpu.h>
> +#include <asm/arch/dmc.h>
> +#include <asm/arch/power.h>
> +#include <asm/arch/tzpc.h>
> +#include "setup.h"
> +
> +/* These are the things we can do during low-level init */
> +enum {
> +       DO_WAKEUP       = 1 << 0,
> +       DO_CLOCKS       = 1 << 1,
> +       DO_MEM_RESET    = 1 << 2,
> +};
> +
> +int lowlevel_init_subsystems(void)
> +{
> +       uint32_t reset_status;
> +       int actions = 0;
> +
> +       arch_cpu_init();
> +
> +       reset_status = power_read_reset_status();
> +
> +       switch (reset_status) {
> +       case EXYNOS_CHECK_SLEEP:
> +               actions = DO_CLOCKS | DO_WAKEUP;
> +               break;
> +       case EXYNOS_CHECK_DIDLE:
> +       case EXYNOS_CHECK_LPA:
> +               actions = DO_WAKEUP;
> +               break;
> +       default:
> +               /* This is a normal boot (not a wake from sleep) */
> +               actions = DO_CLOCKS | DO_MEM_RESET;
> +       }
> +
> +       if (actions & DO_CLOCKS) {
> +               system_clock_init();
> +               mem_ctrl_init(actions & DO_MEM_RESET);
> +               tzpc_init();
> +       }
> +
> +       return actions & DO_WAKEUP;
> +}
> diff --git a/board/samsung/smdk5250/setup.h b/board/samsung/smdk5250/setup.h
> index a159601..d64e385 100644
> --- a/board/samsung/smdk5250/setup.h
> +++ b/board/samsung/smdk5250/setup.h
> @@ -28,6 +28,11 @@
>  #include <config.h>
>  #include <asm/arch/dmc.h>
>
> +/* Power Down Modes */
> +#define EXYNOS_CHECK_SLEEP     0x00000BAD
> +#define EXYNOS_CHECK_DIDLE     0xBAD00000
> +#define EXYNOS_CHECK_LPA       0xABAD0000
These can be uses other exynos5250 series. so can you place it common
header file?
> +
>  /* TZPC : Register Offsets */
>  #define TZPC0_BASE             0x10100000
>  #define TZPC1_BASE             0x10110000
> @@ -539,7 +544,8 @@ enum {
>   *                     accesses; may vary across boards.
>   * @return 0 if ok, SETUP_ERR_... if there is a problem
>   */
> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size);
> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
> +                       int mem_reset);
>
>  /*
>   * Configure ZQ I/O interface
> @@ -588,7 +594,14 @@ void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc);
>  void update_reset_dll(struct exynos5_dmc *, enum ddr_mode);
>
>  void sdelay(unsigned long);
> -void mem_ctrl_init(void);
> +void mem_ctrl_init(int mem_reset);
>  void system_clock_init(void);
>  void tzpc_init(void);
> +
> +/**
> + * Init subsystems according to the reset status
> + *
> + * @return 0 for a normal boot, non-zero for a resume
> + */
> +int lowlevel_init_subsystems(void);
do_lowlevle_init?

Thank you,
Kyungmin Park
>  #endif
> diff --git a/board/samsung/smdk5250/spl_boot.c b/board/samsung/smdk5250/spl_boot.c
> index d8f3c1e..66bce5b 100644
> --- a/board/samsung/smdk5250/spl_boot.c
> +++ b/board/samsung/smdk5250/spl_boot.c
> @@ -20,18 +20,16 @@
>   * MA 02111-1307 USA
>   */
>
> -#include<common.h>
> -#include<config.h>
> +#include <common.h>
> +#include <config.h>
> +#include <asm/arch/spl.h>
> +#include <asm/arch/cpu.h>
> +#include <asm/arch/power.h>
> +#include "setup.h"
>
> -enum boot_mode {
> -       BOOT_MODE_MMC = 4,
> -       BOOT_MODE_SERIAL = 20,
> -       /* Boot based on Operating Mode pin settings */
> -       BOOT_MODE_OM = 32,
> -       BOOT_MODE_USB,  /* Boot using USB download */
> -};
> +DECLARE_GLOBAL_DATA_PTR;
>
> -       typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
> +typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>
>  /*
>  * Copy U-boot from mmc to RAM:
> @@ -62,15 +60,49 @@ void copy_uboot_to_ram(void)
>         }
>  }
>
> +void memzero(void *s, size_t n)
> +{
> +       char *ptr = s;
> +       size_t i;
> +
> +       for (i = 0; i < n; i++)
> +               *ptr++ = '\0';
> +}
> +
> +/**
> + * Set up the U-Boot global_data pointer
> + *
> + * This sets the address of the global data, and sets up basic values.
> + *
> + * @param gdp   Value to give to gd
> + */
> +static void setup_global_data(gd_t *gdp)
> +{
> +       gd = gdp;
> +       memzero((void *)gd, sizeof(gd_t));
> +       gd->flags |= GD_FLG_RELOC;
> +       gd->baudrate = CONFIG_BAUDRATE;
> +       gd->have_console = 1;
> +}
> +
>  void board_init_f(unsigned long bootflag)
>  {
> +       __attribute__((aligned(8))) gd_t local_gd;
>         __attribute__((noreturn)) void (*uboot)(void);
> +
> +       setup_global_data(&local_gd);
> +
> +       if (lowlevel_init_subsystems())
> +               power_exit_wakeup();
> +
>         copy_uboot_to_ram();
>
>         /* Jump to U-Boot image */
>         uboot = (void *)CONFIG_SYS_TEXT_BASE;
>         (*uboot)();
> +
>         /* Never returns Here */
> +       panic("%s: u-boot jump failed", __func__);
>  }
>
>  /* Place Holders */
> diff --git a/spl/Makefile b/spl/Makefile
> index 6dbb105..3aab466 100644
> --- a/spl/Makefile
> +++ b/spl/Makefile
> @@ -86,6 +86,10 @@ ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
>  LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
>  endif
>
> +ifneq ($(CONFIG_EXYNOS4)$(CONFIG_EXYNOS5),)
> +LIBS-y += $(CPUDIR)/s5p-common/libs5p-common.o
> +endif
> +
>  ifeq ($(SOC),tegra20)
>  LIBS-y += arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
>  LIBS-y += arch/$(ARCH)/cpu/tegra-common/libcputegra-common.o
> --
> 1.7.4.4
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Rajeshwari Birje Jan. 2, 2013, 5:56 a.m. UTC | #4
Hi Kyungmin Park,

Thank you for comments.

On Mon, Dec 31, 2012 at 6:02 PM, Kyungmin Park <kmpark@infradead.org> wrote:
> On Fri, Dec 28, 2012 at 9:08 PM, Rajeshwari Shinde
> <rajeshwari.s@samsung.com> wrote:
>> This patch converts lowlevel_init.S to lowlevel_init_c.c for
>> SMDK5250.
>>
>> Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
>> ---
>>  board/samsung/smdk5250/Makefile          |    1 +
>>  board/samsung/smdk5250/dmc_common.c      |    4 +-
>>  board/samsung/smdk5250/dmc_init_ddr3.c   |    6 ++-
>>  board/samsung/smdk5250/lowlevel_init.S   |   69 ++---------------------------
>>  board/samsung/smdk5250/lowlevel_init_c.c |   70 ++++++++++++++++++++++++++++++
>>  board/samsung/smdk5250/setup.h           |   17 ++++++-
>>  board/samsung/smdk5250/spl_boot.c        |   52 ++++++++++++++++++----
>>  spl/Makefile                             |    4 ++
>>  8 files changed, 142 insertions(+), 81 deletions(-)
>>  create mode 100644 board/samsung/smdk5250/lowlevel_init_c.c
>>
>> diff --git a/board/samsung/smdk5250/Makefile b/board/samsung/smdk5250/Makefile
>> index 47c6a5a..b99ac7f 100644
>> --- a/board/samsung/smdk5250/Makefile
>> +++ b/board/samsung/smdk5250/Makefile
>> @@ -37,6 +37,7 @@ endif
>>
>>  ifdef CONFIG_SPL_BUILD
>>  COBJS  += spl_boot.o
>> +COBJS  += lowlevel_init_c.o
>>  endif
>>
>>  SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
>> diff --git a/board/samsung/smdk5250/dmc_common.c b/board/samsung/smdk5250/dmc_common.c
>> index 109602a..6a26822 100644
>> --- a/board/samsung/smdk5250/dmc_common.c
>> +++ b/board/samsung/smdk5250/dmc_common.c
>> @@ -175,7 +175,7 @@ void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc)
>>         writel(DMC_MEMBASECONFIG1_VAL, &dmc->membaseconfig1);
>>  }
>>
>> -void mem_ctrl_init()
>> +void mem_ctrl_init(int mem_reset)
> does 'reset' is enough?
- OK
>>  {
>>         struct spl_machine_param *param = spl_get_machine_params();
>>         struct mem_timings *mem;
>> @@ -185,7 +185,7 @@ void mem_ctrl_init()
>>
>>         /* If there are any other memory variant, add their init call below */
>>         if (param->mem_type == DDR_MODE_DDR3) {
>> -               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size);
>> +               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size, mem_reset);
>>                 if (ret) {
>>                         /* will hang if failed to init memory control */
>>                         while (1)
>> diff --git a/board/samsung/smdk5250/dmc_init_ddr3.c b/board/samsung/smdk5250/dmc_init_ddr3.c
>> index e050790..4e0693d 100644
>> --- a/board/samsung/smdk5250/dmc_init_ddr3.c
>> +++ b/board/samsung/smdk5250/dmc_init_ddr3.c
>> @@ -40,7 +40,8 @@ static void reset_phy_ctrl(void)
>>         writel(DDR3PHY_CTRL_PHY_RESET, &clk->lpddr3phy_ctrl);
>>  }
>>
>> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
>> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
>> +                       int mem_reset)
> ditto
-OK
>>  {
>>         unsigned int val;
>>         struct exynos5_phy_control *phy0_ctrl, *phy1_ctrl;
>> @@ -51,7 +52,8 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
>>         phy1_ctrl = (struct exynos5_phy_control *)EXYNOS5_DMC_PHY1_BASE;
>>         dmc = (struct exynos5_dmc *)EXYNOS5_DMC_CTRL_BASE;
>>
>> -       reset_phy_ctrl();
>> +       if (mem_reset)
> if (reset)
>> +               reset_phy_ctrl();
>>
>>         /* Set Impedance Output Driver */
>>         val = (mem->impedance << CA_CK_DRVR_DS_OFFSET) |
>> diff --git a/board/samsung/smdk5250/lowlevel_init.S b/board/samsung/smdk5250/lowlevel_init.S
>> index bc6cb6f..469126d 100644
>> --- a/board/samsung/smdk5250/lowlevel_init.S
>> +++ b/board/samsung/smdk5250/lowlevel_init.S
>> @@ -23,74 +23,13 @@
>>   */
>>
>>  #include <config.h>
>> -#include <version.h>
>>  #include <asm/arch/cpu.h>
>>
>> -_TEXT_BASE:
>> -       .word   CONFIG_SYS_TEXT_BASE
>> -
>>         .globl lowlevel_init
>>  lowlevel_init:
>> -
>> -       /* use iRAM stack in bl2 */
>> -       ldr     sp, =CONFIG_IRAM_STACK
>> -       stmdb   r13!, {ip,lr}
>> -
>> -       /* check reset status */
>> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM1_OFFSET)
>> -       ldr     r1, [r0]
>> -
>> -       /* AFTR wakeup reset */
>> -       ldr     r2, =S5P_CHECK_DIDLE
>> -       cmp     r1, r2
>> -       beq     exit_wakeup
>> -
>> -       /* LPA wakeup reset */
>> -       ldr     r2, =S5P_CHECK_LPA
>> -       cmp     r1, r2
>> -       beq     exit_wakeup
>> -
>> -       /* Sleep wakeup reset */
>> -       ldr     r2, =S5P_CHECK_SLEEP
>> -       cmp     r1, r2
>> -       beq     wakeup_reset
>> -
>>         /*
>> -        * If U-boot is already running in RAM, no need to relocate U-Boot.
>> -        * Memory controller must be configured before relocating U-Boot
>> -        * in ram.
>> +        * Set the stack pointer, although it will be overwriten by the caller
>> +        * It seems we will not boot if this function is empty.
>>          */
>> -       ldr     r0, =0x0ffffff          /* r0 <- Mask Bits*/
>> -       bic     r1, pc, r0              /* pc <- current addr of code */
>> -                                       /* r1 <- unmasked bits of pc */
>> -       ldr     r2, _TEXT_BASE          /* r2 <- original base addr in ram */
>> -       bic     r2, r2, r0              /* r2 <- unmasked bits of r2*/
>> -       cmp     r1, r2                  /* compare r1, r2 */
>> -       beq     1f                      /* r0 == r1 then skip sdram init */
>> -
>> -       /* init system clock */
>> -       bl      system_clock_init
>> -
>> -       /* Memory initialize */
>> -       bl      mem_ctrl_init
>> -
>> -1:
>> -       bl      tzpc_init
>> -       ldmia   r13!, {ip,pc}
>> -
>> -wakeup_reset:
>> -       bl      system_clock_init
>> -       bl      mem_ctrl_init
>> -       bl      tzpc_init
>> -
>> -exit_wakeup:
>> -       /* Load return address and jump to kernel */
>> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM0_OFFSET)
>> -
>> -       /* r1 = physical address of exynos5_cpu_resume function*/
>> -       ldr     r1, [r0]
>> -
>> -       /* Jump to kernel */
>> -       mov     pc, r1
>> -       nop
>> -       nop
>> +       ldr     sp, =CONFIG_IRAM_STACK
>> +       mov     pc, lr
>> diff --git a/board/samsung/smdk5250/lowlevel_init_c.c b/board/samsung/smdk5250/lowlevel_init_c.c
>> new file mode 100644
>> index 0000000..fdb98cf
>> --- /dev/null
>> +++ b/board/samsung/smdk5250/lowlevel_init_c.c
> lowlevel_init.c?
- We get multiple definition of `lowlevel_init' error if we name as
lowlevel_init.c.
>> @@ -0,0 +1,70 @@
>> +/*
>> + * Lowlevel setup for SMDK5250 board based on S5PC520
>> + *
>> + * Copyright (C) 2012 Samsung Electronics
>> + * Copyright (c) 2012 The Chromium OS Authors.
>> + *
>> + * See file CREDITS for list of people who contributed to this
>> + * project.
>> + *
>> + * This program is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU General Public License as
>> + * published by the Free Software Foundation; either version 2 of
>> + * the License, or (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>> + * MA 02111-1307 USA
>> + */
>> +
>> +#include <common.h>
>> +#include <config.h>
>> +#include <asm/arch/cpu.h>
>> +#include <asm/arch/dmc.h>
>> +#include <asm/arch/power.h>
>> +#include <asm/arch/tzpc.h>
>> +#include "setup.h"
>> +
>> +/* These are the things we can do during low-level init */
>> +enum {
>> +       DO_WAKEUP       = 1 << 0,
>> +       DO_CLOCKS       = 1 << 1,
>> +       DO_MEM_RESET    = 1 << 2,
>> +};
>> +
>> +int lowlevel_init_subsystems(void)
>> +{
>> +       uint32_t reset_status;
>> +       int actions = 0;
>> +
>> +       arch_cpu_init();
>> +
>> +       reset_status = power_read_reset_status();
>> +
>> +       switch (reset_status) {
>> +       case EXYNOS_CHECK_SLEEP:
>> +               actions = DO_CLOCKS | DO_WAKEUP;
>> +               break;
>> +       case EXYNOS_CHECK_DIDLE:
>> +       case EXYNOS_CHECK_LPA:
>> +               actions = DO_WAKEUP;
>> +               break;
>> +       default:
>> +               /* This is a normal boot (not a wake from sleep) */
>> +               actions = DO_CLOCKS | DO_MEM_RESET;
>> +       }
>> +
>> +       if (actions & DO_CLOCKS) {
>> +               system_clock_init();
>> +               mem_ctrl_init(actions & DO_MEM_RESET);
>> +               tzpc_init();
>> +       }
>> +
>> +       return actions & DO_WAKEUP;
>> +}
>> diff --git a/board/samsung/smdk5250/setup.h b/board/samsung/smdk5250/setup.h
>> index a159601..d64e385 100644
>> --- a/board/samsung/smdk5250/setup.h
>> +++ b/board/samsung/smdk5250/setup.h
>> @@ -28,6 +28,11 @@
>>  #include <config.h>
>>  #include <asm/arch/dmc.h>
>>
>> +/* Power Down Modes */
>> +#define EXYNOS_CHECK_SLEEP     0x00000BAD
>> +#define EXYNOS_CHECK_DIDLE     0xBAD00000
>> +#define EXYNOS_CHECK_LPA       0xABAD0000
> These can be uses other exynos5250 series. so can you place it common
> header file?
- Would it be ok if I place this in arch/arm/include/asm/arch-exynos/power.h ?
>> +
>>  /* TZPC : Register Offsets */
>>  #define TZPC0_BASE             0x10100000
>>  #define TZPC1_BASE             0x10110000
>> @@ -539,7 +544,8 @@ enum {
>>   *                     accesses; may vary across boards.
>>   * @return 0 if ok, SETUP_ERR_... if there is a problem
>>   */
>> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size);
>> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
>> +                       int mem_reset);
>>
>>  /*
>>   * Configure ZQ I/O interface
>> @@ -588,7 +594,14 @@ void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc);
>>  void update_reset_dll(struct exynos5_dmc *, enum ddr_mode);
>>
>>  void sdelay(unsigned long);
>> -void mem_ctrl_init(void);
>> +void mem_ctrl_init(int mem_reset);
>>  void system_clock_init(void);
>>  void tzpc_init(void);
>> +
>> +/**
>> + * Init subsystems according to the reset status
>> + *
>> + * @return 0 for a normal boot, non-zero for a resume
>> + */
>> +int lowlevel_init_subsystems(void);
> do_lowlevle_init?
- OK
>
> Thank you,
> Kyungmin Park
>>  #endif
>> diff --git a/board/samsung/smdk5250/spl_boot.c b/board/samsung/smdk5250/spl_boot.c
>> index d8f3c1e..66bce5b 100644
>> --- a/board/samsung/smdk5250/spl_boot.c
>> +++ b/board/samsung/smdk5250/spl_boot.c
>> @@ -20,18 +20,16 @@
>>   * MA 02111-1307 USA
>>   */
>>
>> -#include<common.h>
>> -#include<config.h>
>> +#include <common.h>
>> +#include <config.h>
>> +#include <asm/arch/spl.h>
>> +#include <asm/arch/cpu.h>
>> +#include <asm/arch/power.h>
>> +#include "setup.h"
>>
>> -enum boot_mode {
>> -       BOOT_MODE_MMC = 4,
>> -       BOOT_MODE_SERIAL = 20,
>> -       /* Boot based on Operating Mode pin settings */
>> -       BOOT_MODE_OM = 32,
>> -       BOOT_MODE_USB,  /* Boot using USB download */
>> -};
>> +DECLARE_GLOBAL_DATA_PTR;
>>
>> -       typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>> +typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>>
>>  /*
>>  * Copy U-boot from mmc to RAM:
>> @@ -62,15 +60,49 @@ void copy_uboot_to_ram(void)
>>         }
>>  }
>>
>> +void memzero(void *s, size_t n)
>> +{
>> +       char *ptr = s;
>> +       size_t i;
>> +
>> +       for (i = 0; i < n; i++)
>> +               *ptr++ = '\0';
>> +}
>> +
>> +/**
>> + * Set up the U-Boot global_data pointer
>> + *
>> + * This sets the address of the global data, and sets up basic values.
>> + *
>> + * @param gdp   Value to give to gd
>> + */
>> +static void setup_global_data(gd_t *gdp)
>> +{
>> +       gd = gdp;
>> +       memzero((void *)gd, sizeof(gd_t));
>> +       gd->flags |= GD_FLG_RELOC;
>> +       gd->baudrate = CONFIG_BAUDRATE;
>> +       gd->have_console = 1;
>> +}
>> +
>>  void board_init_f(unsigned long bootflag)
>>  {
>> +       __attribute__((aligned(8))) gd_t local_gd;
>>         __attribute__((noreturn)) void (*uboot)(void);
>> +
>> +       setup_global_data(&local_gd);
>> +
>> +       if (lowlevel_init_subsystems())
>> +               power_exit_wakeup();
>> +
>>         copy_uboot_to_ram();
>>
>>         /* Jump to U-Boot image */
>>         uboot = (void *)CONFIG_SYS_TEXT_BASE;
>>         (*uboot)();
>> +
>>         /* Never returns Here */
>> +       panic("%s: u-boot jump failed", __func__);
>>  }
>>
>>  /* Place Holders */
>> diff --git a/spl/Makefile b/spl/Makefile
>> index 6dbb105..3aab466 100644
>> --- a/spl/Makefile
>> +++ b/spl/Makefile
>> @@ -86,6 +86,10 @@ ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
>>  LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
>>  endif
>>
>> +ifneq ($(CONFIG_EXYNOS4)$(CONFIG_EXYNOS5),)
>> +LIBS-y += $(CPUDIR)/s5p-common/libs5p-common.o
>> +endif
>> +
>>  ifeq ($(SOC),tegra20)
>>  LIBS-y += arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
>>  LIBS-y += arch/$(ARCH)/cpu/tegra-common/libcputegra-common.o
>> --
>> 1.7.4.4
>>
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot@lists.denx.de
>> http://lists.denx.de/mailman/listinfo/u-boot
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Kyungmin Park Jan. 2, 2013, 6:18 a.m. UTC | #5
Hi,

On 1/2/13, Rajeshwari Birje <rajeshwari.birje@gmail.com> wrote:
> Hi Kyungmin Park,
>
> Thank you for comments.
>
> On Mon, Dec 31, 2012 at 6:02 PM, Kyungmin Park <kmpark@infradead.org>
> wrote:
>> On Fri, Dec 28, 2012 at 9:08 PM, Rajeshwari Shinde
>> <rajeshwari.s@samsung.com> wrote:
>>> This patch converts lowlevel_init.S to lowlevel_init_c.c for
>>> SMDK5250.
>>>
>>> Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
>>> ---
>>>  board/samsung/smdk5250/Makefile          |    1 +
>>>  board/samsung/smdk5250/dmc_common.c      |    4 +-
>>>  board/samsung/smdk5250/dmc_init_ddr3.c   |    6 ++-
>>>  board/samsung/smdk5250/lowlevel_init.S   |   69
>>> ++---------------------------
>>>  board/samsung/smdk5250/lowlevel_init_c.c |   70
>>> ++++++++++++++++++++++++++++++
>>>  board/samsung/smdk5250/setup.h           |   17 ++++++-
>>>  board/samsung/smdk5250/spl_boot.c        |   52 ++++++++++++++++++----
>>>  spl/Makefile                             |    4 ++
>>>  8 files changed, 142 insertions(+), 81 deletions(-)
>>>  create mode 100644 board/samsung/smdk5250/lowlevel_init_c.c
>>>
>>> diff --git a/board/samsung/smdk5250/Makefile
>>> b/board/samsung/smdk5250/Makefile
>>> index 47c6a5a..b99ac7f 100644
>>> --- a/board/samsung/smdk5250/Makefile
>>> +++ b/board/samsung/smdk5250/Makefile
>>> @@ -37,6 +37,7 @@ endif
>>>
>>>  ifdef CONFIG_SPL_BUILD
>>>  COBJS  += spl_boot.o
>>> +COBJS  += lowlevel_init_c.o
>>>  endif
>>>
>>>  SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
>>> diff --git a/board/samsung/smdk5250/dmc_common.c
>>> b/board/samsung/smdk5250/dmc_common.c
>>> index 109602a..6a26822 100644
>>> --- a/board/samsung/smdk5250/dmc_common.c
>>> +++ b/board/samsung/smdk5250/dmc_common.c
>>> @@ -175,7 +175,7 @@ void dmc_config_memory(struct mem_timings *mem,
>>> struct exynos5_dmc *dmc)
>>>         writel(DMC_MEMBASECONFIG1_VAL, &dmc->membaseconfig1);
>>>  }
>>>
>>> -void mem_ctrl_init()
>>> +void mem_ctrl_init(int mem_reset)
>> does 'reset' is enough?
> - OK
>>>  {
>>>         struct spl_machine_param *param = spl_get_machine_params();
>>>         struct mem_timings *mem;
>>> @@ -185,7 +185,7 @@ void mem_ctrl_init()
>>>
>>>         /* If there are any other memory variant, add their init call
>>> below */
>>>         if (param->mem_type == DDR_MODE_DDR3) {
>>> -               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size);
>>> +               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size,
>>> mem_reset);
>>>                 if (ret) {
>>>                         /* will hang if failed to init memory control */
>>>                         while (1)
>>> diff --git a/board/samsung/smdk5250/dmc_init_ddr3.c
>>> b/board/samsung/smdk5250/dmc_init_ddr3.c
>>> index e050790..4e0693d 100644
>>> --- a/board/samsung/smdk5250/dmc_init_ddr3.c
>>> +++ b/board/samsung/smdk5250/dmc_init_ddr3.c
>>> @@ -40,7 +40,8 @@ static void reset_phy_ctrl(void)
>>>         writel(DDR3PHY_CTRL_PHY_RESET, &clk->lpddr3phy_ctrl);
>>>  }
>>>
>>> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>> mem_iv_size)
>>> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>> mem_iv_size,
>>> +                       int mem_reset)
>> ditto
> -OK
>>>  {
>>>         unsigned int val;
>>>         struct exynos5_phy_control *phy0_ctrl, *phy1_ctrl;
>>> @@ -51,7 +52,8 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem,
>>> unsigned long mem_iv_size)
>>>         phy1_ctrl = (struct exynos5_phy_control *)EXYNOS5_DMC_PHY1_BASE;
>>>         dmc = (struct exynos5_dmc *)EXYNOS5_DMC_CTRL_BASE;
>>>
>>> -       reset_phy_ctrl();
>>> +       if (mem_reset)
>> if (reset)
>>> +               reset_phy_ctrl();
>>>
>>>         /* Set Impedance Output Driver */
>>>         val = (mem->impedance << CA_CK_DRVR_DS_OFFSET) |
>>> diff --git a/board/samsung/smdk5250/lowlevel_init.S
>>> b/board/samsung/smdk5250/lowlevel_init.S
>>> index bc6cb6f..469126d 100644
>>> --- a/board/samsung/smdk5250/lowlevel_init.S
>>> +++ b/board/samsung/smdk5250/lowlevel_init.S
>>> @@ -23,74 +23,13 @@
>>>   */
>>>
>>>  #include <config.h>
>>> -#include <version.h>
>>>  #include <asm/arch/cpu.h>
>>>
>>> -_TEXT_BASE:
>>> -       .word   CONFIG_SYS_TEXT_BASE
>>> -
>>>         .globl lowlevel_init
>>>  lowlevel_init:
>>> -
>>> -       /* use iRAM stack in bl2 */
>>> -       ldr     sp, =CONFIG_IRAM_STACK
>>> -       stmdb   r13!, {ip,lr}
>>> -
>>> -       /* check reset status */
>>> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM1_OFFSET)
>>> -       ldr     r1, [r0]
>>> -
>>> -       /* AFTR wakeup reset */
>>> -       ldr     r2, =S5P_CHECK_DIDLE
>>> -       cmp     r1, r2
>>> -       beq     exit_wakeup
>>> -
>>> -       /* LPA wakeup reset */
>>> -       ldr     r2, =S5P_CHECK_LPA
>>> -       cmp     r1, r2
>>> -       beq     exit_wakeup
>>> -
>>> -       /* Sleep wakeup reset */
>>> -       ldr     r2, =S5P_CHECK_SLEEP
>>> -       cmp     r1, r2
>>> -       beq     wakeup_reset
>>> -
>>>         /*
>>> -        * If U-boot is already running in RAM, no need to relocate
>>> U-Boot.
>>> -        * Memory controller must be configured before relocating U-Boot
>>> -        * in ram.
>>> +        * Set the stack pointer, although it will be overwriten by the
>>> caller
>>> +        * It seems we will not boot if this function is empty.
>>>          */
>>> -       ldr     r0, =0x0ffffff          /* r0 <- Mask Bits*/
>>> -       bic     r1, pc, r0              /* pc <- current addr of code */
>>> -                                       /* r1 <- unmasked bits of pc */
>>> -       ldr     r2, _TEXT_BASE          /* r2 <- original base addr in
>>> ram */
>>> -       bic     r2, r2, r0              /* r2 <- unmasked bits of r2*/
>>> -       cmp     r1, r2                  /* compare r1, r2 */
>>> -       beq     1f                      /* r0 == r1 then skip sdram init
>>> */
>>> -
>>> -       /* init system clock */
>>> -       bl      system_clock_init
>>> -
>>> -       /* Memory initialize */
>>> -       bl      mem_ctrl_init
>>> -
>>> -1:
>>> -       bl      tzpc_init
>>> -       ldmia   r13!, {ip,pc}
>>> -
>>> -wakeup_reset:
>>> -       bl      system_clock_init
>>> -       bl      mem_ctrl_init
>>> -       bl      tzpc_init
>>> -
>>> -exit_wakeup:
>>> -       /* Load return address and jump to kernel */
>>> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM0_OFFSET)
>>> -
>>> -       /* r1 = physical address of exynos5_cpu_resume function*/
>>> -       ldr     r1, [r0]
>>> -
>>> -       /* Jump to kernel */
>>> -       mov     pc, r1
>>> -       nop
>>> -       nop
>>> +       ldr     sp, =CONFIG_IRAM_STACK
>>> +       mov     pc, lr
>>> diff --git a/board/samsung/smdk5250/lowlevel_init_c.c
>>> b/board/samsung/smdk5250/lowlevel_init_c.c
>>> new file mode 100644
>>> index 0000000..fdb98cf
>>> --- /dev/null
>>> +++ b/board/samsung/smdk5250/lowlevel_init_c.c
>> lowlevel_init.c?
> - We get multiple definition of `lowlevel_init' error if we name as
> lowlevel_init.c.
It's filename, and function name is used as do_lowlevel_init. doesn't it?
>>> @@ -0,0 +1,70 @@
>>> +/*
>>> + * Lowlevel setup for SMDK5250 board based on S5PC520
>>> + *
>>> + * Copyright (C) 2012 Samsung Electronics
>>> + * Copyright (c) 2012 The Chromium OS Authors.
>>> + *
>>> + * See file CREDITS for list of people who contributed to this
>>> + * project.
>>> + *
>>> + * This program is free software; you can redistribute it and/or
>>> + * modify it under the terms of the GNU General Public License as
>>> + * published by the Free Software Foundation; either version 2 of
>>> + * the License, or (at your option) any later version.
>>> + *
>>> + * This program is distributed in the hope that it will be useful,
>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> + * GNU General Public License for more details.
>>> + *
>>> + * You should have received a copy of the GNU General Public License
>>> + * along with this program; if not, write to the Free Software
>>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>>> + * MA 02111-1307 USA
>>> + */
>>> +
>>> +#include <common.h>
>>> +#include <config.h>
>>> +#include <asm/arch/cpu.h>
>>> +#include <asm/arch/dmc.h>
>>> +#include <asm/arch/power.h>
>>> +#include <asm/arch/tzpc.h>
>>> +#include "setup.h"
>>> +
>>> +/* These are the things we can do during low-level init */
>>> +enum {
>>> +       DO_WAKEUP       = 1 << 0,
>>> +       DO_CLOCKS       = 1 << 1,
>>> +       DO_MEM_RESET    = 1 << 2,
>>> +};
>>> +
>>> +int lowlevel_init_subsystems(void)
>>> +{
>>> +       uint32_t reset_status;
>>> +       int actions = 0;
>>> +
>>> +       arch_cpu_init();
>>> +
>>> +       reset_status = power_read_reset_status();
>>> +
>>> +       switch (reset_status) {
>>> +       case EXYNOS_CHECK_SLEEP:
>>> +               actions = DO_CLOCKS | DO_WAKEUP;
>>> +               break;
>>> +       case EXYNOS_CHECK_DIDLE:
>>> +       case EXYNOS_CHECK_LPA:
>>> +               actions = DO_WAKEUP;
>>> +               break;
>>> +       default:
>>> +               /* This is a normal boot (not a wake from sleep) */
>>> +               actions = DO_CLOCKS | DO_MEM_RESET;
>>> +       }
>>> +
>>> +       if (actions & DO_CLOCKS) {
>>> +               system_clock_init();
>>> +               mem_ctrl_init(actions & DO_MEM_RESET);
>>> +               tzpc_init();
>>> +       }
>>> +
>>> +       return actions & DO_WAKEUP;
>>> +}
>>> diff --git a/board/samsung/smdk5250/setup.h
>>> b/board/samsung/smdk5250/setup.h
>>> index a159601..d64e385 100644
>>> --- a/board/samsung/smdk5250/setup.h
>>> +++ b/board/samsung/smdk5250/setup.h
>>> @@ -28,6 +28,11 @@
>>>  #include <config.h>
>>>  #include <asm/arch/dmc.h>
>>>
>>> +/* Power Down Modes */
>>> +#define EXYNOS_CHECK_SLEEP     0x00000BAD
>>> +#define EXYNOS_CHECK_DIDLE     0xBAD00000
>>> +#define EXYNOS_CHECK_LPA       0xABAD0000
>> These can be uses other exynos5250 series. so can you place it common
>> header file?
> - Would it be ok if I place this in arch/arm/include/asm/arch-exynos/power.h
> ?
yes, and proper prefix, EXYNOS5 or EXYNOS5250. BTW can be use it at
exynos4 series?

Thank you,
Kyungmin Park
>>> +
>>>  /* TZPC : Register Offsets */
>>>  #define TZPC0_BASE             0x10100000
>>>  #define TZPC1_BASE             0x10110000
>>> @@ -539,7 +544,8 @@ enum {
>>>   *                     accesses; may vary across boards.
>>>   * @return 0 if ok, SETUP_ERR_... if there is a problem
>>>   */
>>> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>> mem_iv_size);
>>> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>> mem_iv_size,
>>> +                       int mem_reset);
>>>
>>>  /*
>>>   * Configure ZQ I/O interface
>>> @@ -588,7 +594,14 @@ void dmc_config_memory(struct mem_timings *mem,
>>> struct exynos5_dmc *dmc);
>>>  void update_reset_dll(struct exynos5_dmc *, enum ddr_mode);
>>>
>>>  void sdelay(unsigned long);
>>> -void mem_ctrl_init(void);
>>> +void mem_ctrl_init(int mem_reset);
>>>  void system_clock_init(void);
>>>  void tzpc_init(void);
>>> +
>>> +/**
>>> + * Init subsystems according to the reset status
>>> + *
>>> + * @return 0 for a normal boot, non-zero for a resume
>>> + */
>>> +int lowlevel_init_subsystems(void);
>> do_lowlevle_init?
> - OK
>>
>> Thank you,
>> Kyungmin Park
>>>  #endif
>>> diff --git a/board/samsung/smdk5250/spl_boot.c
>>> b/board/samsung/smdk5250/spl_boot.c
>>> index d8f3c1e..66bce5b 100644
>>> --- a/board/samsung/smdk5250/spl_boot.c
>>> +++ b/board/samsung/smdk5250/spl_boot.c
>>> @@ -20,18 +20,16 @@
>>>   * MA 02111-1307 USA
>>>   */
>>>
>>> -#include<common.h>
>>> -#include<config.h>
>>> +#include <common.h>
>>> +#include <config.h>
>>> +#include <asm/arch/spl.h>
>>> +#include <asm/arch/cpu.h>
>>> +#include <asm/arch/power.h>
>>> +#include "setup.h"
>>>
>>> -enum boot_mode {
>>> -       BOOT_MODE_MMC = 4,
>>> -       BOOT_MODE_SERIAL = 20,
>>> -       /* Boot based on Operating Mode pin settings */
>>> -       BOOT_MODE_OM = 32,
>>> -       BOOT_MODE_USB,  /* Boot using USB download */
>>> -};
>>> +DECLARE_GLOBAL_DATA_PTR;
>>>
>>> -       typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>>> +typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>>>
>>>  /*
>>>  * Copy U-boot from mmc to RAM:
>>> @@ -62,15 +60,49 @@ void copy_uboot_to_ram(void)
>>>         }
>>>  }
>>>
>>> +void memzero(void *s, size_t n)
>>> +{
>>> +       char *ptr = s;
>>> +       size_t i;
>>> +
>>> +       for (i = 0; i < n; i++)
>>> +               *ptr++ = '\0';
>>> +}
>>> +
>>> +/**
>>> + * Set up the U-Boot global_data pointer
>>> + *
>>> + * This sets the address of the global data, and sets up basic values.
>>> + *
>>> + * @param gdp   Value to give to gd
>>> + */
>>> +static void setup_global_data(gd_t *gdp)
>>> +{
>>> +       gd = gdp;
>>> +       memzero((void *)gd, sizeof(gd_t));
>>> +       gd->flags |= GD_FLG_RELOC;
>>> +       gd->baudrate = CONFIG_BAUDRATE;
>>> +       gd->have_console = 1;
>>> +}
>>> +
>>>  void board_init_f(unsigned long bootflag)
>>>  {
>>> +       __attribute__((aligned(8))) gd_t local_gd;
>>>         __attribute__((noreturn)) void (*uboot)(void);
>>> +
>>> +       setup_global_data(&local_gd);
>>> +
>>> +       if (lowlevel_init_subsystems())
>>> +               power_exit_wakeup();
>>> +
>>>         copy_uboot_to_ram();
>>>
>>>         /* Jump to U-Boot image */
>>>         uboot = (void *)CONFIG_SYS_TEXT_BASE;
>>>         (*uboot)();
>>> +
>>>         /* Never returns Here */
>>> +       panic("%s: u-boot jump failed", __func__);
>>>  }
>>>
>>>  /* Place Holders */
>>> diff --git a/spl/Makefile b/spl/Makefile
>>> index 6dbb105..3aab466 100644
>>> --- a/spl/Makefile
>>> +++ b/spl/Makefile
>>> @@ -86,6 +86,10 @@ ifneq
>>> ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
>>>  LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
>>>  endif
>>>
>>> +ifneq ($(CONFIG_EXYNOS4)$(CONFIG_EXYNOS5),)
>>> +LIBS-y += $(CPUDIR)/s5p-common/libs5p-common.o
>>> +endif
>>> +
>>>  ifeq ($(SOC),tegra20)
>>>  LIBS-y += arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
>>>  LIBS-y += arch/$(ARCH)/cpu/tegra-common/libcputegra-common.o
>>> --
>>> 1.7.4.4
>>>
>>> _______________________________________________
>>> U-Boot mailing list
>>> U-Boot@lists.denx.de
>>> http://lists.denx.de/mailman/listinfo/u-boot
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot@lists.denx.de
>> http://lists.denx.de/mailman/listinfo/u-boot
>
>
>
> --
> Regards,
> Rajeshwari Shinde
>
Rajeshwari Birje Jan. 2, 2013, 6:34 a.m. UTC | #6
Hi Kyungmin Park,

On Wed, Jan 2, 2013 at 11:48 AM, Kyungmin Park <kmpark@infradead.org> wrote:
> Hi,
>
> On 1/2/13, Rajeshwari Birje <rajeshwari.birje@gmail.com> wrote:
>> Hi Kyungmin Park,
>>
>> Thank you for comments.
>>
>> On Mon, Dec 31, 2012 at 6:02 PM, Kyungmin Park <kmpark@infradead.org>
>> wrote:
>>> On Fri, Dec 28, 2012 at 9:08 PM, Rajeshwari Shinde
>>> <rajeshwari.s@samsung.com> wrote:
>>>> This patch converts lowlevel_init.S to lowlevel_init_c.c for
>>>> SMDK5250.
>>>>
>>>> Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
>>>> ---
>>>>  board/samsung/smdk5250/Makefile          |    1 +
>>>>  board/samsung/smdk5250/dmc_common.c      |    4 +-
>>>>  board/samsung/smdk5250/dmc_init_ddr3.c   |    6 ++-
>>>>  board/samsung/smdk5250/lowlevel_init.S   |   69
>>>> ++---------------------------
>>>>  board/samsung/smdk5250/lowlevel_init_c.c |   70
>>>> ++++++++++++++++++++++++++++++
>>>>  board/samsung/smdk5250/setup.h           |   17 ++++++-
>>>>  board/samsung/smdk5250/spl_boot.c        |   52 ++++++++++++++++++----
>>>>  spl/Makefile                             |    4 ++
>>>>  8 files changed, 142 insertions(+), 81 deletions(-)
>>>>  create mode 100644 board/samsung/smdk5250/lowlevel_init_c.c
>>>>
>>>> diff --git a/board/samsung/smdk5250/Makefile
>>>> b/board/samsung/smdk5250/Makefile
>>>> index 47c6a5a..b99ac7f 100644
>>>> --- a/board/samsung/smdk5250/Makefile
>>>> +++ b/board/samsung/smdk5250/Makefile
>>>> @@ -37,6 +37,7 @@ endif
>>>>
>>>>  ifdef CONFIG_SPL_BUILD
>>>>  COBJS  += spl_boot.o
>>>> +COBJS  += lowlevel_init_c.o
>>>>  endif
>>>>
>>>>  SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
>>>> diff --git a/board/samsung/smdk5250/dmc_common.c
>>>> b/board/samsung/smdk5250/dmc_common.c
>>>> index 109602a..6a26822 100644
>>>> --- a/board/samsung/smdk5250/dmc_common.c
>>>> +++ b/board/samsung/smdk5250/dmc_common.c
>>>> @@ -175,7 +175,7 @@ void dmc_config_memory(struct mem_timings *mem,
>>>> struct exynos5_dmc *dmc)
>>>>         writel(DMC_MEMBASECONFIG1_VAL, &dmc->membaseconfig1);
>>>>  }
>>>>
>>>> -void mem_ctrl_init()
>>>> +void mem_ctrl_init(int mem_reset)
>>> does 'reset' is enough?
>> - OK
>>>>  {
>>>>         struct spl_machine_param *param = spl_get_machine_params();
>>>>         struct mem_timings *mem;
>>>> @@ -185,7 +185,7 @@ void mem_ctrl_init()
>>>>
>>>>         /* If there are any other memory variant, add their init call
>>>> below */
>>>>         if (param->mem_type == DDR_MODE_DDR3) {
>>>> -               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size);
>>>> +               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size,
>>>> mem_reset);
>>>>                 if (ret) {
>>>>                         /* will hang if failed to init memory control */
>>>>                         while (1)
>>>> diff --git a/board/samsung/smdk5250/dmc_init_ddr3.c
>>>> b/board/samsung/smdk5250/dmc_init_ddr3.c
>>>> index e050790..4e0693d 100644
>>>> --- a/board/samsung/smdk5250/dmc_init_ddr3.c
>>>> +++ b/board/samsung/smdk5250/dmc_init_ddr3.c
>>>> @@ -40,7 +40,8 @@ static void reset_phy_ctrl(void)
>>>>         writel(DDR3PHY_CTRL_PHY_RESET, &clk->lpddr3phy_ctrl);
>>>>  }
>>>>
>>>> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>>> mem_iv_size)
>>>> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>>> mem_iv_size,
>>>> +                       int mem_reset)
>>> ditto
>> -OK
>>>>  {
>>>>         unsigned int val;
>>>>         struct exynos5_phy_control *phy0_ctrl, *phy1_ctrl;
>>>> @@ -51,7 +52,8 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem,
>>>> unsigned long mem_iv_size)
>>>>         phy1_ctrl = (struct exynos5_phy_control *)EXYNOS5_DMC_PHY1_BASE;
>>>>         dmc = (struct exynos5_dmc *)EXYNOS5_DMC_CTRL_BASE;
>>>>
>>>> -       reset_phy_ctrl();
>>>> +       if (mem_reset)
>>> if (reset)
>>>> +               reset_phy_ctrl();
>>>>
>>>>         /* Set Impedance Output Driver */
>>>>         val = (mem->impedance << CA_CK_DRVR_DS_OFFSET) |
>>>> diff --git a/board/samsung/smdk5250/lowlevel_init.S
>>>> b/board/samsung/smdk5250/lowlevel_init.S
>>>> index bc6cb6f..469126d 100644
>>>> --- a/board/samsung/smdk5250/lowlevel_init.S
>>>> +++ b/board/samsung/smdk5250/lowlevel_init.S
>>>> @@ -23,74 +23,13 @@
>>>>   */
>>>>
>>>>  #include <config.h>
>>>> -#include <version.h>
>>>>  #include <asm/arch/cpu.h>
>>>>
>>>> -_TEXT_BASE:
>>>> -       .word   CONFIG_SYS_TEXT_BASE
>>>> -
>>>>         .globl lowlevel_init
>>>>  lowlevel_init:
>>>> -
>>>> -       /* use iRAM stack in bl2 */
>>>> -       ldr     sp, =CONFIG_IRAM_STACK
>>>> -       stmdb   r13!, {ip,lr}
>>>> -
>>>> -       /* check reset status */
>>>> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM1_OFFSET)
>>>> -       ldr     r1, [r0]
>>>> -
>>>> -       /* AFTR wakeup reset */
>>>> -       ldr     r2, =S5P_CHECK_DIDLE
>>>> -       cmp     r1, r2
>>>> -       beq     exit_wakeup
>>>> -
>>>> -       /* LPA wakeup reset */
>>>> -       ldr     r2, =S5P_CHECK_LPA
>>>> -       cmp     r1, r2
>>>> -       beq     exit_wakeup
>>>> -
>>>> -       /* Sleep wakeup reset */
>>>> -       ldr     r2, =S5P_CHECK_SLEEP
>>>> -       cmp     r1, r2
>>>> -       beq     wakeup_reset
>>>> -
>>>>         /*
>>>> -        * If U-boot is already running in RAM, no need to relocate
>>>> U-Boot.
>>>> -        * Memory controller must be configured before relocating U-Boot
>>>> -        * in ram.
>>>> +        * Set the stack pointer, although it will be overwriten by the
>>>> caller
>>>> +        * It seems we will not boot if this function is empty.
>>>>          */
>>>> -       ldr     r0, =0x0ffffff          /* r0 <- Mask Bits*/
>>>> -       bic     r1, pc, r0              /* pc <- current addr of code */
>>>> -                                       /* r1 <- unmasked bits of pc */
>>>> -       ldr     r2, _TEXT_BASE          /* r2 <- original base addr in
>>>> ram */
>>>> -       bic     r2, r2, r0              /* r2 <- unmasked bits of r2*/
>>>> -       cmp     r1, r2                  /* compare r1, r2 */
>>>> -       beq     1f                      /* r0 == r1 then skip sdram init
>>>> */
>>>> -
>>>> -       /* init system clock */
>>>> -       bl      system_clock_init
>>>> -
>>>> -       /* Memory initialize */
>>>> -       bl      mem_ctrl_init
>>>> -
>>>> -1:
>>>> -       bl      tzpc_init
>>>> -       ldmia   r13!, {ip,pc}
>>>> -
>>>> -wakeup_reset:
>>>> -       bl      system_clock_init
>>>> -       bl      mem_ctrl_init
>>>> -       bl      tzpc_init
>>>> -
>>>> -exit_wakeup:
>>>> -       /* Load return address and jump to kernel */
>>>> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM0_OFFSET)
>>>> -
>>>> -       /* r1 = physical address of exynos5_cpu_resume function*/
>>>> -       ldr     r1, [r0]
>>>> -
>>>> -       /* Jump to kernel */
>>>> -       mov     pc, r1
>>>> -       nop
>>>> -       nop
>>>> +       ldr     sp, =CONFIG_IRAM_STACK
>>>> +       mov     pc, lr
>>>> diff --git a/board/samsung/smdk5250/lowlevel_init_c.c
>>>> b/board/samsung/smdk5250/lowlevel_init_c.c
>>>> new file mode 100644
>>>> index 0000000..fdb98cf
>>>> --- /dev/null
>>>> +++ b/board/samsung/smdk5250/lowlevel_init_c.c
>>> lowlevel_init.c?
>> - We get multiple definition of `lowlevel_init' error if we name as
>> lowlevel_init.c.
> It's filename, and function name is used as do_lowlevel_init. doesn't it?
- Yes but we also have a lowlevel_init.S which will have a object file
lowlevel_init.o and if we name file as lowlevel_init.c it will also
have lowlevel_init.o and it will lead to error.
>>>> @@ -0,0 +1,70 @@
>>>> +/*
>>>> + * Lowlevel setup for SMDK5250 board based on S5PC520
>>>> + *
>>>> + * Copyright (C) 2012 Samsung Electronics
>>>> + * Copyright (c) 2012 The Chromium OS Authors.
>>>> + *
>>>> + * See file CREDITS for list of people who contributed to this
>>>> + * project.
>>>> + *
>>>> + * This program is free software; you can redistribute it and/or
>>>> + * modify it under the terms of the GNU General Public License as
>>>> + * published by the Free Software Foundation; either version 2 of
>>>> + * the License, or (at your option) any later version.
>>>> + *
>>>> + * This program is distributed in the hope that it will be useful,
>>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>>> + * GNU General Public License for more details.
>>>> + *
>>>> + * You should have received a copy of the GNU General Public License
>>>> + * along with this program; if not, write to the Free Software
>>>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>>>> + * MA 02111-1307 USA
>>>> + */
>>>> +
>>>> +#include <common.h>
>>>> +#include <config.h>
>>>> +#include <asm/arch/cpu.h>
>>>> +#include <asm/arch/dmc.h>
>>>> +#include <asm/arch/power.h>
>>>> +#include <asm/arch/tzpc.h>
>>>> +#include "setup.h"
>>>> +
>>>> +/* These are the things we can do during low-level init */
>>>> +enum {
>>>> +       DO_WAKEUP       = 1 << 0,
>>>> +       DO_CLOCKS       = 1 << 1,
>>>> +       DO_MEM_RESET    = 1 << 2,
>>>> +};
>>>> +
>>>> +int lowlevel_init_subsystems(void)
>>>> +{
>>>> +       uint32_t reset_status;
>>>> +       int actions = 0;
>>>> +
>>>> +       arch_cpu_init();
>>>> +
>>>> +       reset_status = power_read_reset_status();
>>>> +
>>>> +       switch (reset_status) {
>>>> +       case EXYNOS_CHECK_SLEEP:
>>>> +               actions = DO_CLOCKS | DO_WAKEUP;
>>>> +               break;
>>>> +       case EXYNOS_CHECK_DIDLE:
>>>> +       case EXYNOS_CHECK_LPA:
>>>> +               actions = DO_WAKEUP;
>>>> +               break;
>>>> +       default:
>>>> +               /* This is a normal boot (not a wake from sleep) */
>>>> +               actions = DO_CLOCKS | DO_MEM_RESET;
>>>> +       }
>>>> +
>>>> +       if (actions & DO_CLOCKS) {
>>>> +               system_clock_init();
>>>> +               mem_ctrl_init(actions & DO_MEM_RESET);
>>>> +               tzpc_init();
>>>> +       }
>>>> +
>>>> +       return actions & DO_WAKEUP;
>>>> +}
>>>> diff --git a/board/samsung/smdk5250/setup.h
>>>> b/board/samsung/smdk5250/setup.h
>>>> index a159601..d64e385 100644
>>>> --- a/board/samsung/smdk5250/setup.h
>>>> +++ b/board/samsung/smdk5250/setup.h
>>>> @@ -28,6 +28,11 @@
>>>>  #include <config.h>
>>>>  #include <asm/arch/dmc.h>
>>>>
>>>> +/* Power Down Modes */
>>>> +#define EXYNOS_CHECK_SLEEP     0x00000BAD
>>>> +#define EXYNOS_CHECK_DIDLE     0xBAD00000
>>>> +#define EXYNOS_CHECK_LPA       0xABAD0000
>>> These can be uses other exynos5250 series. so can you place it common
>>> header file?
>> - Would it be ok if I place this in arch/arm/include/asm/arch-exynos/power.h
>> ?
> yes, and proper prefix, EXYNOS5 or EXYNOS5250. BTW can be use it at
> exynos4 series?
>
> Thank you,
> Kyungmin Park
>>>> +
>>>>  /* TZPC : Register Offsets */
>>>>  #define TZPC0_BASE             0x10100000
>>>>  #define TZPC1_BASE             0x10110000
>>>> @@ -539,7 +544,8 @@ enum {
>>>>   *                     accesses; may vary across boards.
>>>>   * @return 0 if ok, SETUP_ERR_... if there is a problem
>>>>   */
>>>> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>>> mem_iv_size);
>>>> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>>> mem_iv_size,
>>>> +                       int mem_reset);
>>>>
>>>>  /*
>>>>   * Configure ZQ I/O interface
>>>> @@ -588,7 +594,14 @@ void dmc_config_memory(struct mem_timings *mem,
>>>> struct exynos5_dmc *dmc);
>>>>  void update_reset_dll(struct exynos5_dmc *, enum ddr_mode);
>>>>
>>>>  void sdelay(unsigned long);
>>>> -void mem_ctrl_init(void);
>>>> +void mem_ctrl_init(int mem_reset);
>>>>  void system_clock_init(void);
>>>>  void tzpc_init(void);
>>>> +
>>>> +/**
>>>> + * Init subsystems according to the reset status
>>>> + *
>>>> + * @return 0 for a normal boot, non-zero for a resume
>>>> + */
>>>> +int lowlevel_init_subsystems(void);
>>> do_lowlevle_init?
>> - OK
>>>
>>> Thank you,
>>> Kyungmin Park
>>>>  #endif
>>>> diff --git a/board/samsung/smdk5250/spl_boot.c
>>>> b/board/samsung/smdk5250/spl_boot.c
>>>> index d8f3c1e..66bce5b 100644
>>>> --- a/board/samsung/smdk5250/spl_boot.c
>>>> +++ b/board/samsung/smdk5250/spl_boot.c
>>>> @@ -20,18 +20,16 @@
>>>>   * MA 02111-1307 USA
>>>>   */
>>>>
>>>> -#include<common.h>
>>>> -#include<config.h>
>>>> +#include <common.h>
>>>> +#include <config.h>
>>>> +#include <asm/arch/spl.h>
>>>> +#include <asm/arch/cpu.h>
>>>> +#include <asm/arch/power.h>
>>>> +#include "setup.h"
>>>>
>>>> -enum boot_mode {
>>>> -       BOOT_MODE_MMC = 4,
>>>> -       BOOT_MODE_SERIAL = 20,
>>>> -       /* Boot based on Operating Mode pin settings */
>>>> -       BOOT_MODE_OM = 32,
>>>> -       BOOT_MODE_USB,  /* Boot using USB download */
>>>> -};
>>>> +DECLARE_GLOBAL_DATA_PTR;
>>>>
>>>> -       typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>>>> +typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>>>>
>>>>  /*
>>>>  * Copy U-boot from mmc to RAM:
>>>> @@ -62,15 +60,49 @@ void copy_uboot_to_ram(void)
>>>>         }
>>>>  }
>>>>
>>>> +void memzero(void *s, size_t n)
>>>> +{
>>>> +       char *ptr = s;
>>>> +       size_t i;
>>>> +
>>>> +       for (i = 0; i < n; i++)
>>>> +               *ptr++ = '\0';
>>>> +}
>>>> +
>>>> +/**
>>>> + * Set up the U-Boot global_data pointer
>>>> + *
>>>> + * This sets the address of the global data, and sets up basic values.
>>>> + *
>>>> + * @param gdp   Value to give to gd
>>>> + */
>>>> +static void setup_global_data(gd_t *gdp)
>>>> +{
>>>> +       gd = gdp;
>>>> +       memzero((void *)gd, sizeof(gd_t));
>>>> +       gd->flags |= GD_FLG_RELOC;
>>>> +       gd->baudrate = CONFIG_BAUDRATE;
>>>> +       gd->have_console = 1;
>>>> +}
>>>> +
>>>>  void board_init_f(unsigned long bootflag)
>>>>  {
>>>> +       __attribute__((aligned(8))) gd_t local_gd;
>>>>         __attribute__((noreturn)) void (*uboot)(void);
>>>> +
>>>> +       setup_global_data(&local_gd);
>>>> +
>>>> +       if (lowlevel_init_subsystems())
>>>> +               power_exit_wakeup();
>>>> +
>>>>         copy_uboot_to_ram();
>>>>
>>>>         /* Jump to U-Boot image */
>>>>         uboot = (void *)CONFIG_SYS_TEXT_BASE;
>>>>         (*uboot)();
>>>> +
>>>>         /* Never returns Here */
>>>> +       panic("%s: u-boot jump failed", __func__);
>>>>  }
>>>>
>>>>  /* Place Holders */
>>>> diff --git a/spl/Makefile b/spl/Makefile
>>>> index 6dbb105..3aab466 100644
>>>> --- a/spl/Makefile
>>>> +++ b/spl/Makefile
>>>> @@ -86,6 +86,10 @@ ifneq
>>>> ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
>>>>  LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
>>>>  endif
>>>>
>>>> +ifneq ($(CONFIG_EXYNOS4)$(CONFIG_EXYNOS5),)
>>>> +LIBS-y += $(CPUDIR)/s5p-common/libs5p-common.o
>>>> +endif
>>>> +
>>>>  ifeq ($(SOC),tegra20)
>>>>  LIBS-y += arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
>>>>  LIBS-y += arch/$(ARCH)/cpu/tegra-common/libcputegra-common.o
>>>> --
>>>> 1.7.4.4
>>>>
>>>> _______________________________________________
>>>> U-Boot mailing list
>>>> U-Boot@lists.denx.de
>>>> http://lists.denx.de/mailman/listinfo/u-boot
>>> _______________________________________________
>>> U-Boot mailing list
>>> U-Boot@lists.denx.de
>>> http://lists.denx.de/mailman/listinfo/u-boot
>>
>>
>>
>> --
>> Regards,
>> Rajeshwari Shinde
>>
Kyungmin Park Jan. 2, 2013, 6:44 a.m. UTC | #7
On 1/2/13, Rajeshwari Birje <rajeshwari.birje@gmail.com> wrote:
> Hi Kyungmin Park,
>
> On Wed, Jan 2, 2013 at 11:48 AM, Kyungmin Park <kmpark@infradead.org>
> wrote:
>> Hi,
>>
>> On 1/2/13, Rajeshwari Birje <rajeshwari.birje@gmail.com> wrote:
>>> Hi Kyungmin Park,
>>>
>>> Thank you for comments.
>>>
>>> On Mon, Dec 31, 2012 at 6:02 PM, Kyungmin Park <kmpark@infradead.org>
>>> wrote:
>>>> On Fri, Dec 28, 2012 at 9:08 PM, Rajeshwari Shinde
>>>> <rajeshwari.s@samsung.com> wrote:
>>>>> This patch converts lowlevel_init.S to lowlevel_init_c.c for
>>>>> SMDK5250.
>>>>>
>>>>> Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
>>>>> ---
>>>>>  board/samsung/smdk5250/Makefile          |    1 +
>>>>>  board/samsung/smdk5250/dmc_common.c      |    4 +-
>>>>>  board/samsung/smdk5250/dmc_init_ddr3.c   |    6 ++-
>>>>>  board/samsung/smdk5250/lowlevel_init.S   |   69
>>>>> ++---------------------------
>>>>>  board/samsung/smdk5250/lowlevel_init_c.c |   70
>>>>> ++++++++++++++++++++++++++++++
>>>>>  board/samsung/smdk5250/setup.h           |   17 ++++++-
>>>>>  board/samsung/smdk5250/spl_boot.c        |   52
>>>>> ++++++++++++++++++----
>>>>>  spl/Makefile                             |    4 ++
>>>>>  8 files changed, 142 insertions(+), 81 deletions(-)
>>>>>  create mode 100644 board/samsung/smdk5250/lowlevel_init_c.c
>>>>>
>>>>> diff --git a/board/samsung/smdk5250/Makefile
>>>>> b/board/samsung/smdk5250/Makefile
>>>>> index 47c6a5a..b99ac7f 100644
>>>>> --- a/board/samsung/smdk5250/Makefile
>>>>> +++ b/board/samsung/smdk5250/Makefile
>>>>> @@ -37,6 +37,7 @@ endif
>>>>>
>>>>>  ifdef CONFIG_SPL_BUILD
>>>>>  COBJS  += spl_boot.o
>>>>> +COBJS  += lowlevel_init_c.o
>>>>>  endif
>>>>>
>>>>>  SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
>>>>> diff --git a/board/samsung/smdk5250/dmc_common.c
>>>>> b/board/samsung/smdk5250/dmc_common.c
>>>>> index 109602a..6a26822 100644
>>>>> --- a/board/samsung/smdk5250/dmc_common.c
>>>>> +++ b/board/samsung/smdk5250/dmc_common.c
>>>>> @@ -175,7 +175,7 @@ void dmc_config_memory(struct mem_timings *mem,
>>>>> struct exynos5_dmc *dmc)
>>>>>         writel(DMC_MEMBASECONFIG1_VAL, &dmc->membaseconfig1);
>>>>>  }
>>>>>
>>>>> -void mem_ctrl_init()
>>>>> +void mem_ctrl_init(int mem_reset)
>>>> does 'reset' is enough?
>>> - OK
>>>>>  {
>>>>>         struct spl_machine_param *param = spl_get_machine_params();
>>>>>         struct mem_timings *mem;
>>>>> @@ -185,7 +185,7 @@ void mem_ctrl_init()
>>>>>
>>>>>         /* If there are any other memory variant, add their init call
>>>>> below */
>>>>>         if (param->mem_type == DDR_MODE_DDR3) {
>>>>> -               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size);
>>>>> +               ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size,
>>>>> mem_reset);
>>>>>                 if (ret) {
>>>>>                         /* will hang if failed to init memory control
>>>>> */
>>>>>                         while (1)
>>>>> diff --git a/board/samsung/smdk5250/dmc_init_ddr3.c
>>>>> b/board/samsung/smdk5250/dmc_init_ddr3.c
>>>>> index e050790..4e0693d 100644
>>>>> --- a/board/samsung/smdk5250/dmc_init_ddr3.c
>>>>> +++ b/board/samsung/smdk5250/dmc_init_ddr3.c
>>>>> @@ -40,7 +40,8 @@ static void reset_phy_ctrl(void)
>>>>>         writel(DDR3PHY_CTRL_PHY_RESET, &clk->lpddr3phy_ctrl);
>>>>>  }
>>>>>
>>>>> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>>>> mem_iv_size)
>>>>> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>>>> mem_iv_size,
>>>>> +                       int mem_reset)
>>>> ditto
>>> -OK
>>>>>  {
>>>>>         unsigned int val;
>>>>>         struct exynos5_phy_control *phy0_ctrl, *phy1_ctrl;
>>>>> @@ -51,7 +52,8 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem,
>>>>> unsigned long mem_iv_size)
>>>>>         phy1_ctrl = (struct exynos5_phy_control
>>>>> *)EXYNOS5_DMC_PHY1_BASE;
>>>>>         dmc = (struct exynos5_dmc *)EXYNOS5_DMC_CTRL_BASE;
>>>>>
>>>>> -       reset_phy_ctrl();
>>>>> +       if (mem_reset)
>>>> if (reset)
>>>>> +               reset_phy_ctrl();
>>>>>
>>>>>         /* Set Impedance Output Driver */
>>>>>         val = (mem->impedance << CA_CK_DRVR_DS_OFFSET) |
>>>>> diff --git a/board/samsung/smdk5250/lowlevel_init.S
>>>>> b/board/samsung/smdk5250/lowlevel_init.S
>>>>> index bc6cb6f..469126d 100644
>>>>> --- a/board/samsung/smdk5250/lowlevel_init.S
>>>>> +++ b/board/samsung/smdk5250/lowlevel_init.S
>>>>> @@ -23,74 +23,13 @@
>>>>>   */
>>>>>
>>>>>  #include <config.h>
>>>>> -#include <version.h>
>>>>>  #include <asm/arch/cpu.h>
>>>>>
>>>>> -_TEXT_BASE:
>>>>> -       .word   CONFIG_SYS_TEXT_BASE
>>>>> -
>>>>>         .globl lowlevel_init
>>>>>  lowlevel_init:
>>>>> -
>>>>> -       /* use iRAM stack in bl2 */
>>>>> -       ldr     sp, =CONFIG_IRAM_STACK
>>>>> -       stmdb   r13!, {ip,lr}
>>>>> -
>>>>> -       /* check reset status */
>>>>> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM1_OFFSET)
>>>>> -       ldr     r1, [r0]
>>>>> -
>>>>> -       /* AFTR wakeup reset */
>>>>> -       ldr     r2, =S5P_CHECK_DIDLE
>>>>> -       cmp     r1, r2
>>>>> -       beq     exit_wakeup
>>>>> -
>>>>> -       /* LPA wakeup reset */
>>>>> -       ldr     r2, =S5P_CHECK_LPA
>>>>> -       cmp     r1, r2
>>>>> -       beq     exit_wakeup
>>>>> -
>>>>> -       /* Sleep wakeup reset */
>>>>> -       ldr     r2, =S5P_CHECK_SLEEP
>>>>> -       cmp     r1, r2
>>>>> -       beq     wakeup_reset
>>>>> -
>>>>>         /*
>>>>> -        * If U-boot is already running in RAM, no need to relocate
>>>>> U-Boot.
>>>>> -        * Memory controller must be configured before relocating
>>>>> U-Boot
>>>>> -        * in ram.
>>>>> +        * Set the stack pointer, although it will be overwriten by
>>>>> the
>>>>> caller
>>>>> +        * It seems we will not boot if this function is empty.
>>>>>          */
>>>>> -       ldr     r0, =0x0ffffff          /* r0 <- Mask Bits*/
>>>>> -       bic     r1, pc, r0              /* pc <- current addr of code
>>>>> */
>>>>> -                                       /* r1 <- unmasked bits of pc
>>>>> */
>>>>> -       ldr     r2, _TEXT_BASE          /* r2 <- original base addr in
>>>>> ram */
>>>>> -       bic     r2, r2, r0              /* r2 <- unmasked bits of r2*/
>>>>> -       cmp     r1, r2                  /* compare r1, r2 */
>>>>> -       beq     1f                      /* r0 == r1 then skip sdram
>>>>> init
>>>>> */
>>>>> -
>>>>> -       /* init system clock */
>>>>> -       bl      system_clock_init
>>>>> -
>>>>> -       /* Memory initialize */
>>>>> -       bl      mem_ctrl_init
>>>>> -
>>>>> -1:
>>>>> -       bl      tzpc_init
>>>>> -       ldmia   r13!, {ip,pc}
>>>>> -
>>>>> -wakeup_reset:
>>>>> -       bl      system_clock_init
>>>>> -       bl      mem_ctrl_init
>>>>> -       bl      tzpc_init
>>>>> -
>>>>> -exit_wakeup:
>>>>> -       /* Load return address and jump to kernel */
>>>>> -       ldr     r0, =(EXYNOS5_POWER_BASE + INFORM0_OFFSET)
>>>>> -
>>>>> -       /* r1 = physical address of exynos5_cpu_resume function*/
>>>>> -       ldr     r1, [r0]
>>>>> -
>>>>> -       /* Jump to kernel */
>>>>> -       mov     pc, r1
>>>>> -       nop
>>>>> -       nop
>>>>> +       ldr     sp, =CONFIG_IRAM_STACK
>>>>> +       mov     pc, lr
>>>>> diff --git a/board/samsung/smdk5250/lowlevel_init_c.c
>>>>> b/board/samsung/smdk5250/lowlevel_init_c.c
>>>>> new file mode 100644
>>>>> index 0000000..fdb98cf
>>>>> --- /dev/null
>>>>> +++ b/board/samsung/smdk5250/lowlevel_init_c.c
>>>> lowlevel_init.c?
>>> - We get multiple definition of `lowlevel_init' error if we name as
>>> lowlevel_init.c.
>> It's filename, and function name is used as do_lowlevel_init. doesn't it?
> - Yes but we also have a lowlevel_init.S which will have a object file
> lowlevel_init.o and if we name file as lowlevel_init.c it will also
> have lowlevel_init.o and it will lead to error.
Okay, I assume we already have common lowlevel_init at common
directory as others. but exynos doesn't.

So how about to add common codes and use it?
you can refer it as omap did.

Thank you,
Kyungmin Park

# git grep lowlevel arch/arm/cpu/armv7/
arch/arm/cpu/armv7/Makefile:SOBJS       += lowlevel_init.o
arch/arm/cpu/armv7/lowlevel_init.S: * A lowlevel_init function that sets up the
arch/arm/cpu/armv7/lowlevel_init.S:ENTRY(lowlevel_init)
arch/arm/cpu/armv7/lowlevel_init.S:ENDPROC(lowlevel_init)
arch/arm/cpu/armv7/mx5/Makefile:SOBJS = lowlevel_init.o
arch/arm/cpu/armv7/mx5/lowlevel_init.S:ENTRY(lowlevel_init)
arch/arm/cpu/armv7/mx5/lowlevel_init.S:ENDPROC(lowlevel_init)
arch/arm/cpu/armv7/mx6/Makefile:SOBJS   = lowlevel_init.o
arch/arm/cpu/armv7/mx6/lowlevel_init.S:ENTRY(lowlevel_init)
arch/arm/cpu/armv7/mx6/lowlevel_init.S:ENDPROC(lowlevel_init)
arch/arm/cpu/armv7/omap-common/Makefile:SOBJS   += lowlevel_init.o
arch/arm/cpu/armv7/omap3/Makefile:SOBJS := lowlevel_init.o
arch/arm/cpu/armv7/omap3/lowlevel_init.S:ENTRY(lowlevel_init)
arch/arm/cpu/armv7/omap3/lowlevel_init.S:ENDPROC(lowlevel_init)
arch/arm/cpu/armv7/rmobile/Makefile:SOBJS = lowlevel_init.o
arch/arm/cpu/armv7/rmobile/lowlevel_init.S:ENTRY(lowlevel_init)
arch/arm/cpu/armv7/rmobile/lowlevel_init.S:     beq             lowlevel_init__
arch/arm/cpu/armv7/rmobile/lowlevel_init.S:lowlevel_init__:
arch/arm/cpu/armv7/rmobile/lowlevel_init.S:ENDPROC(lowlevel_init)
arch/arm/cpu/armv7/socfpga/Makefile:SOBJS       := lowlevel_init.o
arch/arm/cpu/armv7/socfpga/lowlevel_init.S:.globl lowlevel_init
arch/arm/cpu/armv7/socfpga/lowlevel_init.S:lowlevel_init:
arch/arm/cpu/armv7/start.S:     b       lowlevel_init           @ go setup pll,m
arch/arm/cpu/armv7/u8500/Makefile:SOBJS = lowlevel.o
arch/arm/cpu/armv7/u8500/lowlevel.S:ENTRY(lowlevel_init)
arch/arm/cpu/armv7/u8500/lowlevel.S:ENDPROC(lowlevel_init)
arch/arm/cpu/armv7/zynq/cpu.c:inline void lowlevel_init(void) {}

>>>>> @@ -0,0 +1,70 @@
>>>>> +/*
>>>>> + * Lowlevel setup for SMDK5250 board based on S5PC520
>>>>> + *
>>>>> + * Copyright (C) 2012 Samsung Electronics
>>>>> + * Copyright (c) 2012 The Chromium OS Authors.
>>>>> + *
>>>>> + * See file CREDITS for list of people who contributed to this
>>>>> + * project.
>>>>> + *
>>>>> + * This program is free software; you can redistribute it and/or
>>>>> + * modify it under the terms of the GNU General Public License as
>>>>> + * published by the Free Software Foundation; either version 2 of
>>>>> + * the License, or (at your option) any later version.
>>>>> + *
>>>>> + * This program is distributed in the hope that it will be useful,
>>>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>>>> + * GNU General Public License for more details.
>>>>> + *
>>>>> + * You should have received a copy of the GNU General Public License
>>>>> + * along with this program; if not, write to the Free Software
>>>>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>>>>> + * MA 02111-1307 USA
>>>>> + */
>>>>> +
>>>>> +#include <common.h>
>>>>> +#include <config.h>
>>>>> +#include <asm/arch/cpu.h>
>>>>> +#include <asm/arch/dmc.h>
>>>>> +#include <asm/arch/power.h>
>>>>> +#include <asm/arch/tzpc.h>
>>>>> +#include "setup.h"
>>>>> +
>>>>> +/* These are the things we can do during low-level init */
>>>>> +enum {
>>>>> +       DO_WAKEUP       = 1 << 0,
>>>>> +       DO_CLOCKS       = 1 << 1,
>>>>> +       DO_MEM_RESET    = 1 << 2,
>>>>> +};
>>>>> +
>>>>> +int lowlevel_init_subsystems(void)
>>>>> +{
>>>>> +       uint32_t reset_status;
>>>>> +       int actions = 0;
>>>>> +
>>>>> +       arch_cpu_init();
>>>>> +
>>>>> +       reset_status = power_read_reset_status();
>>>>> +
>>>>> +       switch (reset_status) {
>>>>> +       case EXYNOS_CHECK_SLEEP:
>>>>> +               actions = DO_CLOCKS | DO_WAKEUP;
>>>>> +               break;
>>>>> +       case EXYNOS_CHECK_DIDLE:
>>>>> +       case EXYNOS_CHECK_LPA:
>>>>> +               actions = DO_WAKEUP;
>>>>> +               break;
>>>>> +       default:
>>>>> +               /* This is a normal boot (not a wake from sleep) */
>>>>> +               actions = DO_CLOCKS | DO_MEM_RESET;
>>>>> +       }
>>>>> +
>>>>> +       if (actions & DO_CLOCKS) {
>>>>> +               system_clock_init();
>>>>> +               mem_ctrl_init(actions & DO_MEM_RESET);
>>>>> +               tzpc_init();
>>>>> +       }
>>>>> +
>>>>> +       return actions & DO_WAKEUP;
>>>>> +}
>>>>> diff --git a/board/samsung/smdk5250/setup.h
>>>>> b/board/samsung/smdk5250/setup.h
>>>>> index a159601..d64e385 100644
>>>>> --- a/board/samsung/smdk5250/setup.h
>>>>> +++ b/board/samsung/smdk5250/setup.h
>>>>> @@ -28,6 +28,11 @@
>>>>>  #include <config.h>
>>>>>  #include <asm/arch/dmc.h>
>>>>>
>>>>> +/* Power Down Modes */
>>>>> +#define EXYNOS_CHECK_SLEEP     0x00000BAD
>>>>> +#define EXYNOS_CHECK_DIDLE     0xBAD00000
>>>>> +#define EXYNOS_CHECK_LPA       0xABAD0000
>>>> These can be uses other exynos5250 series. so can you place it common
>>>> header file?
>>> - Would it be ok if I place this in
>>> arch/arm/include/asm/arch-exynos/power.h
>>> ?
>> yes, and proper prefix, EXYNOS5 or EXYNOS5250. BTW can be use it at
>> exynos4 series?
>>
>> Thank you,
>> Kyungmin Park
>>>>> +
>>>>>  /* TZPC : Register Offsets */
>>>>>  #define TZPC0_BASE             0x10100000
>>>>>  #define TZPC1_BASE             0x10110000
>>>>> @@ -539,7 +544,8 @@ enum {
>>>>>   *                     accesses; may vary across boards.
>>>>>   * @return 0 if ok, SETUP_ERR_... if there is a problem
>>>>>   */
>>>>> -int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>>>> mem_iv_size);
>>>>> +int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long
>>>>> mem_iv_size,
>>>>> +                       int mem_reset);
>>>>>
>>>>>  /*
>>>>>   * Configure ZQ I/O interface
>>>>> @@ -588,7 +594,14 @@ void dmc_config_memory(struct mem_timings *mem,
>>>>> struct exynos5_dmc *dmc);
>>>>>  void update_reset_dll(struct exynos5_dmc *, enum ddr_mode);
>>>>>
>>>>>  void sdelay(unsigned long);
>>>>> -void mem_ctrl_init(void);
>>>>> +void mem_ctrl_init(int mem_reset);
>>>>>  void system_clock_init(void);
>>>>>  void tzpc_init(void);
>>>>> +
>>>>> +/**
>>>>> + * Init subsystems according to the reset status
>>>>> + *
>>>>> + * @return 0 for a normal boot, non-zero for a resume
>>>>> + */
>>>>> +int lowlevel_init_subsystems(void);
>>>> do_lowlevle_init?
>>> - OK
>>>>
>>>> Thank you,
>>>> Kyungmin Park
>>>>>  #endif
>>>>> diff --git a/board/samsung/smdk5250/spl_boot.c
>>>>> b/board/samsung/smdk5250/spl_boot.c
>>>>> index d8f3c1e..66bce5b 100644
>>>>> --- a/board/samsung/smdk5250/spl_boot.c
>>>>> +++ b/board/samsung/smdk5250/spl_boot.c
>>>>> @@ -20,18 +20,16 @@
>>>>>   * MA 02111-1307 USA
>>>>>   */
>>>>>
>>>>> -#include<common.h>
>>>>> -#include<config.h>
>>>>> +#include <common.h>
>>>>> +#include <config.h>
>>>>> +#include <asm/arch/spl.h>
>>>>> +#include <asm/arch/cpu.h>
>>>>> +#include <asm/arch/power.h>
>>>>> +#include "setup.h"
>>>>>
>>>>> -enum boot_mode {
>>>>> -       BOOT_MODE_MMC = 4,
>>>>> -       BOOT_MODE_SERIAL = 20,
>>>>> -       /* Boot based on Operating Mode pin settings */
>>>>> -       BOOT_MODE_OM = 32,
>>>>> -       BOOT_MODE_USB,  /* Boot using USB download */
>>>>> -};
>>>>> +DECLARE_GLOBAL_DATA_PTR;
>>>>>
>>>>> -       typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32
>>>>> dst);
>>>>> +typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>>>>>
>>>>>  /*
>>>>>  * Copy U-boot from mmc to RAM:
>>>>> @@ -62,15 +60,49 @@ void copy_uboot_to_ram(void)
>>>>>         }
>>>>>  }
>>>>>
>>>>> +void memzero(void *s, size_t n)
>>>>> +{
>>>>> +       char *ptr = s;
>>>>> +       size_t i;
>>>>> +
>>>>> +       for (i = 0; i < n; i++)
>>>>> +               *ptr++ = '\0';
>>>>> +}
>>>>> +
>>>>> +/**
>>>>> + * Set up the U-Boot global_data pointer
>>>>> + *
>>>>> + * This sets the address of the global data, and sets up basic
>>>>> values.
>>>>> + *
>>>>> + * @param gdp   Value to give to gd
>>>>> + */
>>>>> +static void setup_global_data(gd_t *gdp)
>>>>> +{
>>>>> +       gd = gdp;
>>>>> +       memzero((void *)gd, sizeof(gd_t));
>>>>> +       gd->flags |= GD_FLG_RELOC;
>>>>> +       gd->baudrate = CONFIG_BAUDRATE;
>>>>> +       gd->have_console = 1;
>>>>> +}
>>>>> +
>>>>>  void board_init_f(unsigned long bootflag)
>>>>>  {
>>>>> +       __attribute__((aligned(8))) gd_t local_gd;
>>>>>         __attribute__((noreturn)) void (*uboot)(void);
>>>>> +
>>>>> +       setup_global_data(&local_gd);
>>>>> +
>>>>> +       if (lowlevel_init_subsystems())
>>>>> +               power_exit_wakeup();
>>>>> +
>>>>>         copy_uboot_to_ram();
>>>>>
>>>>>         /* Jump to U-Boot image */
>>>>>         uboot = (void *)CONFIG_SYS_TEXT_BASE;
>>>>>         (*uboot)();
>>>>> +
>>>>>         /* Never returns Here */
>>>>> +       panic("%s: u-boot jump failed", __func__);
>>>>>  }
>>>>>
>>>>>  /* Place Holders */
>>>>> diff --git a/spl/Makefile b/spl/Makefile
>>>>> index 6dbb105..3aab466 100644
>>>>> --- a/spl/Makefile
>>>>> +++ b/spl/Makefile
>>>>> @@ -86,6 +86,10 @@ ifneq
>>>>> ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
>>>>>  LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
>>>>>  endif
>>>>>
>>>>> +ifneq ($(CONFIG_EXYNOS4)$(CONFIG_EXYNOS5),)
>>>>> +LIBS-y += $(CPUDIR)/s5p-common/libs5p-common.o
>>>>> +endif
>>>>> +
>>>>>  ifeq ($(SOC),tegra20)
>>>>>  LIBS-y += arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
>>>>>  LIBS-y += arch/$(ARCH)/cpu/tegra-common/libcputegra-common.o
>>>>> --
>>>>> 1.7.4.4
>>>>>
>>>>> _______________________________________________
>>>>> U-Boot mailing list
>>>>> U-Boot@lists.denx.de
>>>>> http://lists.denx.de/mailman/listinfo/u-boot
>>>> _______________________________________________
>>>> U-Boot mailing list
>>>> U-Boot@lists.denx.de
>>>> http://lists.denx.de/mailman/listinfo/u-boot
>>>
>>>
>>>
>>> --
>>> Regards,
>>> Rajeshwari Shinde
>>>
>
>
>
> --
> Regards,
> Rajeshwari Shinde
>
diff mbox

Patch

diff --git a/board/samsung/smdk5250/Makefile b/board/samsung/smdk5250/Makefile
index 47c6a5a..b99ac7f 100644
--- a/board/samsung/smdk5250/Makefile
+++ b/board/samsung/smdk5250/Makefile
@@ -37,6 +37,7 @@  endif
 
 ifdef CONFIG_SPL_BUILD
 COBJS	+= spl_boot.o
+COBJS	+= lowlevel_init_c.o
 endif
 
 SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)
diff --git a/board/samsung/smdk5250/dmc_common.c b/board/samsung/smdk5250/dmc_common.c
index 109602a..6a26822 100644
--- a/board/samsung/smdk5250/dmc_common.c
+++ b/board/samsung/smdk5250/dmc_common.c
@@ -175,7 +175,7 @@  void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc)
 	writel(DMC_MEMBASECONFIG1_VAL, &dmc->membaseconfig1);
 }
 
-void mem_ctrl_init()
+void mem_ctrl_init(int mem_reset)
 {
 	struct spl_machine_param *param = spl_get_machine_params();
 	struct mem_timings *mem;
@@ -185,7 +185,7 @@  void mem_ctrl_init()
 
 	/* If there are any other memory variant, add their init call below */
 	if (param->mem_type == DDR_MODE_DDR3) {
-		ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size);
+		ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size, mem_reset);
 		if (ret) {
 			/* will hang if failed to init memory control */
 			while (1)
diff --git a/board/samsung/smdk5250/dmc_init_ddr3.c b/board/samsung/smdk5250/dmc_init_ddr3.c
index e050790..4e0693d 100644
--- a/board/samsung/smdk5250/dmc_init_ddr3.c
+++ b/board/samsung/smdk5250/dmc_init_ddr3.c
@@ -40,7 +40,8 @@  static void reset_phy_ctrl(void)
 	writel(DDR3PHY_CTRL_PHY_RESET, &clk->lpddr3phy_ctrl);
 }
 
-int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
+int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
+			int mem_reset)
 {
 	unsigned int val;
 	struct exynos5_phy_control *phy0_ctrl, *phy1_ctrl;
@@ -51,7 +52,8 @@  int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
 	phy1_ctrl = (struct exynos5_phy_control *)EXYNOS5_DMC_PHY1_BASE;
 	dmc = (struct exynos5_dmc *)EXYNOS5_DMC_CTRL_BASE;
 
-	reset_phy_ctrl();
+	if (mem_reset)
+		reset_phy_ctrl();
 
 	/* Set Impedance Output Driver */
 	val = (mem->impedance << CA_CK_DRVR_DS_OFFSET) |
diff --git a/board/samsung/smdk5250/lowlevel_init.S b/board/samsung/smdk5250/lowlevel_init.S
index bc6cb6f..469126d 100644
--- a/board/samsung/smdk5250/lowlevel_init.S
+++ b/board/samsung/smdk5250/lowlevel_init.S
@@ -23,74 +23,13 @@ 
  */
 
 #include <config.h>
-#include <version.h>
 #include <asm/arch/cpu.h>
 
-_TEXT_BASE:
-	.word	CONFIG_SYS_TEXT_BASE
-
 	.globl lowlevel_init
 lowlevel_init:
-
-	/* use iRAM stack in bl2 */
-	ldr	sp, =CONFIG_IRAM_STACK
-	stmdb	r13!, {ip,lr}
-
-	/* check reset status */
-	ldr	r0, =(EXYNOS5_POWER_BASE + INFORM1_OFFSET)
-	ldr	r1, [r0]
-
-	/* AFTR wakeup reset */
-	ldr	r2, =S5P_CHECK_DIDLE
-	cmp	r1, r2
-	beq	exit_wakeup
-
-	/* LPA wakeup reset */
-	ldr	r2, =S5P_CHECK_LPA
-	cmp	r1, r2
-	beq	exit_wakeup
-
-	/* Sleep wakeup reset */
-	ldr	r2, =S5P_CHECK_SLEEP
-	cmp	r1, r2
-	beq	wakeup_reset
-
 	/*
-	 * If U-boot is already running in RAM, no need to relocate U-Boot.
-	 * Memory controller must be configured before relocating U-Boot
-	 * in ram.
+	 * Set the stack pointer, although it will be overwriten by the caller
+	 * It seems we will not boot if this function is empty.
 	 */
-	ldr	r0, =0x0ffffff		/* r0 <- Mask Bits*/
-	bic	r1, pc, r0		/* pc <- current addr of code */
-					/* r1 <- unmasked bits of pc */
-	ldr	r2, _TEXT_BASE		/* r2 <- original base addr in ram */
-	bic	r2, r2, r0		/* r2 <- unmasked bits of r2*/
-	cmp	r1, r2			/* compare r1, r2 */
-	beq	1f			/* r0 == r1 then skip sdram init */
-
-	/* init system clock */
-	bl	system_clock_init
-
-	/* Memory initialize */
-	bl	mem_ctrl_init
-
-1:
-	bl	tzpc_init
-	ldmia	r13!, {ip,pc}
-
-wakeup_reset:
-	bl	system_clock_init
-	bl	mem_ctrl_init
-	bl	tzpc_init
-
-exit_wakeup:
-	/* Load return address and jump to kernel */
-	ldr	r0, =(EXYNOS5_POWER_BASE + INFORM0_OFFSET)
-
-	/* r1 = physical address of exynos5_cpu_resume function*/
-	ldr	r1, [r0]
-
-	/* Jump to kernel */
-	mov	pc, r1
-	nop
-	nop
+	ldr	sp, =CONFIG_IRAM_STACK
+	mov	pc, lr
diff --git a/board/samsung/smdk5250/lowlevel_init_c.c b/board/samsung/smdk5250/lowlevel_init_c.c
new file mode 100644
index 0000000..fdb98cf
--- /dev/null
+++ b/board/samsung/smdk5250/lowlevel_init_c.c
@@ -0,0 +1,70 @@ 
+/*
+ * Lowlevel setup for SMDK5250 board based on S5PC520
+ *
+ * Copyright (C) 2012 Samsung Electronics
+ * Copyright (c) 2012 The Chromium OS Authors.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <config.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/dmc.h>
+#include <asm/arch/power.h>
+#include <asm/arch/tzpc.h>
+#include "setup.h"
+
+/* These are the things we can do during low-level init */
+enum {
+	DO_WAKEUP	= 1 << 0,
+	DO_CLOCKS	= 1 << 1,
+	DO_MEM_RESET	= 1 << 2,
+};
+
+int lowlevel_init_subsystems(void)
+{
+	uint32_t reset_status;
+	int actions = 0;
+
+	arch_cpu_init();
+
+	reset_status = power_read_reset_status();
+
+	switch (reset_status) {
+	case EXYNOS_CHECK_SLEEP:
+		actions = DO_CLOCKS | DO_WAKEUP;
+		break;
+	case EXYNOS_CHECK_DIDLE:
+	case EXYNOS_CHECK_LPA:
+		actions = DO_WAKEUP;
+		break;
+	default:
+		/* This is a normal boot (not a wake from sleep) */
+		actions = DO_CLOCKS | DO_MEM_RESET;
+	}
+
+	if (actions & DO_CLOCKS) {
+		system_clock_init();
+		mem_ctrl_init(actions & DO_MEM_RESET);
+		tzpc_init();
+	}
+
+	return actions & DO_WAKEUP;
+}
diff --git a/board/samsung/smdk5250/setup.h b/board/samsung/smdk5250/setup.h
index a159601..d64e385 100644
--- a/board/samsung/smdk5250/setup.h
+++ b/board/samsung/smdk5250/setup.h
@@ -28,6 +28,11 @@ 
 #include <config.h>
 #include <asm/arch/dmc.h>
 
+/* Power Down Modes */
+#define EXYNOS_CHECK_SLEEP	0x00000BAD
+#define EXYNOS_CHECK_DIDLE	0xBAD00000
+#define EXYNOS_CHECK_LPA	0xABAD0000
+
 /* TZPC : Register Offsets */
 #define TZPC0_BASE		0x10100000
 #define TZPC1_BASE		0x10110000
@@ -539,7 +544,8 @@  enum {
  *			accesses; may vary across boards.
  * @return 0 if ok, SETUP_ERR_... if there is a problem
  */
-int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size);
+int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
+			int mem_reset);
 
 /*
  * Configure ZQ I/O interface
@@ -588,7 +594,14 @@  void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc);
 void update_reset_dll(struct exynos5_dmc *, enum ddr_mode);
 
 void sdelay(unsigned long);
-void mem_ctrl_init(void);
+void mem_ctrl_init(int mem_reset);
 void system_clock_init(void);
 void tzpc_init(void);
+
+/**
+ * Init subsystems according to the reset status
+ *
+ * @return 0 for a normal boot, non-zero for a resume
+ */
+int lowlevel_init_subsystems(void);
 #endif
diff --git a/board/samsung/smdk5250/spl_boot.c b/board/samsung/smdk5250/spl_boot.c
index d8f3c1e..66bce5b 100644
--- a/board/samsung/smdk5250/spl_boot.c
+++ b/board/samsung/smdk5250/spl_boot.c
@@ -20,18 +20,16 @@ 
  * MA 02111-1307 USA
  */
 
-#include<common.h>
-#include<config.h>
+#include <common.h>
+#include <config.h>
+#include <asm/arch/spl.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/power.h>
+#include "setup.h"
 
-enum boot_mode {
-	BOOT_MODE_MMC = 4,
-	BOOT_MODE_SERIAL = 20,
-	/* Boot based on Operating Mode pin settings */
-	BOOT_MODE_OM = 32,
-	BOOT_MODE_USB,	/* Boot using USB download */
-};
+DECLARE_GLOBAL_DATA_PTR;
 
-	typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
+typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
 
 /*
 * Copy U-boot from mmc to RAM:
@@ -62,15 +60,49 @@  void copy_uboot_to_ram(void)
 	}
 }
 
+void memzero(void *s, size_t n)
+{
+	char *ptr = s;
+	size_t i;
+
+	for (i = 0; i < n; i++)
+		*ptr++ = '\0';
+}
+
+/**
+ * Set up the U-Boot global_data pointer
+ *
+ * This sets the address of the global data, and sets up basic values.
+ *
+ * @param gdp   Value to give to gd
+ */
+static void setup_global_data(gd_t *gdp)
+{
+	gd = gdp;
+	memzero((void *)gd, sizeof(gd_t));
+	gd->flags |= GD_FLG_RELOC;
+	gd->baudrate = CONFIG_BAUDRATE;
+	gd->have_console = 1;
+}
+
 void board_init_f(unsigned long bootflag)
 {
+	__attribute__((aligned(8))) gd_t local_gd;
 	__attribute__((noreturn)) void (*uboot)(void);
+
+	setup_global_data(&local_gd);
+
+	if (lowlevel_init_subsystems())
+		power_exit_wakeup();
+
 	copy_uboot_to_ram();
 
 	/* Jump to U-Boot image */
 	uboot = (void *)CONFIG_SYS_TEXT_BASE;
 	(*uboot)();
+
 	/* Never returns Here */
+	panic("%s: u-boot jump failed", __func__);
 }
 
 /* Place Holders */
diff --git a/spl/Makefile b/spl/Makefile
index 6dbb105..3aab466 100644
--- a/spl/Makefile
+++ b/spl/Makefile
@@ -86,6 +86,10 @@  ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
 LIBS-y += $(CPUDIR)/omap-common/libomap-common.o
 endif
 
+ifneq ($(CONFIG_EXYNOS4)$(CONFIG_EXYNOS5),)
+LIBS-y += $(CPUDIR)/s5p-common/libs5p-common.o
+endif
+
 ifeq ($(SOC),tegra20)
 LIBS-y += arch/$(ARCH)/cpu/$(SOC)-common/lib$(SOC)-common.o
 LIBS-y += arch/$(ARCH)/cpu/tegra-common/libcputegra-common.o