Module Name:    src
Committed By:   simonb
Date:           Fri Jun  5 07:17:38 UTC 2020

Modified Files:
        src/sys/arch/evbmips/cavium: machdep.c octeon_uboot.h
        src/sys/arch/evbmips/conf: ERLITE

Log Message:
Now that we don't zero out the second link in the U-boot bootmem
descripter, use that to configure free memory.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/evbmips/cavium/machdep.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbmips/cavium/octeon_uboot.h
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/evbmips/conf/ERLITE

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/evbmips/cavium/machdep.c
diff -u src/sys/arch/evbmips/cavium/machdep.c:1.12 src/sys/arch/evbmips/cavium/machdep.c:1.13
--- src/sys/arch/evbmips/cavium/machdep.c:1.12	Thu Jun  4 03:08:59 2020
+++ src/sys/arch/evbmips/cavium/machdep.c	Fri Jun  5 07:17:38 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.12 2020/06/04 03:08:59 simonb Exp $	*/
+/*	$NetBSD: machdep.c,v 1.13 2020/06/05 07:17:38 simonb Exp $	*/
 
 /*
  * Copyright 2001, 2002 Wasabi Systems, Inc.
@@ -115,7 +115,7 @@
 #include "opt_cavium.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.12 2020/06/04 03:08:59 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.13 2020/06/05 07:17:38 simonb Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -157,7 +157,7 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 
 static void	mach_init_vector(void);
 static void	mach_init_bus_space(void);
 static void	mach_init_console(void);
-static void	mach_init_memory(u_quad_t);
+static void	mach_init_memory(void);
 
 #include "com.h"
 #if NCOM > 0
@@ -173,6 +173,9 @@ int	netboot;
 
 phys_ram_seg_t mem_clusters[VM_PHYSSEG_MAX];
 int mem_cluster_cnt;
+extern char kernel_text[];
+extern char edata[];
+extern char end[];
 
 void	mach_init(uint64_t, uint64_t, uint64_t, uint64_t);
 
@@ -188,14 +191,11 @@ void
 mach_init(uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3)
 {
 	uint64_t btinfo_paddr;
-	u_quad_t memsize;
 	int corefreq;
-	extern char edata[], end[];
 
 	/* clear the BSS segment */
 	memset(edata, 0, end - edata);
 
-
 	KASSERT(MIPS_XKPHYS_P(arg3));
 	btinfo_paddr = mips3_ld(arg3 + OCTEON_BTINFO_PADDR_OFFSET);
 
@@ -206,11 +206,6 @@ mach_init(uint64_t arg0, uint64_t arg1, 
 	    sizeof(octeon_btinfo));
 
 	corefreq = octeon_btinfo.obt_eclock_hz;
-#ifdef OCTEON_MEMSIZE // avoid uvm issue
-	memsize = OCTEON_MEMSIZE;
-#else
-	memsize = octeon_btinfo.obt_dram_size * 1024 * 1024;
-#endif
 
 	octeon_cal_timer(corefreq);
 
@@ -233,7 +228,7 @@ mach_init(uint64_t arg0, uint64_t arg1, 
 
 	mach_init_console();
 
-	mach_init_memory(memsize);
+	mach_init_memory();
 
 	/*
 	 * Allocate uarea page for lwp0 and set it.
@@ -325,34 +320,42 @@ mach_init_console(void)
 #endif /* NCOM > 0 */
 }
 
-void
-mach_init_memory(u_quad_t memsize)
+static void
+mach_init_memory(void)
 {
-	extern char kernel_text[];
-	extern char end[];
-
-	physmem = btoc(memsize);
-
-	if (memsize <= 256 * 1024 * 1024) {
-		mem_clusters[0].start = 0;
-		mem_clusters[0].size = memsize;
-		mem_cluster_cnt = 1;
-	} else if (memsize <= 512 * 1024 * 1024) {
-		mem_clusters[0].start = 0;
-		mem_clusters[0].size = 256 * 1024 * 1024;
-		mem_clusters[1].start = 0x410000000ULL;
-		mem_clusters[1].size = memsize - 256 * 1024 * 1024;
-		mem_cluster_cnt = 2;
-	} else {
-		mem_clusters[0].start = 0;
-		mem_clusters[0].size = 256 * 1024 * 1024;
-		mem_clusters[1].start = 0x20000000;
-		mem_clusters[1].size = memsize - 512 * 1024 * 1024;
-		mem_clusters[2].start = 0x410000000ULL;
-		mem_clusters[2].size = 256 * 1024 * 1024;
-		mem_cluster_cnt = 3;
+	struct octeon_bootmem_desc *memdesc;
+	struct octeon_bootmem_block_header *block;
+	paddr_t blockaddr;
+	int i;
+
+	mem_cluster_cnt = 0;
+
+	if (octeon_btinfo.obt_phy_mem_desc_addr == 0)
+		panic("bootmem desc is missing");
+
+	memdesc = (void *)MIPS_PHYS_TO_XKPHYS(CCA_CACHEABLE,
+                    octeon_btinfo.obt_phy_mem_desc_addr);
+	printf("u-boot bootmem desc @ 0x%x version %d.%d\n",
+	    octeon_btinfo.obt_phy_mem_desc_addr,
+	    memdesc->bmd_major_version, memdesc->bmd_minor_version);
+	if (memdesc->bmd_major_version > 3)
+		panic("unhandled bootmem desc version %d.%d",
+		    memdesc->bmd_major_version, memdesc->bmd_minor_version);
+
+	blockaddr = memdesc->bmd_head_addr;
+	if (blockaddr == 0)
+		panic("bootmem list is empty");
+
+	for (i = 0; i < VM_PHYSSEG_MAX && blockaddr != 0;
+	    i++, blockaddr = block->bbh_next_block_addr) {
+		block = (void *)MIPS_PHYS_TO_XKPHYS(CCA_CACHEABLE, blockaddr);
+
+		mem_clusters[mem_cluster_cnt].start = blockaddr;
+		mem_clusters[mem_cluster_cnt].size = block->bbh_size;
+		mem_cluster_cnt++;
 	}
 
+	physmem = btoc(octeon_btinfo.obt_dram_size * 1024 * 1024);
 
 #ifdef MULTIPROCESSOR
 	const u_int cores = mipsNN_cp0_ebase_read() & MIPS_EBASE_CPUNUM;

Index: src/sys/arch/evbmips/cavium/octeon_uboot.h
diff -u src/sys/arch/evbmips/cavium/octeon_uboot.h:1.1 src/sys/arch/evbmips/cavium/octeon_uboot.h:1.2
--- src/sys/arch/evbmips/cavium/octeon_uboot.h:1.1	Wed Apr 29 08:32:01 2015
+++ src/sys/arch/evbmips/cavium/octeon_uboot.h	Fri Jun  5 07:17:38 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: octeon_uboot.h,v 1.1 2015/04/29 08:32:01 hikaru Exp $	*/
+/*	$NetBSD: octeon_uboot.h,v 1.2 2020/06/05 07:17:38 simonb Exp $	*/
 
 #ifndef _EVBMIPS_OCTEON_UBOOT_H_
 #define _EVBMIPS_OCTEON_UBOOT_H_
@@ -55,4 +55,41 @@ extern struct octeon_btinfo octeon_btinf
 /* obt_board_type */
 #define BOARD_TYPE_UBIQUITI_E100	20002
 
+
+struct octeon_bootmem_desc {
+#if BYTE_ORDER == BIG_ENDIAN
+	uint32_t	bmd_lock;
+	uint32_t	bmd_flags;
+	uint64_t	bmd_head_addr;
+
+	uint32_t	bmd_major_version;
+	uint32_t	bmd_minor_version;
+	uint64_t	bmd_app_data_addr;
+	uint64_t	bmd_app_data_size;
+
+	uint32_t	bmd_named_block_num_blocks;
+	uint32_t	bmd_named_block_name_len;
+	uint64_t	bmd_named_block_array_addr;
+#endif
+#if BYTE_ORDER == LITTLE_ENDIAN
+	uint32_t	bmd_flags;
+	uint32_t	bmd_lock;
+	uint64_t	bmd_head_addr;
+
+	uint32_t	bmd_minor_version;
+	uint32_t	bmd_major_version;
+	uint64_t	bmd_app_data_addr;
+	uint64_t	bmd_app_data_size;
+
+	uint32_t	bmd_named_block_name_len;
+	uint32_t	bmd_named_block_num_blocks;
+	uint64_t	bmd_named_block_array_addr;
+#endif
+};
+
+struct octeon_bootmem_block_header {
+	uint64_t	bbh_next_block_addr;
+	uint64_t	bbh_size;
+};
+
 #endif /* _EVBMIPS_OCTEON_UBOOT_H_ */

Index: src/sys/arch/evbmips/conf/ERLITE
diff -u src/sys/arch/evbmips/conf/ERLITE:1.25 src/sys/arch/evbmips/conf/ERLITE:1.26
--- src/sys/arch/evbmips/conf/ERLITE:1.25	Sun May 31 04:56:35 2020
+++ src/sys/arch/evbmips/conf/ERLITE	Fri Jun  5 07:17:38 2020
@@ -1,18 +1,14 @@
-#	$NetBSD: ERLITE,v 1.25 2020/05/31 04:56:35 simonb Exp $
+#	$NetBSD: ERLITE,v 1.26 2020/06/05 07:17:38 simonb Exp $
 
 include 	"arch/mips/conf/std.octeon"
 include 	"arch/evbmips/conf/files.octeon"
 
 #options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-#ident 		"ERLITE-$Revision: 1.25 $"
+#ident 		"ERLITE-$Revision: 1.26 $"
 
 maxusers	32
 
-# XXX UVM freelists vs 4GB issue.  Enable this if you see hangs
-# waiting for memory when there are actual free pages around.
-#options 	OCTEON_MEMSIZE="(256*1024*1024)"
-
 # Options for necessary to use MD
 #options 	MEMORY_DISK_HOOKS
 #options 	MEMORY_DISK_IS_ROOT	# force root on memory disk

Reply via email to