Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/powerpc/booke More MP support.
details: https://anonhg.NetBSD.org/src/rev/cee9a85f0f7e
branches: trunk
changeset: 766653:cee9a85f0f7e
user: matt <matt%NetBSD.org@localhost>
date: Wed Jun 29 06:06:04 2011 +0000
description:
More MP support.
diffstat:
sys/arch/powerpc/booke/e500_mpsubr.S | 154 ++++++++++++++++++++++++++++++++--
sys/arch/powerpc/booke/genassym.cf | 13 ++-
2 files changed, 155 insertions(+), 12 deletions(-)
diffs (266 lines):
diff -r 18b69da8932e -r cee9a85f0f7e sys/arch/powerpc/booke/e500_mpsubr.S
--- a/sys/arch/powerpc/booke/e500_mpsubr.S Wed Jun 29 06:05:38 2011 +0000
+++ b/sys/arch/powerpc/booke/e500_mpsubr.S Wed Jun 29 06:06:04 2011 +0000
@@ -8,7 +8,35 @@
* r8 = 0
* r9 = 0
*/
-_ENTRY(e500_spinup_trampoline)
+ .p2align 5
+ENTRY_NOPROFILE(e500_spinup_trampoline)
+
+ stw %r7, 4(%r0) /* r7 to 4 */
+
+ lis %r31, 0xdeadbeef@h
+ ori %r31, %r31, 0xdeadbeef@l
+ mr %r30, %r31
+ mr %r29, %r31
+ mr %r28, %r31
+ mr %r27, %r31
+ mr %r26, %r31
+ mr %r25, %r31
+ mr %r24, %r31
+ mr %r23, %r31
+ mr %r22, %r31
+ mr %r21, %r31
+ mr %r20, %r31
+ mr %r19, %r31
+ mr %r18, %r31
+ mr %r17, %r31
+ mr %r16, %r31
+ mr %r15, %r31
+ mr %r14, %r31
+ mr %r13, %r31
+ mr %r12, %r31
+ mr %r11, %r31
+ mr %r10, %r31
+ mr %r2, %r31
/*
* First thing we need to do is to set SPRG0 with our cpu_info
@@ -19,25 +47,78 @@
*
* All the caller-saved register are ours to use. So we will.
*/
- lis %r20, _C_LABEL(cpu_hatch_data)@ha
- addi %r20, %r20, _C_LABEL(cpu_hatch_data)@l
+ lis %r20, _C_LABEL(cpu_hatch_data)@h
+ ori %r20, %r20, _C_LABEL(cpu_hatch_data)@l
+ li %r0, 0
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+ eieio
+
+ lwz %r1, HATCH_SP(%r20) /* get hatch SP */
lwz %r21, HATCH_CI(%r20) /* get cpu_info */
mtsprg0 %r21 /* save cpu_info */
- lwz %r1, HATCH_SP(%r20) /* get hatch SP */
-
+ lwz %r13, CI_CURLWP(%r21) /* load r13 with curlwp */
+ mtsprg2 %r13 /* save it in sprg2 */
+
+ /*
+ * Now to synchronize timebase values. First to make sure HID0 is
+ * set correctly, except with the timebase disabled.
+ */
+ lwz %r22, HATCH_HID0(%r20) /* get HID0 */
+ li %r28, HID0_TBEN /* HID0_TBEN */
+ andc %r0,%r22,%r28 /* clear TBEN from HID0 */
+ mtspr SPR_HID0, %r0 /* set HID0 (timebase off) */
+ isync
+ lwz %r24, HATCH_TBL(%r20) /* get lower timebase value */
+ lwz %r23, HATCH_TBU(%r20) /* get upper timebase value */
+
+ /*
+ * Figure out how much we are adjusting the timebase
+ */
+ mftbl %r4 /* get lower timebase */
+ subfc %r0, %r4, %r24 /* subtract from new value */
+ stw %r0, HATCH_TBL(%r20) /* save it */
+ mftbu %r3 /* get upper timebase */
+ subfe %r0, %r3, %r23 /* subtract from new value */
+ stw %r0, HATCH_TBU(%r20) /* save it */
+
+ /*
+ * Since we've disabled timebase, we can set the timebase registers
+ * without fear of them changing. Have to do this after we read the
+ * previous values.
+ */
+ mttbu %r23 /* set upper timebase */
+ mttbl %r24 /* set lower timebase */
+
+ /*
+ * Now we loop until the boot cpu tells us to enable timebase
+ */
+1: lwz %r0, HATCH_RUNNING(%r20) /* is it time? */
+ cmplwi %r0, 0
+ beq+ 1b
+
+ mtspr SPR_HID0, %r22 /* start timebase running */
+ isync
+
+ li %r0, 2
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
/*
* We have to setup the IVOR SPRs since the ones u-boot setup
* don't work for us.
*/
bl _C_LABEL(exception_init) /* setup IVORs */
+ li %r0, 3
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
/*
* U-boot has mapped the bottom 64MB in TLB1[0]. We are going to need
- * change this entry and it's not safe to do so while running out of it.
- * So we copy TLB1[0] to TLB1[1] but set it for AS1. We then switch
- * to AS1 and reload TLB1[0] with its correct value, and we switch
- * back to AS0. Then we can load the rest of the TLB1 entries.
+ * to change this entry and it's not safe to do so while running out
+ * of it. So we copy TLB1[0] to TLB1[1] but set it for AS1. We then
+ * switch to AS1 and reload TLB1[0] with its correct value, and then we
+ * switch back to AS0. After that, we can load the rest of the TLB1
+ * entries.
*/
/*
@@ -47,6 +128,9 @@
mtspr SPR_MAS0, %r16
tlbre
+ li %r0, 4
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
/*
* Copy TLB1[0] to TLB[1] and set it to use AS1
*/
@@ -58,6 +142,9 @@
mtspr SPR_MAS1, %r4
tlbwe /* write the TLB entry */
+ li %r0, 5
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
/*
* Let's find out what TLB1[0] entry we are supposed to use.
*/
@@ -69,6 +156,9 @@
mtspr SPR_MAS2, %r30
mtspr SPR_MAS3, %r31
+ li %r0, 6
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
/*
* Now to switch to running in AS1
*/
@@ -81,19 +171,49 @@
addi %r4,%r11,.Las1start-1b
addi %r5,%r11,.Las1end-1b
mtsrr0 %r4
+ li %r0, 7
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
rfi /* switch to AS1, context synchronizing */
.Las1start:
/*
* We are now running in AS1, update TLB1[0]
*/
+ li %r0, 8
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
tlbwe
mtsrr0 %r5
mtsrr1 %r3
+
+ li %r0, 9
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
rfi /* switch back to AS0, context synchronizing */
.Las1end:
+ li %r0, 10
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
+ /*
+ * Now we can use our stack...
+ */
+ lwz %r0, CI_CURPCB(%r21)
+ lwz %r1, PCB_SP(%r0)
+
+ li %r0, 11
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
+ /*
+ * Tell spinup code we are done with the hatch stack.
+ */
+ li %r0, 0
+ stw %r0, HATCH_SP(%r20)
+
+ li %r0, 12
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
/*
* We now have our TLB1[0] in place. Now we need to load the rest of
* TLB1 with our entries. After this is done, we should have access
@@ -101,13 +221,25 @@
*/
bl _C_LABEL(e500_tlb1_sync)
+ li %r0, 13
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
/*
* We've gotten the low level stuff done.
* Now to do more advanced stuff.
*/
- bl _C_LABEL(cpu_hatch)
- mr %r1, %r3 /* our new SP */
+ mr %r3, %r21
+ bl _C_LABEL(e500_cpu_hatch)
+
+ li %r0, 14
+ stw %r0, HATCH_RUNNING(%r20) /* progress */
+
+ /*
+ * Now wait to become runnable
+ */
+ bl _C_LABEL(cpu_hatch)
wrteei 1 /* allow interrupts */
+ bl _C_LABEL(spl0) /* unblock interrupts */
b _C_LABEL(idle_loop)
diff -r 18b69da8932e -r cee9a85f0f7e sys/arch/powerpc/booke/genassym.cf
--- a/sys/arch/powerpc/booke/genassym.cf Wed Jun 29 06:05:38 2011 +0000
+++ b/sys/arch/powerpc/booke/genassym.cf Wed Jun 29 06:06:04 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.7 2011/06/20 17:15:38 matt Exp $
+# $NetBSD: genassym.cf,v 1.8 2011/06/29 06:06:04 matt Exp $
#-
# Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
@@ -41,6 +41,8 @@
# POSSIBILITY OF SUCH DAMAGE.
#+
+include "opt_multiprocessor.h"
+
include <sys/param.h>
include <sys/bitops.h>
@@ -99,3 +101,12 @@
define MSR_DS 31 - ilog2(PSL_DS)
define MSR_IS 31 - ilog2(PSL_IS)
+
+ifdef MULTIPROCESSOR
+define HATCH_CI offsetof(struct cpu_hatch_data, hatch_ci)
+define HATCH_HID0 offsetof(struct cpu_hatch_data, hatch_hid0)
+define HATCH_RUNNING offsetof(struct cpu_hatch_data, hatch_running)
+define HATCH_SP offsetof(struct cpu_hatch_data, hatch_sp)
+define HATCH_TBU offsetof(struct cpu_hatch_data, hatch_tbu)
+define HATCH_TBL offsetof(struct cpu_hatch_data, hatch_tbl)
+endif
Home |
Main Index |
Thread Index |
Old Index