[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |