Module Name:    src
Committed By:   jmcneill
Date:           Fri May 26 18:58:55 UTC 2017

Modified Files:
        src/sys/arch/evbarm/tegra: tegra_machdep.c

Log Message:
Don't try to use memory above 4GB PA.


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sys/arch/evbarm/tegra/tegra_machdep.c

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/evbarm/tegra/tegra_machdep.c
diff -u src/sys/arch/evbarm/tegra/tegra_machdep.c:1.41 src/sys/arch/evbarm/tegra/tegra_machdep.c:1.42
--- src/sys/arch/evbarm/tegra/tegra_machdep.c:1.41	Fri May 26 00:15:12 2017
+++ src/sys/arch/evbarm/tegra/tegra_machdep.c	Fri May 26 18:58:55 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_machdep.c,v 1.41 2017/05/26 00:15:12 jmcneill Exp $ */
+/* $NetBSD: tegra_machdep.c,v 1.42 2017/05/26 18:58:55 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_machdep.c,v 1.41 2017/05/26 00:15:12 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_machdep.c,v 1.42 2017/05/26 18:58:55 jmcneill Exp $");
 
 #include "opt_tegra.h"
 #include "opt_machdep.h"
@@ -225,8 +225,7 @@ extern void cortex_mpstart(void);
 u_int
 initarm(void *arg)
 {
-	bus_addr_t memory_addr;
-	bus_size_t memory_size;
+	uint64_t memory_addr, memory_size;
 	psize_t ram_size = 0;
 	DPRINT("initarm:");
 
@@ -285,20 +284,24 @@ initarm(void *arg)
 		KERNEL_BASE, KERNEL_VM_BASE, KERNEL_VM_BASE - KERNEL_BASE, KERNEL_BASE_VOFFSET);
 
 	const int memory = OF_finddevice("/memory");
-	if (fdtbus_get_reg(memory, 0, &memory_addr, &memory_size) != 0)
+	if (fdtbus_get_reg64(memory, 0, &memory_addr, &memory_size) != 0)
 		panic("Cannot determine memory size");
 
 	DPRINTF("FDT memory node = %d, addr %llx, size %llu\n",
 	    memory, (unsigned long long)memory_addr,
 	    (unsigned long long)memory_size);
 
-	ram_size = memory_size;
+	/* Cannot map memory above 4GB */
+	if (memory_addr + memory_size > 0x100000000)
+		memory_size = 0x100000000 - memory_addr;
+
+	ram_size = (bus_size_t)memory_size;
 
 #ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
 	const bool mapallmem_p = true;
 #ifndef PMAP_NEED_ALLOC_POOLPAGE
 	if (ram_size > KERNEL_VM_BASE - KERNEL_BASE) {
-		printf("%s: dropping RAM size from %luMB to %uMB\n",
+		DPRINTF("%s: dropping RAM size from %luMB to %uMB\n",
 		    __func__, (unsigned long) (ram_size >> 20),     
 		    (KERNEL_VM_BASE - KERNEL_BASE) >> 20);
 		ram_size = KERNEL_VM_BASE - KERNEL_BASE;
@@ -325,7 +328,7 @@ initarm(void *arg)
 
 	/* Fake bootconfig structure for the benefit of pmap.c. */
 	bootconfig.dramblocks = 1;
-	bootconfig.dram[0].address = memory_addr;
+	bootconfig.dram[0].address = (bus_addr_t)memory_addr;
 	bootconfig.dram[0].pages = ram_size / PAGE_SIZE;
 
 	KASSERT((armreg_pfr1_read() & ARM_PFR1_SEC_MASK) != 0);

Reply via email to