From 577734564eba54fb00df422cabefe80d3c032bb5 Mon Sep 17 00:00:00 2001 From: Miod Vallat Date: Sun, 11 Feb 2007 12:41:30 +0000 Subject: Rework the i/o mapping logic so that it allows the 1:1 region to not go up to the end of the address space; allows the A16D16 VME space to be mapped correctly again on MVME197. --- sys/arch/mvme88k/dev/mainbus.c | 91 +++++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 36 deletions(-) diff --git a/sys/arch/mvme88k/dev/mainbus.c b/sys/arch/mvme88k/dev/mainbus.c index 171d2f76428..f8a92d0c1a5 100644 --- a/sys/arch/mvme88k/dev/mainbus.c +++ b/sys/arch/mvme88k/dev/mainbus.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mainbus.c,v 1.21 2006/07/07 19:36:50 miod Exp $ */ +/* $OpenBSD: mainbus.c,v 1.22 2007/02/11 12:41:29 miod Exp $ */ /* * Copyright (c) 1998 Steve Murphree, Jr. * Copyright (c) 2004, Miodrag Vallat. @@ -76,7 +76,8 @@ const struct mvme88k_bus_space_tag mainbus_bustag = { mainbus_vaddr }; -bus_addr_t bs_threshold; +bus_addr_t bs_obio_start; +bus_addr_t bs_obio_end; struct extent *bs_extent; /* @@ -130,26 +131,36 @@ mainbus_vaddr(bus_space_handle_t handle) * we might have several mappings for a given chunk of the IO page. */ vaddr_t -mapiodev(addr, size) - paddr_t addr; - int size; +mapiodev(paddr_t addr, int _size) { vaddr_t va, iova, off; - paddr_t pa; + paddr_t pa, epa; + psize_t size; int s, error; - if (size <= 0) + /* sanity checks */ + if (_size <= 0) + return NULL; + size = (psize_t)_size; + epa = addr + size; + if (epa < addr && epa != 0) return NULL; - if (addr >= bs_threshold) - return ((vaddr_t)addr); + /* check for 1:1 mapping */ + if (addr >= bs_obio_start) { + if (bs_obio_end == 0 || epa <= bs_obio_end) + return ((vaddr_t)addr); + else if (addr <= bs_obio_end) + /* accross obio and non-obio, not supported */ + return NULL; + } pa = trunc_page(addr); off = addr & PGOFSET; size = round_page(off + size); s = splhigh(); - error = extent_alloc_region(bs_extent, pa, size, + error = extent_alloc_region(bs_extent, atop(pa), atop(size), EX_MALLOCOK | (cold ? 0 : EX_WAITSPACE)); splx(s); @@ -158,7 +169,7 @@ mapiodev(addr, size) va = uvm_km_valloc(kernel_map, size); if (va == 0) { - extent_free(bs_extent, pa, size, + extent_free(bs_extent, atop(pa), atop(size), EX_MALLOCOK | (cold ? 0 : EX_WAITSPACE)); return NULL; } @@ -180,17 +191,30 @@ mapiodev(addr, size) * Free up the mapping in iomap. */ void -unmapiodev(va, size) - vaddr_t va; - int size; +unmapiodev(vaddr_t va, int _size) { - vaddr_t kva, off; + vaddr_t eva, kva, off; + vsize_t size; paddr_t pa; int s, error; - if (va >= bs_threshold) + /* sanity checks */ + if (_size <= 0) + return; + size = (vsize_t)_size; + eva = va + size; + if (eva < va && eva != 0) return; + /* check for 1:1 mapping */ + if (va >= bs_obio_start) { + if (bs_obio_end == 0 || eva <= bs_obio_end) + return; + else if (va <= bs_obio_end) + /* accross obio and non-obio, not supported */ + return; + } + off = va & PGOFSET; kva = trunc_page(va); size = round_page(off + size); @@ -203,7 +227,7 @@ unmapiodev(va, size) uvm_km_free(kernel_map, kva, size); s = splhigh(); - error = extent_free(bs_extent, pa, size, + error = extent_free(bs_extent, atop(pa), atop(size), EX_MALLOCOK | (cold ? 0 : EX_WAITSPACE)); #ifdef DIAGNOSTIC if (error != 0) @@ -226,18 +250,13 @@ struct cfdriver mainbus_cd = { }; int -mainbus_match(parent, cf, args) - struct device *parent; - void *cf; - void *args; +mainbus_match(struct device *parent, void *cf, void *args) { return (1); } int -mainbus_print(args, bus) - void *args; - const char *bus; +mainbus_print(void *args, const char *bus) { struct confargs *ca = args; @@ -247,9 +266,7 @@ mainbus_print(args, bus) } int -mainbus_scan(parent, child, args) - struct device *parent; - void *child, *args; +mainbus_scan(struct device *parent, void *child, void *args) { struct cfdata *cf = child; struct confargs oca; @@ -268,9 +285,7 @@ mainbus_scan(parent, child, args) } void -mainbus_attach(parent, self, args) - struct device *parent, *self; - void *args; +mainbus_attach(struct device *parent, struct device *self, void *args) { extern char cpu_model[]; @@ -285,15 +300,19 @@ mainbus_attach(parent, self, args) * Initialize an extent to keep track of I/O mappings. */ #ifdef M88100 - if (CPU_IS88100) - bs_threshold = BATC8_VA; /* hardwired BATC */ + if (CPU_IS88100) { + bs_obio_start = BATC8_VA; /* hardwired BATC */ + bs_obio_end = 0; + } #endif #ifdef MVME197 - if (CPU_IS88110) - bs_threshold = OBIO197_START; + if (CPU_IS88110) { + bs_obio_start = OBIO197_START; + bs_obio_end = OBIO197_START + OBIO197_SIZE; + } #endif - bs_extent = extent_create("bus_space", physmem, - bs_threshold, M_DEVBUF, NULL, 0, EX_NOWAIT); + bs_extent = extent_create("bus_space", atop(physmem), + 1 + atop(0U - PAGE_SIZE), M_DEVBUF, NULL, 0, EX_NOWAIT); if (bs_extent == NULL) panic("unable to allocate bus_space extent"); -- cgit v1.2.3