summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2015-05-23 23:35:19 +0000
committerian <ian@FreeBSD.org>2015-05-23 23:35:19 +0000
commit884316392ad48186d3e882c810123f020c4df56b (patch)
tree6adaac14cef4e240d798af9c937822019f660f54 /sys/arm
parent45e1cf60a142653a0d963cfcc63e4ecd0823a7b5 (diff)
downloadFreeBSD-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.c24
-rw-r--r--sys/arm/mv/armadaxp/mptramp.S11
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):
OpenPOWER on IntegriCloud