linux-rockchip.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 0/5] roc-rk3399-pc: Custom SPL
@ 2020-07-14  9:32 Jagan Teki
  2020-07-14  9:32 ` [PATCH v5 1/5] roc-rk3399-pc: Move leds setup in SPL Jagan Teki
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Jagan Teki @ 2020-07-14  9:32 UTC (permalink / raw)
  To: Kever Yang, Philipp Tomsich, Simon Glass
  Cc: Suniel Mahesh, U-Boot-Denx, linux-rockchip, linux-amarula,
	Jagan Teki

This series supports custom initialization code required for 
roc-rk3399-pc board on SPL stage.

Now this series is well mature code handling to add custom 
spl_board_init code parts.

roc-rk3399-pc would require custom leds initialization based 
on user intervention of the power key. This code handles the 
user intervention via SPI environment variable. If someone 
or production systems wants this feature then 'pwr_key' has 
to be set otherwise it is normal like other rk3399 boards 
in Mainline.

Changes for v5:
- drop banner changes
- add code changes in roc-pc-rk3399.c
Changes for v4:
- enable SPL_BOARD_INIT in all platforms
Changes for v3:
- support leds on SPL
- support env 'pwr_key'

Jagan Teki (5):
  roc-rk3399-pc: Move leds setup in SPL
  rockchip: Don't clear the reset status reg
  rockchip: Separate the reset cause from display cpuinfo
  rockchip: spl: Move board_early_init_f after cpu timer
  roc-rk3399-pc: Set LED only during POR and pwr_key=y

 arch/arm/include/asm/arch-rockchip/cru.h    |  3 +-
 arch/arm/mach-rockchip/Makefile             |  5 +-
 arch/arm/mach-rockchip/cpu-info.c           | 26 ++++----
 arch/arm/mach-rockchip/spl.c                |  5 +-
 arch/arm/mach-rockchip/tpl.c                |  7 ---
 board/firefly/roc-pc-rk3399/roc-pc-rk3399.c | 67 ++++++++++++++++-----
 configs/roc-pc-mezzanine-rk3399_defconfig   |  5 +-
 configs/roc-pc-rk3399_defconfig             |  5 +-
 8 files changed, 80 insertions(+), 43 deletions(-)

-- 
2.25.1

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v5 1/5] roc-rk3399-pc: Move leds setup in SPL
  2020-07-14  9:32 [PATCH v5 0/5] roc-rk3399-pc: Custom SPL Jagan Teki
@ 2020-07-14  9:32 ` Jagan Teki
  2020-07-18 12:45   ` Kever Yang
  2020-07-14  9:32 ` [PATCH v5 2/5] rockchip: Don't clear the reset status reg Jagan Teki
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 10+ messages in thread
From: Jagan Teki @ 2020-07-14  9:32 UTC (permalink / raw)
  To: Kever Yang, Philipp Tomsich, Simon Glass
  Cc: Suniel Mahesh, U-Boot-Denx, linux-rockchip, linux-amarula,
	Jagan Teki

roc-rk3399-pc has some specific requirements to support LEDS,
environment. board detection and etc prior to U-Boot proper.

So as of now SPL would be a better stage for these custom board
requirements to support unlike TPL. Adding few of these custom
requirements like LEDS in TPL would require extra code pulling
and also the size of TPL can grow.

So, this patch moves the leds code from TPL into SPL after relocation.

Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
---
Changes for v5
- drop tpl.c file
- update the code in board file

 arch/arm/mach-rockchip/tpl.c                |  7 ----
 board/firefly/roc-pc-rk3399/roc-pc-rk3399.c | 36 +++++++++++----------
 configs/roc-pc-mezzanine-rk3399_defconfig   |  2 +-
 configs/roc-pc-rk3399_defconfig             |  2 +-
 4 files changed, 21 insertions(+), 26 deletions(-)

diff --git a/arch/arm/mach-rockchip/tpl.c b/arch/arm/mach-rockchip/tpl.c
index 88f80b05a9..cc908e1b0e 100644
--- a/arch/arm/mach-rockchip/tpl.c
+++ b/arch/arm/mach-rockchip/tpl.c
@@ -43,18 +43,11 @@ __weak void rockchip_stimer_init(void)
 	       TIMER_CONTROL_REG);
 }
 
-__weak int board_early_init_f(void)
-{
-	return 0;
-}
-
 void board_init_f(ulong dummy)
 {
 	struct udevice *dev;
 	int ret;
 
-	board_early_init_f();
-
 #if defined(CONFIG_DEBUG_UART) && defined(CONFIG_TPL_SERIAL_SUPPORT)
 	/*
 	 * Debug UART can be used from here if required:
diff --git a/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c b/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c
index 7c3a803654..4db3dd739c 100644
--- a/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c
+++ b/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c
@@ -6,14 +6,24 @@
 #include <common.h>
 #include <dm.h>
 #include <log.h>
-#include <asm/arch-rockchip/periph.h>
-#include <power/regulator.h>
 #include <spl_gpio.h>
-#include <asm/io.h>
+#include <power/regulator.h>
+
 #include <asm/arch-rockchip/gpio.h>
 
-#ifndef CONFIG_SPL_BUILD
-int board_early_init_f(void)
+#define GPIO0_BASE		0xff720000
+
+static int led_setup(void)
+{
+	struct rockchip_gpio_regs * const gpio0 = (void *)GPIO0_BASE;
+
+	/* Turn on red LED, indicating full power mode */
+	spl_gpio_output(gpio0, GPIO(BANK_B, 5), 1);
+
+	return 0;
+}
+
+static int roc_pc_early_init_f(void)
 {
 	struct udevice *regulator;
 	int ret;
@@ -30,19 +40,11 @@ int board_early_init_f(void)
 out:
 	return 0;
 }
-#endif
-
-#if defined(CONFIG_TPL_BUILD)
-
-#define GPIO0_BASE      0xff720000
 
 int board_early_init_f(void)
 {
-	struct rockchip_gpio_regs * const gpio0 = (void *)GPIO0_BASE;
-
-	/* Turn on red LED, indicating full power mode */
-	spl_gpio_output(gpio0, GPIO(BANK_B, 5), 1);
-
-	return 0;
+	if (IS_ENABLED(CONFIG_SPL_BUILD))
+		return led_setup();
+	else
+		return roc_pc_early_init_f();
 }
-#endif
diff --git a/configs/roc-pc-mezzanine-rk3399_defconfig b/configs/roc-pc-mezzanine-rk3399_defconfig
index c87a8568fc..15d511741f 100644
--- a/configs/roc-pc-mezzanine-rk3399_defconfig
+++ b/configs/roc-pc-mezzanine-rk3399_defconfig
@@ -1,6 +1,7 @@
 CONFIG_ARM=y
 CONFIG_ARCH_ROCKCHIP=y
 CONFIG_SYS_TEXT_BASE=0x00200000
+CONFIG_SPL_GPIO_SUPPORT=y
 CONFIG_ENV_SIZE=0x8000
 CONFIG_ENV_OFFSET=0x3F8000
 CONFIG_ENV_SECT_SIZE=0x1000
@@ -21,7 +22,6 @@ CONFIG_SPL_STACK_R=y
 CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_TPL=y
-CONFIG_TPL_GPIO_SUPPORT=y
 CONFIG_CMD_BOOTZ=y
 CONFIG_CMD_GPT=y
 CONFIG_CMD_MMC=y
diff --git a/configs/roc-pc-rk3399_defconfig b/configs/roc-pc-rk3399_defconfig
index 601f5c6ae1..2a6d0d22c8 100644
--- a/configs/roc-pc-rk3399_defconfig
+++ b/configs/roc-pc-rk3399_defconfig
@@ -1,6 +1,7 @@
 CONFIG_ARM=y
 CONFIG_ARCH_ROCKCHIP=y
 CONFIG_SYS_TEXT_BASE=0x00200000
+CONFIG_SPL_GPIO_SUPPORT=y
 CONFIG_ENV_SIZE=0x8000
 CONFIG_ENV_OFFSET=0x3F8000
 CONFIG_ENV_SECT_SIZE=0x1000
@@ -21,7 +22,6 @@ CONFIG_SPL_STACK_R=y
 CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_TPL=y
-CONFIG_TPL_GPIO_SUPPORT=y
 CONFIG_CMD_BOOTZ=y
 CONFIG_CMD_GPT=y
 CONFIG_CMD_MMC=y
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v5 2/5] rockchip: Don't clear the reset status reg
  2020-07-14  9:32 [PATCH v5 0/5] roc-rk3399-pc: Custom SPL Jagan Teki
  2020-07-14  9:32 ` [PATCH v5 1/5] roc-rk3399-pc: Move leds setup in SPL Jagan Teki
@ 2020-07-14  9:32 ` Jagan Teki
  2020-07-18 12:45   ` Kever Yang
  2020-07-14  9:32 ` [PATCH v5 3/5] rockchip: Separate the reset cause from display cpuinfo Jagan Teki
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 10+ messages in thread
From: Jagan Teki @ 2020-07-14  9:32 UTC (permalink / raw)
  To: Kever Yang, Philipp Tomsich, Simon Glass
  Cc: Suniel Mahesh, U-Boot-Denx, linux-rockchip, linux-amarula,
	Jagan Teki

reset reason can be used several stages of U-Boot bootloader
like SPL, U-Boot proper based on the requirements.

Clearing the status register end of get_reset_cause will end
up showing the wrong reset cause when it read the second time.
For example, if board resets, SPL reads the reset status as
RST whereas U-Boot proper reads the status as POR.

However, based on the latest testing clearing reset status
won't be required for determine the last reset cause or
following resets.

Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
---
Changes for v5:
- new patch

 arch/arm/include/asm/arch-rockchip/cru.h | 1 -
 arch/arm/mach-rockchip/cpu-info.c        | 6 ------
 2 files changed, 7 deletions(-)

diff --git a/arch/arm/include/asm/arch-rockchip/cru.h b/arch/arm/include/asm/arch-rockchip/cru.h
index 5eb17f9d55..d2057cb738 100644
--- a/arch/arm/include/asm/arch-rockchip/cru.h
+++ b/arch/arm/include/asm/arch-rockchip/cru.h
@@ -26,7 +26,6 @@ enum {
 	SND_GLB_TSADC_RST_ST	= BIT(3),
 	FST_GLB_WDT_RST_ST	= BIT(4),
 	SND_GLB_WDT_RST_ST	= BIT(5),
-	GLB_RST_ST_MASK		= GENMASK(5, 0),
 };
 
 #define MHz		1000000
diff --git a/arch/arm/mach-rockchip/cpu-info.c b/arch/arm/mach-rockchip/cpu-info.c
index 21ca9dedce..bb5a198039 100644
--- a/arch/arm/mach-rockchip/cpu-info.c
+++ b/arch/arm/mach-rockchip/cpu-info.c
@@ -47,12 +47,6 @@ static char *get_reset_cause(void)
 	 */
 	env_set("reset_reason", cause);
 
-	/*
-	 * Clear glb_rst_st, so we can determine the last reset cause
-	 * for following resets.
-	 */
-	rk_clrreg(&cru->glb_rst_st, GLB_RST_ST_MASK);
-
 	return cause;
 }
 
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v5 3/5] rockchip: Separate the reset cause from display cpuinfo
  2020-07-14  9:32 [PATCH v5 0/5] roc-rk3399-pc: Custom SPL Jagan Teki
  2020-07-14  9:32 ` [PATCH v5 1/5] roc-rk3399-pc: Move leds setup in SPL Jagan Teki
  2020-07-14  9:32 ` [PATCH v5 2/5] rockchip: Don't clear the reset status reg Jagan Teki
@ 2020-07-14  9:32 ` Jagan Teki
  2020-07-18 12:45   ` Kever Yang
  2020-07-14  9:32 ` [PATCH v5 4/5] rockchip: spl: Move board_early_init_f after cpu timer Jagan Teki
  2020-07-14  9:32 ` [PATCH v5 5/5] roc-rk3399-pc: Set LED only during POR and pwr_key=y Jagan Teki
  4 siblings, 1 reply; 10+ messages in thread
From: Jagan Teki @ 2020-07-14  9:32 UTC (permalink / raw)
  To: Kever Yang, Philipp Tomsich, Simon Glass
  Cc: Suniel Mahesh, U-Boot-Denx, linux-rockchip, linux-amarula,
	Jagan Teki

reset cause is a generic functionality based on the soc
cru registers in rockchip. This can be used for printing
the cause of reset in cpuinfo or some other place where
reset cause is needed. 

Other than cpuinfo, reset cause can also be using during
bootcount for checking the specific reset cause and glow
the led based on the reset cause.

So, let's separate the reset cause code from cpuinfo, and
add a check to build it for rk3399, rk3288 since these two
soc are supporting reset cause as of now.

Tested-by: Suniel Mahesh <sunil@amarulasolutions.com>
Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
---
Changes for v5:
- update Makefile

 arch/arm/include/asm/arch-rockchip/cru.h |  2 ++
 arch/arm/mach-rockchip/Makefile          |  5 ++++-
 arch/arm/mach-rockchip/cpu-info.c        | 20 ++++++++++++--------
 3 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/arch/arm/include/asm/arch-rockchip/cru.h b/arch/arm/include/asm/arch-rockchip/cru.h
index d2057cb738..13ea4aba8e 100644
--- a/arch/arm/include/asm/arch-rockchip/cru.h
+++ b/arch/arm/include/asm/arch-rockchip/cru.h
@@ -30,4 +30,6 @@ enum {
 
 #define MHz		1000000
 
+char *get_reset_cause(void);
+
 #endif /* _ROCKCHIP_CLOCK_H */
diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
index 5b38526fe0..121f23a563 100644
--- a/arch/arm/mach-rockchip/Makefile
+++ b/arch/arm/mach-rockchip/Makefile
@@ -22,11 +22,14 @@ ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),)
 # we can have the preprocessor correctly recognise both 0x0 and 0
 # meaning "turn it off".
 obj-y += boot_mode.o
-obj-$(CONFIG_DISPLAY_CPUINFO) += cpu-info.o
 obj-$(CONFIG_ROCKCHIP_COMMON_BOARD) += board.o
 obj-$(CONFIG_MISC_INIT_R) += misc.o
 endif
 
+ifeq ($(CONFIG_TPL_BUILD),)
+obj-$(CONFIG_DISPLAY_CPUINFO) += cpu-info.o
+endif
+
 obj-$(CONFIG_$(SPL_TPL_)RAM) += sdram.o
 
 obj-$(CONFIG_ROCKCHIP_PX30) += px30/
diff --git a/arch/arm/mach-rockchip/cpu-info.c b/arch/arm/mach-rockchip/cpu-info.c
index bb5a198039..d0f030109f 100644
--- a/arch/arm/mach-rockchip/cpu-info.c
+++ b/arch/arm/mach-rockchip/cpu-info.c
@@ -13,7 +13,7 @@
 #include <asm/arch-rockchip/hardware.h>
 #include <linux/err.h>
 
-static char *get_reset_cause(void)
+char *get_reset_cause(void)
 {
 	struct rockchip_cru *cru = rockchip_get_cru();
 	char *cause = NULL;
@@ -41,21 +41,25 @@ static char *get_reset_cause(void)
 		cause = "unknown reset";
 	}
 
-	/**
-	 * reset_reason env is used by rk3288, due to special use case
-	 * to figure it the boot behavior. so keep this as it is.
-	 */
-	env_set("reset_reason", cause);
-
 	return cause;
 }
 
+#if CONFIG_IS_ENABLED(DISPLAY_CPUINFO)
 int print_cpuinfo(void)
 {
+	char *cause = get_reset_cause();
+
 	printf("SoC: Rockchip %s\n", CONFIG_SYS_SOC);
-	printf("Reset cause: %s\n", get_reset_cause());
+	printf("Reset cause: %s\n", cause);
+
+	/**
+	 * reset_reason env is used by rk3288, due to special use case
+	 * to figure it the boot behavior. so keep this as it is.
+	 */
+	env_set("reset_reason", cause);
 
 	/* TODO print operating temparature and clock */
 
 	return 0;
 }
+#endif
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v5 4/5] rockchip: spl: Move board_early_init_f after cpu timer
  2020-07-14  9:32 [PATCH v5 0/5] roc-rk3399-pc: Custom SPL Jagan Teki
                   ` (2 preceding siblings ...)
  2020-07-14  9:32 ` [PATCH v5 3/5] rockchip: Separate the reset cause from display cpuinfo Jagan Teki
@ 2020-07-14  9:32 ` Jagan Teki
  2020-07-18 13:22   ` Kever Yang
  2020-07-14  9:32 ` [PATCH v5 5/5] roc-rk3399-pc: Set LED only during POR and pwr_key=y Jagan Teki
  4 siblings, 1 reply; 10+ messages in thread
From: Jagan Teki @ 2020-07-14  9:32 UTC (permalink / raw)
  To: Kever Yang, Philipp Tomsich, Simon Glass
  Cc: Suniel Mahesh, U-Boot-Denx, linux-rockchip, linux-amarula,
	Jagan Teki

Custom board_early_init_f not only deal with simple gpio
configuration but also have a possibility to access clocks
to process any clock related operations like checking reset
cause state and etc.

So, call it once the rockchip timer initialization done instead
of calling first place of board_init_f which doesn't have any
rockchip init code before.

This specific concern was tested with checking reset reason
via board_early_init_f, which indeed require a clk probe.

Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
---
Changes for v5:
- new patch

 arch/arm/mach-rockchip/spl.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-rockchip/spl.c b/arch/arm/mach-rockchip/spl.c
index cddf4fd3d5..082828de66 100644
--- a/arch/arm/mach-rockchip/spl.c
+++ b/arch/arm/mach-rockchip/spl.c
@@ -122,8 +122,6 @@ void board_init_f(ulong dummy)
 	debug("\nspl:debug uart enabled in %s\n", __func__);
 #endif
 
-	board_early_init_f();
-
 	ret = spl_early_init();
 	if (ret) {
 		printf("spl_early_init() failed: %d\n", ret);
@@ -137,6 +135,9 @@ void board_init_f(ulong dummy)
 	/* Init ARM arch timer in arch/arm/cpu/armv7/arch_timer.c */
 	timer_init();
 #endif
+
+	board_early_init_f();
+
 #if !defined(CONFIG_TPL) || defined(CONFIG_SPL_RAM)
 	debug("\nspl:init dram\n");
 	ret = dram_init();
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v5 5/5] roc-rk3399-pc: Set LED only during POR and pwr_key=y
  2020-07-14  9:32 [PATCH v5 0/5] roc-rk3399-pc: Custom SPL Jagan Teki
                   ` (3 preceding siblings ...)
  2020-07-14  9:32 ` [PATCH v5 4/5] rockchip: spl: Move board_early_init_f after cpu timer Jagan Teki
@ 2020-07-14  9:32 ` Jagan Teki
  4 siblings, 0 replies; 10+ messages in thread
From: Jagan Teki @ 2020-07-14  9:32 UTC (permalink / raw)
  To: Kever Yang, Philipp Tomsich, Simon Glass
  Cc: Suniel Mahesh, U-Boot-Denx, linux-rockchip, linux-amarula,
	Jagan Teki

ROC-RK3399-PC has specific set of configurations for
on-board led setup.

Due to easiness for user to know the state of the board
roc-rk339-pc board code will setup the low power led
on/off, and waiting for user to press power key and then
glow full power led.

All this needs to happen only during power-on-reset not
for soft reset or WDT.

Also, it is not a proper usage to ask the user to press
the Power key if the board connected remotely, so add
the environment variable 'pwr_key' to check as well.

So, user need to press Power key only
- during POR
- pwr_key=y

Tested-by: Suniel Mahesh <sunil@amarulasolutions.com>
Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
---
Changes for v5:
- add changes on board file

 board/firefly/roc-pc-rk3399/roc-pc-rk3399.c | 35 ++++++++++++++++++++-
 configs/roc-pc-mezzanine-rk3399_defconfig   |  3 ++
 configs/roc-pc-rk3399_defconfig             |  3 ++
 3 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c b/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c
index 4db3dd739c..ff2dc028a1 100644
--- a/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c
+++ b/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c
@@ -5,19 +5,52 @@
 
 #include <common.h>
 #include <dm.h>
+#include <env.h>
 #include <log.h>
 #include <spl_gpio.h>
+#include <asm/io.h>
 #include <power/regulator.h>
 
+#include <asm/arch-rockchip/cru.h>
 #include <asm/arch-rockchip/gpio.h>
+#include <asm/arch-rockchip/grf_rk3399.h>
 
+#define PMUGRF_BASE		0xff320000
 #define GPIO0_BASE		0xff720000
 
+/**
+ * LED setup for roc-rk3399-pc
+ *
+ * 1. Set the low power leds (only during POR, pwr_key env is 'y')
+ *    glow yellow LED, termed as low power
+ *    poll for on board power key press
+ *    once powe key pressed, turn off yellow
+ * 2. Turn on red LED, indicating full power mode
+ */
 static int led_setup(void)
 {
 	struct rockchip_gpio_regs * const gpio0 = (void *)GPIO0_BASE;
+	struct rk3399_pmugrf_regs * const pmugrf = (void *)PMUGRF_BASE;
+	bool press_pwr_key = false;
+
+	if (IS_ENABLED(CONFIG_SPL_ENV_SUPPORT)) {
+		env_init();
+		env_load();
+		if (env_get_yesno("pwr_key") == 1)
+			press_pwr_key = true;
+	}
+
+	if (press_pwr_key && !strcmp(get_reset_cause(), "POR")) {
+		spl_gpio_output(gpio0, GPIO(BANK_A, 2), 1);
+
+		spl_gpio_set_pull(&pmugrf->gpio0_p, GPIO(BANK_A, 5),
+				  GPIO_PULL_NORMAL);
+		while (readl(&gpio0->ext_port) & 0x20)
+			;
+
+		spl_gpio_output(gpio0, GPIO(BANK_A, 2), 0);
+	}
 
-	/* Turn on red LED, indicating full power mode */
 	spl_gpio_output(gpio0, GPIO(BANK_B, 5), 1);
 
 	return 0;
diff --git a/configs/roc-pc-mezzanine-rk3399_defconfig b/configs/roc-pc-mezzanine-rk3399_defconfig
index 15d511741f..14cda5850e 100644
--- a/configs/roc-pc-mezzanine-rk3399_defconfig
+++ b/configs/roc-pc-mezzanine-rk3399_defconfig
@@ -8,6 +8,7 @@ CONFIG_ENV_SECT_SIZE=0x1000
 CONFIG_SPL_DM_SPI=y
 CONFIG_ROCKCHIP_RK3399=y
 CONFIG_TARGET_ROC_PC_RK3399=y
+CONFIG_SPL_SYS_MALLOC_F_LEN=0x20000
 CONFIG_NR_DRAM_BANKS=1
 CONFIG_DEBUG_UART_BASE=0xFF1A0000
 CONFIG_DEBUG_UART_CLOCK=24000000
@@ -20,6 +21,7 @@ CONFIG_DISPLAY_BOARDINFO_LATE=y
 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000
+CONFIG_SPL_ENV_SUPPORT=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_TPL=y
 CONFIG_CMD_BOOTZ=y
@@ -34,6 +36,7 @@ CONFIG_DEFAULT_DEVICE_TREE="rk3399-roc-pc-mezzanine"
 CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_ROCKCHIP_GPIO=y
 CONFIG_SYS_I2C_ROCKCHIP=y
 CONFIG_MISC=y
diff --git a/configs/roc-pc-rk3399_defconfig b/configs/roc-pc-rk3399_defconfig
index 2a6d0d22c8..85f5c8f86b 100644
--- a/configs/roc-pc-rk3399_defconfig
+++ b/configs/roc-pc-rk3399_defconfig
@@ -8,6 +8,7 @@ CONFIG_ENV_SECT_SIZE=0x1000
 CONFIG_SPL_DM_SPI=y
 CONFIG_ROCKCHIP_RK3399=y
 CONFIG_TARGET_ROC_PC_RK3399=y
+CONFIG_SPL_SYS_MALLOC_F_LEN=0x20000
 CONFIG_NR_DRAM_BANKS=1
 CONFIG_DEBUG_UART_BASE=0xFF1A0000
 CONFIG_DEBUG_UART_CLOCK=24000000
@@ -20,6 +21,7 @@ CONFIG_DISPLAY_BOARDINFO_LATE=y
 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000
+CONFIG_SPL_ENV_SUPPORT=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_TPL=y
 CONFIG_CMD_BOOTZ=y
@@ -33,6 +35,7 @@ CONFIG_DEFAULT_DEVICE_TREE="rk3399-roc-pc"
 CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_ROCKCHIP_GPIO=y
 CONFIG_SYS_I2C_ROCKCHIP=y
 CONFIG_MISC=y
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v5 1/5] roc-rk3399-pc: Move leds setup in SPL
  2020-07-14  9:32 ` [PATCH v5 1/5] roc-rk3399-pc: Move leds setup in SPL Jagan Teki
@ 2020-07-18 12:45   ` Kever Yang
  0 siblings, 0 replies; 10+ messages in thread
From: Kever Yang @ 2020-07-18 12:45 UTC (permalink / raw)
  To: Jagan Teki, Philipp Tomsich, Simon Glass
  Cc: Suniel Mahesh, U-Boot-Denx, linux-rockchip, linux-amarula


On 2020/7/14 下午5:32, Jagan Teki wrote:
> roc-rk3399-pc has some specific requirements to support LEDS,
> environment. board detection and etc prior to U-Boot proper.
>
> So as of now SPL would be a better stage for these custom board
> requirements to support unlike TPL. Adding few of these custom
> requirements like LEDS in TPL would require extra code pulling
> and also the size of TPL can grow.
>
> So, this patch moves the leds code from TPL into SPL after relocation.
>
> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
Reviewed-by: Kever Yang<kever.yang@rock-chips.com>

Thanks,
- Kever
> ---
> Changes for v5
> - drop tpl.c file
> - update the code in board file
>
>   arch/arm/mach-rockchip/tpl.c                |  7 ----
>   board/firefly/roc-pc-rk3399/roc-pc-rk3399.c | 36 +++++++++++----------
>   configs/roc-pc-mezzanine-rk3399_defconfig   |  2 +-
>   configs/roc-pc-rk3399_defconfig             |  2 +-
>   4 files changed, 21 insertions(+), 26 deletions(-)
>
> diff --git a/arch/arm/mach-rockchip/tpl.c b/arch/arm/mach-rockchip/tpl.c
> index 88f80b05a9..cc908e1b0e 100644
> --- a/arch/arm/mach-rockchip/tpl.c
> +++ b/arch/arm/mach-rockchip/tpl.c
> @@ -43,18 +43,11 @@ __weak void rockchip_stimer_init(void)
>   	       TIMER_CONTROL_REG);
>   }
>   
> -__weak int board_early_init_f(void)
> -{
> -	return 0;
> -}
> -
>   void board_init_f(ulong dummy)
>   {
>   	struct udevice *dev;
>   	int ret;
>   
> -	board_early_init_f();
> -
>   #if defined(CONFIG_DEBUG_UART) && defined(CONFIG_TPL_SERIAL_SUPPORT)
>   	/*
>   	 * Debug UART can be used from here if required:
> diff --git a/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c b/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c
> index 7c3a803654..4db3dd739c 100644
> --- a/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c
> +++ b/board/firefly/roc-pc-rk3399/roc-pc-rk3399.c
> @@ -6,14 +6,24 @@
>   #include <common.h>
>   #include <dm.h>
>   #include <log.h>
> -#include <asm/arch-rockchip/periph.h>
> -#include <power/regulator.h>
>   #include <spl_gpio.h>
> -#include <asm/io.h>
> +#include <power/regulator.h>
> +
>   #include <asm/arch-rockchip/gpio.h>
>   
> -#ifndef CONFIG_SPL_BUILD
> -int board_early_init_f(void)
> +#define GPIO0_BASE		0xff720000
> +
> +static int led_setup(void)
> +{
> +	struct rockchip_gpio_regs * const gpio0 = (void *)GPIO0_BASE;
> +
> +	/* Turn on red LED, indicating full power mode */
> +	spl_gpio_output(gpio0, GPIO(BANK_B, 5), 1);
> +
> +	return 0;
> +}
> +
> +static int roc_pc_early_init_f(void)
>   {
>   	struct udevice *regulator;
>   	int ret;
> @@ -30,19 +40,11 @@ int board_early_init_f(void)
>   out:
>   	return 0;
>   }
> -#endif
> -
> -#if defined(CONFIG_TPL_BUILD)
> -
> -#define GPIO0_BASE      0xff720000
>   
>   int board_early_init_f(void)
>   {
> -	struct rockchip_gpio_regs * const gpio0 = (void *)GPIO0_BASE;
> -
> -	/* Turn on red LED, indicating full power mode */
> -	spl_gpio_output(gpio0, GPIO(BANK_B, 5), 1);
> -
> -	return 0;
> +	if (IS_ENABLED(CONFIG_SPL_BUILD))
> +		return led_setup();
> +	else
> +		return roc_pc_early_init_f();
>   }
> -#endif
> diff --git a/configs/roc-pc-mezzanine-rk3399_defconfig b/configs/roc-pc-mezzanine-rk3399_defconfig
> index c87a8568fc..15d511741f 100644
> --- a/configs/roc-pc-mezzanine-rk3399_defconfig
> +++ b/configs/roc-pc-mezzanine-rk3399_defconfig
> @@ -1,6 +1,7 @@
>   CONFIG_ARM=y
>   CONFIG_ARCH_ROCKCHIP=y
>   CONFIG_SYS_TEXT_BASE=0x00200000
> +CONFIG_SPL_GPIO_SUPPORT=y
>   CONFIG_ENV_SIZE=0x8000
>   CONFIG_ENV_OFFSET=0x3F8000
>   CONFIG_ENV_SECT_SIZE=0x1000
> @@ -21,7 +22,6 @@ CONFIG_SPL_STACK_R=y
>   CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000
>   CONFIG_SPL_SPI_LOAD=y
>   CONFIG_TPL=y
> -CONFIG_TPL_GPIO_SUPPORT=y
>   CONFIG_CMD_BOOTZ=y
>   CONFIG_CMD_GPT=y
>   CONFIG_CMD_MMC=y
> diff --git a/configs/roc-pc-rk3399_defconfig b/configs/roc-pc-rk3399_defconfig
> index 601f5c6ae1..2a6d0d22c8 100644
> --- a/configs/roc-pc-rk3399_defconfig
> +++ b/configs/roc-pc-rk3399_defconfig
> @@ -1,6 +1,7 @@
>   CONFIG_ARM=y
>   CONFIG_ARCH_ROCKCHIP=y
>   CONFIG_SYS_TEXT_BASE=0x00200000
> +CONFIG_SPL_GPIO_SUPPORT=y
>   CONFIG_ENV_SIZE=0x8000
>   CONFIG_ENV_OFFSET=0x3F8000
>   CONFIG_ENV_SECT_SIZE=0x1000
> @@ -21,7 +22,6 @@ CONFIG_SPL_STACK_R=y
>   CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000
>   CONFIG_SPL_SPI_LOAD=y
>   CONFIG_TPL=y
> -CONFIG_TPL_GPIO_SUPPORT=y
>   CONFIG_CMD_BOOTZ=y
>   CONFIG_CMD_GPT=y
>   CONFIG_CMD_MMC=y

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v5 2/5] rockchip: Don't clear the reset status reg
  2020-07-14  9:32 ` [PATCH v5 2/5] rockchip: Don't clear the reset status reg Jagan Teki
@ 2020-07-18 12:45   ` Kever Yang
  0 siblings, 0 replies; 10+ messages in thread
From: Kever Yang @ 2020-07-18 12:45 UTC (permalink / raw)
  To: Jagan Teki, Philipp Tomsich, Simon Glass
  Cc: Suniel Mahesh, U-Boot-Denx, linux-rockchip, linux-amarula


On 2020/7/14 下午5:32, Jagan Teki wrote:
> reset reason can be used several stages of U-Boot bootloader
> like SPL, U-Boot proper based on the requirements.
>
> Clearing the status register end of get_reset_cause will end
> up showing the wrong reset cause when it read the second time.
> For example, if board resets, SPL reads the reset status as
> RST whereas U-Boot proper reads the status as POR.
>
> However, based on the latest testing clearing reset status
> won't be required for determine the last reset cause or
> following resets.
>
> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
Reviewed-by: Kever Yang<kever.yang@rock-chips.com>

Thanks,
- Kever
> ---
> Changes for v5:
> - new patch
>
>   arch/arm/include/asm/arch-rockchip/cru.h | 1 -
>   arch/arm/mach-rockchip/cpu-info.c        | 6 ------
>   2 files changed, 7 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-rockchip/cru.h b/arch/arm/include/asm/arch-rockchip/cru.h
> index 5eb17f9d55..d2057cb738 100644
> --- a/arch/arm/include/asm/arch-rockchip/cru.h
> +++ b/arch/arm/include/asm/arch-rockchip/cru.h
> @@ -26,7 +26,6 @@ enum {
>   	SND_GLB_TSADC_RST_ST	= BIT(3),
>   	FST_GLB_WDT_RST_ST	= BIT(4),
>   	SND_GLB_WDT_RST_ST	= BIT(5),
> -	GLB_RST_ST_MASK		= GENMASK(5, 0),
>   };
>   
>   #define MHz		1000000
> diff --git a/arch/arm/mach-rockchip/cpu-info.c b/arch/arm/mach-rockchip/cpu-info.c
> index 21ca9dedce..bb5a198039 100644
> --- a/arch/arm/mach-rockchip/cpu-info.c
> +++ b/arch/arm/mach-rockchip/cpu-info.c
> @@ -47,12 +47,6 @@ static char *get_reset_cause(void)
>   	 */
>   	env_set("reset_reason", cause);
>   
> -	/*
> -	 * Clear glb_rst_st, so we can determine the last reset cause
> -	 * for following resets.
> -	 */
> -	rk_clrreg(&cru->glb_rst_st, GLB_RST_ST_MASK);
> -
>   	return cause;
>   }
>   

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v5 3/5] rockchip: Separate the reset cause from display cpuinfo
  2020-07-14  9:32 ` [PATCH v5 3/5] rockchip: Separate the reset cause from display cpuinfo Jagan Teki
@ 2020-07-18 12:45   ` Kever Yang
  0 siblings, 0 replies; 10+ messages in thread
From: Kever Yang @ 2020-07-18 12:45 UTC (permalink / raw)
  To: Jagan Teki, Philipp Tomsich, Simon Glass
  Cc: Suniel Mahesh, U-Boot-Denx, linux-rockchip, linux-amarula


On 2020/7/14 下午5:32, Jagan Teki wrote:
> reset cause is a generic functionality based on the soc
> cru registers in rockchip. This can be used for printing
> the cause of reset in cpuinfo or some other place where
> reset cause is needed.
>
> Other than cpuinfo, reset cause can also be using during
> bootcount for checking the specific reset cause and glow
> the led based on the reset cause.
>
> So, let's separate the reset cause code from cpuinfo, and
> add a check to build it for rk3399, rk3288 since these two
> soc are supporting reset cause as of now.
>
> Tested-by: Suniel Mahesh <sunil@amarulasolutions.com>
> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
Reviewed-by: Kever Yang<kever.yang@rock-chips.com>

Thanks,
- Kever
> ---
> Changes for v5:
> - update Makefile
>
>   arch/arm/include/asm/arch-rockchip/cru.h |  2 ++
>   arch/arm/mach-rockchip/Makefile          |  5 ++++-
>   arch/arm/mach-rockchip/cpu-info.c        | 20 ++++++++++++--------
>   3 files changed, 18 insertions(+), 9 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-rockchip/cru.h b/arch/arm/include/asm/arch-rockchip/cru.h
> index d2057cb738..13ea4aba8e 100644
> --- a/arch/arm/include/asm/arch-rockchip/cru.h
> +++ b/arch/arm/include/asm/arch-rockchip/cru.h
> @@ -30,4 +30,6 @@ enum {
>   
>   #define MHz		1000000
>   
> +char *get_reset_cause(void);
> +
>   #endif /* _ROCKCHIP_CLOCK_H */
> diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
> index 5b38526fe0..121f23a563 100644
> --- a/arch/arm/mach-rockchip/Makefile
> +++ b/arch/arm/mach-rockchip/Makefile
> @@ -22,11 +22,14 @@ ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),)
>   # we can have the preprocessor correctly recognise both 0x0 and 0
>   # meaning "turn it off".
>   obj-y += boot_mode.o
> -obj-$(CONFIG_DISPLAY_CPUINFO) += cpu-info.o
>   obj-$(CONFIG_ROCKCHIP_COMMON_BOARD) += board.o
>   obj-$(CONFIG_MISC_INIT_R) += misc.o
>   endif
>   
> +ifeq ($(CONFIG_TPL_BUILD),)
> +obj-$(CONFIG_DISPLAY_CPUINFO) += cpu-info.o
> +endif
> +
>   obj-$(CONFIG_$(SPL_TPL_)RAM) += sdram.o
>   
>   obj-$(CONFIG_ROCKCHIP_PX30) += px30/
> diff --git a/arch/arm/mach-rockchip/cpu-info.c b/arch/arm/mach-rockchip/cpu-info.c
> index bb5a198039..d0f030109f 100644
> --- a/arch/arm/mach-rockchip/cpu-info.c
> +++ b/arch/arm/mach-rockchip/cpu-info.c
> @@ -13,7 +13,7 @@
>   #include <asm/arch-rockchip/hardware.h>
>   #include <linux/err.h>
>   
> -static char *get_reset_cause(void)
> +char *get_reset_cause(void)
>   {
>   	struct rockchip_cru *cru = rockchip_get_cru();
>   	char *cause = NULL;
> @@ -41,21 +41,25 @@ static char *get_reset_cause(void)
>   		cause = "unknown reset";
>   	}
>   
> -	/**
> -	 * reset_reason env is used by rk3288, due to special use case
> -	 * to figure it the boot behavior. so keep this as it is.
> -	 */
> -	env_set("reset_reason", cause);
> -
>   	return cause;
>   }
>   
> +#if CONFIG_IS_ENABLED(DISPLAY_CPUINFO)
>   int print_cpuinfo(void)
>   {
> +	char *cause = get_reset_cause();
> +
>   	printf("SoC: Rockchip %s\n", CONFIG_SYS_SOC);
> -	printf("Reset cause: %s\n", get_reset_cause());
> +	printf("Reset cause: %s\n", cause);
> +
> +	/**
> +	 * reset_reason env is used by rk3288, due to special use case
> +	 * to figure it the boot behavior. so keep this as it is.
> +	 */
> +	env_set("reset_reason", cause);
>   
>   	/* TODO print operating temparature and clock */
>   
>   	return 0;
>   }
> +#endif

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v5 4/5] rockchip: spl: Move board_early_init_f after cpu timer
  2020-07-14  9:32 ` [PATCH v5 4/5] rockchip: spl: Move board_early_init_f after cpu timer Jagan Teki
@ 2020-07-18 13:22   ` Kever Yang
  0 siblings, 0 replies; 10+ messages in thread
From: Kever Yang @ 2020-07-18 13:22 UTC (permalink / raw)
  To: Jagan Teki, Philipp Tomsich, Simon Glass
  Cc: Suniel Mahesh, U-Boot-Denx, linux-rockchip, linux-amarula

Hi Jagan,

On 2020/7/14 下午5:32, Jagan Teki wrote:
> Custom board_early_init_f not only deal with simple gpio
> configuration but also have a possibility to access clocks
> to process any clock related operations like checking reset
> cause state and etc.
>
> So, call it once the rockchip timer initialization done instead
> of calling first place of board_init_f which doesn't have any
> rockchip init code before.
>
> This specific concern was tested with checking reset reason
> via board_early_init_f, which indeed require a clk probe.

board_early_init_f() is suppose to run at very beginning before
the spl framework is init, so I don't agree this move.
I think the led setup code definitely should go to spl_board_init().

As I said before, the setup_led should be the common feature,
so I think you can have a copy of setup_led() in rk3399.c as a weak
common function, and if roc-rk3399-pc is really special, then you
can have its own implementation.

Note that the spl_board_init in SPL is already very early stage in
system init, should be enough for your case, you can do a test for
the led_setup() in board_early_init_f() after this patch and in
spl_board_init(), they should be very close.

Thanks,
- Kever

>
> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
> ---
> Changes for v5:
> - new patch
>
>   arch/arm/mach-rockchip/spl.c | 5 +++--
>   1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-rockchip/spl.c b/arch/arm/mach-rockchip/spl.c
> index cddf4fd3d5..082828de66 100644
> --- a/arch/arm/mach-rockchip/spl.c
> +++ b/arch/arm/mach-rockchip/spl.c
> @@ -122,8 +122,6 @@ void board_init_f(ulong dummy)
>   	debug("\nspl:debug uart enabled in %s\n", __func__);
>   #endif
>   
> -	board_early_init_f();
> -
>   	ret = spl_early_init();
>   	if (ret) {
>   		printf("spl_early_init() failed: %d\n", ret);
> @@ -137,6 +135,9 @@ void board_init_f(ulong dummy)
>   	/* Init ARM arch timer in arch/arm/cpu/armv7/arch_timer.c */
>   	timer_init();
>   #endif
> +
> +	board_early_init_f();
> +
>   #if !defined(CONFIG_TPL) || defined(CONFIG_SPL_RAM)
>   	debug("\nspl:init dram\n");
>   	ret = dram_init();

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2020-07-18 13:22 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-07-14  9:32 [PATCH v5 0/5] roc-rk3399-pc: Custom SPL Jagan Teki
2020-07-14  9:32 ` [PATCH v5 1/5] roc-rk3399-pc: Move leds setup in SPL Jagan Teki
2020-07-18 12:45   ` Kever Yang
2020-07-14  9:32 ` [PATCH v5 2/5] rockchip: Don't clear the reset status reg Jagan Teki
2020-07-18 12:45   ` Kever Yang
2020-07-14  9:32 ` [PATCH v5 3/5] rockchip: Separate the reset cause from display cpuinfo Jagan Teki
2020-07-18 12:45   ` Kever Yang
2020-07-14  9:32 ` [PATCH v5 4/5] rockchip: spl: Move board_early_init_f after cpu timer Jagan Teki
2020-07-18 13:22   ` Kever Yang
2020-07-14  9:32 ` [PATCH v5 5/5] roc-rk3399-pc: Set LED only during POR and pwr_key=y Jagan Teki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).