Skip to contentSkip to conversation

arm: mvebu: Allow DB-88F6820-GP to boot Linux

PATCH Superseded Kevin Smith 2 participants 8 messages May 13, 2015 – May 15, 2015

Subsystems (3)

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

v2 cover arm: mvebu: Allow DB-88F6820-GP to boot Linux

Changes needed to allow the DB-88F6820-GP development board to successfully boot a Linux kernel.

Changes in v2:
- Correct address written to CBAR to be the SCU address instead of the internal registers address

Kevin Smith (3):
arm: mvebu: Update CBAR with SOC regs base mv-common.h: Include support for device trees db-88f6820-gp.h: Load data blobs into lower memory

Stefan Roese (1):
arm: mvebu: Disable L2 cache before enabling d-cache

 arch/arm/mach-mvebu/cpu.c       | 15 +++++++++++++++
 include/configs/db-88f6820-gp.h |  5 +++++
 include/configs/mv-common.h     |  2 ++
 3 files changed, 22 insertions(+)
Signature · 1 line
2.3.2
#1 lore raw

PATCH v2 1/4 arm: mvebu: Disable L2 cache before enabling d-cache

From: Stefan Roese <[email protected]>

L2 cache may still be enabled by the BootROM. We need to first disable it before enabling d-cache support.

---
 arch/arm/mach-mvebu/cpu.c | 8 ++++++++
 1 file changed, 8 insertions(+)
arch/arm/mach-mvebu/cpu.c +8 -0
index 04681fc..417fc35 100644
@@ -7,6 +7,7 @@
 #include <common.h>
 #include <netdev.h>
 #include <asm/io.h>
+#include <asm/pl310.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/soc.h>
 
@@ -240,6 +241,13 @@ int cpu_eth_init(bd_t *bis)
 #ifndef CONFIG_SYS_DCACHE_OFF
 void enable_caches(void)
 {
+	struct pl310_regs *const pl310 =
+		(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
+
+	/* First disable L2 cache - may still be enable from BootROM */
+	if (mvebu_soc_family() == MVEBU_SOC_A38X)
+		clrbits_le32(&pl310->pl310_ctrl, L2X0_CTRL_EN);
+
 	/* Avoid problem with e.g. neta ethernet driver */
 	invalidate_dcache_all();
 
Signature · 1 line
2.3.2
#2 lore raw

PATCH v2 2/4 arm: mvebu: Update CBAR with SOC regs base

In reply to Kevin Smith

SMP-enabled Linux kernels read the CBAR register in CP15 to find the address of the SCU registers. After remapping internal registers, also update the CBAR so the kernel can find them.

---
 arch/arm/mach-mvebu/cpu.c | 7 +++++++
 1 file changed, 7 insertions(+)
arch/arm/mach-mvebu/cpu.c +7 -0
index 417fc35..2970e07 100644
@@ -161,10 +161,17 @@ static void update_sdram_window_sizes(void)
 }
 
 #ifdef CONFIG_ARCH_CPU_INIT
+static void set_cbar (u32 addr)
+{
+    asm ("mcr p15, 4, %0, c15, c0" : : "r" (addr));
+}
+
+
 int arch_cpu_init(void)
 {
 	/* Linux expects the internal registers to be at 0xf1000000 */
 	writel(SOC_REGS_PHY_BASE, INTREG_BASE_ADDR_REG);
+	set_cbar (SOC_REGS_PHY_BASE + 0xC000);
 
 	/*
 	 * We need to call mvebu_mbus_probe() before calling
Signature · 1 line
2.3.2
#3 lore raw

PATCH v2 2/4 arm: mvebu: Update CBAR with SOC regs base

Quoted 3 lines · Kevin Smith

SMP-enabled Linux kernels read the CBAR register in CP15 to find the address of the SCU registers. After remapping internal registers, also update the CBAR so the kernel can find them.

Thanks Kevin. Only some coding style related comments below:

Quoted 10 lines
---
  arch/arm/mach-mvebu/cpu.c | 7 +++++++
  1 file changed, 7 insertions(+)
arch/arm/mach-mvebu/cpu.c +0 -0
index 417fc35..2970e07 100644

arch/arm/mach-mvebu/cpu.c static void update_sdram_window_sizes(void) · line 167

Quoted 7 lines
arch/arm/mach-mvebu/cpu.c +4 -0
@@ -161,10 +161,17 @@ static void update_sdram_window_sizes(void)
  }
 
  #ifdef CONFIG_ARCH_CPU_INIT
+static void set_cbar (u32 addr)
+{
+    asm ("mcr p15, 4, %0, c15, c0" : : "r" (addr));
+}

Indentation with tabs please. And no space before the "(".

arch/arm/mach-mvebu/cpu.c static void update_sdram_window_sizes(void) · line 174

Quoted 7 lines
arch/arm/mach-mvebu/cpu.c +3 -0
+
+
  int arch_cpu_init(void)
  {
  	/* Linux expects the internal registers to be at 0xf1000000 */
  	writel(SOC_REGS_PHY_BASE, INTREG_BASE_ADDR_REG);
+	set_cbar (SOC_REGS_PHY_BASE + 0xC000);

No space before the "(" please. checkpatch should complain about these minor issues btw. So its always recommended to run it before sending the patches to the list.

Please send an updated version and add my

Thanks,
Stefan

#4 lore raw

PATCH v2 3/4 mv-common.h: Include support for device trees

In reply to Kevin Smith
---
 include/configs/mv-common.h | 2 ++
 1 file changed, 2 insertions(+)
include/configs/mv-common.h +2 -0
index 51436da..03518b0 100644
@@ -59,6 +59,8 @@
 #define CONFIG_BOOTDELAY	3	/* default enable autoboot */
 #define CONFIG_PREBOOT
 
+#define CONFIG_OF_LIBFDT	1	/* Device tree support */
+
 /*
  * For booting Linux, the board info and command line data
  * have to be in the first 8 MB of memory, since this is
Signature · 1 line
2.3.2
#5 lore raw

PATCH v2 3/4 mv-common.h: Include support for device trees

Quoted 10 lines · Kevin Smith
---
  include/configs/mv-common.h | 2 ++
  1 file changed, 2 insertions(+)
include/configs/mv-common.h +0 -0
index 51436da..03518b0 100644

include/configs/mv-common.h line 62

Quoted 4 lines
include/configs/mv-common.h +1 -0
@@ -59,6 +59,8 @@
  #define CONFIG_BOOTDELAY	3	/* default enable autoboot */
  #define CONFIG_PREBOOT
 
+#define CONFIG_OF_LIBFDT	1	/* Device tree support */

To enable this option, no value is needed. So

#define CONFIG_OF_LIBFDT /* Device tree support */

should do as well and is preferred.

Thanks,
Stefan

#6 lore raw

PATCH v2 4/4 db-88f6820-gp.h: Load data blobs into lower memory

In reply to Kevin Smith

By default on this platform, u-boot loads data into high memory in the range of 0x7Fxxxxxx, which generates a data abort when the kernel tries to read it. Config the u-boot environment to load the device tree and initrd image into lower memory to make them accessible to the kernel.

---
 include/configs/db-88f6820-gp.h | 5 +++++
 1 file changed, 5 insertions(+)
include/configs/db-88f6820-gp.h +5 -0
index 12a24ce..490d74e 100644
@@ -63,6 +63,11 @@
 #define CONFIG_SYS_CONSOLE_INFO_QUIET	/* don't print console @ startup */
 #define CONFIG_SYS_ALT_MEMTEST
 
+/* Keep device tree and initrd in lower memory so the kernel can access them */
+#define CONFIG_EXTRA_ENV_SETTINGS       \
+        "fdt_high=0x10000000\0"         \
+        "initrd_high=0x10000000\0"
+
 /*
  * mv-common.h should be defined after CMD configs since it used them
  * to enable certain macros
Signature · 1 line
2.3.2
#7 lore raw

PATCH v2 4/4 db-88f6820-gp.h: Load data blobs into lower memory

Quoted 16 lines · Kevin Smith

By default on this platform, u-boot loads data into high memory in the range of 0x7Fxxxxxx, which generates a data abort when the kernel tries to read it. Config the u-boot environment to load the device tree and initrd image into lower memory to make them accessible to the kernel.

---
  include/configs/db-88f6820-gp.h | 5 +++++
  1 file changed, 5 insertions(+)
include/configs/db-88f6820-gp.h +0 -0
index 12a24ce..490d74e 100644

include/configs/db-88f6820-gp.h line 69

Quoted 7 lines
include/configs/db-88f6820-gp.h +4 -0
@@ -63,6 +63,11 @@
  #define CONFIG_SYS_CONSOLE_INFO_QUIET	/* don't print console @ startup */
  #define CONFIG_SYS_ALT_MEMTEST
 
+/* Keep device tree and initrd in lower memory so the kernel can access them */
+#define CONFIG_EXTRA_ENV_SETTINGS       \
+        "fdt_high=0x10000000\0"         \
+        "initrd_high=0x10000000\0"

Indentation with tabs please.

Thanks,
Stefan