All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heiko Stuebner <heiko@sntech.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 14/16] rockchip: rk3188: Add main, spl and tpl boards
Date: Sat, 11 Feb 2017 01:47:10 +0100	[thread overview]
Message-ID: <51300309.Jp5btNiEcP@phil> (raw)
In-Reply-To: <CAPnjgZ11eof1dALXxQu083vAu7sZxAOr=9yxMNrydNgm=R8kFw@mail.gmail.com>

Am Montag, 6. Februar 2017, 07:35:25 CET schrieb Simon Glass:
> Hi Heiko,
> 
> On 3 February 2017 at 08:09, Heiko Stuebner <heiko@sntech.de> wrote:
> > The rk3188 needs 3 uboot stages: a tpl living in 1KB of sram, a spl
> > the resides in the rest of the sram and loads the regular uboot living
> > in regular ram.
> 
> s/uboot/U-Boot/
> 
> > Signed-off-by: Heiko Stuebner <heiko@sntech.de>
> > ---
> > 
> >  arch/arm/mach-rockchip/Makefile           |   7 +-
> >  arch/arm/mach-rockchip/rk3188-board-spl.c | 220
> >  ++++++++++++++++++++++++++++++
> There is a lot of common code here with rk3288 - can we unify it a
> bit, or is that not feasible?

not sure about that. In the end the amount of code is not that much - 
essentially the setup_led() and spl_board_init() could be unified a bit, but 
then spl_board_init() would probably require empty functions for not 
implemented stuff  - configure_emmc on rk3188 for example.

So I'm not sure if this would help or just makes everything more complicated.


> 
> >  arch/arm/mach-rockchip/rk3188-board-tpl.c |  87 ++++++++++++
> >  arch/arm/mach-rockchip/rk3188-board.c     |  71 ++++++++++
> >  4 files changed, 384 insertions(+), 1 deletion(-)
> >  create mode 100644 arch/arm/mach-rockchip/rk3188-board-spl.c
> >  create mode 100644 arch/arm/mach-rockchip/rk3188-board-tpl.c
> >  create mode 100644 arch/arm/mach-rockchip/rk3188-board.c
> > 
> > diff --git a/arch/arm/mach-rockchip/Makefile
> > b/arch/arm/mach-rockchip/Makefile index 2be7e14e3e..7b8abc2266 100644
> > --- a/arch/arm/mach-rockchip/Makefile
> > +++ b/arch/arm/mach-rockchip/Makefile
> > @@ -4,11 +4,16 @@
> > 
> >  # SPDX-License-Identifier:     GPL-2.0+
> >  #
> > 
> > -ifdef CONFIG_SPL_BUILD
> > +ifdef CONFIG_TPL_BUILD
> > +obj-$(CONFIG_ROCKCHIP_RK3188) += rk3188-board-tpl.o
> > +obj-$(CONFIG_ROCKCHIP_BROM_HELPER) += save_boot_param.o
> > +else ifdef CONFIG_SPL_BUILD
> > 
> >  obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o
> > 
> > +obj-$(CONFIG_ROCKCHIP_RK3188) += rk3188-board-spl.o
> > 
> >  obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288-board-spl.o
> >  obj-$(CONFIG_ROCKCHIP_BROM_HELPER) += save_boot_param.o
> >  else
> > 
> > +obj-$(CONFIG_ROCKCHIP_RK3188) += rk3188-board.o
> > 
> >  obj-$(CONFIG_ROCKCHIP_RK3288) += rk3288-board.o
> >  obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board.o
> >  endif
> > 
> > diff --git a/arch/arm/mach-rockchip/rk3188-board-spl.c
> > b/arch/arm/mach-rockchip/rk3188-board-spl.c new file mode 100644
> > index 0000000000..b528a2f73d
> > --- /dev/null
> > +++ b/arch/arm/mach-rockchip/rk3188-board-spl.c
> > @@ -0,0 +1,220 @@
> > +/*
> > + * (C) Copyright 2015 Google, Inc
> > + *
> > + * SPDX-License-Identifier:     GPL-2.0+
> > + */
> > +
> > +#include <common.h>
> > +#include <debug_uart.h>
> > +#include <dm.h>
> > +#include <fdtdec.h>
> > +#include <led.h>
> > +#include <malloc.h>
> > +#include <ram.h>
> > +#include <spl.h>
> > +#include <asm/gpio.h>
> > +#include <asm/io.h>
> > +#include <asm/arch/clock.h>
> > +#include <asm/arch/hardware.h>
> > +#include <asm/arch/periph.h>
> > +#include <asm/arch/pmu_rk3188.h>
> > +#include <asm/arch/sdram.h>
> > +#include <asm/arch/timer.h>
> > +#include <dm/pinctrl.h>
> > +#include <dm/root.h>
> > +#include <dm/test.h>
> > +#include <dm/util.h>
> > +#include <power/regulator.h>
> > +#include <syscon.h>
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +u32 spl_boot_device(void)
> > +{
> > +#if !CONFIG_IS_ENABLED(OF_PLATDATA)
> > +       const void *blob = gd->fdt_blob;
> > +       struct udevice *dev;
> > +       const char *bootdev;
> > +       int node;
> > +       int ret;
> > +
> > +       bootdev = fdtdec_get_config_string(blob, "u-boot,boot0");
> > +       debug("Boot device %s\n", bootdev);
> > +       if (!bootdev)
> > +               goto fallback;
> > +
> > +       node = fdt_path_offset(blob, bootdev);
> > +       if (node < 0) {
> > +               debug("node=%d\n", node);
> > +               goto fallback;
> > +       }
> > +       ret = device_get_global_by_of_offset(node, &dev);
> > +       if (ret) {
> > +               debug("device at node %s/%d not found: %d\n", bootdev,
> > node, +                     ret);
> > +               goto fallback;
> > +       }
> > +       debug("Found device %s\n", dev->name);
> > +       switch (device_get_uclass_id(dev)) {
> > +       case UCLASS_SPI_FLASH:
> > +               return BOOT_DEVICE_SPI;
> > +       case UCLASS_MMC:
> > +               return BOOT_DEVICE_MMC1;
> > +       default:
> > +               debug("Booting from device uclass '%s' not supported\n",
> > +                     dev_get_uclass_name(dev));
> > +       }
> > +
> > +fallback:
> > +#endif
> > +       return BOOT_DEVICE_MMC1;
> > +}
> > +
> > +u32 spl_boot_mode(const u32 boot_device)
> > +{
> > +       return MMCSD_MODE_RAW;
> > +}
> > +
> > +extern u32 SAVE_SP_ADDR;
> > +extern void back_to_bootrom(void);
> > +void board_init_f(ulong dummy)
> > +{
> > +       struct udevice *pinctrl, *dev;
> > +       struct rk3188_pmu *pmu;
> > +       int ret;
> > +
> > +#define EARLY_UART
> > +       /* Example code showing how to enable the debug UART on RK3188 */
> > +#ifdef EARLY_UART
> > +#include <asm/arch/grf_rk3188.h>
> > +       /* Enable early UART on the RK3188 */
> > +#define GRF_BASE       0x20008000
> > +       struct rk3188_grf * const grf = (void *)GRF_BASE;
> > +
> > +       rk_clrsetreg(&grf->gpio1b_iomux,
> > +                    GPIO1B1_MASK << GPIO1B1_SHIFT |
> > +                    GPIO1B0_MASK << GPIO1B0_SHIFT,
> > +                    GPIO1B1_UART2_SOUT << GPIO1B1_SHIFT |
> > +                    GPIO1B0_UART2_SIN << GPIO1B0_SHIFT);
> > +       /*
> > +        * Debug UART can be used from here if required:
> > +        *
> > +        * debug_uart_init();
> > +        * printch('a');
> > +        * printhex8(0x1234);
> > +        * printascii("string");
> > +        */
> > +       debug_uart_init();
> > +       printch('s');
> > +       printch('p');
> > +       printch('l');
> > +       printch('\n');
> 
> printascii("spl\n");

actually using printascii at this point make the board hang in the past. So 
far I haven't figured out why printch works but printascii does not.

I'll try again, maybe it magically fixed itself


> > +#endif
> > +
> > +       ret = spl_init();
> > +       if (ret) {
> > +               debug("spl_init() failed: %d\n", ret);
> > +               hang();
> > +       }
> > +
> > +       rockchip_timer_init();
> > +
> > +       ret = rockchip_get_clk(&dev);
> > +       if (ret) {
> > +               debug("CLK init failed: %d\n", ret);
> > +               return;
> > +       }
> > +
> > +       /*
> > +        * Recover the bootrom's stackpointer.
> > +        * For whatever reason needs to run after rockchip_get_clk.
> > +        */
> > +       pmu = syscon_get_first_range(ROCKCHIP_SYSCON_PMU);
> > +       if (IS_ERR(pmu))
> > +               error("pmu syscon returned %ld\n", PTR_ERR(pmu));
> > +       SAVE_SP_ADDR = readl(&pmu->sys_reg[2]);
> > +
> > +       ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
> > +       if (ret) {
> > +               debug("Pinctrl init failed: %d\n", ret);
> > +               return;
> > +       }
> > +
> > +       ret = uclass_get_device(UCLASS_RAM, 0, &dev);
> > +       if (ret) {
> > +               debug("DRAM init failed: %d\n", ret);
> > +               return;
> > +       }
> > +
> > +#if defined(CONFIG_ROCKCHIP_SPL_BACK_TO_BROM) &&
> > !defined(CONFIG_SPL_BOARD_INIT) +       back_to_bootrom();
> > +#endif
> > +}
> > +
> > +static int setup_led(void)
> > +{
> > +#ifdef CONFIG_SPL_LED
> > +       struct udevice *dev;
> > +       char *led_name;
> > +       int ret;
> > +
> > +       led_name = fdtdec_get_config_string(gd->fdt_blob,
> > "u-boot,boot-led"); +       if (!led_name)
> > +               return 0;
> > +       ret = led_get_by_label(led_name, &dev);
> > +       if (ret) {
> > +               debug("%s: get=%d\n", __func__, ret);
> > +               return ret;
> > +       }
> > +       ret = led_set_on(dev, 1);
> > +       if (ret)
> > +               return ret;
> > +#endif
> > +
> > +       return 0;
> > +}
> > +
> > +void spl_board_init(void)
> > +{
> > +       struct udevice *pinctrl;
> > +       int ret;
> > +
> > +       ret = setup_led();
> > +       if (ret) {
> > +               debug("LED ret=%d\n", ret);
> > +               hang();
> > +       }
> > +
> > +       ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
> > +       if (ret) {
> > +               debug("%s: Cannot find pinctrl device\n", __func__);
> > +               goto err;
> > +       }
> > +
> > +#ifdef CONFIG_SPL_MMC_SUPPORT
> > +       ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
> > +       if (ret) {
> > +               debug("%s: Failed to set up SD card\n", __func__);
> > +               goto err;
> > +       }
> > +#endif
> > +
> > +       /* Enable debug UART */
> > +       ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_UART_DBG);
> > +       if (ret) {
> > +               debug("%s: Failed to set up console UART\n", __func__);
> > +               goto err;
> > +       }
> > +
> > +       preloader_console_init();
> > +#ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
> > +       back_to_bootrom();
> > +#endif
> > +       return;
> > +
> > +err:
> > +       printf("spl_board_init: Error %d\n", ret);
> > +
> > +       /* No way to report error here */
> > +       hang();
> > +}
> > diff --git a/arch/arm/mach-rockchip/rk3188-board-tpl.c
> > b/arch/arm/mach-rockchip/rk3188-board-tpl.c new file mode 100644
> > index 0000000000..62cdb8976a
> > --- /dev/null
> > +++ b/arch/arm/mach-rockchip/rk3188-board-tpl.c
> > @@ -0,0 +1,87 @@
> > +/*
> > + * (C) Copyright 2015 Google, Inc
> > + *
> > + * SPDX-License-Identifier:     GPL-2.0+
> > + */
> > +
> > +#include <common.h>
> > +#include <debug_uart.h>
> > +#include <spl.h>
> > +#include <asm/io.h>
> > +#include <asm/arch/pmu_rk3188.h>
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +/* track how often we were entered */
> > +static int rk3188_num_entries;
> 
> Is this in BSS? I suspect it might cause problems. Perhaps put it in
> the data section?

ok, I'll give that a try. So far I've never reached linker stuff, but judging 
from other uboot code a " __attribute__ ((section(".data")))" should be 
sufficient?


> 
> > +extern void back_to_bootrom(void);
> 
> Should be in a header file somewhere

So far each board has declared this itself, but I've moved it to a header now
for all of them.


> > +
> > +#define PMU_BASE       0x20004000
> > +#define TPL_ENTRY      0x10080C00
> > +extern u32 SAVE_SP_ADDR;

I've also moved this to my new bootrom.h


> 
> Blank line

ok

> > +static void jump_to_tpl(void)
> > +{
> > +       typedef void __noreturn (*image_entry_noargs_t)(void);
> > +
> > +       struct rk3188_pmu * const pmu = (void *)PMU_BASE;
> > +       image_entry_noargs_t tpl_entry =
> > +               (image_entry_noargs_t)(unsigned long)TPL_ENTRY;
> > +
> > +       /* Store the SAVE_SP_ADDR in a location shared with TPL. */
> > +       writel(SAVE_SP_ADDR, &pmu->sys_reg[2]);
> > +       tpl_entry();
> > +}
> > +
> > +void board_init_f(ulong dummy)
> > +{
> > +#define EARLY_UART
> > +       /* Example code showing how to enable the debug UART on RK3188 */
> > +#ifdef EARLY_UART
> > +#include <asm/arch/grf_rk3188.h>
> > +       /* Enable early UART on the RK3188 */
> > +#define GRF_BASE       0x20008000
> > +       struct rk3188_grf * const grf = (void *)GRF_BASE;
> > +
> > +       rk_clrsetreg(&grf->gpio1b_iomux,
> > +                    GPIO1B1_MASK << GPIO1B1_SHIFT |
> > +                    GPIO1B0_MASK << GPIO1B0_SHIFT,
> > +                    GPIO1B1_UART2_SOUT << GPIO1B1_SHIFT |
> > +                    GPIO1B0_UART2_SIN << GPIO1B0_SHIFT);
> > +       /*
> > +        * Debug UART can be used from here if required:
> > +        *
> > +        * debug_uart_init();
> > +        * printch('a');
> > +        * printhex8(0x1234);
> > +        * printascii("string");
> > +        */
> > +       debug_uart_init();
> > +
> > +       printch('t');
> > +       printch('p');
> > +       printch('l');
> > +       printch('-');
> 
> printascii()

see spl printascii comment :-)

> 
> > +       printch(rk3188_num_entries + 1 + '0');
> > +       printch('\n');
> > +#endif
> > +
> > +       rk3188_num_entries++;
> > +
> > +       if (rk3188_num_entries == 1) {
> > +               /*
> > +                * The original loader did some very basic integrity
> > +                * checking at this point, but the remaining few bytes
> > +                * could be used for any improvement making sense
> > +                * really early on.
> > +                */
> > +
> > +               back_to_bootrom();
> > +       } else {
> > +               /*
> > +                * TPL part of the loader should now wait for us
> > +                * at offset 0xC00 in the sram. Should never return
> > +                * from there.
> > +                */
> > +               jump_to_tpl();
> > +       }
> > +}
> > diff --git a/arch/arm/mach-rockchip/rk3188-board.c
> > b/arch/arm/mach-rockchip/rk3188-board.c new file mode 100644
> > index 0000000000..16f38559af
> > --- /dev/null
> > +++ b/arch/arm/mach-rockchip/rk3188-board.c
> > @@ -0,0 +1,71 @@
> > +/*
> > + * (C) Copyright 2015 Google, Inc
> > + *
> > + * SPDX-License-Identifier:     GPL-2.0+
> > + */
> > +
> > +#include <common.h>
> > +#include <clk.h>
> > +#include <dm.h>
> > +#include <ram.h>
> > +#include <syscon.h>
> > +#include <asm/io.h>
> > +#include <asm/arch/clock.h>
> > +#include <asm/arch/periph.h>
> > +#include <asm/arch/pmu_rk3288.h>
> > +#include <asm/arch/boot_mode.h>
> > +#include <asm/gpio.h>
> > +#include <dm/pinctrl.h>
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +int board_init(void)
> > +{
> > +#if defined(CONFIG_ROCKCHIP_SPL_BACK_TO_BROM)
> > +       struct udevice *pinctrl;
> > +       int ret;
> > +
> > +       /*
> > +        * We need to implement sdcard iomux here for the further
> > +        * initialization, otherwise, it'll hit sdcard command sending
> > +        * timeout exception.
> > +        */
> > +       ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
> > +       if (ret) {
> > +               debug("%s: Cannot find pinctrl device\n", __func__);
> > +               goto err;
> > +       }
> > +       ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
> > +       if (ret) {
> > +               debug("%s: Failed to set up SD card\n", __func__);
> > +               goto err;
> > +       }
> > +
> > +       return 0;
> > +err:
> > +       printf("board_init: Error %d\n", ret);
> > +
> > +       /* No way to report error here */
> > +       hang();
> > +
> > +       return -1;
> > +#else
> > +       return 0;
> > +#endif
> > +}
> > +
> > +int dram_init(void)
> > +{
> > +       /* FIXME: read back ram size from sys_reg2 */
> 
> TODO(email):
> > +       gd->ram_size = 0x40000000;

yep, I plan on doing this once the jump from spl to uboot actually works :-)


> > +
> > +       return 0;
> > +}
> > +
> > +#ifndef CONFIG_SYS_DCACHE_OFF
> > +void enable_caches(void)
> > +{
> > +       /* Enable D-cache. I-cache is already enabled in start.S */
> > +       dcache_enable();
> > +}
> > +#endif
> > --
> > 2.11.0
> 
> Regards,
> Simon

  reply	other threads:[~2017-02-11  0:47 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-03 16:09 [U-Boot] [PATCH v3 00/16] rk3188 uboot support Heiko Stuebner
2017-02-03 16:09 ` [U-Boot] [PATCH v3 01/16] dm: allow limiting pre-reloc markings to spl or tpl Heiko Stuebner
2017-02-06 15:34   ` Simon Glass
2017-02-17  0:36     ` Heiko Stübner
2017-02-22  3:59       ` Simon Glass
2017-02-03 16:09 ` [U-Boot] [PATCH v3 02/16] rockchip: move bootrom helper compilation to a hidden option Heiko Stuebner
2017-02-06 15:34   ` Simon Glass
2017-02-03 16:09 ` [U-Boot] [PATCH v3 03/16] rockchip: mkimage: Allow encoding of loader code in spl images Heiko Stuebner
2017-02-06 15:35   ` Simon Glass
2017-02-17  3:23   ` Kever Yang
2017-02-03 16:09 ` [U-Boot] [PATCH v3 04/16] rockchip: mkimage: Add support rk3188 serial Heiko Stuebner
2017-02-06 15:35   ` Simon Glass
2017-02-17  3:29   ` Kever Yang
2017-02-03 16:09 ` [U-Boot] [PATCH v3 05/16] rockchip: serial: Adapt rockchip of-platdata driver for rk3188 Heiko Stuebner
2017-02-06 15:35   ` Simon Glass
2017-02-03 16:09 ` [U-Boot] [PATCH v3 06/16] rockchip: rk3188: Add header files for PMU and GRF Heiko Stuebner
2017-02-03 16:09 ` [U-Boot] [PATCH v3 07/16] rockchip: rk3188: Add pinctrl driver Heiko Stuebner
2017-02-03 16:09 ` [U-Boot] [PATCH v3 08/16] rockchip: rk3188: Add sysreset driver Heiko Stuebner
2017-02-06 15:35   ` Simon Glass
2017-02-03 16:09 ` [U-Boot] [PATCH v3 09/16] rockchip: rk3188: Add rk3066/rk3188 clock bindings Heiko Stuebner
2017-02-03 16:09 ` [U-Boot] [PATCH v3 10/16] rockchip: rk3188: Add clock driver Heiko Stuebner
2017-02-06 15:35   ` Simon Glass
2017-02-18 14:19     ` Heiko Stuebner
2017-02-21 18:07       ` Simon Glass
2017-02-21 20:35         ` Simon Glass
2017-02-03 16:09 ` [U-Boot] [PATCH v3 11/16] rockchip: rk3188: Add core devicetree files Heiko Stuebner
2017-02-06 15:35   ` Simon Glass
2017-02-10 23:17     ` Heiko Stuebner
2017-02-03 16:09 ` [U-Boot] [PATCH v3 12/16] rockchip: rk3188: Add core support Heiko Stuebner
2017-02-06 15:35   ` Simon Glass
2017-02-03 16:09 ` [U-Boot] [PATCH v3 13/16] rockchip: rk3188: Add sdram driver Heiko Stuebner
2017-02-06 15:35   ` Simon Glass
2017-02-17 20:39     ` Heiko Stuebner
2017-02-17 20:44       ` Simon Glass
2017-02-03 16:09 ` [U-Boot] [PATCH v3 14/16] rockchip: rk3188: Add main, spl and tpl boards Heiko Stuebner
2017-02-06 15:35   ` Simon Glass
2017-02-11  0:47     ` Heiko Stuebner [this message]
2017-02-03 16:09 ` [U-Boot] [PATCH v3 15/16] rockchip: rk3188: Add Radxa Rock board Heiko Stuebner
2017-02-06 15:35   ` Simon Glass
2017-02-03 16:09 ` [U-Boot] [TEST-ONLY 16/16] Add a temporary script that can create a bootimage for rk3188 Heiko Stuebner
2017-02-06 15:35   ` Simon Glass
2017-02-16 20:43 ` [U-Boot] [PATCH v3 00/16] rk3188 uboot support Simon Glass
2017-02-17  0:41   ` Heiko Stübner
2017-02-17 20:11     ` Heiko Stuebner
2017-02-17  3:21 ` Kever Yang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51300309.Jp5btNiEcP@phil \
    --to=heiko@sntech.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.