WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: Keir Fraser <Keir.Fraser@xxxxxxxxxxxx>
Subject: Re: [Xen-devel] Getting a console on the Intel mac / ioremap
From: Muli Ben-Yehuda <muli@xxxxxxxxxx>
Date: Mon, 14 Aug 2006 10:02:33 +0300
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx, Marco Gerards <mgerards@xxxxxxxxx>
Delivery-date: Mon, 14 Aug 2006 00:03:00 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <C1050785.611%Keir.Fraser@xxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <87u04gzlgo.fsf@xxxxxxxxx> <C1050785.611%Keir.Fraser@xxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.5.11
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