Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/powerpc Make the 85xx get closer to spinning up the...



details:   https://anonhg.NetBSD.org/src/rev/d2afc7c5910f
branches:  trunk
changeset: 782936:d2afc7c5910f
user:      matt <matt%NetBSD.org@localhost>
date:      Tue Nov 27 19:24:45 2012 +0000

description:
Make the 85xx get closer to spinning up the secondary CPUs.
Don't assume TLB1[0] has the mapping for VA/PA 0.
Make sure the TLB1 entries that map physical memory have the M (memory
coherent) bit set.

diffstat:

 sys/arch/powerpc/booke/e500_mpsubr.S     |  111 +++++++++++++++++++++++++-----
 sys/arch/powerpc/booke/e500_tlb.c        |   22 +++--
 sys/arch/powerpc/booke/genassym.cf       |    3 +-
 sys/arch/powerpc/include/booke/e500var.h |    5 +-
 sys/arch/powerpc/include/cpu.h           |    3 +-
 5 files changed, 112 insertions(+), 32 deletions(-)

diffs (truncated from 305 to 300 lines):

diff -r ffd2489f6e8b -r d2afc7c5910f sys/arch/powerpc/booke/e500_mpsubr.S
--- a/sys/arch/powerpc/booke/e500_mpsubr.S      Tue Nov 27 16:01:49 2012 +0000
+++ b/sys/arch/powerpc/booke/e500_mpsubr.S      Tue Nov 27 19:24:45 2012 +0000
@@ -1,3 +1,31 @@
+/*-
+ * Copyright (c) 2011, 2012 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas of 3am Software Foundry.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
 
 /*
  * r3 = fdt pointer (ignored)
@@ -11,8 +39,6 @@
        .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
@@ -49,16 +75,38 @@
         */
        lis     %r20, _C_LABEL(cpu_hatch_data)@h
        ori     %r20, %r20, _C_LABEL(cpu_hatch_data)@l
+       sync
+
+       /*
+        * Ensure that the TLB entry we are using is memory coherent.
+        */
+       lis     %r0, (MASX_TLBSEL_MAKE(1)|MAS0_ESEL_MAKE(0))@h
+       mtspr   SPR_MAS0, %r0                   /* setup MAS0 */
+       lis     %r3, (MAS1_V|MAS1_IPROT)@h      /* V | IPROT */
+       ori     %r3, %r3, MASX_TSIZE_64MB       /* and 64MB */
+       mtspr   SPR_MAS1, %r3                   /* save MAS1 */
+       li      %r3, MAS2_M                     /* set M bit */
+       mtspr   SPR_MAS2, %r3                   /* save MAS2 */
+       li      %r3, MAS3_SX|MAS3_SR|MAS3_SW    /* set kernel RWX */
+       mtspr   SPR_MAS3, %r3                   /* save MAS3 */
+       tlbwe                                   /* update entry */
+       isync                                   /* flush i-stream */
+       sync                                    /* sync memory. */
 
        li      %r0, 0
        stw     %r0, HATCH_RUNNING(%r20)        /* progress */
-       eieio
+       sync
+#if 0
+       dcbf    0, %r20
+#endif
 
        lwz     %r1, HATCH_SP(%r20)             /* get hatch SP */
        lwz     %r21, HATCH_CI(%r20)            /* get cpu_info */
        mtsprg0 %r21                            /* save cpu_info */
        lwz     %r13, CI_CURLWP(%r21)           /* load r13 with curlwp */
        mtsprg2 %r13                            /* save it in sprg2 */
+       addi    %r0,%r21,CI_SAVELIFO            /* get SAVE area start */
+       mtsprg3 %r0                             /* save it in sprg3 */
 
        /*
         * Now to synchronize timebase values.  First to make sure HID0 is
@@ -102,6 +150,7 @@
 
        li      %r0, 2
        stw     %r0, HATCH_RUNNING(%r20)        /* progress */
+       sync
 
        /*
         * We have to setup the IVOR SPRs since the ones u-boot setup
@@ -146,15 +195,11 @@
        stw     %r0, HATCH_RUNNING(%r20)        /* progress */
 
        /*
-        * Let's find out what TLB1[0] entry we are supposed to use.
+        * Let's find out what TLB1 entry we are supposed to use.
         */
-       li      %r3, 0
+       lwz     %r3, HATCH_TLBIDX(%r20)
        bl      _C_LABEL(e500_tlb1_fetch)
-       lwz     %r28, 0(%r3)                    /* load the saved TLB1 entry */
-       mtspr   SPR_MAS0, %r28                  /* place into SPRs */
-       mtspr   SPR_MAS1, %r29
-       mtspr   SPR_MAS2, %r30
-       mtspr   SPR_MAS3, %r31
+       lmw     %r28, 0(%r3)                    /* load the saved TLB1 entry */
 
        li      %r0, 6
        stw     %r0, HATCH_RUNNING(%r20)        /* progress */
@@ -182,6 +227,30 @@
        li      %r0, 8
        stw     %r0, HATCH_RUNNING(%r20)        /* progress */
 
+       /*
+        * Let's clear TBL1[0] and TBL1[1]
+        */
+       li      %r8, 0
+       mtspr   SPR_MAS1, %r8
+       mtspr   SPR_MAS2, %r8
+       mtspr   SPR_MAS3, %r8
+       mtspr   SPR_MAS7, %r8
+
+       lis     %r8, (MASX_TLBSEL_MAKE(1)|MAS0_ESEL_MAKE(0))@h
+       mtspr   SPR_MAS0, %r8
+       tlbwe
+
+       lis     %r8, (MASX_TLBSEL_MAKE(1)|MAS0_ESEL_MAKE(1))@h
+       mtspr   SPR_MAS0, %r8
+       tlbwe
+
+       /*
+        * Now load the new TLB data into the MAS registers.
+        */
+       mtspr   SPR_MAS0, %r28                  /* place into SPRs */
+       mtspr   SPR_MAS1, %r29
+       mtspr   SPR_MAS2, %r30
+       mtspr   SPR_MAS3, %r31
        tlbwe
 
        mtsrr0  %r5
@@ -197,12 +266,22 @@
        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
+        * to everything.
+        */
+       bl      _C_LABEL(e500_tlb1_sync)
+
+       li      %r0, 11
+       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
+       li      %r0, 12
        stw     %r0, HATCH_RUNNING(%r20)        /* progress */
 
        /*
@@ -211,16 +290,6 @@
        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
-        * to everything.
-        */
-       bl      _C_LABEL(e500_tlb1_sync)
-
        li      %r0, 13
        stw     %r0, HATCH_RUNNING(%r20)        /* progress */
 
diff -r ffd2489f6e8b -r d2afc7c5910f sys/arch/powerpc/booke/e500_tlb.c
--- a/sys/arch/powerpc/booke/e500_tlb.c Tue Nov 27 16:01:49 2012 +0000
+++ b/sys/arch/powerpc/booke/e500_tlb.c Tue Nov 27 19:24:45 2012 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: e500_tlb.c,v 1.11 2012/07/25 22:11:36 matt Exp $       */
+/*     $NetBSD: e500_tlb.c,v 1.12 2012/11/27 19:24:46 matt Exp $       */
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: e500_tlb.c,v 1.11 2012/07/25 22:11:36 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: e500_tlb.c,v 1.12 2012/11/27 19:24:46 matt Exp $");
 
 #include <sys/param.h>
 
@@ -202,6 +202,7 @@
         */
        if (hwtlb.hwtlb_mas1 & MAS1_V) {
                mtspr(SPR_MAS3, hwtlb.hwtlb_mas3);
+               //mtspr(SPR_MAS7, 0);
        }
        
 #if 0
@@ -543,6 +544,7 @@
        }
        mtspr(SPR_MAS2, hwtlb.hwtlb_mas2);
        mtspr(SPR_MAS3, hwtlb.hwtlb_mas3);
+       //mtspr(SPR_MAS7, 0);
        __asm volatile("tlbwe");
        if (asid == KERNEL_PID)
                __asm volatile("isync\n\tsync");
@@ -641,11 +643,6 @@
                        mtspr(SPR_MAS2, epn);
                        __asm volatile("tlbre");
                        hwtlb.hwtlb_mas1 = mfspr(SPR_MAS1);
-                       /*
-                        * If this is a valid entry for AS space 1 and
-                        * its asid matches the constraints of the caller,
-                        * clear its valid bit.
-                        */
                        if (hwtlb.hwtlb_mas1 & MAS1_V) {
                                hwtlb.hwtlb_mas2 = mfspr(SPR_MAS2);
                                hwtlb.hwtlb_mas3 = mfspr(SPR_MAS3);
@@ -682,7 +679,7 @@
        return NULL;
 }
 
-static struct e500_xtlb *
+struct e500_xtlb *
 e500_tlb_lookup_xtlb(vaddr_t va, u_int *slotp)
 {
        struct e500_tlb1 * const tlb1 = &e500_tlb1;
@@ -942,6 +939,15 @@
                if (xtlb->e_tlb.tlb_va == 0
                    || xtlb->e_tlb.tlb_va + xtlb->e_tlb.tlb_size <= memsize) {
                        memmapped += xtlb->e_tlb.tlb_size;
+                       /*
+                        * Let make sure main memory is setup so it's memory
+                        * coherent.  For some reason u-boot doesn't set it up
+                        * that way.
+                        */
+                       if ((xtlb->e_hwtlb.hwtlb_mas2 & MAS2_M) == 0) {
+                               xtlb->e_hwtlb.hwtlb_mas2 |= MAS2_M;
+                               hwtlb_write(xtlb->e_hwtlb, true);
+                       }
                }
        }
 
diff -r ffd2489f6e8b -r d2afc7c5910f sys/arch/powerpc/booke/genassym.cf
--- a/sys/arch/powerpc/booke/genassym.cf        Tue Nov 27 16:01:49 2012 +0000
+++ b/sys/arch/powerpc/booke/genassym.cf        Tue Nov 27 19:24:45 2012 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: genassym.cf,v 1.9 2012/08/01 16:19:43 matt Exp $
+#      $NetBSD: genassym.cf,v 1.10 2012/11/27 19:24:46 matt Exp $
 
 #-
 # Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
@@ -110,4 +110,5 @@
 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)
+define HATCH_TLBIDX            offsetof(struct cpu_hatch_data, hatch_tlbidx)
 endif
diff -r ffd2489f6e8b -r d2afc7c5910f sys/arch/powerpc/include/booke/e500var.h
--- a/sys/arch/powerpc/include/booke/e500var.h  Tue Nov 27 16:01:49 2012 +0000
+++ b/sys/arch/powerpc/include/booke/e500var.h  Tue Nov 27 19:24:45 2012 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: e500var.h,v 1.6 2012/07/27 22:24:13 matt Exp $ */
+/*     $NetBSD: e500var.h,v 1.7 2012/11/27 19:24:47 matt Exp $ */
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -91,6 +91,9 @@
 void   e500_ipi_halt(void);
 void   e500_spinup_trampoline(void);
 void   e500_cpu_hatch(struct cpu_info *);
+struct e500_xtlb *
+       e500_tlb_lookup_xtlb(vaddr_t, u_int *);
+
 
 void   pq3gpio_attach(device_t, device_t, void *);
 
diff -r ffd2489f6e8b -r d2afc7c5910f sys/arch/powerpc/include/cpu.h
--- a/sys/arch/powerpc/include/cpu.h    Tue Nov 27 16:01:49 2012 +0000
+++ b/sys/arch/powerpc/include/cpu.h    Tue Nov 27 19:24:45 2012 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpu.h,v 1.94 2012/10/20 14:42:15 kiyohara Exp $        */
+/*     $NetBSD: cpu.h,v 1.95 2012/11/27 19:24:45 matt Exp $    */
 
 /*
  * Copyright (C) 1999 Wolfgang Solfrank.
@@ -170,6 +170,7 @@
 #endif
 #if defined(PPC_BOOKE)



Home | Main Index | Thread Index | Old Index