[linux-yocto] [PATCH 17/94] arm: AXM5516 emulation bringup mach-axxia
Bruce Ashfield
bruce.ashfield at windriver.com
Sat Nov 9 06:22:10 PST 2013
On 11/7/2013, 8:12 PM, Paul Butler wrote:
> Signed-off-by: Paul Butler <paul.butler at windriver.com>
> ---
> arch/arm/Makefile | 4 ++
> arch/arm/kernel/head.S | 8 +++
> arch/arm/mach-axxia/Kconfig | 3 +
> arch/arm/mach-axxia/include/mach/debug-macro.S | 34 ++++-----
How do the debug-macro changes play into bringup ?
> arch/arm/mach-axxia/platsmp.c | 96 +++++++++++++++++++++++++-
> init/main.c | 11 +++
> 6 files changed, 139 insertions(+), 17 deletions(-)
>
> diff --git a/arch/arm/Makefile b/arch/arm/Makefile
> index db992cd..16a0b42 100644
> --- a/arch/arm/Makefile
> +++ b/arch/arm/Makefile
> @@ -133,6 +133,10 @@ textofs-$(CONFIG_ARCH_MSM7X30) := 0x00208000
> textofs-$(CONFIG_ARCH_MSM8X60) := 0x00208000
> textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000
>
> +ifneq ($(CONFIG_ARCH_AXXIA_SIM),y)
> +textofs-$(CONFIG_ARCH_AXXIA) := 0x00408000
> +endif
> +
> # Machine directory name. This list is sorted alphanumerically
> # by CONFIG_* macro name.
> machine-$(CONFIG_ARCH_AT91) := at91
> diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
> index 3bf0c7f..bd39808 100644
> --- a/arch/arm/kernel/head.S
> +++ b/arch/arm/kernel/head.S
> @@ -52,7 +52,12 @@
> .equ swapper_pg_dir, KERNEL_RAM_VADDR - PG_DIR_SIZE
>
> .macro pgtbl, rd, phys
> +#ifdef CONFIG_ARCH_AXXIA
> + ldr \rd, =(TEXT_OFFSET - PG_DIR_SIZE)
> + add \rd, \rd, \phys
> +#else
> add \rd, \phys, #TEXT_OFFSET - PG_DIR_SIZE
> +#endif
> .endm
>
> #ifdef CONFIG_XIP_KERNEL
> @@ -289,6 +294,9 @@ __create_page_tables:
> #else
> orr r3, r3, #PMD_SECT_XN
> #endif
> +#ifdef CONFIG_ARCH_AXXIA
> + orr r7, r7, #0x20
> +#endif
> 1: str r3, [r0], #4
> #ifdef CONFIG_ARM_LPAE
> str r7, [r0], #4
> diff --git a/arch/arm/mach-axxia/Kconfig b/arch/arm/mach-axxia/Kconfig
> index 4a4922f..206c344 100644
> --- a/arch/arm/mach-axxia/Kconfig
> +++ b/arch/arm/mach-axxia/Kconfig
> @@ -28,4 +28,7 @@ config ARCH_AXXIA_DT
> If your bootloader supports Flattened Device Tree based booting,
> say Y here.
>
> +config ARCH_AXXIA_SIM
> + bool "Build for Simulation instead of Emulation or ASIC"
> +
> endmenu
> diff --git a/arch/arm/mach-axxia/include/mach/debug-macro.S b/arch/arm/mach-axxia/include/mach/debug-macro.S
> index f25a024..83d6670 100644
> --- a/arch/arm/mach-axxia/include/mach/debug-macro.S
> +++ b/arch/arm/mach-axxia/include/mach/debug-macro.S
> @@ -10,26 +10,28 @@
> * published by the Free Software Foundation.
> */
>
> -#ifdef CONFIG_DEBUG_VEXPRESS_CA9X4_UART
> -#define DEBUG_LL_PHYS_BASE 0x10000000
> -#define DEBUG_LL_UART_OFFSET 0x00009000
> -#endif
> +/*
> + * -- NOTE --
> + *
> +*/
>
> -#ifdef CONFIG_DEBUG_VEXPRESS_RS1_UART
> -#define DEBUG_LL_PHYS_BASE 0x1c000000
> -#define DEBUG_LL_UART_OFFSET 0x00090000
> +#if !defined(CONFIG_ARM_LPAE)
> +#error "Axxia Peripherals Are Only Accessible Using the LPAE!"
> #endif
>
> -#define DEBUG_LL_VIRT_BASE 0xf8000000
> +#define UART0_PHYSICAL_ADDRESS 0x0000002010080000ULL
> +#define UART1_PHYSICAL_ADDRESS 0x0000002010081000ULL
> +#define UART2_PHYSICAL_ADDRESS 0x0000002010082000ULL
> +#define UART3_PHYSICAL_ADDRESS 0x0000002010083000ULL
>
> -#ifndef DEBUG_LL_UART_OFFSET
> -#error "Unknown vexpress UART offset"
> -#endif
> +#define UART0_VIRTUAL_ADDRESS 0xf0080000
> +#define UART1_VIRTUAL_ADDRESS 0xf0081000
> +#define UART2_VIRTUAL_ADDRESS 0xf0082000
> +#define UART3_VIRTUAL_ADDRESS 0xf0083000
>
> - .macro addruart,rp,rv,tmp
> - mov \rp, #DEBUG_LL_UART_OFFSET
> - orr \rv, \rp, #DEBUG_LL_VIRT_BASE
> - orr \rp, \rp, #DEBUG_LL_PHYS_BASE
> - .endm
> + .macro addruart, rp, rv, tmp
> + ldr \rp, =0x10080000
> + ldr \rv, =0xf0080000
> + .endm
>
> #include <asm/hardware/debug-pl01x.S>
> diff --git a/arch/arm/mach-axxia/platsmp.c b/arch/arm/mach-axxia/platsmp.c
> index 4ba2e7a..95859ec 100644
> --- a/arch/arm/mach-axxia/platsmp.c
> +++ b/arch/arm/mach-axxia/platsmp.c
> @@ -31,6 +31,9 @@ volatile int __cpuinitdata pen_release = -1;
>
> extern void axxia_secondary_startup(void);
>
> +#define APB2_SER3_PHY_ADDR 0x002010030000ULL
> +#define APB2_SER3_ADDR_SIZE 0x10000
> +
> /*
> * Write pen_release in a way that is guaranteed to be visible to all
> * observers, irrespective of whether they're taking part in coherency
> @@ -113,7 +116,12 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
> #endif
>
> /* Wait for so long, then give up if nothing happens ... */
> +#ifdef CONFIG_ARCH_AXXIA_SIM
> timeout = jiffies + (1 * HZ);
> +#else
> + timeout = jiffies + (10 * HZ);
> +#endif
> +
> while (time_before(jiffies, timeout)) {
> smp_rmb();
> if (pen_release == -1)
> @@ -159,8 +167,10 @@ void __init smp_init_cpus(void)
> set_smp_cross_call(axxia_gic_raise_softirq);
> }
>
> -void __init platform_smp_prepare_cpus(unsigned int max_cpus)
> +void __init
> +platform_smp_prepare_cpus(unsigned int max_cpus)
> {
> +#ifdef CONFIG_ARCH_AXXIA_SIM
> int i;
>
> /*
> @@ -177,4 +187,88 @@ void __init platform_smp_prepare_cpus(unsigned int max_cpus)
> */
> *(u32 *)phys_to_virt(0x10000020) =
> virt_to_phys(axxia_secondary_startup);
> +#else
> + int i;
> + void __iomem *apb2_ser3_base;
> + unsigned long resetVal;
> + int phys_cpu, cpu_count=0;
> + struct device_node *np;
> + unsigned long release_addr[NR_CPUS] = {0};
> + unsigned long release;
> +
> + if (of_find_compatible_node(NULL, NULL, "lsi,axm5516")) {
> + for_each_node_by_name(np, "cpu") {
> + if (of_property_read_u32(np, "reg", &phys_cpu))
> + continue;
> +
> + if (0 == phys_cpu)
> + continue;
> +
> + if (of_property_read_u32(np, "cpu-release-addr",
> + &release))
> + continue;
> +
> + release_addr[phys_cpu] = release;
> + printk(KERN_ERR
> + "%s:%d - set address for %d to 0x%08x\n",
> + __FILE__, __LINE__,
> + phys_cpu, release_addr[phys_cpu]);
> + }
> +
> + /*
> + * Initialise the present map, which describes the set of CPUs
> + * actually populated at the present time.
> + */
> +
> + apb2_ser3_base = ioremap(APB2_SER3_PHY_ADDR, APB2_SER3_ADDR_SIZE);
> +
> + for (i = 0; i < NR_CPUS; i++) {
> + /* check if this is a possible CPU and
> + it is within max_cpus range */
> + if ((cpu_possible(i)) &&
> + (cpu_count < max_cpus) &&
> + (0 != release_addr[i])) {
> + resetVal = readl(apb2_ser3_base + 0x1010);
> + phys_cpu = cpu_logical_map(i);
> + set_cpu_present(cpu_count, true);
> + if (phys_cpu != 0) {
> + writel(0xab, apb2_ser3_base+0x1000);
> + resetVal &= ~(1 << phys_cpu);
> + writel(resetVal, apb2_ser3_base+0x1010);
> + udelay(1000);
> + }
> + cpu_count++;
> + }
> + }
> +
> + iounmap(apb2_ser3_base);
> +
> + /*
> + * This is the entry point of the routine that the secondary
> + * cores will execute once they are released from their
> + * "holding pen".
> + */
> + *(u32 *)phys_to_virt(release) =
> + virt_to_phys(axxia_secondary_startup);
> + smp_wmb();
> + __cpuc_flush_dcache_area((void *)phys_to_virt(release),
> + sizeof(u32));
> + } else if (of_find_compatible_node(NULL, NULL, "lsi,axm5516-sim")) {
> + for (i = 0; i < max_cpus; i++)
> + set_cpu_present(i, true);
> +
> + /*
> + * This is the entry point of the routine that the secondary
> + * cores will execute once they are released from their
> + * "holding pen".
> + */
> + *(u32 *)phys_to_virt(0x10000020) =
> + virt_to_phys(axxia_secondary_startup);
> + smp_wmb();
> + __cpuc_flush_dcache_area((void *)phys_to_virt(0x10000020),
> + sizeof(u32));
> + }
> +
> + return;
> +#endif
> }
> diff --git a/init/main.c b/init/main.c
> index 6484e4e..82b4513 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -467,6 +467,17 @@ asmlinkage void __init start_kernel(void)
> char * command_line;
> extern const struct kernel_param __start___param[], __stop___param[];
>
> +#if defined(CONFIG_ARCH_AXXIA) && defined(DEBUG_LL)
> + {
> + *(unsigned long *)(0xf0080000 + 0x24) = 13;
> + *(unsigned long *)(0xf0080000 + 0x28) = 1;
> + *(unsigned long *)(0xf0080000 + 0x2c) = 0x70;
> + *(unsigned long *)(0xf0080000 + 0x30) = 0x301;
> + *(unsigned long *)(0xf0080000 + 0x34) = 0;
> + *(unsigned long *)(0xf0080000 + 0x38) = 0x700;
> + }
> +#endif /* CONFIG_ARCH_AXXIA && DEBUG_LL */
This should be dropped. It doesn't belong in main.c
Bruce
> +
> /*
> * Need to run as early as possible, to initialize the
> * lockdep hash:
>
More information about the linux-yocto
mailing list