[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Define new io_remap_pfn_range() for mapping device space into user
ChangeSet 1.1791, 2005/03/15 18:15:48+00:00, kaf24@xxxxxxxxxxxxxxxxxxxx Define new io_remap_pfn_range() for mapping device space into user applications. Patch drivers to use this instead of remap_pfn_range() where appropriate. This patch should be pushed upstream to the kernel maintainers. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h | 5 patches/linux-2.6.11/iomap.patch | 99 +++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) diff -Nru a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h --- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h 2005-03-16 04:02:23 -05:00 +++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h 2005-03-16 04:02:26 -05:00 @@ -485,7 +485,10 @@ mmu_update_t *v); #define io_remap_page_range(vma,from,phys,size,prot) \ - direct_remap_area_pages(vma->vm_mm,from,phys,size,prot,DOMID_IO) +direct_remap_area_pages(vma->vm_mm,from,phys,size,prot,DOMID_IO) + +#define io_remap_pfn_range(vma,from,pfn,size,prot) \ +direct_remap_area_pages(vma->vm_mm,from,pfn<<PAGE_SHIFT,size,prot,DOMID_IO) #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY diff -Nru a/patches/linux-2.6.11/iomap.patch b/patches/linux-2.6.11/iomap.patch --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/patches/linux-2.6.11/iomap.patch 2005-03-16 04:02:26 -05:00 @@ -0,0 +1,120 @@ +diff -ur linux-2.6.11/drivers/char/agp/frontend.c linux-2.6.11-io/drivers/char/agp/frontend.c +--- linux-2.6.11/drivers/char/agp/frontend.c 2005-03-02 07:37:49.000000000 +0000 ++++ linux-2.6.11-io/drivers/char/agp/frontend.c 2005-03-15 17:38:30.000000000 +0000 +@@ -627,7 +627,7 @@ + DBG("client vm_ops=%p", kerninfo.vm_ops); + if (kerninfo.vm_ops) { + vma->vm_ops = kerninfo.vm_ops; +- } else if (remap_pfn_range(vma, vma->vm_start, ++ } else if (io_remap_pfn_range(vma, vma->vm_start, + (kerninfo.aper_base + offset) >> PAGE_SHIFT, + size, vma->vm_page_prot)) { + goto out_again; +@@ -643,7 +643,7 @@ + DBG("controller vm_ops=%p", kerninfo.vm_ops); + if (kerninfo.vm_ops) { + vma->vm_ops = kerninfo.vm_ops; +- } else if (remap_pfn_range(vma, vma->vm_start, ++ } else if (io_remap_pfn_range(vma, vma->vm_start, + kerninfo.aper_base >> PAGE_SHIFT, + size, vma->vm_page_prot)) { + goto out_again; +diff -ur linux-2.6.11/drivers/char/drm/drm_vm.c linux-2.6.11-io/drivers/char/drm/drm_vm.c +--- linux-2.6.11/drivers/char/drm/drm_vm.c 2005-03-02 07:38:33.000000000 +0000 ++++ linux-2.6.11-io/drivers/char/drm/drm_vm.c 2005-03-15 17:43:26.000000000 +0000 +@@ -630,7 +630,7 @@ + vma->vm_end - vma->vm_start, + vma->vm_page_prot, 0)) + #else +- if (remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start, ++ if (io_remap_pfn_range(vma, vma->vm_start, + (VM_OFFSET(vma) + offset) >> PAGE_SHIFT, + vma->vm_end - vma->vm_start, + vma->vm_page_prot)) +diff -ur linux-2.6.11/drivers/char/drm/i810_dma.c linux-2.6.11-io/drivers/char/drm/i810_dma.c +--- linux-2.6.11/drivers/char/drm/i810_dma.c 2005-03-02 07:37:55.000000000 +0000 ++++ linux-2.6.11-io/drivers/char/drm/i810_dma.c 2005-03-15 17:53:36.000000000 +0000 +@@ -139,7 +139,7 @@ + buf_priv->currently_mapped = I810_BUF_MAPPED; + unlock_kernel(); + +- if (remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start, ++ if (io_remap_pfn_range(vma, vma->vm_start, + VM_OFFSET(vma) >> PAGE_SHIFT, + vma->vm_end - vma->vm_start, + vma->vm_page_prot)) return -EAGAIN; +diff -ur linux-2.6.11/drivers/char/drm/i830_dma.c linux-2.6.11-io/drivers/char/drm/i830_dma.c +--- linux-2.6.11/drivers/char/drm/i830_dma.c 2005-03-02 07:37:48.000000000 +0000 ++++ linux-2.6.11-io/drivers/char/drm/i830_dma.c 2005-03-15 17:53:46.000000000 +0000 +@@ -157,7 +157,7 @@ + buf_priv->currently_mapped = I830_BUF_MAPPED; + unlock_kernel(); + +- if (remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start, ++ if (io_remap_pfn_range(vma, vma->vm_start, + VM_OFFSET(vma) >> PAGE_SHIFT, + vma->vm_end - vma->vm_start, + vma->vm_page_prot)) return -EAGAIN; +diff -ur linux-2.6.11/drivers/char/hpet.c linux-2.6.11-io/drivers/char/hpet.c +--- linux-2.6.11/drivers/char/hpet.c 2005-03-02 07:38:10.000000000 +0000 ++++ linux-2.6.11-io/drivers/char/hpet.c 2005-03-15 17:37:22.000000000 +0000 +@@ -76,6 +76,7 @@ + struct hpets { + struct hpets *hp_next; + struct hpet __iomem *hp_hpet; ++ unsigned long hp_hpet_phys; + struct time_interpolator *hp_interpolator; + unsigned long hp_period; + unsigned long hp_delta; +@@ -265,7 +266,7 @@ + return -EINVAL; + + devp = file->private_data; +- addr = (unsigned long)devp->hd_hpet; ++ addr = devp->hd_hpets->hp_hpet_phys; + + if (addr & (PAGE_SIZE - 1)) + return -ENOSYS; +@@ -274,7 +275,7 @@ + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + addr = __pa(addr); + +- if (remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT, ++ if (io_remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT, + PAGE_SIZE, vma->vm_page_prot)) { + printk(KERN_ERR "remap_pfn_range failed in hpet.c\n"); + return -EAGAIN; +@@ -795,6 +796,7 @@ + + hpetp->hp_which = hpet_nhpet++; + hpetp->hp_hpet = hdp->hd_address; ++ hpetp->hp_hpet_phys = hdp->hd_phys_address; + + hpetp->hp_ntimer = hdp->hd_nirqs; + +diff -ur linux-2.6.11/drivers/sbus/char/flash.c linux-2.6.11-io/drivers/sbus/char/flash.c +--- linux-2.6.11/drivers/sbus/char/flash.c 2005-03-02 07:38:10.000000000 +0000 ++++ linux-2.6.11-io/drivers/sbus/char/flash.c 2005-03-15 17:20:22.000000000 +0000 +@@ -75,7 +75,7 @@ + pgprot_val(vma->vm_page_prot) |= _PAGE_E; + vma->vm_flags |= (VM_SHM | VM_LOCKED); + +- if (remap_pfn_range(vma, vma->vm_start, addr, size, vma->vm_page_prot)) ++ if (io_remap_pfn_range(vma, vma->vm_start, addr, size, vma->vm_page_prot)) + return -EAGAIN; + + return 0; +diff -ur linux-2.6.11/include/linux/mm.h linux-2.6.11-io/include/linux/mm.h +--- linux-2.6.11/include/linux/mm.h 2005-03-02 07:37:47.000000000 +0000 ++++ linux-2.6.11-io/include/linux/mm.h 2005-03-15 17:03:46.000000000 +0000 +@@ -815,6 +815,10 @@ + extern int check_user_page_readable(struct mm_struct *mm, unsigned long address); + int remap_pfn_range(struct vm_area_struct *, unsigned long, + unsigned long, unsigned long, pgprot_t); ++/* Allow arch override for mapping of device and I/O (non-RAM) pages. */ ++#ifndef io_remap_pfn_range ++#define io_remap_pfn_range remap_pfn_range ++#endif + + #ifdef CONFIG_PROC_FS + void __vm_stat_account(struct mm_struct *, unsigned long, struct file *, long); ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxxx https://lists.sourceforge.net/lists/listinfo/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |