Module Name:    src
Committed By:   msaitoh
Date:           Sun Apr 19 06:11:17 UTC 2015

Modified Files:
        src/sys/arch/sparc/include [netbsd-5]: openfirm.h
        src/sys/arch/sparc/stand/ofwboot [netbsd-5]: Locore.c
            loadfile_machdep.c openfirm.h

Log Message:
Pullup another commit for ticket #1958 requested by martin:

sys/arch/sparc/include/openfirm.h               1.7
sys/arch/sparc/stand/ofwboot/Locore.c           1.11
sys/arch/sparc/stand/ofwboot/loadfile_machdep.c 1.7
sys/arch/sparc/stand/ofwboot/openfirm.h         1.4

        Make ofwboot can handle over 4GB physical memory by using OpenFirmware
        calls properly, and some cosmetic changes.  Idea from OpenBSD.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.6.82.1 src/sys/arch/sparc/include/openfirm.h
cvs rdiff -u -r1.10.30.1 -r1.10.30.2 \
    src/sys/arch/sparc/stand/ofwboot/Locore.c
cvs rdiff -u -r1.6 -r1.6.4.1 \
    src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c
cvs rdiff -u -r1.3 -r1.3.72.1 src/sys/arch/sparc/stand/ofwboot/openfirm.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/sparc/include/openfirm.h
diff -u src/sys/arch/sparc/include/openfirm.h:1.6 src/sys/arch/sparc/include/openfirm.h:1.6.82.1
--- src/sys/arch/sparc/include/openfirm.h:1.6	Sat Mar  4 02:56:21 2006
+++ src/sys/arch/sparc/include/openfirm.h	Sun Apr 19 06:11:17 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: openfirm.h,v 1.6 2006/03/04 02:56:21 uwe Exp $	*/
+/*	$NetBSD: openfirm.h,v 1.6.82.1 2015/04/19 06:11:17 msaitoh Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -49,6 +49,9 @@ typedef uint64_t cell_t;
 #define HDL2CELL(x)	(cell_t)(u_int)(int)(x)
 #define ADR2CELL(x)	(cell_t)(u_int)(int)(x)
 #endif
+#define HDQ2CELL_HI(x)	(cell_t)(0)
+#define HDQ2CELL_LO(x)	(cell_t)(x)
+#define CELL2HDQ(hi,lo)	(lo)
 #else /* SUN4U */
 /* All cells are 4 byte slots */
 typedef uint32_t cell_t;

Index: src/sys/arch/sparc/stand/ofwboot/Locore.c
diff -u src/sys/arch/sparc/stand/ofwboot/Locore.c:1.10.30.1 src/sys/arch/sparc/stand/ofwboot/Locore.c:1.10.30.2
--- src/sys/arch/sparc/stand/ofwboot/Locore.c:1.10.30.1	Fri Apr 17 10:49:16 2015
+++ src/sys/arch/sparc/stand/ofwboot/Locore.c	Sun Apr 19 06:11:17 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: Locore.c,v 1.10.30.1 2015/04/17 10:49:16 msaitoh Exp $	*/
+/*	$NetBSD: Locore.c,v 1.10.30.2 2015/04/19 06:11:17 msaitoh Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -36,15 +36,6 @@
 
 #include <machine/cpu.h>
 
-vaddr_t	OF_claim_virt(vaddr_t, int);
-vaddr_t	OF_alloc_virt(int, int);
-int	OF_free_virt(vaddr_t, int);
-int	OF_unmap_virt(vaddr_t, int);
-vaddr_t	OF_map_phys(paddr_t, off_t, vaddr_t, int);
-paddr_t	OF_alloc_phys(int, int);
-paddr_t	OF_claim_phys(paddr_t, int);
-int	OF_free_phys(paddr_t, int);
-
 extern int openfirmware(void *);
 
 
@@ -450,9 +441,9 @@ OF_claim_virt(vaddr_t vaddr, int len)
 	args.align = 0;
 	args.len = len;
 	args.vaddr = ADR2CELL(vaddr);
-	if(openfirmware(&args) != 0)
+	if (openfirmware(&args) != 0)
 		return -1LL;
-	return args.retaddr; /* Kluge till we go 64-bit */
+	return (vaddr_t)args.retaddr;
 }
 
 /* 
@@ -486,13 +477,13 @@ OF_alloc_virt(int len, int align)
 	args.nargs = 4;
 	args.nreturns = 2;
 	args.method = ADR2CELL("claim");
-	args.ihandle = mmuh;
+	args.ihandle = HDL2CELL(mmuh);
 	args.align = align;
 	args.len = len;
 	args.retaddr = ADR2CELL(&retaddr);
-	if(openfirmware(&args) != 0)
+	if (openfirmware(&args) != 0)
 		return -1LL;
-	return (vaddr_t)args.retaddr; /* Kluge till we go 64-bit */
+	return (vaddr_t)args.retaddr;
 }
 
 /* 
@@ -601,8 +592,8 @@ OF_map_phys(paddr_t paddr, off_t size, v
 	args.mode = mode;
 	args.size = size;
 	args.vaddr = ADR2CELL(vaddr);
-	args.paddr_hi = ADR2CELL(paddr>>32);
-	args.paddr_lo = ADR2CELL(paddr);
+	args.paddr_hi = HDQ2CELL_HI(paddr);
+	args.paddr_lo = HDQ2CELL_LO(paddr);
 
 	if (openfirmware(&args) == -1)
 		return -1;
@@ -620,7 +611,6 @@ OF_map_phys(paddr_t paddr, off_t size, v
 paddr_t
 OF_alloc_phys(int len, int align)
 {
-	paddr_t paddr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -647,10 +637,9 @@ OF_alloc_phys(int len, int align)
 	args.ihandle = HDL2CELL(memh);
 	args.align = align;
 	args.len = len;
-	if(openfirmware(&args) != 0)
+	if (openfirmware(&args) != 0)
 		return -1LL;
-	paddr = (paddr_t)(args.phys_hi<<32)|((unsigned int)(args.phys_lo));
-	return paddr; /* Kluge till we go 64-bit */
+	return (paddr_t)CELL2HDQ(args.phys_hi, args.phys_lo);
 }
 
 /* 
@@ -661,7 +650,6 @@ OF_alloc_phys(int len, int align)
 paddr_t
 OF_claim_phys(paddr_t phys, int len)
 {
-	paddr_t paddr;
 	struct {
 		cell_t name;
 		cell_t nargs;
@@ -691,12 +679,11 @@ OF_claim_phys(paddr_t phys, int len)
 	args.ihandle = HDL2CELL(memh);
 	args.align = 0;
 	args.len = len;
-	args.phys_hi = HDL2CELL(phys>>32);
-	args.phys_lo = HDL2CELL(phys);
-	if(openfirmware(&args) != 0)
+	args.phys_hi = HDQ2CELL_HI(phys);
+	args.phys_lo = HDQ2CELL_LO(phys);
+	if (openfirmware(&args) != 0)
 		return 0LL;
-	paddr = (paddr_t)(args.rphys_hi<<32)|((unsigned int)(args.rphys_lo));
-	return paddr;
+	return (paddr_t)CELL2HDQ(args.rphys_hi, args.rphys_lo);
 }
 
 /* 
@@ -730,8 +717,8 @@ OF_free_phys(paddr_t phys, int len)
 	args.method = ADR2CELL("release");
 	args.ihandle = HDL2CELL(memh);
 	args.len = len;
-	args.phys_hi = HDL2CELL(phys>>32);
-	args.phys_lo = HDL2CELL(phys);
+	args.phys_hi = HDQ2CELL_HI(phys);
+	args.phys_lo = HDQ2CELL_LO(phys);
 	return openfirmware(&args);
 }
 
@@ -786,7 +773,7 @@ OF_claim(void *virt, u_int size, u_int a
 			return (void *)-1;
 		}
 	}
-	if ((paddr = OF_alloc_phys(size, align)) == -1) {
+	if ((paddr = OF_alloc_phys(size, align)) == (paddr_t)-1) {
 		printf("OF_alloc_phys(%d,%d) failed\n", size, align);
 		OF_free_virt((vaddr_t)virt, size);
 		return (void *)-1;

Index: src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c
diff -u src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c:1.6 src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c:1.6.4.1
--- src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c:1.6	Mon Aug 25 22:31:12 2008
+++ src/sys/arch/sparc/stand/ofwboot/loadfile_machdep.c	Sun Apr 19 06:11:17 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: loadfile_machdep.c,v 1.6 2008/08/25 22:31:12 martin Exp $	*/
+/*	$NetBSD: loadfile_machdep.c,v 1.6.4.1 2015/04/19 06:11:17 msaitoh Exp $	*/
 
 /*-
  * Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -181,22 +181,22 @@ tlb_init(void)
 			if (_prom_getprop(child, "upa-portid", &cpu,
 			    sizeof(cpu)) == -1 && _prom_getprop(child, "portid",
 			    &cpu, sizeof(cpu)) == -1)
-				panic("main: prom_getprop");
+				panic("tlb_init: prom_getprop");
 			if (cpu == bootcpu)
 				break;
 		}
 	}
 	if (cpu != bootcpu)
-		panic("init_tlb: no node for bootcpu?!?!");
+		panic("tlb_init: no node for bootcpu?!?!");
 	if (_prom_getprop(child, "#dtlb-entries", &dtlb_slot_max,
 	    sizeof(dtlb_slot_max)) == -1 ||
 	    _prom_getprop(child, "#itlb-entries", &itlb_slot_max,
 	    sizeof(itlb_slot_max)) == -1)
-		panic("init_tlb: prom_getprop");
+		panic("tlb_init: prom_getprop");
 	dtlb_store = alloc(dtlb_slot_max * sizeof(*dtlb_store));
 	itlb_store = alloc(itlb_slot_max * sizeof(*itlb_store));
 	if (dtlb_store == NULL || itlb_store == NULL) {
-		panic("init_tlb: malloc");
+		panic("tlb_init: malloc");
 	}
 
 	dtlb_slot = itlb_slot = 0;
@@ -208,14 +208,15 @@ tlb_init(void)
 static int
 mmu_mapin(vaddr_t rva, vsize_t len)
 {
-	int64_t data;
-	vaddr_t va, pa, mva;
+	uint64_t data;
+	paddr_t pa;
+	vaddr_t va, mva;
 
 	len  = roundup2(len + (rva & PAGE_MASK_4M), PAGE_SIZE_4M);
 	rva &= ~PAGE_MASK_4M;
 
 	tlb_init();
-	for (pa = (vaddr_t)-1; len > 0; rva = va) {
+	for (pa = (paddr_t)-1; len > 0; rva = va) {
 		if ( (len = kvamap_extract(rva, len, &va)) == 0) {
 			/* The rest is already mapped */
 			break;
@@ -224,13 +225,11 @@ mmu_mapin(vaddr_t rva, vsize_t len)
 		if (dtlb_va_to_pa(va) == (u_long)-1 ||
 		    itlb_va_to_pa(va) == (u_long)-1) {
 			/* Allocate a physical page, claim the virtual area */
-			if (pa == (vaddr_t)-1) {
-				pa = (vaddr_t)OF_alloc_phys(PAGE_SIZE_4M,
-				    PAGE_SIZE_4M);
-				if (pa == (vaddr_t)-1)
+			if (pa == (paddr_t)-1) {
+				pa = OF_alloc_phys(PAGE_SIZE_4M, PAGE_SIZE_4M);
+				if (pa == (paddr_t)-1)
 					panic("out of memory");
-				mva = (vaddr_t)OF_claim_virt(va,
-				    PAGE_SIZE_4M, 0);
+				mva = OF_claim_virt(va, PAGE_SIZE_4M);
 				if (mva != va) {
 					panic("can't claim virtual page "
 					    "(wanted %#lx, got %#lx)",
@@ -249,7 +248,7 @@ mmu_mapin(vaddr_t rva, vsize_t len)
 			if (itlb_slot >= itlb_slot_max)
 				panic("mmu_mapin: out of itlb_slots");
 
-			DPRINTF(("mmu_mapin: %p:%p\n", va, pa));
+			DPRINTF(("mmu_mapin: %p:%p.%p\n", va, hi(pa), lo(pa)));
 
 			data = TSB_DATA(0,		/* global */
 					PGSZ_4M,	/* 4mb page */
@@ -267,7 +266,7 @@ mmu_mapin(vaddr_t rva, vsize_t len)
 			dtlb_store[dtlb_slot].te_va = va;
 			dtlb_slot++;
 			dtlb_enter(va, hi(data), lo(data));
-			pa = (vaddr_t)-1;
+			pa = (paddr_t)-1;
 		}
 
 		kvamap_enter(va, PAGE_SIZE_4M);
@@ -276,7 +275,7 @@ mmu_mapin(vaddr_t rva, vsize_t len)
 		va += PAGE_SIZE_4M;
 	}
 
-	if (pa != (vaddr_t)-1) {
+	if (pa != (paddr_t)-1) {
 		OF_free_phys(pa, PAGE_SIZE_4M);
 	}
 

Index: src/sys/arch/sparc/stand/ofwboot/openfirm.h
diff -u src/sys/arch/sparc/stand/ofwboot/openfirm.h:1.3 src/sys/arch/sparc/stand/ofwboot/openfirm.h:1.3.72.1
--- src/sys/arch/sparc/stand/ofwboot/openfirm.h:1.3	Thu Jul 13 20:03:34 2006
+++ src/sys/arch/sparc/stand/ofwboot/openfirm.h	Sun Apr 19 06:11:17 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: openfirm.h,v 1.3 2006/07/13 20:03:34 uwe Exp $	*/
+/*	$NetBSD: openfirm.h,v 1.3.72.1 2015/04/19 06:11:17 msaitoh Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -61,5 +61,12 @@ int	OF_milliseconds(void);
 void	OF_chain(void *, u_int, void (*)(), void *, u_int);
 int	OF_peer(int);
 int	OF_child(int);
+vaddr_t	OF_claim_virt(vaddr_t, int);
+vaddr_t	OF_alloc_virt(int, int);
+int	OF_free_virt(vaddr_t, int);
+int	OF_unmap_virt(vaddr_t, int);
+vaddr_t	OF_map_phys(paddr_t, off_t, vaddr_t, int);
 paddr_t	OF_alloc_phys(int, int);
+paddr_t	OF_claim_phys(paddr_t, int);
+int	OF_free_phys(paddr_t, int);
 void	OF_initialize(void);

Reply via email to