Module Name: src
Committed By: macallan
Date: Thu Apr 11 17:13:16 UTC 2013
Modified Files:
src/sys/arch/powerpc/oea: ofwoea_machdep.c pmap.c
src/sys/arch/powerpc/powerpc: trap_subr.S
Log Message:
make PPC_OEA64_BRIDGE mode work
from Phileas Fogg
To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/powerpc/oea/ofwoea_machdep.c
cvs rdiff -u -r1.88 -r1.89 src/sys/arch/powerpc/oea/pmap.c
cvs rdiff -u -r1.75 -r1.76 src/sys/arch/powerpc/powerpc/trap_subr.S
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/oea/ofwoea_machdep.c
diff -u src/sys/arch/powerpc/oea/ofwoea_machdep.c:1.31 src/sys/arch/powerpc/oea/ofwoea_machdep.c:1.32
--- src/sys/arch/powerpc/oea/ofwoea_machdep.c:1.31 Sat Oct 20 14:42:15 2012
+++ src/sys/arch/powerpc/oea/ofwoea_machdep.c Thu Apr 11 17:13:15 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: ofwoea_machdep.c,v 1.31 2012/10/20 14:42:15 kiyohara Exp $ */
+/* $NetBSD: ofwoea_machdep.c,v 1.32 2013/04/11 17:13:15 macallan Exp $ */
/*-
* Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofwoea_machdep.c,v 1.31 2012/10/20 14:42:15 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofwoea_machdep.c,v 1.32 2013/04/11 17:13:15 macallan Exp $");
#include "opt_ppcarch.h"
#include "opt_compat_netbsd.h"
@@ -39,6 +39,8 @@ __KERNEL_RCSID(0, "$NetBSD: ofwoea_machd
#include "opt_ipkdb.h"
#include "opt_modular.h"
+#include "wsdisplay.h"
+
#include <sys/param.h>
#include <sys/buf.h>
#include <sys/boot_flag.h>
@@ -48,6 +50,10 @@ __KERNEL_RCSID(0, "$NetBSD: ofwoea_machd
#include <uvm/uvm_extern.h>
#include <dev/ofw/openfirm.h>
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsdisplayvar.h>
+#include <dev/rasops/rasops.h>
+#include <dev/wscons/wsdisplay_vconsvar.h>
#include <machine/pmap.h>
#include <machine/powerpc.h>
#include <machine/trap.h>
@@ -55,6 +61,7 @@ __KERNEL_RCSID(0, "$NetBSD: ofwoea_machd
#include <machine/autoconf.h>
#include <sys/bus.h>
#include <powerpc/oea/bat.h>
+#include <powerpc/oea/ofw_rasconsvar.h>
#include <powerpc/oea/cpufeat.h>
#include <powerpc/ofw_cons.h>
#include <powerpc/spr.h>
@@ -230,9 +237,44 @@ ofwoea_initppc(u_int startkernel, u_int
#if defined(PPC_OEA64) || defined (PPC_OEA64_BRIDGE)
#if defined (PMAC_G5)
/* Mapin 1st 256MB segment 1:1, also map in mem needed to access OFW*/
- if (oeacpufeat & OEACPU_64_BRIDGE)
- pmap_setup_segment0_map(0, 0xff800000, 0x3fc00000, 0x400000,
- 0x0);
+ if (oeacpufeat & OEACPU_64_BRIDGE) {
+ vaddr_t va;
+ paddr_t pa;
+ int i;
+
+ pmap_setup_segment0_map(0, 0x0);
+
+ /* Map OFW code+data */
+
+ for (i = 0; i < ofmaplen / sizeof(struct ofw_translations); i++) {
+ if (ofmap[i].va < 0xff800000)
+ continue;
+
+ for (va = ofmap[i].va, pa = ofmap[i].pa;
+ va < ofmap[i].va + ofmap[i].len;
+ va += PAGE_SIZE, pa += PAGE_SIZE) {
+ pmap_enter(pmap_kernel(), va, pa, VM_PROT_ALL,
+ VM_PROT_ALL | PMAP_WIRED);
+ }
+ }
+
+#if NWSDISPLAY > 0
+ /* Map video frame buffer */
+
+ struct rasops_info *ri = &rascons_console_screen.scr_ri;
+
+ if (ri->ri_bits != NULL) {
+ for (va = (vaddr_t) ri->ri_bits;
+ va < round_page((vaddr_t) ri->ri_bits +
+ ri->ri_height * ri->ri_stride);
+ va += PAGE_SIZE) {
+ pmap_enter(pmap_kernel(), va, va,
+ VM_PROT_READ | VM_PROT_WRITE,
+ PMAP_NOCACHE | PMAP_WIRED);
+ }
+ }
+#endif
+ }
#elif defined (MAMBO)
/* Mapin 1st 256MB segment 1:1, also map in mem needed to access OFW*/
if (oeacpufeat & OEACPU_64_BRIDGE)
@@ -330,10 +372,11 @@ restore_ofmap(struct ofw_translations *m
pmap_pinit(&ofw_pmap);
- ofw_pmap.pm_sr[KERNEL_SR] = KERNEL_SEGMENT;
+ ofw_pmap.pm_sr[0] = KERNELN_SEGMENT(0)|SR_PRKEY;
+ ofw_pmap.pm_sr[KERNEL_SR] = KERNEL_SEGMENT|SR_SUKEY|SR_PRKEY;
#ifdef KERNEL2_SR
- ofw_pmap.pm_sr[KERNEL2_SR] = KERNEL2_SEGMENT;
+ ofw_pmap.pm_sr[KERNEL2_SR] = KERNEL2_SEGMENT|SR_SUKEY|SR_PRKEY;
#endif
for (i = 0; i < n; i++) {
@@ -466,7 +509,7 @@ static void
find_ranges(int base, rangemap_t *regions, int *cur, int type)
{
int node, i, len, reclen;
- u_int32_t acells, scells, map[160];
+ u_int32_t parent_acells, acells, scells, map[160];
char tmp[32];
node = base;
@@ -480,12 +523,15 @@ find_ranges(int base, rangemap_t *region
len = OF_getprop(node, "ranges", map, sizeof(map));
if (len == -1)
goto rec;
+ if (OF_getprop(OF_parent(node), "#address-cells", &parent_acells,
+ sizeof(parent_acells)) != sizeof(parent_acells))
+ parent_acells = 1;
if (OF_getprop(node, "#address-cells", &acells,
sizeof(acells)) != sizeof(acells))
- acells = 1;
+ acells = 3;
if (OF_getprop(node, "#size-cells", &scells,
sizeof(scells)) != sizeof(scells))
- scells = 1;
+ scells = 2;
#ifdef ofppc
if (modeldata.ranges_offset == 0)
scells -= 1;
@@ -493,7 +539,7 @@ find_ranges(int base, rangemap_t *region
if (type == RANGE_TYPE_ISA)
reclen = 6;
else
- reclen = acells + scells + 1;
+ reclen = parent_acells + acells + scells;
/*
* There exist ISA buses with empty ranges properties. This is
* known to occur on the Pegasos II machine, and likely others.
@@ -514,12 +560,12 @@ find_ranges(int base, rangemap_t *region
for (i=0; i < len/(4*reclen); i++) {
DPRINTF("FOUND PCI RANGE\n");
regions[*cur].size =
- map[i*reclen + acells + scells];
+ map[i*reclen + parent_acells + acells + scells - 1];
/* skip ranges of size==0 */
if (regions[*cur].size == 0)
continue;
- regions[*cur].type = map[i*reclen] >> 24;
- regions[*cur].addr = map[i*reclen + acells];
+ regions[*cur].type = (map[i*reclen] >> 24) & 0x3;
+ regions[*cur].addr = map[i*reclen + parent_acells + acells - 1];
(*cur)++;
}
break;
@@ -583,6 +629,7 @@ ofwoea_map_space(int rangetype, int iome
rangemap_t region, holes[32], list[32];
memset(list, 0, sizeof(list));
+ memset(®ion, 0, sizeof(region));
cur = 0;
if (rangetype == RANGE_TYPE_ISA || node == -1)
node = OF_finddevice("/");
Index: src/sys/arch/powerpc/oea/pmap.c
diff -u src/sys/arch/powerpc/oea/pmap.c:1.88 src/sys/arch/powerpc/oea/pmap.c:1.89
--- src/sys/arch/powerpc/oea/pmap.c:1.88 Thu Mar 28 00:22:21 2013
+++ src/sys/arch/powerpc/oea/pmap.c Thu Apr 11 17:13:15 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.88 2013/03/28 00:22:21 christos Exp $ */
+/* $NetBSD: pmap.c,v 1.89 2013/04/11 17:13:15 macallan Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -63,7 +63,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.88 2013/03/28 00:22:21 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.89 2013/04/11 17:13:15 macallan Exp $");
#define PMAP_NOOPNAMES
@@ -3465,7 +3465,7 @@ pmap_bootstrap(paddr_t kernelstart, padd
sizeof(void *), 0, 0, "pmap_pl", &pmap_pool_uallocator,
IPL_NONE);
-#if defined(PMAP_NEED_MAPKERNEL) || 1
+#if defined(PMAP_NEED_MAPKERNEL)
{
struct pmap *pm = pmap_kernel();
#if defined(PMAP_NEED_FULL_MAPKERNEL)
Index: src/sys/arch/powerpc/powerpc/trap_subr.S
diff -u src/sys/arch/powerpc/powerpc/trap_subr.S:1.75 src/sys/arch/powerpc/powerpc/trap_subr.S:1.76
--- src/sys/arch/powerpc/powerpc/trap_subr.S:1.75 Fri Jul 27 04:17:07 2012
+++ src/sys/arch/powerpc/powerpc/trap_subr.S Thu Apr 11 17:13:15 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: trap_subr.S,v 1.75 2012/07/27 04:17:07 matt Exp $ */
+/* $NetBSD: trap_subr.S,v 1.76 2013/04/11 17:13:15 macallan Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -55,11 +55,20 @@
#define RESTORE_VRSAVE(tf,b)
#endif
-#if defined (PPC_OEA64)
+#if defined (PPC_OEA64) || defined (PPC_OEA64_BRIDGE)
#define RFI rfid
#else
#define RFI rfi
-#endif /* PPC_OEA64 */
+#endif /* PPC_OEA64 || PPC_OEA64_BRIDGE*/
+
+#if defined (PPC_OEA64_BRIDGE)
+#define ENABLE_64BIT_BRIDGE(t0) \
+ mfmsr t0; \
+ clrldi t0,t0,1; \
+ mtmsrd t0;
+#else
+#define ENABLE_64BIT_BRIDGE(t0)
+#endif /* PPC_OEA64_BRIDGE */
#if defined(PPC_OEA64)
/*
@@ -170,6 +179,7 @@
.globl _C_LABEL(trapcode),_C_LABEL(trapsize)
_C_LABEL(trapcode):
mtsprg1 %r1 /* save SP */
+ ENABLE_64BIT_BRIDGE(%r1)
GET_CPUINFO(%r1)
streg %r28,(CI_TEMPSAVE+CPUSAVE_R28)(%r1) /* free r28 */
streg %r29,(CI_TEMPSAVE+CPUSAVE_R29)(%r1) /* free r29 */
@@ -199,6 +209,7 @@ _C_LABEL(trapsize) = .-_C_LABEL(trapcode
.globl _C_LABEL(alitrap),_C_LABEL(alisize)
_C_LABEL(alitrap):
mtsprg1 %r1 /* save SP */
+ ENABLE_64BIT_BRIDGE(%r1)
GET_CPUINFO(%r1)
streg %r28,(CI_TEMPSAVE+CPUSAVE_R28)(%r1) /* save r28 */
streg %r29,(CI_TEMPSAVE+CPUSAVE_R29)(%r1) /* save r29 */
@@ -234,6 +245,7 @@ _C_LABEL(alisize) = .-_C_LABEL(alitrap)
.globl _C_LABEL(dsitrap),_C_LABEL(dsisize)
_C_LABEL(dsitrap):
mtsprg1 %r1
+ ENABLE_64BIT_BRIDGE(%r1)
GET_CPUINFO(%r1)
streg %r28,(CI_DISISAVE+CPUSAVE_R28)(%r1) /* save r28 */
streg %r29,(CI_DISISAVE+CPUSAVE_R29)(%r1) /* save r29 */
@@ -330,6 +342,7 @@ _C_LABEL(dsisize) = .-_C_LABEL(dsitrap)
.globl _C_LABEL(dsi601trap),_C_LABEL(dsi601size)
_C_LABEL(dsi601trap):
mtsprg1 %r1
+ ENABLE_64BIT_BRIDGE(%r1)
GET_CPUINFO(%r1)
streg %r28,(CI_DISISAVE+CPUSAVE_R28)(%r1) /* save r28 */
streg %r29,(CI_DISISAVE+CPUSAVE_R29)(%r1) /* save r29 */
@@ -397,6 +410,7 @@ _C_LABEL(dsi601size) = .-_C_LABEL(dsi601
.globl _C_LABEL(extint),_C_LABEL(extsize)
_C_LABEL(extint):
mtsprg1 %r1 /* save SP */
+ ENABLE_64BIT_BRIDGE(%r1)
GET_CPUINFO(%r1)
streg %r28,(CI_TEMPSAVE+CPUSAVE_R28)(%r1) /* save r28 */
streg %r29,(CI_TEMPSAVE+CPUSAVE_R29)(%r1) /* save r29 */
@@ -430,6 +444,7 @@ _C_LABEL(extsize) = .-_C_LABEL(extint)
.globl _C_LABEL(decrint),_C_LABEL(decrsize)
_C_LABEL(decrint):
mtsprg1 %r1 /* save SP */
+ ENABLE_64BIT_BRIDGE(%r1)
GET_CPUINFO(%r1)
streg %r28,(CI_TEMPSAVE+CPUSAVE_R28)(%r1) /* save r28 */
streg %r29,(CI_TEMPSAVE+CPUSAVE_R29)(%r1) /* save r29 */
@@ -673,6 +688,7 @@ _C_LABEL(tlbdsmsize) = .-_C_LABEL(tlbdsm
.globl _C_LABEL(ddblow),_C_LABEL(ddbsize)
_C_LABEL(ddblow):
mtsprg1 %r1 /* save SP */
+ ENABLE_64BIT_BRIDGE(%r1)
mtsprg2 %r29 /* save r29 */
mfcr %r29 /* save CR in r29 */
mfsrr1 %r1
@@ -728,6 +744,7 @@ _C_LABEL(ddbsize) = .-_C_LABEL(ddblow)
.globl _C_LABEL(ipkdblow),_C_LABEL(ipkdbsize)
_C_LABEL(ipkdblow):
mtsprg1 %r1 /* save SP */
+ ENABLE_64BIT_BRIDGE(%r1)
GET_CPUINFO(%r1)
streg %r28,(CI_IPKDBSAVE+CPUSAVE_R28)(%r1) /* save r28 */
streg %r29,(CI_IPKDBSAVE+CPUSAVE_R29)(%r1) /* save r29 */
@@ -1020,6 +1037,7 @@ intrleave:
.globl _C_LABEL(sctrap),_C_LABEL(scsize),_C_LABEL(sctrapexit)
_C_LABEL(sctrap):
mtsprg1 %r1 /* save SP */
+ ENABLE_64BIT_BRIDGE(%r1)
GET_CPUINFO(%r1)
streg %r28,(CI_TEMPSAVE+CPUSAVE_R28)(%r1) /* save r28 */
streg %r29,(CI_TEMPSAVE+CPUSAVE_R29)(%r1) /* save r20 */
@@ -1213,6 +1231,7 @@ _C_LABEL(ddb_trap):
andi. %r3,%r3,~(PSL_EE|PSL_ME)@l
mtmsr %r3 /* disable interrupts */
isync
+ ENABLE_64BIT_BRIDGE(%r3)
GET_CPUINFO(%r3)
streg %r28,(CI_DDBSAVE+CPUSAVE_R28)(%r3)
streg %r29,(CI_DDBSAVE+CPUSAVE_R29)(%r3)
@@ -1253,6 +1272,7 @@ _C_LABEL(ipkdb_trap):
andi. %r3,%r3,~(PSL_EE|PSL_ME)@l
mtmsr %r3 /* disable interrupts */
isync
+ ENABLE_64BIT_BRIDGE(%r3)
GET_CPUINFO(%r3)
streg %r28,(CI_IPKDBSAVE+CPUSAVE_R28)(%r3)
streg %r29,(CI_IPKDBSAVE+CPUSAVE_R29)(%r3)