Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3affedc4 authored by Mark Nelson's avatar Mark Nelson Committed by Benjamin Herrenschmidt
Browse files

powerpc/dma: implement new dma_*map*_attrs() interfaces



Update powerpc to use the new dma_*map*_attrs() interfaces. In doing so
update struct dma_mapping_ops to accept a struct dma_attrs and propagate
these changes through to all users of the code (generic IOMMU and the
64bit DMA code, and the iseries and ps3 platform code).

The old dma_*map_*() interfaces are reimplemented as calls to the
corresponding new interfaces.

Signed-off-by: default avatarMark Nelson <markn@au1.ibm.com>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Acked-by: default avatarGeoff Levand <geoffrey.levand@am.sony.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent c8692362
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -110,6 +110,7 @@ config PPC
	select HAVE_KPROBES
	select HAVE_KRETPROBES
	select HAVE_LMB
	select HAVE_DMA_ATTRS

config EARLY_PRINTK
	bool
+22 −12
Original line number Diff line number Diff line
@@ -50,32 +50,38 @@ static void dma_iommu_free_coherent(struct device *dev, size_t size,
 */
static dma_addr_t dma_iommu_map_single(struct device *dev, void *vaddr,
				       size_t size,
				       enum dma_data_direction direction)
				       enum dma_data_direction direction,
				       struct dma_attrs *attrs)
{
	return iommu_map_single(dev, dev->archdata.dma_data, vaddr, size,
			        device_to_mask(dev), direction);
				device_to_mask(dev), direction, attrs);
}


static void dma_iommu_unmap_single(struct device *dev, dma_addr_t dma_handle,
				   size_t size,
				   enum dma_data_direction direction)
				   enum dma_data_direction direction,
				   struct dma_attrs *attrs)
{
	iommu_unmap_single(dev->archdata.dma_data, dma_handle, size, direction);
	iommu_unmap_single(dev->archdata.dma_data, dma_handle, size, direction,
			   attrs);
}


static int dma_iommu_map_sg(struct device *dev, struct scatterlist *sglist,
			    int nelems, enum dma_data_direction direction)
			    int nelems, enum dma_data_direction direction,
			    struct dma_attrs *attrs)
{
	return iommu_map_sg(dev, dev->archdata.dma_data, sglist, nelems,
			    device_to_mask(dev), direction);
			    device_to_mask(dev), direction, attrs);
}

static void dma_iommu_unmap_sg(struct device *dev, struct scatterlist *sglist,
		int nelems, enum dma_data_direction direction)
		int nelems, enum dma_data_direction direction,
		struct dma_attrs *attrs)
{
	iommu_unmap_sg(dev->archdata.dma_data, sglist, nelems, direction);
	iommu_unmap_sg(dev->archdata.dma_data, sglist, nelems, direction,
		       attrs);
}

/* We support DMA to/from any memory page via the iommu */
@@ -148,19 +154,22 @@ static void dma_direct_free_coherent(struct device *dev, size_t size,

static dma_addr_t dma_direct_map_single(struct device *dev, void *ptr,
					size_t size,
					enum dma_data_direction direction)
					enum dma_data_direction direction,
					struct dma_attrs *attrs)
{
	return virt_to_abs(ptr) + get_dma_direct_offset(dev);
}

static void dma_direct_unmap_single(struct device *dev, dma_addr_t dma_addr,
				    size_t size,
				    enum dma_data_direction direction)
				    enum dma_data_direction direction,
				    struct dma_attrs *attrs)
{
}

static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl,
			     int nents, enum dma_data_direction direction)
			     int nents, enum dma_data_direction direction,
			     struct dma_attrs *attrs)
{
	struct scatterlist *sg;
	int i;
@@ -174,7 +183,8 @@ static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl,
}

static void dma_direct_unmap_sg(struct device *dev, struct scatterlist *sg,
				int nents, enum dma_data_direction direction)
				int nents, enum dma_data_direction direction,
				struct dma_attrs *attrs)
{
}

+8 −4
Original line number Diff line number Diff line
@@ -82,7 +82,8 @@ static void ibmebus_free_coherent(struct device *dev,
static dma_addr_t ibmebus_map_single(struct device *dev,
				     void *ptr,
				     size_t size,
				     enum dma_data_direction direction)
				     enum dma_data_direction direction,
				     struct dma_attrs *attrs)
{
	return (dma_addr_t)(ptr);
}
@@ -90,14 +91,16 @@ static dma_addr_t ibmebus_map_single(struct device *dev,
static void ibmebus_unmap_single(struct device *dev,
				 dma_addr_t dma_addr,
				 size_t size,
				 enum dma_data_direction direction)
				 enum dma_data_direction direction,
				 struct dma_attrs *attrs)
{
	return;
}

static int ibmebus_map_sg(struct device *dev,
			  struct scatterlist *sgl,
			  int nents, enum dma_data_direction direction)
			  int nents, enum dma_data_direction direction,
			  struct dma_attrs *attrs)
{
	struct scatterlist *sg;
	int i;
@@ -112,7 +115,8 @@ static int ibmebus_map_sg(struct device *dev,

static void ibmebus_unmap_sg(struct device *dev,
			     struct scatterlist *sg,
			     int nents, enum dma_data_direction direction)
			     int nents, enum dma_data_direction direction,
			     struct dma_attrs *attrs)
{
	return;
}
+7 −4
Original line number Diff line number Diff line
@@ -269,7 +269,8 @@ static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,

int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
		 struct scatterlist *sglist, int nelems,
		 unsigned long mask, enum dma_data_direction direction)
		 unsigned long mask, enum dma_data_direction direction,
		 struct dma_attrs *attrs)
{
	dma_addr_t dma_next = 0, dma_addr;
	unsigned long flags;
@@ -411,7 +412,8 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl,


void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist,
		int nelems, enum dma_data_direction direction)
		int nelems, enum dma_data_direction direction,
		struct dma_attrs *attrs)
{
	struct scatterlist *sg;
	unsigned long flags;
@@ -553,7 +555,7 @@ void iommu_free_table(struct iommu_table *tbl, const char *node_name)
 */
dma_addr_t iommu_map_single(struct device *dev, struct iommu_table *tbl,
			    void *vaddr, size_t size, unsigned long mask,
			    enum dma_data_direction direction)
		enum dma_data_direction direction, struct dma_attrs *attrs)
{
	dma_addr_t dma_handle = DMA_ERROR_CODE;
	unsigned long uaddr;
@@ -586,7 +588,8 @@ dma_addr_t iommu_map_single(struct device *dev, struct iommu_table *tbl,
}

void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle,
		size_t size, enum dma_data_direction direction)
		size_t size, enum dma_data_direction direction,
		struct dma_attrs *attrs)
{
	unsigned int npages;

+2 −2
Original line number Diff line number Diff line
@@ -214,13 +214,13 @@ dma_addr_t iseries_hv_map(void *vaddr, size_t size,
			enum dma_data_direction direction)
{
	return iommu_map_single(NULL, &vio_iommu_table, vaddr, size,
				DMA_32BIT_MASK, direction);
				DMA_32BIT_MASK, direction, NULL);
}

void iseries_hv_unmap(dma_addr_t dma_handle, size_t size,
			enum dma_data_direction direction)
{
	iommu_unmap_single(&vio_iommu_table, dma_handle, size, direction);
	iommu_unmap_single(&vio_iommu_table, dma_handle, size, direction, NULL);
}

void __init iommu_vio_init(void)
Loading