Re: [PATCH] mips: Add dma_mmap_coherent()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Takashi et al.,

[snip]

> diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c
> index b30e38f..dd2ab2c 100644
> --- a/drivers/parisc/ccio-dma.c
> +++ b/drivers/parisc/ccio-dma.c
> @@ -1014,6 +1014,19 @@ ccio_unmap_sg(struct device *dev, struct scatterlist
*sglist, int nents,
>  	DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents);
>  }
>
> +static int ccio_dma_mmap_coherent(struct device *dev,
> +				  struct vm_area_struct *vma,
> +				  void *cpu_addr, dma_addr_t handle,
> +				  size_t size)
> +{
> +	struct page *pg;
> +	pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
> +	pg = virt_to_page(cpu_addr);
> +	return remap_pfn_range(vma, vma->vm_start,
> +			       page_to_pfn(pg) + vma->vm_pgoff,
> +			       size, vma->vm_page_prot);
> +}
> +
>  static struct hppa_dma_ops ccio_ops = {
>  	.dma_supported =	ccio_dma_supported,
>  	.alloc_consistent =	ccio_alloc_consistent,
> @@ -1027,6 +1040,7 @@ static struct hppa_dma_ops ccio_ops = {
>  	.dma_sync_single_for_device =	NULL,	/* NOP for U2/Uturn */
>  	.dma_sync_sg_for_cpu =		NULL,	/* ditto */
>  	.dma_sync_sg_for_device =		NULL,	/* ditto */
> +	.mmap_coherent =	ccio_dma_mmap_coherent,
>  };
>
>  #ifdef CONFIG_PROC_FS
> diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c
> index bc73b96..403d66d 100644
> --- a/drivers/parisc/sba_iommu.c
> +++ b/drivers/parisc/sba_iommu.c
> @@ -1057,6 +1057,19 @@ sba_unmap_sg(struct device *dev, struct scatterlist
*sglist, int nents,
>
>  }
>
> +static int sba_dma_mmap_coherent(struct device *dev,
> +				 struct vm_area_struct *vma,
> +				 void *cpu_addr, dma_addr_t handle,
> +				 size_t size)
> +{
> +	struct page *pg;
> +	pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
> +	pg = virt_to_page(cpu_addr);
> +	return remap_pfn_range(vma, vma->vm_start,
> +			       page_to_pfn(pg) + vma->vm_pgoff,
> +			       size, vma->vm_page_prot);
> +}
> +
>  static struct hppa_dma_ops sba_ops = {
>  	.dma_supported =	sba_dma_supported,
>  	.alloc_consistent =	sba_alloc_consistent,
> @@ -1070,6 +1083,7 @@ static struct hppa_dma_ops sba_ops = {
>  	.dma_sync_single_for_device =	NULL,
>  	.dma_sync_sg_for_cpu =		NULL,
>  	.dma_sync_sg_for_device =	NULL,
> +	.mmap_coherent =	sba_dma_mmap_coherent,
>  };
>
I build and boot successfully kernel 32bit including your patch on 2 systems
(a b2k using sba and a d380 using ccio).

I just noticed that the above code is ~ the same; otoh there is also a
iommu-helpers.h containing also common code to those 2 drivers. So may be for
easiest maintenance, could you merge and move this code in this 'helper' as
follow:
--- ./drivers/parisc/iommu-helpers.h.Orig	2008-08-01 12:57:22.000000000 +0000
+++ ./drivers/parisc/iommu-helpers.h	2008-08-22 08:07:26.000000000 +0000
@@ -172,3 +172,16 @@
 	return n_mappings;
 }

+static int iommu_dma_mmap_coherent(struct device *dev,
+				  struct vm_area_struct *vma,
+				  void *cpu_addr, dma_addr_t handle,
+				  size_t size)
+{
+	struct page *pg;
+	pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
+	pg = virt_to_page(cpu_addr);
+	return remap_pfn_range(vma, vma->vm_start,
+			       page_to_pfn(pg) + vma->vm_pgoff,
+			       size, vma->vm_page_prot);
+}
+
--- ./drivers/parisc/ccio-dma.c.Orig	2008-08-22 07:49:21.000000000 +0000
+++ ./drivers/parisc/ccio-dma.c	2008-08-22 08:06:32.000000000 +0000
@@ -1005,19 +1005,6 @@
 	DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents);
 }

-static int ccio_dma_mmap_coherent(struct device *dev,
-				  struct vm_area_struct *vma,
-				  void *cpu_addr, dma_addr_t handle,
-				  size_t size)
-{
-	struct page *pg;
-	pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
-	pg = virt_to_page(cpu_addr);
-	return remap_pfn_range(vma, vma->vm_start,
-			       page_to_pfn(pg) + vma->vm_pgoff,
-			       size, vma->vm_page_prot);
-}
-
 static struct hppa_dma_ops ccio_ops = {
 	.dma_supported =	ccio_dma_supported,
 	.alloc_consistent =	ccio_alloc_consistent,
@@ -1031,7 +1018,7 @@
 	.dma_sync_single_for_device =	NULL,	/* NOP for U2/Uturn */
 	.dma_sync_sg_for_cpu =		NULL,	/* ditto */
 	.dma_sync_sg_for_device =		NULL,	/* ditto */
-	.mmap_coherent =	ccio_dma_mmap_coherent,
+	.mmap_coherent =	iommu_dma_mmap_coherent,
 };

 #ifdef CONFIG_PROC_FS
--- ./drivers/parisc/sba_iommu.c.Orig	2008-08-22 07:49:21.000000000 +0000
+++ ./drivers/parisc/sba_iommu.c	2008-08-22 08:08:30.000000000 +0000
@@ -1057,19 +1057,6 @@

 }

-static int sba_dma_mmap_coherent(struct device *dev,
-				 struct vm_area_struct *vma,
-				 void *cpu_addr, dma_addr_t handle,
-				 size_t size)
-{
-	struct page *pg;
-	pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
-	pg = virt_to_page(cpu_addr);
-	return remap_pfn_range(vma, vma->vm_start,
-			       page_to_pfn(pg) + vma->vm_pgoff,
-			       size, vma->vm_page_prot);
-}
-
 static struct hppa_dma_ops sba_ops = {
 	.dma_supported =	sba_dma_supported,
 	.alloc_consistent =	sba_alloc_consistent,
@@ -1083,7 +1070,7 @@
 	.dma_sync_single_for_device =	NULL,
 	.dma_sync_sg_for_cpu =		NULL,
 	.dma_sync_sg_for_device =	NULL,
-	.mmap_coherent =	sba_dma_mmap_coherent,
+	.mmap_coherent =	iommu_dma_mmap_coherent,
 };


=== <> ===
>
> diff --git a/include/asm-parisc/dma-mapping.h b/include/asm-parisc/dma-mapping.h
> index 53af696..5b357b3 100644
> --- a/include/asm-parisc/dma-mapping.h
> +++ b/include/asm-parisc/dma-mapping.h

The small issue encountered: against latest Kyle git tree (dated 2008-07-29)
this file was moved in arch/parisc/include/asm.

> @@ -19,6 +19,9 @@ struct hppa_dma_ops {
>  	void (*dma_sync_single_for_device)(struct device *dev, dma_addr_t iova,
unsigned long offset, size_t size, enum dma_data_direction direction);
>  	void (*dma_sync_sg_for_cpu)(struct device *dev, struct scatterlist *sg,
int nelems, enum dma_data_direction direction);
>  	void (*dma_sync_sg_for_device)(struct device *dev, struct scatterlist *sg,
int nelems, enum dma_data_direction direction);
> +	int (*mmap_coherent)(struct device *dev, struct vm_area_struct *vma,
> +			     void *cpu_addr, dma_addr_t handle, size_t size);
> +
>  };
>
>  /*
> @@ -204,6 +207,15 @@ dma_cache_sync(struct device *dev, void *vaddr, size_t
size,
>  		flush_kernel_dcache_range((unsigned long)vaddr, size);
>  }
>
> +static inline int
> +dma_mmap_coherent(struct device *dev, struct vm_area_struct *vma,
> +		  void *cpu_addr, dma_addr_t handle, size_t size)
> +{
> +	if (!hppa_dma_ops->mmap_coherent)
> +		return -ENXIO;
> +	return hppa_dma_ops->mmap_coherent(dev, vma, cpu_addr, handle, size);
> +}
> +
>  static inline void *
>  parisc_walk_tree(struct device *dev)
>  {

Tx,
    J.

--- ./drivers/parisc/iommu-helpers.h.Orig	2008-08-01 12:57:22.000000000 +0000
+++ ./drivers/parisc/iommu-helpers.h	2008-08-22 08:07:26.000000000 +0000
@@ -172,3 +172,16 @@
 	return n_mappings;
 }
 
+static int iommu_dma_mmap_coherent(struct device *dev,
+				  struct vm_area_struct *vma,
+				  void *cpu_addr, dma_addr_t handle,
+				  size_t size)
+{
+	struct page *pg;
+	pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
+	pg = virt_to_page(cpu_addr);
+	return remap_pfn_range(vma, vma->vm_start,
+			       page_to_pfn(pg) + vma->vm_pgoff,
+			       size, vma->vm_page_prot);
+}
+
--- ./drivers/parisc/ccio-dma.c.Orig	2008-08-22 07:49:21.000000000 +0000
+++ ./drivers/parisc/ccio-dma.c	2008-08-22 08:06:32.000000000 +0000
@@ -1005,19 +1005,6 @@
 	DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents);
 }
 
-static int ccio_dma_mmap_coherent(struct device *dev,
-				  struct vm_area_struct *vma,
-				  void *cpu_addr, dma_addr_t handle,
-				  size_t size)
-{
-	struct page *pg;
-	pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
-	pg = virt_to_page(cpu_addr);
-	return remap_pfn_range(vma, vma->vm_start,
-			       page_to_pfn(pg) + vma->vm_pgoff,
-			       size, vma->vm_page_prot);
-}
-
 static struct hppa_dma_ops ccio_ops = {
 	.dma_supported =	ccio_dma_supported,
 	.alloc_consistent =	ccio_alloc_consistent,
@@ -1031,7 +1018,7 @@
 	.dma_sync_single_for_device =	NULL,	/* NOP for U2/Uturn */
 	.dma_sync_sg_for_cpu =		NULL,	/* ditto */
 	.dma_sync_sg_for_device =		NULL,	/* ditto */
-	.mmap_coherent =	ccio_dma_mmap_coherent,
+	.mmap_coherent =	iommu_dma_mmap_coherent,
 };
 
 #ifdef CONFIG_PROC_FS
--- ./drivers/parisc/sba_iommu.c.Orig	2008-08-22 07:49:21.000000000 +0000
+++ ./drivers/parisc/sba_iommu.c	2008-08-22 08:08:30.000000000 +0000
@@ -1057,19 +1057,6 @@
 
 }
 
-static int sba_dma_mmap_coherent(struct device *dev,
-				 struct vm_area_struct *vma,
-				 void *cpu_addr, dma_addr_t handle,
-				 size_t size)
-{
-	struct page *pg;
-	pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
-	pg = virt_to_page(cpu_addr);
-	return remap_pfn_range(vma, vma->vm_start,
-			       page_to_pfn(pg) + vma->vm_pgoff,
-			       size, vma->vm_page_prot);
-}
-
 static struct hppa_dma_ops sba_ops = {
 	.dma_supported =	sba_dma_supported,
 	.alloc_consistent =	sba_alloc_consistent,
@@ -1083,7 +1070,7 @@
 	.dma_sync_single_for_device =	NULL,
 	.dma_sync_sg_for_cpu =		NULL,
 	.dma_sync_sg_for_device =	NULL,
-	.mmap_coherent =	sba_dma_mmap_coherent,
+	.mmap_coherent =	iommu_dma_mmap_coherent,
 };
 
 

[Index of Archives]     [Linux SoC]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux