diff options
author | 2010-01-22 21:45:22 +0000 | |
---|---|---|
committer | 2010-01-22 21:45:22 +0000 | |
commit | df5d8a75e685d584a7e6cff1ddcfd48dcc21ba97 (patch) | |
tree | d1a077a82872d8aa34b9a68926b1e4a7b1a3540a | |
parent | Fix previous to pick the right year as the timebase (mips64 routines expect (diff) | |
download | wireguard-openbsd-df5d8a75e685d584a7e6cff1ddcfd48dcc21ba97.tar.xz wireguard-openbsd-df5d8a75e685d584a7e6cff1ddcfd48dcc21ba97.zip |
Move is_memory_range() from mips64 mem.c to a per-architecture location; this
allows /dev/kmem to access the 256MB alias of the low memory on loongson, which
in turns makes procmap(8) happy.
-rw-r--r-- | sys/arch/loongson/dev/bonito.c | 6 | ||||
-rw-r--r-- | sys/arch/loongson/loongson/loongson2_machdep.c | 70 | ||||
-rw-r--r-- | sys/arch/mips64/mips64/mem.c | 22 | ||||
-rw-r--r-- | sys/arch/sgi/sgi/machdep.c | 23 |
4 files changed, 78 insertions, 43 deletions
diff --git a/sys/arch/loongson/dev/bonito.c b/sys/arch/loongson/dev/bonito.c index 0bf452ad996..9d46d4ad68b 100644 --- a/sys/arch/loongson/dev/bonito.c +++ b/sys/arch/loongson/dev/bonito.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bonito.c,v 1.1.1.1 2009/12/25 22:09:45 miod Exp $ */ +/* $OpenBSD: bonito.c,v 1.2 2010/01/22 21:45:22 miod Exp $ */ /* $NetBSD: bonito_mainbus.c,v 1.11 2008/04/28 20:23:10 martin Exp $ */ /* $NetBSD: bonito_pci.c,v 1.5 2008/04/28 20:23:28 martin Exp $ */ @@ -300,13 +300,13 @@ bonito_attach(struct device *parent, struct device *self, void *aux) bus_addr_t bonito_pa_to_device(paddr_t pa) { - return pa; + return pa ^ loongson_dma_base; } paddr_t bonito_device_to_pa(bus_addr_t addr) { - return addr; + return addr ^ loongson_dma_base; } int diff --git a/sys/arch/loongson/loongson/loongson2_machdep.c b/sys/arch/loongson/loongson/loongson2_machdep.c index ff8521ddb38..541ef74c63e 100644 --- a/sys/arch/loongson/loongson/loongson2_machdep.c +++ b/sys/arch/loongson/loongson/loongson2_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: loongson2_machdep.c,v 1.1.1.1 2009/12/25 22:04:21 miod Exp $ */ +/* $OpenBSD: loongson2_machdep.c,v 1.2 2010/01/22 21:45:24 miod Exp $ */ /* * Copyright (c) 2009 Miodrag Vallat. @@ -30,6 +30,7 @@ extern struct phys_mem_desc mem_layout[MAXMEMSEGS]; +boolean_t is_memory_range(paddr_t, psize_t, psize_t); void loongson2e_setup(u_long, u_long); void loongson2f_setup(u_long, u_long); @@ -42,23 +43,6 @@ paddr_t loongson_dma_base = 0; * Setup memory mappings for Loongson 2E processors. */ -void -loongson2e_setup(u_long memlo, u_long memhi) -{ - memlo = atop(memlo << 20); - memhi = atop(memhi << 20); - physmem = memlo + memhi; - - /* - * Only register the first 256MB of memory. - * This will be hopefully be revisited once we get our hands - * on Loongson 2E-based hardware... - */ - - mem_layout[0].mem_first_page = 1; /* do NOT stomp on exception area */ - mem_layout[0].mem_last_page = memlo; -} - /* * Canonical crossbow assignments on Loongson 2F based designs. * Might need to move to a per-design header file in the future. @@ -84,6 +68,25 @@ loongson2e_setup(u_long memlo, u_long memhi) #define PCI_DDR_SIZE DDR_PHYSICAL_SIZE #define PCI_DDR_WINDOW_BASE DDR_PHYSICAL_BASE +void +loongson2e_setup(u_long memlo, u_long memhi) +{ + memlo = atop(memlo << 20); + memhi = atop(memhi << 20); + physmem = memlo + memhi; + + /* + * Only register the first 256MB of memory. + * This will be hopefully be revisited once we get our hands + * on Loongson 2E-based hardware... + */ + + mem_layout[0].mem_first_page = 1; /* do NOT stomp on exception area */ + mem_layout[0].mem_last_page = memlo; + + loongson_dma_base = PCI_DDR_BASE; +} + /* * Setup memory mappings for Loongson 2F processors. */ @@ -160,3 +163,34 @@ loongson2f_setup(u_long memlo, u_long memhi) *awrreg = DDR_PHYSICAL_BASE | MASTER_CPU; (void)*awrreg; } + +boolean_t +is_memory_range(paddr_t pa, psize_t len, psize_t limit) +{ + struct phys_mem_desc *seg; + uint64_t fp, lp; + int i; + + fp = atop(pa); + lp = atop(round_page(pa + len)); + + if (limit != 0 && lp > atop(limit)) + return FALSE; + + /* + * Allow access to the low 256MB aliased region on 2F systems. + */ + if (/* curcpu()->ci_hw.type == MIPS_LOONGSON2 && */ + (curcpu()->ci_hw.c0prid & 0xff) == 0x2f - 0x2c) { + if (pa < 0x10000000) { + fp += atop(DDR_WINDOW_BASE); + lp += atop(DDR_WINDOW_BASE); + } + } + + for (i = 0, seg = mem_layout; i < MAXMEMSEGS; i++, seg++) + if (fp >= seg->mem_first_page && lp <= seg->mem_last_page) + return TRUE; + + return FALSE; +} diff --git a/sys/arch/mips64/mips64/mem.c b/sys/arch/mips64/mips64/mem.c index 4e2cedaa2a8..84850c602d4 100644 --- a/sys/arch/mips64/mips64/mem.c +++ b/sys/arch/mips64/mips64/mem.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mem.c,v 1.14 2010/01/09 18:51:59 miod Exp $ */ +/* $OpenBSD: mem.c,v 1.15 2010/01/22 21:45:25 miod Exp $ */ /* $NetBSD: mem.c,v 1.6 1995/04/10 11:55:03 mycroft Exp $ */ /* @@ -197,23 +197,3 @@ mmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p) { return (EOPNOTSUPP); } - -boolean_t -is_memory_range(paddr_t pa, psize_t len, psize_t limit) -{ - struct phys_mem_desc *seg; - uint64_t fp, lp; - int i; - - fp = atop(pa); - lp = atop(round_page(pa + len)); - - if (limit != 0 && lp > atop(limit)) - return FALSE; - - for (i = 0, seg = mem_layout; i < MAXMEMSEGS; i++, seg++) - if (fp >= seg->mem_first_page && lp <= seg->mem_last_page) - return TRUE; - - return FALSE; -} diff --git a/sys/arch/sgi/sgi/machdep.c b/sys/arch/sgi/sgi/machdep.c index 1b26fdef6b8..bae4b29b70c 100644 --- a/sys/arch/sgi/sgi/machdep.c +++ b/sys/arch/sgi/sgi/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.97 2010/01/09 23:34:29 miod Exp $ */ +/* $OpenBSD: machdep.c,v 1.98 2010/01/22 21:45:26 miod Exp $ */ /* * Copyright (c) 2003-2004 Opsycon AB (www.opsycon.se / www.opsycon.com) @@ -129,6 +129,7 @@ static void dobootopts(int, void *); void arcbios_halt(int); void build_trampoline(vaddr_t, vaddr_t); +boolean_t is_memory_range(paddr_t, psize_t, psize_t); void (*md_halt)(int) = arcbios_halt; @@ -946,6 +947,26 @@ initcpu() { } +boolean_t +is_memory_range(paddr_t pa, psize_t len, psize_t limit) +{ + struct phys_mem_desc *seg; + uint64_t fp, lp; + int i; + + fp = atop(pa); + lp = atop(round_page(pa + len)); + + if (limit != 0 && lp > atop(limit)) + return FALSE; + + for (i = 0, seg = mem_layout; i < MAXMEMSEGS; i++, seg++) + if (fp >= seg->mem_first_page && lp <= seg->mem_last_page) + return TRUE; + + return FALSE; +} + #ifdef CPU_RM7000 #ifdef RM7K_PERFCNTR /* |