diff options
author | ian <ian@FreeBSD.org> | 2015-05-23 23:35:19 +0000 |
---|---|---|
committer | ian <ian@FreeBSD.org> | 2015-05-23 23:35:19 +0000 |
commit | 884316392ad48186d3e882c810123f020c4df56b (patch) | |
tree | 6adaac14cef4e240d798af9c937822019f660f54 /sys/arm | |
parent | 45e1cf60a142653a0d963cfcc63e4ecd0823a7b5 (diff) | |
download | FreeBSD-src-884316392ad48186d3e882c810123f020c4df56b.zip FreeBSD-src-884316392ad48186d3e882c810123f020c4df56b.tar.gz |
MFC r262409, r267129, r267130, r280709:
Move the declaration for mpentry() into a header file
Fix broken SMP startup on Armada XP after r265694
Avoid using hard-coded SoC's register address in mptramp code for Armada XP
Use pmap_mapdev()/unmapdev() to temporarily map on-chip sram while copying
the startup trampoline code.
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/mv/armadaxp/armadaxp_mp.c | 24 | ||||
-rw-r--r-- | sys/arm/mv/armadaxp/mptramp.S | 11 |
2 files changed, 22 insertions, 13 deletions
diff --git a/sys/arm/mv/armadaxp/armadaxp_mp.c b/sys/arm/mv/armadaxp/armadaxp_mp.c index 004f8db..775fc09 100644 --- a/sys/arm/mv/armadaxp/armadaxp_mp.c +++ b/sys/arm/mv/armadaxp/armadaxp_mp.c @@ -37,6 +37,8 @@ #include <vm/vm_kern.h> #include <vm/vm_extern.h> +#include <dev/fdt/fdt_common.h> + #include <machine/smp.h> #include <machine/fdt.h> #include <machine/armreg.h> @@ -97,14 +99,14 @@ platform_mp_init_secondary(void) } void mptramp(void); - - +void mptramp_end(void); +extern vm_offset_t mptramp_pmu_boot; void platform_mp_start_ap(void) { uint32_t reg, *src, *dst, cpu_num, div_val, cputype; - vm_offset_t smp_boot; + vm_offset_t pmu_boot_off; /* * Initialization procedure depends on core revision, * in this step CHIP ID is checked to choose proper procedure @@ -112,16 +114,18 @@ platform_mp_start_ap(void) cputype = cpufunc_id(); cputype &= CPU_ID_CPU_MASK; - smp_boot = kva_alloc(PAGE_SIZE); - pmap_kenter_nocache(smp_boot, 0xffff0000); - dst = (uint32_t *) smp_boot; - - for (src = (uint32_t *)mptramp; src < (uint32_t *)mpentry; + /* + * Set the PA of CPU0 Boot Address Redirect register used in + * mptramp according to the actual SoC registers' base address. + */ + pmu_boot_off = (CPU_PMU(0) - MV_BASE) + CPU_PMU_BOOT; + mptramp_pmu_boot = fdt_immr_pa + pmu_boot_off; + dst = pmap_mapdev(0xffff0000, PAGE_SIZE); + for (src = (uint32_t *)mptramp; src < (uint32_t *)mptramp_end; src++, dst++) { *dst = *src; } - kva_free(smp_boot, PAGE_SIZE); - + pmap_unmapdev((vm_offset_t)dst, PAGE_SIZE); if (cputype == CPU_ID_MV88SV584X_V7) { /* Core rev A0 */ div_val = read_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL1); diff --git a/sys/arm/mv/armadaxp/mptramp.S b/sys/arm/mv/armadaxp/mptramp.S index 4d657e4..056f588 100644 --- a/sys/arm/mv/armadaxp/mptramp.S +++ b/sys/arm/mv/armadaxp/mptramp.S @@ -29,6 +29,8 @@ __FBSDID("$FreeBSD$"); +.global _C_LABEL(mptramp_pmu_boot) + ASENTRY_NP(mptramp) mov r0, #0 mcr p15, 0, r0, c7, c7, 0 @@ -44,13 +46,16 @@ ASENTRY_NP(mptramp) /* Read boot address for CPU */ mov r1, #0x100 mul r2, r0, r1 - ldr r1, Lpmureg + ldr r1, mptramp_pmu_boot add r0, r2, r1 ldr r1, [r0], #0x00 mov pc, r1 -Lpmureg: - .word 0xd0022124 +_C_LABEL(mptramp_pmu_boot): + .word 0x0 + END(mptramp) + .global _C_LABEL(mptramp_end) +_C_LABEL(mptramp_end): |