Module Name: src
Committed By: macallan
Date: Tue Nov 10 22:24:58 UTC 2009
Modified Files:
src/sys/arch/shark/ofw: igsfb_ofbus.c
Log Message:
add a mmap() method so the xf86-video-igs driver can map the aperture and
IO space in a sane way.
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/shark/ofw/igsfb_ofbus.c
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/shark/ofw/igsfb_ofbus.c
diff -u src/sys/arch/shark/ofw/igsfb_ofbus.c:1.8 src/sys/arch/shark/ofw/igsfb_ofbus.c:1.9
--- src/sys/arch/shark/ofw/igsfb_ofbus.c:1.8 Thu May 8 02:10:52 2008
+++ src/sys/arch/shark/ofw/igsfb_ofbus.c Tue Nov 10 22:24:57 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: igsfb_ofbus.c,v 1.8 2008/05/08 02:10:52 macallan Exp $ */
+/* $NetBSD: igsfb_ofbus.c,v 1.9 2009/11/10 22:24:57 macallan Exp $ */
/*
* Copyright (c) 2006 Michael Lorenz
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: igsfb_ofbus.c,v 1.8 2008/05/08 02:10:52 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: igsfb_ofbus.c,v 1.9 2009/11/10 22:24:57 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -66,6 +66,7 @@
static int igsfb_ofbus_match(struct device *, struct cfdata *, void *);
static void igsfb_ofbus_attach(struct device *, struct device *, void *);
static int igsfb_setup_dc(struct igsfb_devconfig *);
+static paddr_t igsfb_ofbus_mmap(void *, void *, off_t, int);
CFATTACH_DECL(igsfb_ofbus, sizeof(struct igsfb_softc),
igsfb_ofbus_match, igsfb_ofbus_attach, NULL, NULL);
@@ -74,6 +75,7 @@
vaddr_t igsfb_mem_vaddr = 0, igsfb_mmio_vaddr = 0;
paddr_t igsfb_mem_paddr;
+extern paddr_t isa_io_physaddr;
struct bus_space igsfb_memt, igsfb_iot;
#if (NIGSFB_OFBUS > 0) || (NVGA_OFBUS > 0)
@@ -106,8 +108,8 @@
return ENXIO;
igsfb_mem_paddr = be32toh(regs[13]);
- /* 4MB VRAM */
- igsfb_mem_vaddr = ofw_map(igsfb_mem_paddr, 0x00400000, 0);
+ /* 4MB VRAM aperture, bufferable and cacheable */
+ igsfb_mem_vaddr = ofw_map(igsfb_mem_paddr, 0x00400000, L2_B | L2_C);
/* MMIO registers */
igsfb_mmio_vaddr = ofw_map(igsfb_mem_paddr + IGS_MEM_MMIO_SELECT,
0x00100000, 0);
@@ -163,7 +165,7 @@
dc->dc_iot = &igsfb_iot;
dc->dc_iobase = 0;
dc->dc_ioflags = 0;
-
+ dc->dc_mmap = igsfb_ofbus_mmap;
if (bus_space_map(dc->dc_iot,
dc->dc_iobase + IGS_REG_BASE, IGS_REG_SIZE,
dc->dc_ioflags,
@@ -229,3 +231,28 @@
igsfb_attach_subr(sc, isconsole);
}
+
+static paddr_t
+igsfb_ofbus_mmap(void *v, void *vs, off_t offset, int prot)
+{
+
+#ifdef PCI_MAGIC_IO_RANGE
+ /* access to IO ports */
+ if ((offset >= PCI_MAGIC_IO_RANGE) &&
+ (offset < (PCI_MAGIC_IO_RANGE + 0x10000))) {
+ paddr_t pa;
+
+ pa = isa_io_physaddr + offset - PCI_MAGIC_IO_RANGE;
+ return arm_btop(pa);
+ }
+#endif
+ /*
+ * we also need to allow mapping of the whole aperture, including MMIO
+ * registers on CyberPro at its physical address
+ */
+ if ((offset >= igsfb_mem_paddr) &&
+ (offset < (igsfb_mem_paddr + 0x01000000)))
+ return arm_btop(offset);
+
+ return -1;
+}