Siddha, Suresh B
2005-Aug-18 18:23 UTC
[Xen-devel] [Patch] use dev DMA masks in dma_alloc_coherent
64bit devices (whose dma_mask and coherent_dma_mask are set to 64bits) can use MEMZONE_DOM while creating contiguous_region for coherent mappings. Please apply the appended patch. Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> diff -r 84ee014ebd41 linux-2.6-xen-sparse/arch/xen/i386/kernel/pci-dma.c --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/pci-dma.c Wed Aug 17 20:34:38 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/pci-dma.c Thu Aug 18 11:06:42 2005 @@ -129,6 +129,7 @@ struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; unsigned int order = get_order(size); unsigned long vstart; + unsigned long dma_mask = 0; /* ignore region specifiers */ gfp &= ~(__GFP_DMA | __GFP_HIGHMEM); @@ -145,13 +146,18 @@ return NULL; } - if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff)) - gfp |= GFP_DMA; + if (!dev) + dma_mask = 0xffffffff; + else + /* Kludge to make it bug-to-bug compatible with i386. i386 + uses the normal dma_mask for alloc_coherent. */ + dma_mask = dev->coherent_dma_mask & *dev->dma_mask; vstart = __get_free_pages(gfp, order); ret = (void *)vstart; if (ret != NULL) { + order |= (dma_mask <= 0xffffffff) ? (32 << 8) : 0; xen_create_contiguous_region(vstart, order); memset(ret, 0, size); diff -r 84ee014ebd41 linux-2.6-xen-sparse/arch/xen/i386/kernel/swiotlb.c --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/swiotlb.c Wed Aug 17 20:34:38 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/swiotlb.c Thu Aug 18 11:06:42 2005 @@ -131,7 +131,7 @@ xen_create_contiguous_region( (unsigned long)io_tlb_start, - get_order(io_tlb_nslabs * (1 << IO_TLB_SHIFT))); + get_order(io_tlb_nslabs * (1 << IO_TLB_SHIFT)) | (32 << 8)); io_tlb_end = io_tlb_start + io_tlb_nslabs * (1 << IO_TLB_SHIFT); diff -r 84ee014ebd41 linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c Wed Aug 17 20:34:38 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c Thu Aug 18 11:06:42 2005 @@ -294,7 +294,7 @@ /* 2. Get a new contiguous memory extent. */ BUG_ON(HYPERVISOR_dom_mem_op( - MEMOP_increase_reservation, &mfn, 1, order | (32<<8)) != 1); + MEMOP_increase_reservation, &mfn, 1, order) != 1); /* 3. Map the new extent in place of old pages. */ for (i = 0; i < (1<<order); i++) { diff -r 84ee014ebd41 linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c Wed Aug 17 20:34:38 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c Thu Aug 18 11:06:42 2005 @@ -277,7 +277,7 @@ #ifdef CONFIG_X86_PAE /* this gives us a page below 4GB */ - xen_create_contiguous_region((unsigned long)pgd, 0); + xen_create_contiguous_region((unsigned long)pgd, 0 | (32 << 8)); #endif if (!HAVE_SHARED_KERNEL_PMD) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel