[PATCH 16/31] s390: handle page-less SG entries

2015-08-12 Thread Christoph Hellwig
Use sg_phys() instead of page_to_phys(sg_page(sg)) so that we don't
require a page structure for all DMA memory.

Signed-off-by: Christoph Hellwig h...@lst.de
---
 arch/s390/pci/pci_dma.c | 20 ++--
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c
index 6fd8d58..aae5a47 100644
--- a/arch/s390/pci/pci_dma.c
+++ b/arch/s390/pci/pci_dma.c
@@ -272,14 +272,13 @@ int dma_set_mask(struct device *dev, u64 mask)
 }
 EXPORT_SYMBOL_GPL(dma_set_mask);
 
-static dma_addr_t s390_dma_map_pages(struct device *dev, struct page *page,
-unsigned long offset, size_t size,
+static dma_addr_t s390_dma_map_phys(struct device *dev, unsigned long pa,
+size_t size,
 enum dma_data_direction direction,
 struct dma_attrs *attrs)
 {
struct zpci_dev *zdev = get_zdev(to_pci_dev(dev));
unsigned long nr_pages, iommu_page_index;
-   unsigned long pa = page_to_phys(page) + offset;
int flags = ZPCI_PTE_VALID;
dma_addr_t dma_addr;
 
@@ -301,7 +300,7 @@ static dma_addr_t s390_dma_map_pages(struct device *dev, 
struct page *page,
 
if (!dma_update_trans(zdev, pa, dma_addr, size, flags)) {
atomic64_add(nr_pages, zdev-mapped_pages);
-   return dma_addr + (offset  ~PAGE_MASK);
+   return dma_addr + (pa  ~PAGE_MASK);
}
 
 out_free:
@@ -312,6 +311,16 @@ out_err:
return DMA_ERROR_CODE;
 }
 
+static dma_addr_t s390_dma_map_pages(struct device *dev, struct page *page,
+unsigned long offset, size_t size,
+enum dma_data_direction direction,
+struct dma_attrs *attrs)
+{
+   unsigned long pa = page_to_phys(page) + offset;
+
+   return s390_dma_map_phys(dev, pa, size, direction, attrs);
+}
+
 static void s390_dma_unmap_pages(struct device *dev, dma_addr_t dma_addr,
 size_t size, enum dma_data_direction direction,
 struct dma_attrs *attrs)
@@ -384,8 +393,7 @@ static int s390_dma_map_sg(struct device *dev, struct 
scatterlist *sg,
int i;
 
for_each_sg(sg, s, nr_elements, i) {
-   struct page *page = sg_page(s);
-   s-dma_address = s390_dma_map_pages(dev, page, s-offset,
+   s-dma_address = s390_dma_map_phys(dev, sg_phys(s),
s-length, dir, NULL);
if (!dma_mapping_error(dev, s-dma_address)) {
s-dma_length = s-length;
-- 
1.9.1

--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 16/31] s390: handle page-less SG entries

2015-08-12 Thread Sebastian Ott
On Wed, 12 Aug 2015, Christoph Hellwig wrote:

 Use sg_phys() instead of page_to_phys(sg_page(sg)) so that we don't
 require a page structure for all DMA memory.
 
 Signed-off-by: Christoph Hellwig h...@lst.de

Acked-by: Sebastian Ott seb...@linux.vnet.ibm.com


 ---
  arch/s390/pci/pci_dma.c | 20 ++--
  1 file changed, 14 insertions(+), 6 deletions(-)
 
 diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c
 index 6fd8d58..aae5a47 100644
 --- a/arch/s390/pci/pci_dma.c
 +++ b/arch/s390/pci/pci_dma.c
 @@ -272,14 +272,13 @@ int dma_set_mask(struct device *dev, u64 mask)
  }
  EXPORT_SYMBOL_GPL(dma_set_mask);
  
 -static dma_addr_t s390_dma_map_pages(struct device *dev, struct page *page,
 -  unsigned long offset, size_t size,
 +static dma_addr_t s390_dma_map_phys(struct device *dev, unsigned long pa,
 +  size_t size,
enum dma_data_direction direction,
struct dma_attrs *attrs)
  {
   struct zpci_dev *zdev = get_zdev(to_pci_dev(dev));
   unsigned long nr_pages, iommu_page_index;
 - unsigned long pa = page_to_phys(page) + offset;
   int flags = ZPCI_PTE_VALID;
   dma_addr_t dma_addr;
  
 @@ -301,7 +300,7 @@ static dma_addr_t s390_dma_map_pages(struct device *dev, 
 struct page *page,
  
   if (!dma_update_trans(zdev, pa, dma_addr, size, flags)) {
   atomic64_add(nr_pages, zdev-mapped_pages);
 - return dma_addr + (offset  ~PAGE_MASK);
 + return dma_addr + (pa  ~PAGE_MASK);
   }
  
  out_free:
 @@ -312,6 +311,16 @@ out_err:
   return DMA_ERROR_CODE;
  }
  
 +static dma_addr_t s390_dma_map_pages(struct device *dev, struct page *page,
 +  unsigned long offset, size_t size,
 +  enum dma_data_direction direction,
 +  struct dma_attrs *attrs)
 +{
 + unsigned long pa = page_to_phys(page) + offset;
 +
 + return s390_dma_map_phys(dev, pa, size, direction, attrs);
 +}
 +
  static void s390_dma_unmap_pages(struct device *dev, dma_addr_t dma_addr,
size_t size, enum dma_data_direction direction,
struct dma_attrs *attrs)
 @@ -384,8 +393,7 @@ static int s390_dma_map_sg(struct device *dev, struct 
 scatterlist *sg,
   int i;
  
   for_each_sg(sg, s, nr_elements, i) {
 - struct page *page = sg_page(s);
 - s-dma_address = s390_dma_map_pages(dev, page, s-offset,
 + s-dma_address = s390_dma_map_phys(dev, sg_phys(s),
   s-length, dir, NULL);
   if (!dma_mapping_error(dev, s-dma_address)) {
   s-dma_length = s-length;
 -- 
 1.9.1
 
 --
 To unsubscribe from this list: send the line unsubscribe linux-kernel in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 Please read the FAQ at  http://www.tux.org/lkml/
 

--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html