[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] Getting a console on the Intel mac / ioremap



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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.