Re: [PATCH 26/27] agp: use more dma-ops-like operations for agpmemory

From: Dave Airlie
Date: Mon Mar 30 2009 - 17:13:43 EST


> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
>
> When using AGP under Xen, we need to be careful to
> 1) properly translate between physical and machine addresses, and
> 2) make sure memory is physically contigious when the hardware expects it
>
> This change uses swiotlb_phys_to_bus/bus_to_phys to do the phys<->gart
> conversion, since they already do the right thing, and dma_alloc_coherent
> for gatt allocations. This should work equally well running native.
>
> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
> Cc: David Airlie <airlied@xxxxxxxx>

Acked-by: David Airlie <airlied@xxxxxxxx>

> ---
> arch/x86/include/asm/agp.h | 15 ++++++++++-----
> lib/swiotlb.c | 2 ++
> 2 files changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/arch/x86/include/asm/agp.h b/arch/x86/include/asm/agp.h
> index 9825cd6..7ba2639 100644
> --- a/arch/x86/include/asm/agp.h
> +++ b/arch/x86/include/asm/agp.h
> @@ -1,8 +1,11 @@
> #ifndef _ASM_X86_AGP_H
> #define _ASM_X86_AGP_H
>
> +#include <linux/swiotlb.h>
> +
> #include <asm/pgtable.h>
> #include <asm/cacheflush.h>
> +#include <asm/dma-mapping.h>
>
> /*
> * Functions to keep the agpgart mappings coherent with the MMU. The
> @@ -23,13 +26,15 @@
> #define flush_agp_cache() wbinvd()
>
> /* Convert a physical address to an address suitable for the GART. */
> -#define phys_to_gart(x) (x)
> -#define gart_to_phys(x) (x)
> +#define phys_to_gart(x) swiotlb_phys_to_bus(NULL, (x))
> +#define gart_to_phys(x) swiotlb_bus_to_phys(x)
>
> /* GATT allocation. Returns/accepts GATT kernel virtual address. */
> -#define alloc_gatt_pages(order) \
> - ((char *)__get_free_pages(GFP_KERNEL, (order)))
> +#define alloc_gatt_pages(order) ({ \
> + char *_t; dma_addr_t _d; \
> + _t = dma_alloc_coherent(NULL,PAGE_SIZE<<(order),&_d,GFP_KERNEL); \
> + _t; })
> #define free_gatt_pages(table, order) \
> - free_pages((unsigned long)(table), (order))
> + dma_free_coherent(NULL,PAGE_SIZE<<(order),(table),virt_to_bus(table))
>
> #endif /* _ASM_X86_AGP_H */
> diff --git a/lib/swiotlb.c b/lib/swiotlb.c
> index 8e6f6c8..98fb7d3 100644
> --- a/lib/swiotlb.c
> +++ b/lib/swiotlb.c
> @@ -128,11 +128,13 @@ dma_addr_t __weak swiotlb_phys_to_bus(struct device *hwdev, phys_addr_t paddr)
> {
> return paddr;
> }
> +EXPORT_SYMBOL_GPL(swiotlb_phys_to_bus);
>
> phys_addr_t __weak swiotlb_bus_to_phys(dma_addr_t baddr)
> {
> return baddr;
> }
> +EXPORT_SYMBOL_GPL(swiotlb_bus_to_phys);
>
> static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev,
> volatile void *address)
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/