lkml.org 
[lkml]   [2008]   [May]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 2/2] x86: per-device dma_mapping_ops support
On Mon, May 12, 2008 at 11:04 PM, FUJITA Tomonori
<fujita.tomonori@lab.ntt.co.jp> wrote:
> This adds per-device dma_mapping_ops support for CONFIG_X86_64.
>
> A pointer to dma_mapping_ops to struct dev_archdata is added. If the
> pointer is non NULL, DMA operations in asm/dma-mapping.h use it. If
> it's NULL, the system-wide dma_ops pointer is used as before.
>
> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
> ---
> arch/x86/kernel/pci-calgary_64.c | 2 +-
> arch/x86/kernel/pci-dma.c | 2 +-
> arch/x86/kernel/pci-gart_64.c | 2 +-
> arch/x86/kernel/pci-nommu.c | 14 +-----
> arch/x86/kernel/pci-swiotlb_64.c | 2 +-
> include/asm-x86/device.h | 3 +
> include/asm-x86/dma-mapping.h | 95 ++++++++++++++++++++++++++------------
> 7 files changed, 74 insertions(+), 46 deletions(-)
>
> diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c
> index e28ec49..dca9a82 100644
> --- a/arch/x86/kernel/pci-calgary_64.c
> +++ b/arch/x86/kernel/pci-calgary_64.c
> @@ -541,7 +541,7 @@ error:
> return ret;
> }
>
> -static const struct dma_mapping_ops calgary_dma_ops = {
> +static struct dma_mapping_ops calgary_dma_ops = {
> .alloc_coherent = calgary_alloc_coherent,
> .map_single = calgary_map_single,
> .unmap_single = calgary_unmap_single,
> diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c
> index 0c37f16..33ded93 100644
> --- a/arch/x86/kernel/pci-dma.c
> +++ b/arch/x86/kernel/pci-dma.c
> @@ -11,7 +11,7 @@
> int forbid_dac __read_mostly;
> EXPORT_SYMBOL(forbid_dac);
>
> -const struct dma_mapping_ops *dma_ops;
> +struct dma_mapping_ops *dma_ops;
> EXPORT_SYMBOL(dma_ops);
>
> static int iommu_sac_force __read_mostly;
> diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c
> index e1a6954..8469f76 100644
> --- a/arch/x86/kernel/pci-gart_64.c
> +++ b/arch/x86/kernel/pci-gart_64.c
> @@ -621,7 +621,7 @@ static __init int init_k8_gatt(struct agp_kern_info *info)
>
> extern int agp_amd64_init(void);
>
> -static const struct dma_mapping_ops gart_dma_ops = {
> +static struct dma_mapping_ops gart_dma_ops = {
> .map_single = gart_map_single,
> .map_simple = gart_map_simple,
> .unmap_single = gart_unmap_single,
> diff --git a/arch/x86/kernel/pci-nommu.c b/arch/x86/kernel/pci-nommu.c
> index 05d70b8..67cc5ee 100644
> --- a/arch/x86/kernel/pci-nommu.c
> +++ b/arch/x86/kernel/pci-nommu.c
> @@ -72,21 +72,9 @@ static int nommu_map_sg(struct device *hwdev, struct scatterlist *sg,
> return nents;
> }
>
> -/* Make sure we keep the same behaviour */
> -static int nommu_mapping_error(struct device *hwdev, dma_addr_t dma_addr)
> -{
> -#ifdef CONFIG_X86_32
> - return 0;
> -#else
> - return (dma_addr == bad_dma_address);
> -#endif
> -}
> -
> -
> -const struct dma_mapping_ops nommu_dma_ops = {
> +struct dma_mapping_ops nommu_dma_ops = {
> .map_single = nommu_map_single,
> .map_sg = nommu_map_sg,
> - .mapping_error = nommu_mapping_error,
> .is_phys = 1,
> };
>
> diff --git a/arch/x86/kernel/pci-swiotlb_64.c b/arch/x86/kernel/pci-swiotlb_64.c
> index 490da7f..a464016 100644
> --- a/arch/x86/kernel/pci-swiotlb_64.c
> +++ b/arch/x86/kernel/pci-swiotlb_64.c
> @@ -18,7 +18,7 @@ swiotlb_map_single_phys(struct device *hwdev, phys_addr_t paddr, size_t size,
> return swiotlb_map_single(hwdev, phys_to_virt(paddr), size, direction);
> }
>
> -const struct dma_mapping_ops swiotlb_dma_ops = {
> +struct dma_mapping_ops swiotlb_dma_ops = {
> .mapping_error = swiotlb_dma_mapping_error,
> .alloc_coherent = swiotlb_alloc_coherent,
> .free_coherent = swiotlb_free_coherent,
> diff --git a/include/asm-x86/device.h b/include/asm-x86/device.h
> index 87a7153..3c034f4 100644
> --- a/include/asm-x86/device.h
> +++ b/include/asm-x86/device.h
> @@ -5,6 +5,9 @@ struct dev_archdata {
> #ifdef CONFIG_ACPI
> void *acpi_handle;
> #endif
> +#ifdef CONFIG_X86_64
> +struct dma_mapping_ops *dma_ops;
> +#endif
> #ifdef CONFIG_DMAR
> void *iommu; /* hook for IOMMU specific extension */
> #endif

do you have other patch to assign value to dma_ops for every device?
it is always NULL at this time.

YH


\
 
 \ /
  Last update: 2008-05-15 22:49    [W:2.898 / U:0.052 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site