summaryrefslogtreecommitdiffstats
path: root/sys/x86
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2015-08-25 14:39:40 +0000
committermarcel <marcel@FreeBSD.org>2015-08-25 14:39:40 +0000
commit87b09c366d87c98fd8a35cb0883c973290b0858b (patch)
treee20265d6eec7a4355210772dd496b1c6da24ed19 /sys/x86
parentd53cfebe2f15ceb38c2d4e7897391b81ca63387c (diff)
downloadFreeBSD-src-87b09c366d87c98fd8a35cb0883c973290b0858b.zip
FreeBSD-src-87b09c366d87c98fd8a35cb0883c973290b0858b.tar.gz
MFC r286667 & r286723
Better support memory mapped console devices, such as VGA and EFI frame buffers and memory mapped UARTs. PR: 191564, 194952, 202276
Diffstat (limited to 'sys/x86')
-rw-r--r--sys/x86/include/bus.h25
-rw-r--r--sys/x86/x86/bus_machdep.c59
2 files changed, 63 insertions, 21 deletions
diff --git a/sys/x86/include/bus.h b/sys/x86/include/bus.h
index ced90d5..91de8cb 100644
--- a/sys/x86/include/bus.h
+++ b/sys/x86/include/bus.h
@@ -130,32 +130,15 @@
* Map a region of device bus space into CPU virtual address space.
*/
-static __inline int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
- bus_size_t size, int flags,
- bus_space_handle_t *bshp);
-
-static __inline int
-bus_space_map(bus_space_tag_t t __unused, bus_addr_t addr,
- bus_size_t size __unused, int flags __unused,
- bus_space_handle_t *bshp)
-{
-
- *bshp = addr;
- return (0);
-}
+int bus_space_map(bus_space_tag_t tag, bus_addr_t addr, bus_size_t size,
+ int flags, bus_space_handle_t *bshp);
/*
* Unmap a region of device bus space.
*/
-static __inline void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh,
- bus_size_t size);
-
-static __inline void
-bus_space_unmap(bus_space_tag_t t __unused, bus_space_handle_t bsh __unused,
- bus_size_t size __unused)
-{
-}
+void bus_space_unmap(bus_space_tag_t tag, bus_space_handle_t bsh,
+ bus_size_t size);
/*
* Get a new handle for a subregion of an already-mapped area of bus space.
diff --git a/sys/x86/x86/bus_machdep.c b/sys/x86/x86/bus_machdep.c
new file mode 100644
index 0000000..a629a81
--- /dev/null
+++ b/sys/x86/x86/bus_machdep.c
@@ -0,0 +1,59 @@
+/*-
+ * Copyright (c) 2015 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <x86/bus.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+/*
+ * Implementation of bus_space_map(), which effectively is a thin
+ * wrapper around pmap_mapdev() for memory mapped I/O space. It's
+ * implemented here and not in <x86/bus.h> to avoid pollution.
+ */
+int
+bus_space_map(bus_space_tag_t tag, bus_addr_t addr, bus_size_t size,
+ int flags __unused, bus_space_handle_t *bshp)
+{
+
+ *bshp = (tag == X86_BUS_SPACE_MEM)
+ ? (uintptr_t)pmap_mapdev(addr, size)
+ : addr;
+ return (0);
+}
+
+void
+bus_space_unmap(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t size)
+{
+
+ if (tag == X86_BUS_SPACE_MEM)
+ pmap_unmapdev(bsh, size);
+}
OpenPOWER on IntegriCloud