This patch adds support for RS1 memory map based Versatile Express motherboard. As the RAM location has changed, the ZRE values and PLAT_PHYS_OFFSET defaults are changed to the new address (all future tiles will use RS1 map) and enforces AUTO_ZRELADD and ARM_PATCH_PHYS_VIRT when legacy devices are being used.
Signed-off-by: Pawel Moll <[email protected]> --- arch/arm/mach-vexpress/Kconfig | 5 +++ arch/arm/mach-vexpress/Makefile.boot | 6 ++-- arch/arm/mach-vexpress/core.h | 1 + arch/arm/mach-vexpress/include/mach/debug-macro.S | 37 ++++++++++++++++++-- arch/arm/mach-vexpress/include/mach/uncompress.h | 13 +++++++- arch/arm/mach-vexpress/v2m.c | 29 ++++++++++++++++ 6 files changed, 83 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig index 27c1294..9747125 100644 --- a/arch/arm/mach-vexpress/Kconfig +++ b/arch/arm/mach-vexpress/Kconfig @@ -3,6 +3,11 @@ menu "Versatile Express platform type" config ARCH_VEXPRESS_LEGACY bool + select AUTO_ZRELADDR + select ARM_PATCH_PHYS_VIRT + +config ARCH_VEXPRESS_RS1 + bool config ARCH_VEXPRESS_CA9X4 bool "Versatile Express Cortex-A9x4 tile" diff --git a/arch/arm/mach-vexpress/Makefile.boot b/arch/arm/mach-vexpress/Makefile.boot index 8630b3d..3278615 100644 --- a/arch/arm/mach-vexpress/Makefile.boot +++ b/arch/arm/mach-vexpress/Makefile.boot @@ -1,3 +1,3 @@ - zreladdr-y += 0x60008000 -params_phys-y := 0x60000100 -initrd_phys-y := 0x60800000 + zreladdr-y += 0x80008000 +params_phys-y := 0x80000100 +initrd_phys-y := 0x80800000 diff --git a/arch/arm/mach-vexpress/core.h b/arch/arm/mach-vexpress/core.h index 0ea502a..0b5c886 100644 --- a/arch/arm/mach-vexpress/core.h +++ b/arch/arm/mach-vexpress/core.h @@ -33,6 +33,7 @@ extern struct sys_timer v2m_timer; enum v2m_memory_map { v2m_memory_map_legacy, + v2m_memory_map_rs1, }; void __init v2m_dt_map_io(enum v2m_memory_map map); diff --git a/arch/arm/mach-vexpress/include/mach/debug-macro.S b/arch/arm/mach-vexpress/include/mach/debug-macro.S index fd9e6c7..adc94ce 100644 --- a/arch/arm/mach-vexpress/include/mach/debug-macro.S +++ b/arch/arm/mach-vexpress/include/mach/debug-macro.S @@ -10,12 +10,41 @@ * published by the Free Software Foundation. */ -#define DEBUG_LL_UART_OFFSET 0x00009000 +#define VEXPRESS_PHYS_BASE_LEGACY 0x10000000 +#define VEXPRESS_UART_OFFSET_LEGACY 0x00009000 + +#define VEXPRESS_PHYS_BASE_RS1 0x1c000000 +#define VEXPRESS_UART_OFFSET_RS1 0x00090000 + +#define VEXPRESS_VIRT_BASE 0xf8000000 .macro addruart,rp,rv,tmp - mov \rp, #DEBUG_LL_UART_OFFSET - orr \rv, \rp, #0xf8000000 @ virtual base - orr \rp, \rp, #0x10000000 @ physical base + + @ Check the MMU state +#if defined(CONFIG_MMU) + mrc p15, 0, \tmp, c1, c0 @ SCTRL + tst \tmp, #1 @ MMU enabled? + moveq \tmp, #VEXPRESS_PHYS_BASE_LEGACY + movne \tmp, #VEXPRESS_VIRT_BASE +#else + mov \tmp, #VEXPRESS_PHYS_BASE_LEGACY +#endif + + @ PL011 present in "legacy place"? + orr \tmp, \tmp, #VEXPRESS_UART_OFFSET_LEGACY + ldr \tmp, [\tmp, #0xfe0] @ PeriphID0 + teq \tmp, #0x11 @ PL011 + + @ Legacy memory map + moveq \rp, #VEXPRESS_UART_OFFSET_LEGACY + orreq \rv, \rp, #VEXPRESS_VIRT_BASE + orreq \rp, \rp, #VEXPRESS_PHYS_BASE_LEGACY + + @ RS1 memory map + movne \rp, #VEXPRESS_UART_OFFSET_RS1 + orrne \rv, \rp, #VEXPRESS_VIRT_BASE + orrne \rp, \rp, #VEXPRESS_PHYS_BASE_RS1 + .endm #include <asm/hardware/debug-pl01x.S> diff --git a/arch/arm/mach-vexpress/include/mach/uncompress.h b/arch/arm/mach-vexpress/include/mach/uncompress.h index 7972c57..0ac6ba5 100644 --- a/arch/arm/mach-vexpress/include/mach/uncompress.h +++ b/arch/arm/mach-vexpress/include/mach/uncompress.h @@ -22,7 +22,18 @@ #define AMBA_UART_CR(base) (*(volatile unsigned char *)((base) + 0x30)) #define AMBA_UART_FR(base) (*(volatile unsigned char *)((base) + 0x18)) -#define get_uart_base() (0x10000000 + 0x00009000) +#define AMBA_PERIPH_ID0(base) (*(volatile unsigned char *)((base) + 0xfe0)) + +#define UART_BASE_LEGACY 0x10009000 +#define UART_BASE_RS1 0x1c090000 + +static unsigned long get_uart_base(void) +{ + if (AMBA_PERIPH_ID0(UART_BASE_LEGACY) == 0x11) + return UART_BASE_LEGACY; + else + return UART_BASE_RS1; +} /* * This does not append a newline diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 39900c4..b3bbf43 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c @@ -34,6 +34,7 @@ #include "core.h" +/* Legacy memory map values for non-DT code */ #define V2M_PA_CS0 0x40000000 #define V2M_PA_CS1 0x44000000 #define V2M_PA_CS2 0x48000000 @@ -494,12 +495,24 @@ static unsigned long __init v2m_dt_periph_offset(const char *alias) return be32_to_cpup(reg); } +static struct map_desc v2m_rs1_io_desc[] __initdata = { + { + .virtual = V2M_PERIPH, + .pfn = __phys_to_pfn(0x1c000000), + .length = SZ_2M, + .type = MT_DEVICE, + }, +}; + void __init v2m_dt_map_io(enum v2m_memory_map map) { switch (map) { case v2m_memory_map_legacy: iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc)); break; + case v2m_memory_map_rs1: + iotable_init(v2m_rs1_io_desc, ARRAY_SIZE(v2m_rs1_io_desc)); + break; default: panic("%s: Unknown memory map requested!\n", __func__); break; @@ -533,11 +546,27 @@ static struct of_dev_auxdata v2m_legacy_dt_auxdata_lookup[] __initdata = { {} }; +static struct of_dev_auxdata v2m_rs1_dt_auxdata_lookup[] __initdata = { + OF_DEV_AUXDATA("arm,vexpress-flash", 0x08000000, "physmap-flash", + &v2m_flash_data), + OF_DEV_AUXDATA("arm,primecell", 0x1c0f0000, "mb:wdt", NULL), + OF_DEV_AUXDATA("arm,primecell", 0x1c050000, "mb:mmci", &v2m_mmci_data), + OF_DEV_AUXDATA("arm,primecell", 0x1c060000, "mb:kmi0", NULL), + OF_DEV_AUXDATA("arm,primecell", 0x1c070000, "mb:kmi1", NULL), + OF_DEV_AUXDATA("arm,primecell", 0x1c090000, "mb:uart0", NULL), + OF_DEV_AUXDATA("arm,primecell", 0x1c0a0000, "mb:uart1", NULL), + OF_DEV_AUXDATA("arm,primecell", 0x1c0b0000, "mb:uart2", NULL), + OF_DEV_AUXDATA("arm,primecell", 0x1c0c0000, "mb:uart3", NULL), + {} +}; + struct of_dev_auxdata * __init v2m_dt_get_auxdata(enum v2m_memory_map map) { switch (map) { case v2m_memory_map_legacy: return v2m_legacy_dt_auxdata_lookup; + case v2m_memory_map_rs1: + return v2m_rs1_dt_auxdata_lookup; default: panic("%s: Unknown memory map requested!\n", __func__); return NULL; -- 1.6.3.3 _______________________________________________ devicetree-discuss mailing list [email protected] https://lists.ozlabs.org/listinfo/devicetree-discuss
