Module Name: src Committed By: matt Date: Tue Nov 27 19:24:47 UTC 2012
Modified Files: src/sys/arch/powerpc/booke: e500_mpsubr.S e500_tlb.c genassym.cf src/sys/arch/powerpc/include: cpu.h src/sys/arch/powerpc/include/booke: e500var.h Log Message: 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. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/powerpc/booke/e500_mpsubr.S cvs rdiff -u -r1.11 -r1.12 src/sys/arch/powerpc/booke/e500_tlb.c cvs rdiff -u -r1.9 -r1.10 src/sys/arch/powerpc/booke/genassym.cf cvs rdiff -u -r1.94 -r1.95 src/sys/arch/powerpc/include/cpu.h cvs rdiff -u -r1.6 -r1.7 src/sys/arch/powerpc/include/booke/e500var.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/powerpc/booke/e500_mpsubr.S diff -u src/sys/arch/powerpc/booke/e500_mpsubr.S:1.2 src/sys/arch/powerpc/booke/e500_mpsubr.S:1.3 --- src/sys/arch/powerpc/booke/e500_mpsubr.S:1.2 Wed Jun 29 06:06:04 2011 +++ src/sys/arch/powerpc/booke/e500_mpsubr.S Tue Nov 27 19:24:46 2012 @@ -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 @@ ENTRY_NOPROFILE(e500_spinup_trampoline) */ 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 @@ ENTRY_NOPROFILE(e500_spinup_trampoline) 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 @@ ENTRY_NOPROFILE(e500_spinup_trampoline) 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 @@ ENTRY_NOPROFILE(e500_spinup_trampoline) 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,29 +266,29 @@ ENTRY_NOPROFILE(e500_spinup_trampoline) stw %r0, HATCH_RUNNING(%r20) /* progress */ /* - * Now we can use our stack... + * 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. */ - lwz %r0, CI_CURPCB(%r21) - lwz %r1, PCB_SP(%r0) + bl _C_LABEL(e500_tlb1_sync) li %r0, 11 stw %r0, HATCH_RUNNING(%r20) /* progress */ /* - * Tell spinup code we are done with the hatch stack. + * Now we can use our stack... */ - li %r0, 0 - stw %r0, HATCH_SP(%r20) + lwz %r0, CI_CURPCB(%r21) + lwz %r1, PCB_SP(%r0) 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. + * Tell spinup code we are done with the hatch stack. */ - bl _C_LABEL(e500_tlb1_sync) + li %r0, 0 + stw %r0, HATCH_SP(%r20) li %r0, 13 stw %r0, HATCH_RUNNING(%r20) /* progress */ Index: src/sys/arch/powerpc/booke/e500_tlb.c diff -u src/sys/arch/powerpc/booke/e500_tlb.c:1.11 src/sys/arch/powerpc/booke/e500_tlb.c:1.12 --- src/sys/arch/powerpc/booke/e500_tlb.c:1.11 Wed Jul 25 22:11:36 2012 +++ src/sys/arch/powerpc/booke/e500_tlb.c Tue Nov 27 19:24:46 2012 @@ -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 @@ hwtlb_write(const struct e500_hwtlb hwtl */ if (hwtlb.hwtlb_mas1 & MAS1_V) { mtspr(SPR_MAS3, hwtlb.hwtlb_mas3); + //mtspr(SPR_MAS7, 0); } #if 0 @@ -543,6 +544,7 @@ e500_tlb_update_addr(vaddr_t va, tlb_asi } 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 @@ e500_tlb_walk(void *ctx, bool (*func)(vo 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 @@ e500_tlb_lookup_xtlb_pa(vaddr_t pa, u_in 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 @@ e500_tlb_init(vaddr_t endkernel, psize_t 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); + } } } Index: src/sys/arch/powerpc/booke/genassym.cf diff -u src/sys/arch/powerpc/booke/genassym.cf:1.9 src/sys/arch/powerpc/booke/genassym.cf:1.10 --- src/sys/arch/powerpc/booke/genassym.cf:1.9 Wed Aug 1 16:19:43 2012 +++ src/sys/arch/powerpc/booke/genassym.cf Tue Nov 27 19:24:46 2012 @@ -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_RUNNING offsetof(struct cp 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 Index: src/sys/arch/powerpc/include/cpu.h diff -u src/sys/arch/powerpc/include/cpu.h:1.94 src/sys/arch/powerpc/include/cpu.h:1.95 --- src/sys/arch/powerpc/include/cpu.h:1.94 Sat Oct 20 14:42:15 2012 +++ src/sys/arch/powerpc/include/cpu.h Tue Nov 27 19:24:45 2012 @@ -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 @@ struct cpu_hatch_data { #endif #if defined(PPC_BOOKE) vaddr_t hatch_sp; + u_int hatch_tlbidx; #endif }; Index: src/sys/arch/powerpc/include/booke/e500var.h diff -u src/sys/arch/powerpc/include/booke/e500var.h:1.6 src/sys/arch/powerpc/include/booke/e500var.h:1.7 --- src/sys/arch/powerpc/include/booke/e500var.h:1.6 Fri Jul 27 22:24:13 2012 +++ src/sys/arch/powerpc/include/booke/e500var.h Tue Nov 27 19:24:47 2012 @@ -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_tlb1_sync(void); 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 *);