Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/macppc/stand PR 51495/port-macppc
details: https://anonhg.NetBSD.org/src/rev/629ec8619369
branches: trunk
changeset: 994538:629ec8619369
user: scole <scole%NetBSD.org@localhost>
date: Mon Nov 12 20:00:46 2018 +0000
description:
PR 51495/port-macppc
Allow ppc601 to boot off hard disk
diffstat:
sys/arch/macppc/stand/bootxx/bootxx.c | 97 +++++++++++++++++++++++++++------
sys/arch/macppc/stand/ofwboot/Locore.c | 16 +++-
2 files changed, 90 insertions(+), 23 deletions(-)
diffs (192 lines):
diff -r f7a66ec67b6a -r 629ec8619369 sys/arch/macppc/stand/bootxx/bootxx.c
--- a/sys/arch/macppc/stand/bootxx/bootxx.c Mon Nov 12 18:51:01 2018 +0000
+++ b/sys/arch/macppc/stand/bootxx/bootxx.c Mon Nov 12 20:00:46 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: bootxx.c,v 1.18 2009/03/14 21:04:12 dsl Exp $ */
+/* $NetBSD: bootxx.c,v 1.19 2018/11/12 20:00:46 scole Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -33,6 +33,7 @@
#include <sys/types.h>
#include <powerpc/oea/bat.h>
+#include <powerpc/oea/spr.h>
#include <sys/bootblock.h>
@@ -68,15 +69,21 @@
" addi %r8,8,(_start)@l\n"
" li %r9,0x40 \n" /* loop 64 times (for 2048 bytes of bootxx) */
" mtctr %r9 \n"
-"1: \n"
-" dcbf %r0,%r8 \n"
+" \n"
+"1: dcbf %r0,%r8 \n"
" icbi %r0,%r8 \n"
" addi %r8,%r8,0x20 \n"
" bdnz 1b \n"
" sync \n"
" li %r0,0 \n"
-" mtdbatu 3,%r0 \n"
+" \n" /* test for 601 cpu */
+" mfspr %r9,287 \n" /* mfpvbr %r9 PVR = 287 */
+" srwi %r9,%r9,0x10 \n"
+" cmplwi %r9,0x02 \n" /* 601 cpu == 0x0001 */
+" blt 2f \n" /* skip over non-601 BAT setup */
+" \n"
+" mtdbatu 3,%r0 \n" /* non-601 BAT */
" mtibatu 3,%r0 \n"
" isync \n"
" li %r8,0x1ffe \n" /* map the lowest 256MB */
@@ -86,13 +93,61 @@
" mtibatl 3,%r9 \n"
" mtibatu 3,%r8 \n"
" isync \n"
-
+" b 3f \n"
+" \n"
+"2: mfmsr %r8 \n" /* 601 BAT */
+" mtmsr %r0 \n"
+" isync \n"
+" \n"
+" mtibatu 0,%r0 \n"
+" mtibatu 1,%r0 \n"
+" mtibatu 2,%r0 \n"
+" mtibatu 3,%r0 \n"
+" \n"
+" li %r9,0x7f \n"
+" mtibatl 0,%r9 \n"
+" li %r9,0x1a \n"
+" mtibatu 0,%r9 \n"
+" \n"
+" lis %r9,0x80 \n"
+" addi %r9,%r9,0x7f \n"
+" mtibatl 1,%r9 \n"
+" lis %r9,0x80 \n"
+" addi %r9,%r9,0x1a \n"
+" mtibatu 1,%r9 \n"
+" \n"
+" lis %r9,0x100 \n"
+" addi %r9,%r9,0x7f \n"
+" mtibatl 2,%r9 \n"
+" lis %r9,0x100 \n"
+" addi %r9,%r9,0x1a \n"
+" mtibatu 2,%r9 \n"
+" \n"
+" lis %r9,0x180 \n"
+" addi %r9,%r9,0x7f \n"
+" mtibatl 3,%r9 \n"
+" lis %r9,0x180 \n"
+" addi %r9,%r9,0x1a \n"
+" mtibatu 3,%r9 \n"
+" \n"
+" isync \n"
+" \n"
+" mtmsr %r8 \n"
+" isync \n"
+" \n"
/*
* setup 32 KB of stack with 32 bytes overpad (see above)
*/
-" lis %r1,(stack+32768)@ha\n"
+"3: lis %r1,(stack+32768)@ha\n"
" addi %r1,%r1,(stack+32768)@l\n"
-" stw %r0,0(%r1) \n" /* terminate the frame link chain */
+ /*
+ * terminate the frame link chain,
+ * clear by bytes to avoid ppc601 alignment exceptions
+ */
+" stb %r0,0(%r1) \n"
+" stb %r0,1(%r1) \n"
+" stb %r0,2(%r1) \n"
+" stb %r0,3(%r1) \n"
" b startup \n"
);
@@ -258,10 +313,14 @@
startup(int arg1, int arg2, void *openfirm)
{
int fd, blk, chosen, options, j;
+ uint32_t cpuvers;
size_t i;
char *addr;
char bootpath[128];
+ __asm volatile ("mfpvr %0" : "=r"(cpuvers));
+ cpuvers >>= 16;
+
openfirmware = openfirm;
chosen = OF_finddevice("/chosen");
@@ -302,17 +361,19 @@
}
putstr(". done!\r\nstarting stage 2...\r\n");
- /*
- * enable D/I cache
- */
- __asm(
- "mtdbatu 3,%0\n\t"
- "mtdbatl 3,%1\n\t"
- "mtibatu 3,%0\n\t"
- "mtibatl 3,%1\n\t"
- "isync"
- :: "r"(BATU(0, BAT_BL_256M, BAT_Vs)),
- "r"(BATL(0, 0, BAT_PP_RW)));
+ if (cpuvers != MPC601) {
+ /*
+ * enable D/I cache
+ */
+ __asm(
+ "mtdbatu 3,%0\n\t"
+ "mtdbatl 3,%1\n\t"
+ "mtibatu 3,%0\n\t"
+ "mtibatl 3,%1\n\t"
+ "isync"
+ :: "r"(BATU(0, BAT_BL_256M, BAT_Vs)),
+ "r"(BATL(0, 0, BAT_PP_RW)));
+ }
entry_point(0, 0, openfirm);
for (;;); /* just in case */
diff -r f7a66ec67b6a -r 629ec8619369 sys/arch/macppc/stand/ofwboot/Locore.c
--- a/sys/arch/macppc/stand/ofwboot/Locore.c Mon Nov 12 18:51:01 2018 +0000
+++ b/sys/arch/macppc/stand/ofwboot/Locore.c Mon Nov 12 20:00:46 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: Locore.c,v 1.32 2018/08/17 16:04:39 macallan Exp $ */
+/* $NetBSD: Locore.c,v 1.33 2018/11/12 20:00:46 scole Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -81,11 +81,11 @@
" \n" /* test for 601 */
" mfspr %r0,287 \n" /* mfpvbr %r0 PVR = 287 */
" srwi %r0,%r0,0x10 \n"
-" cmpi 0,1,%r0,0x02 \n" /* 601 CPU = 0x0001 */
+" cmplwi %r0,0x02 \n" /* 601 CPU = 0x0001 */
" blt 2f \n" /* skip over non-601 BAT setup */
-" cmpi 0,1,%r0,0x39 \n" /* PPC970 */
+" cmplwi %r0,0x39 \n" /* PPC970 */
" blt 0f \n"
-" cmpi 0,1,%r0,0x45 \n" /* PPC970GX */
+" cmplwi %r0,0x45 \n" /* PPC970GX */
" ble 1f \n"
/* non PPC 601 BATs */
"0: li %r0,0 \n"
@@ -177,7 +177,13 @@
" \n"
"5: cmpw 0,%r8,%r9 \n"
" bge 6f \n"
-" stw %r0,0(%r8) \n"
+ /*
+ * clear by bytes to avoid ppc601 alignment exceptions
+ */
+" stb %r0,0(%r8) \n"
+" stb %r0,1(%r8) \n"
+" stb %r0,2(%r8) \n"
+" stb %r0,3(%r8) \n"
" addi %r8,%r8,4 \n"
" b 5b \n"
" \n"
Home |
Main Index |
Thread Index |
Old Index