On Sun, Aug 13, 2006 at 04:44:53PM +0100, Keir Fraser wrote:
> > The problem I ran into is that only the first 4 MB (see
> > IOREMAP_MBYTES) is usable when using ioremap(). For example, the
> > videocard I am using does memory mapped IO at 0x90380000, thus above
> > this 4MB. Changing IOREMAP_MBYTES just like that isn't possible
> > either, it seems.
>
> There isn't a proper ioremap() any more, because it wasn't being used for
> x86.
FWIW, I'm been using the attached patch for ioremap() support on
x86-64 for a while for the IOMMU work. It should work on x86 as well,
but I haven't tested it.
diff -r 0340e579f065 xen/arch/x86/x86_64/Makefile
--- a/xen/arch/x86/x86_64/Makefile Sat Aug 12 16:18:08 2006 +0100
+++ b/xen/arch/x86/x86_64/Makefile Mon Aug 14 10:00:57 2006 +0300
@@ -1,3 +1,4 @@ obj-y += entry.o
obj-y += entry.o
obj-y += mm.o
+obj-y += ioremap.o
obj-y += traps.o
diff -r 0340e579f065 xen/arch/x86/x86_64/ioremap.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/arch/x86/x86_64/ioremap.c Mon Aug 14 10:01:02 2006 +0300
@@ -0,0 +1,72 @@
+/*
+ * ioremap support for x86-64
+ *
+ * Copyright (C) IBM Corporation, 2006
+ * Based on Linux code (C) Copyright 1995 1996 Linus Torvalds
+ *
+ * Author: Muli Ben-Yehuda <muli@xxxxxxxxxx>
+ */
+
+#include <xen/lib.h>
+#include <asm/config.h>
+#include <asm/io.h>
+
+static unsigned long remap_base = IOREMAP_VIRT_START;
+
+#define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK)
+
+void* ioremap(unsigned long phys_addr, unsigned long size)
+{
+ unsigned long vaddr;
+ unsigned long offset, last_addr;
+ unsigned long mfn, nr_mfns, flags;
+
+ /* Don't allow wraparound or zero size */
+ last_addr = phys_addr + size - 1;
+ if ( (size == 0) || (last_addr < phys_addr) )
+ return NULL;
+
+ /* Don't remap the low PCI/ISA area: it's always mapped. */
+ if ( (phys_addr >= 0xA0000) && (last_addr < 0x100000) )
+ return __va(phys_addr);
+
+ /*
+ * We don't printk before this point - it ends up being called in very
early
+ * boot before printk is safe to use.
+ */
+
+ if ( (remap_base + size) > (IOREMAP_VIRT_END - 1) )
+ {
+ printk("ioremap: going past end of reserved space!\n");
+ return NULL;
+ }
+
+ /* Mappings have to be page-aligned. */
+ offset = phys_addr & ~PAGE_MASK;
+ phys_addr &= PAGE_MASK;
+ size = PAGE_ALIGN(last_addr) - phys_addr;
+
+ /* Ok, go for it. */
+ vaddr = remap_base;
+ remap_base += size;
+
+ mfn = phys_addr >> PAGE_SHIFT;
+ nr_mfns = size >> PAGE_SHIFT;
+ flags = PAGE_HYPERVISOR_NOCACHE;
+
+ map_pages_to_xen(vaddr, mfn, nr_mfns, flags);
+
+ vaddr |= offset;
+
+ return (void *)(vaddr);
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r 0340e579f065 xen/include/asm-x86/io.h
--- a/xen/include/asm-x86/io.h Sat Aug 12 16:18:08 2006 +0100
+++ b/xen/include/asm-x86/io.h Mon Aug 14 10:00:57 2006 +0300
@@ -5,8 +5,14 @@
#include <xen/types.h>
#include <asm/page.h>
-/* We don't need real ioremap() on Xen/x86. */
+#if defined(__i386__)
+/* We don't need real ioremap() on x86-32. */
#define ioremap(x,l) (__va(x))
+#elif defined(__x86_64__)
+extern void* ioremap(unsigned long physaddr, unsigned long size);
+#else
+#error "please provide ioremap for your platform"
+#endif
#define readb(x) (*(volatile char *)(x))
#define readw(x) (*(volatile short *)(x))
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|