Re: [PATCH 2/2] powerpc: Change archdata dma_data to a union

2009-09-20 Thread Benjamin Herrenschmidt
On Wed, 2009-09-02 at 17:23 -0500, Becky Bruce wrote:
 Sometimes this is used to hold a simple offset, and sometimes
 it is used to hold a pointer.  This patch changes it to a union containing
 void * and dma_addr_t.  get/set accessors are also provided, because it was
 getting a bit ugly to get to the actual data.

Looks good, but please respin the two patches with the comment I
suggested added :-)

Cheers,
Ben.

 Signed-off-by: Becky Bruce bec...@kernel.crashing.org
 ---
  arch/powerpc/include/asm/device.h|   11 ++-
  arch/powerpc/include/asm/dma-mapping.h   |   10 --
  arch/powerpc/include/asm/iommu.h |   10 ++
  arch/powerpc/kernel/dma-iommu.c  |   16 
  arch/powerpc/kernel/pci-common.c |2 +-
  arch/powerpc/kernel/vio.c|2 +-
  arch/powerpc/platforms/cell/beat_iommu.c |2 +-
  arch/powerpc/platforms/cell/iommu.c  |9 +++--
  arch/powerpc/platforms/iseries/iommu.c   |2 +-
  arch/powerpc/platforms/pasemi/iommu.c|2 +-
  arch/powerpc/platforms/pseries/iommu.c   |8 
  arch/powerpc/sysdev/dart_iommu.c |2 +-
  12 files changed, 49 insertions(+), 27 deletions(-)
 
 diff --git a/arch/powerpc/include/asm/device.h 
 b/arch/powerpc/include/asm/device.h
 index 67fcd7f..07ca8b5 100644
 --- a/arch/powerpc/include/asm/device.h
 +++ b/arch/powerpc/include/asm/device.h
 @@ -15,7 +15,16 @@ struct dev_archdata {
  
   /* DMA operations on that device */
   struct dma_map_ops  *dma_ops;
 - void*dma_data;
 +
 + /*
 +  * When an iommu is in use, dma_data is used as a ptr to the base of the
 +  * iommu_table.  Otherwise, it is a simple numerical offset.
 +  */
 + union {
 + dma_addr_t  dma_offset;
 + void*iommu_table_base;
 + } dma_data;
 +
  #ifdef CONFIG_SWIOTLB
   dma_addr_t  max_direct_dma_addr;
  #endif
 diff --git a/arch/powerpc/include/asm/dma-mapping.h 
 b/arch/powerpc/include/asm/dma-mapping.h
 index eef4db1..e9f4fe9 100644
 --- a/arch/powerpc/include/asm/dma-mapping.h
 +++ b/arch/powerpc/include/asm/dma-mapping.h
 @@ -89,14 +89,20 @@ static inline void set_dma_ops(struct device *dev, struct 
 dma_map_ops *ops)
   dev-archdata.dma_ops = ops;
  }
  
 -static inline unsigned long get_dma_offset(struct device *dev)
 +static inline dma_addr_t get_dma_offset(struct device *dev)
  {
   if (dev)
 - return (unsigned long)dev-archdata.dma_data;
 + return dev-archdata.dma_data.dma_offset;
  
   return PCI_DRAM_OFFSET;
  }
  
 +static inline void set_dma_offset(struct device *dev, dma_addr_t off)
 +{
 + if (dev)
 + dev-archdata.dma_data.dma_offset = off;
 +}
 +
  /* this will be removed soon */
  #define flush_write_buffers()
  
 diff --git a/arch/powerpc/include/asm/iommu.h 
 b/arch/powerpc/include/asm/iommu.h
 index 7464c0d..edfc980 100644
 --- a/arch/powerpc/include/asm/iommu.h
 +++ b/arch/powerpc/include/asm/iommu.h
 @@ -70,6 +70,16 @@ struct iommu_table {
  
  struct scatterlist;
  
 +static inline void set_iommu_table_base(struct device *dev, void *base)
 +{
 + dev-archdata.dma_data.iommu_table_base = base;
 +}
 +
 +static inline void *get_iommu_table_base(struct device *dev)
 +{
 + return dev-archdata.dma_data.iommu_table_base;
 +}
 +
  /* Frees table for an individual device node */
  extern void iommu_free_table(struct iommu_table *tbl, const char *node_name);
  
 diff --git a/arch/powerpc/kernel/dma-iommu.c b/arch/powerpc/kernel/dma-iommu.c
 index 87ddb3f..37771a5 100644
 --- a/arch/powerpc/kernel/dma-iommu.c
 +++ b/arch/powerpc/kernel/dma-iommu.c
 @@ -18,7 +18,7 @@
  static void *dma_iommu_alloc_coherent(struct device *dev, size_t size,
 dma_addr_t *dma_handle, gfp_t flag)
  {
 - return iommu_alloc_coherent(dev, dev-archdata.dma_data, size,
 + return iommu_alloc_coherent(dev, get_iommu_table_base(dev), size,
   dma_handle, device_to_mask(dev), flag,
   dev_to_node(dev));
  }
 @@ -26,7 +26,7 @@ static void *dma_iommu_alloc_coherent(struct device *dev, 
 size_t size,
  static void dma_iommu_free_coherent(struct device *dev, size_t size,
   void *vaddr, dma_addr_t dma_handle)
  {
 - iommu_free_coherent(dev-archdata.dma_data, size, vaddr, dma_handle);
 + iommu_free_coherent(get_iommu_table_base(dev), size, vaddr, dma_handle);
  }
  
  /* Creates TCEs for a user provided buffer.  The user buffer must be
 @@ -39,8 +39,8 @@ static dma_addr_t dma_iommu_map_page(struct device *dev, 
 struct page *page,
enum dma_data_direction direction,
struct dma_attrs *attrs)
  {
 - return iommu_map_page(dev, dev-archdata.dma_data, page, offset, size,
 -   device_to_mask(dev), 

[PATCH 2/2] powerpc: Change archdata dma_data to a union

2009-09-02 Thread Becky Bruce
Sometimes this is used to hold a simple offset, and sometimes
it is used to hold a pointer.  This patch changes it to a union containing
void * and dma_addr_t.  get/set accessors are also provided, because it was
getting a bit ugly to get to the actual data.

Signed-off-by: Becky Bruce bec...@kernel.crashing.org
---
 arch/powerpc/include/asm/device.h|   11 ++-
 arch/powerpc/include/asm/dma-mapping.h   |   10 --
 arch/powerpc/include/asm/iommu.h |   10 ++
 arch/powerpc/kernel/dma-iommu.c  |   16 
 arch/powerpc/kernel/pci-common.c |2 +-
 arch/powerpc/kernel/vio.c|2 +-
 arch/powerpc/platforms/cell/beat_iommu.c |2 +-
 arch/powerpc/platforms/cell/iommu.c  |9 +++--
 arch/powerpc/platforms/iseries/iommu.c   |2 +-
 arch/powerpc/platforms/pasemi/iommu.c|2 +-
 arch/powerpc/platforms/pseries/iommu.c   |8 
 arch/powerpc/sysdev/dart_iommu.c |2 +-
 12 files changed, 49 insertions(+), 27 deletions(-)

diff --git a/arch/powerpc/include/asm/device.h 
b/arch/powerpc/include/asm/device.h
index 67fcd7f..07ca8b5 100644
--- a/arch/powerpc/include/asm/device.h
+++ b/arch/powerpc/include/asm/device.h
@@ -15,7 +15,16 @@ struct dev_archdata {
 
/* DMA operations on that device */
struct dma_map_ops  *dma_ops;
-   void*dma_data;
+
+   /*
+* When an iommu is in use, dma_data is used as a ptr to the base of the
+* iommu_table.  Otherwise, it is a simple numerical offset.
+*/
+   union {
+   dma_addr_t  dma_offset;
+   void*iommu_table_base;
+   } dma_data;
+
 #ifdef CONFIG_SWIOTLB
dma_addr_t  max_direct_dma_addr;
 #endif
diff --git a/arch/powerpc/include/asm/dma-mapping.h 
b/arch/powerpc/include/asm/dma-mapping.h
index eef4db1..e9f4fe9 100644
--- a/arch/powerpc/include/asm/dma-mapping.h
+++ b/arch/powerpc/include/asm/dma-mapping.h
@@ -89,14 +89,20 @@ static inline void set_dma_ops(struct device *dev, struct 
dma_map_ops *ops)
dev-archdata.dma_ops = ops;
 }
 
-static inline unsigned long get_dma_offset(struct device *dev)
+static inline dma_addr_t get_dma_offset(struct device *dev)
 {
if (dev)
-   return (unsigned long)dev-archdata.dma_data;
+   return dev-archdata.dma_data.dma_offset;
 
return PCI_DRAM_OFFSET;
 }
 
+static inline void set_dma_offset(struct device *dev, dma_addr_t off)
+{
+   if (dev)
+   dev-archdata.dma_data.dma_offset = off;
+}
+
 /* this will be removed soon */
 #define flush_write_buffers()
 
diff --git a/arch/powerpc/include/asm/iommu.h b/arch/powerpc/include/asm/iommu.h
index 7464c0d..edfc980 100644
--- a/arch/powerpc/include/asm/iommu.h
+++ b/arch/powerpc/include/asm/iommu.h
@@ -70,6 +70,16 @@ struct iommu_table {
 
 struct scatterlist;
 
+static inline void set_iommu_table_base(struct device *dev, void *base)
+{
+   dev-archdata.dma_data.iommu_table_base = base;
+}
+
+static inline void *get_iommu_table_base(struct device *dev)
+{
+   return dev-archdata.dma_data.iommu_table_base;
+}
+
 /* Frees table for an individual device node */
 extern void iommu_free_table(struct iommu_table *tbl, const char *node_name);
 
diff --git a/arch/powerpc/kernel/dma-iommu.c b/arch/powerpc/kernel/dma-iommu.c
index 87ddb3f..37771a5 100644
--- a/arch/powerpc/kernel/dma-iommu.c
+++ b/arch/powerpc/kernel/dma-iommu.c
@@ -18,7 +18,7 @@
 static void *dma_iommu_alloc_coherent(struct device *dev, size_t size,
  dma_addr_t *dma_handle, gfp_t flag)
 {
-   return iommu_alloc_coherent(dev, dev-archdata.dma_data, size,
+   return iommu_alloc_coherent(dev, get_iommu_table_base(dev), size,
dma_handle, device_to_mask(dev), flag,
dev_to_node(dev));
 }
@@ -26,7 +26,7 @@ static void *dma_iommu_alloc_coherent(struct device *dev, 
size_t size,
 static void dma_iommu_free_coherent(struct device *dev, size_t size,
void *vaddr, dma_addr_t dma_handle)
 {
-   iommu_free_coherent(dev-archdata.dma_data, size, vaddr, dma_handle);
+   iommu_free_coherent(get_iommu_table_base(dev), size, vaddr, dma_handle);
 }
 
 /* Creates TCEs for a user provided buffer.  The user buffer must be
@@ -39,8 +39,8 @@ static dma_addr_t dma_iommu_map_page(struct device *dev, 
struct page *page,
 enum dma_data_direction direction,
 struct dma_attrs *attrs)
 {
-   return iommu_map_page(dev, dev-archdata.dma_data, page, offset, size,
- device_to_mask(dev), direction, attrs);
+   return iommu_map_page(dev, get_iommu_table_base(dev), page, offset,
+ size, device_to_mask(dev), direction, attrs);
 }
 
 
@@ -48,7 +48,7 @@ static void