rockchip: rk3188: enable remap function
authorHeiko Stübner <heiko@sntech.de>
Wed, 5 Apr 2017 22:19:36 +0000 (00:19 +0200)
committerSimon Glass <sjg@chromium.org>
Sat, 15 Apr 2017 16:13:17 +0000 (10:13 -0600)
Most Rockchip socs have the ability to either map the bootrom or a sram
area to the starting address of the cpu by flipping a bit in the GRF.

Newer socs leave this untouched and mapped to the bootrom but the legacy
loaders on rk3188 and before enabled the remap functionality and the
current smp implementation in the Linux kernel also requires it to be
enabled, to bring up secondary cpus.

So to keep smp working in the kernel, mimic the behaviour of the legacy
bootloaders and enable the remap functionality.

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Acked-by: Simon Glass <sjg@chromium.org>
arch/arm/mach-rockchip/Kconfig
arch/arm/mach-rockchip/rk3188-board.c

index af0796d1d06ad45d4de89a4d883fb8315edf87fb..5b4caec95338396564f8138e5a78fe370307f1f8 100644 (file)
@@ -18,6 +18,7 @@ config ROCKCHIP_RK3188
        select SUPPORT_TPL
        select SPL
        select TPL
+       select BOARD_LATE_INIT
        select ROCKCHIP_BROM_HELPER
        help
          The Rockchip RK3188 is a ARM-based SoC with a quad-core Cortex-A9
index c370156e4c04b9315ff745b4c193b3e82f197659..4be711e4418aa94e58b66946a7a3fc1eb2211c77 100644 (file)
@@ -11,6 +11,7 @@
 #include <syscon.h>
 #include <asm/io.h>
 #include <asm/arch/clock.h>
+#include <asm/arch/grf_rk3188.h>
 #include <asm/arch/periph.h>
 #include <asm/arch/pmu_rk3288.h>
 #include <asm/arch/boot_mode.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+int board_late_init(void)
+{
+       struct rk3188_grf *grf;
+
+       grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+       if (IS_ERR(grf)) {
+               error("grf syscon returned %ld\n", PTR_ERR(grf));
+       } else {
+               /* enable noc remap to mimic legacy loaders */
+               rk_clrsetreg(&grf->soc_con0,
+                       NOC_REMAP_MASK << NOC_REMAP_SHIFT,
+                       NOC_REMAP_MASK << NOC_REMAP_SHIFT);
+       }
+
+       return 0;
+}
+
 int board_init(void)
 {
 #if defined(CONFIG_ROCKCHIP_SPL_BACK_TO_BROM)