Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/evbmips Now that we don't zero out the second link ...
details: https://anonhg.NetBSD.org/src/rev/8c48a9c30128
branches: trunk
changeset: 934048:8c48a9c30128
user: simonb <simonb%NetBSD.org@localhost>
date: Fri Jun 05 07:17:38 2020 +0000
description:
Now that we don't zero out the second link in the U-boot bootmem
descripter, use that to configure free memory.
diffstat:
sys/arch/evbmips/cavium/machdep.c | 73 +++++++++++++++++----------------
sys/arch/evbmips/cavium/octeon_uboot.h | 39 +++++++++++++++++-
sys/arch/evbmips/conf/ERLITE | 8 +--
3 files changed, 78 insertions(+), 42 deletions(-)
diffs (214 lines):
diff -r 9c96b20ac94d -r 8c48a9c30128 sys/arch/evbmips/cavium/machdep.c
--- a/sys/arch/evbmips/cavium/machdep.c Fri Jun 05 03:24:58 2020 +0000
+++ b/sys/arch/evbmips/cavium/machdep.c Fri Jun 05 07:17:38 2020 +0000
@@ -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 @@
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 @@
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 @@
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 @@
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_console();
- mach_init_memory(memsize);
+ mach_init_memory();
/*
* Allocate uarea page for lwp0 and set it.
@@ -325,34 +320,42 @@
#endif /* NCOM > 0 */
}
-void
-mach_init_memory(u_quad_t memsize)
+static void
+mach_init_memory(void)
{
- extern char kernel_text[];
- extern char end[];
+ struct octeon_bootmem_desc *memdesc;
+ struct octeon_bootmem_block_header *block;
+ paddr_t blockaddr;
+ int i;
- physmem = btoc(memsize);
+ mem_cluster_cnt = 0;
+
+ if (octeon_btinfo.obt_phy_mem_desc_addr == 0)
+ panic("bootmem desc is missing");
- 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;
+ 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;
diff -r 9c96b20ac94d -r 8c48a9c30128 sys/arch/evbmips/cavium/octeon_uboot.h
--- a/sys/arch/evbmips/cavium/octeon_uboot.h Fri Jun 05 03:24:58 2020 +0000
+++ b/sys/arch/evbmips/cavium/octeon_uboot.h Fri Jun 05 07:17:38 2020 +0000
@@ -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 @@
/* 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_ */
diff -r 9c96b20ac94d -r 8c48a9c30128 sys/arch/evbmips/conf/ERLITE
--- a/sys/arch/evbmips/conf/ERLITE Fri Jun 05 03:24:58 2020 +0000
+++ b/sys/arch/evbmips/conf/ERLITE Fri Jun 05 07:17:38 2020 +0000
@@ -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
Home |
Main Index |
Thread Index |
Old Index