|
@@ -899,16 +899,18 @@ sba_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * sba_map_single - map one buffer and return IOVA for DMA
|
|
|
+ * sba_map_single_attrs - map one buffer and return IOVA for DMA
|
|
|
* @dev: instance of PCI owned by the driver that's asking.
|
|
|
* @addr: driver buffer to map.
|
|
|
* @size: number of bytes to map in driver buffer.
|
|
|
* @dir: R/W or both.
|
|
|
+ * @attrs: optional dma attributes
|
|
|
*
|
|
|
* See Documentation/DMA-mapping.txt
|
|
|
*/
|
|
|
dma_addr_t
|
|
|
-sba_map_single(struct device *dev, void *addr, size_t size, int dir)
|
|
|
+sba_map_single_attrs(struct device *dev, void *addr, size_t size, int dir,
|
|
|
+ struct dma_attrs *attrs)
|
|
|
{
|
|
|
struct ioc *ioc;
|
|
|
dma_addr_t iovp;
|
|
@@ -932,7 +934,8 @@ sba_map_single(struct device *dev, void *addr, size_t size, int dir)
|
|
|
** Device is bit capable of DMA'ing to the buffer...
|
|
|
** just return the PCI address of ptr
|
|
|
*/
|
|
|
- DBG_BYPASS("sba_map_single() bypass mask/addr: 0x%lx/0x%lx\n",
|
|
|
+ DBG_BYPASS("sba_map_single_attrs() bypass mask/addr: "
|
|
|
+ "0x%lx/0x%lx\n",
|
|
|
to_pci_dev(dev)->dma_mask, pci_addr);
|
|
|
return pci_addr;
|
|
|
}
|
|
@@ -953,7 +956,7 @@ sba_map_single(struct device *dev, void *addr, size_t size, int dir)
|
|
|
|
|
|
#ifdef ASSERT_PDIR_SANITY
|
|
|
spin_lock_irqsave(&ioc->res_lock, flags);
|
|
|
- if (sba_check_pdir(ioc,"Check before sba_map_single()"))
|
|
|
+ if (sba_check_pdir(ioc,"Check before sba_map_single_attrs()"))
|
|
|
panic("Sanity check failed");
|
|
|
spin_unlock_irqrestore(&ioc->res_lock, flags);
|
|
|
#endif
|
|
@@ -982,11 +985,12 @@ sba_map_single(struct device *dev, void *addr, size_t size, int dir)
|
|
|
/* form complete address */
|
|
|
#ifdef ASSERT_PDIR_SANITY
|
|
|
spin_lock_irqsave(&ioc->res_lock, flags);
|
|
|
- sba_check_pdir(ioc,"Check after sba_map_single()");
|
|
|
+ sba_check_pdir(ioc,"Check after sba_map_single_attrs()");
|
|
|
spin_unlock_irqrestore(&ioc->res_lock, flags);
|
|
|
#endif
|
|
|
return SBA_IOVA(ioc, iovp, offset);
|
|
|
}
|
|
|
+EXPORT_SYMBOL(sba_map_single_attrs);
|
|
|
|
|
|
#ifdef ENABLE_MARK_CLEAN
|
|
|
static SBA_INLINE void
|
|
@@ -1013,15 +1017,17 @@ sba_mark_clean(struct ioc *ioc, dma_addr_t iova, size_t size)
|
|
|
#endif
|
|
|
|
|
|
/**
|
|
|
- * sba_unmap_single - unmap one IOVA and free resources
|
|
|
+ * sba_unmap_single_attrs - unmap one IOVA and free resources
|
|
|
* @dev: instance of PCI owned by the driver that's asking.
|
|
|
* @iova: IOVA of driver buffer previously mapped.
|
|
|
* @size: number of bytes mapped in driver buffer.
|
|
|
* @dir: R/W or both.
|
|
|
+ * @attrs: optional dma attributes
|
|
|
*
|
|
|
* See Documentation/DMA-mapping.txt
|
|
|
*/
|
|
|
-void sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size, int dir)
|
|
|
+void sba_unmap_single_attrs(struct device *dev, dma_addr_t iova, size_t size,
|
|
|
+ int dir, struct dma_attrs *attrs)
|
|
|
{
|
|
|
struct ioc *ioc;
|
|
|
#if DELAYED_RESOURCE_CNT > 0
|
|
@@ -1038,7 +1044,8 @@ void sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size, int dir)
|
|
|
/*
|
|
|
** Address does not fall w/in IOVA, must be bypassing
|
|
|
*/
|
|
|
- DBG_BYPASS("sba_unmap_single() bypass addr: 0x%lx\n", iova);
|
|
|
+ DBG_BYPASS("sba_unmap_single_atttrs() bypass addr: 0x%lx\n",
|
|
|
+ iova);
|
|
|
|
|
|
#ifdef ENABLE_MARK_CLEAN
|
|
|
if (dir == DMA_FROM_DEVICE) {
|
|
@@ -1087,7 +1094,7 @@ void sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size, int dir)
|
|
|
spin_unlock_irqrestore(&ioc->res_lock, flags);
|
|
|
#endif /* DELAYED_RESOURCE_CNT == 0 */
|
|
|
}
|
|
|
-
|
|
|
+EXPORT_SYMBOL(sba_unmap_single_attrs);
|
|
|
|
|
|
/**
|
|
|
* sba_alloc_coherent - allocate/map shared mem for DMA
|
|
@@ -1144,7 +1151,8 @@ sba_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, gfp
|
|
|
* If device can't bypass or bypass is disabled, pass the 32bit fake
|
|
|
* device to map single to get an iova mapping.
|
|
|
*/
|
|
|
- *dma_handle = sba_map_single(&ioc->sac_only_dev->dev, addr, size, 0);
|
|
|
+ *dma_handle = sba_map_single_attrs(&ioc->sac_only_dev->dev, addr,
|
|
|
+ size, 0, NULL);
|
|
|
|
|
|
return addr;
|
|
|
}
|
|
@@ -1161,7 +1169,7 @@ sba_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, gfp
|
|
|
*/
|
|
|
void sba_free_coherent (struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle)
|
|
|
{
|
|
|
- sba_unmap_single(dev, dma_handle, size, 0);
|
|
|
+ sba_unmap_single_attrs(dev, dma_handle, size, 0, NULL);
|
|
|
free_pages((unsigned long) vaddr, get_order(size));
|
|
|
}
|
|
|
|
|
@@ -1410,10 +1418,12 @@ sba_coalesce_chunks(struct ioc *ioc, struct device *dev,
|
|
|
* @sglist: array of buffer/length pairs
|
|
|
* @nents: number of entries in list
|
|
|
* @dir: R/W or both.
|
|
|
+ * @attrs: optional dma attributes
|
|
|
*
|
|
|
* See Documentation/DMA-mapping.txt
|
|
|
*/
|
|
|
-int sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, int dir)
|
|
|
+int sba_map_sg_attrs(struct device *dev, struct scatterlist *sglist, int nents,
|
|
|
+ int dir, struct dma_attrs *attrs)
|
|
|
{
|
|
|
struct ioc *ioc;
|
|
|
int coalesced, filled = 0;
|
|
@@ -1441,16 +1451,16 @@ int sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, int di
|
|
|
/* Fast path single entry scatterlists. */
|
|
|
if (nents == 1) {
|
|
|
sglist->dma_length = sglist->length;
|
|
|
- sglist->dma_address = sba_map_single(dev, sba_sg_address(sglist), sglist->length, dir);
|
|
|
+ sglist->dma_address = sba_map_single_attrs(dev, sba_sg_address(sglist), sglist->length, dir, attrs);
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
#ifdef ASSERT_PDIR_SANITY
|
|
|
spin_lock_irqsave(&ioc->res_lock, flags);
|
|
|
- if (sba_check_pdir(ioc,"Check before sba_map_sg()"))
|
|
|
+ if (sba_check_pdir(ioc,"Check before sba_map_sg_attrs()"))
|
|
|
{
|
|
|
sba_dump_sg(ioc, sglist, nents);
|
|
|
- panic("Check before sba_map_sg()");
|
|
|
+ panic("Check before sba_map_sg_attrs()");
|
|
|
}
|
|
|
spin_unlock_irqrestore(&ioc->res_lock, flags);
|
|
|
#endif
|
|
@@ -1479,10 +1489,10 @@ int sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, int di
|
|
|
|
|
|
#ifdef ASSERT_PDIR_SANITY
|
|
|
spin_lock_irqsave(&ioc->res_lock, flags);
|
|
|
- if (sba_check_pdir(ioc,"Check after sba_map_sg()"))
|
|
|
+ if (sba_check_pdir(ioc,"Check after sba_map_sg_attrs()"))
|
|
|
{
|
|
|
sba_dump_sg(ioc, sglist, nents);
|
|
|
- panic("Check after sba_map_sg()\n");
|
|
|
+ panic("Check after sba_map_sg_attrs()\n");
|
|
|
}
|
|
|
spin_unlock_irqrestore(&ioc->res_lock, flags);
|
|
|
#endif
|
|
@@ -1492,18 +1502,20 @@ int sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, int di
|
|
|
|
|
|
return filled;
|
|
|
}
|
|
|
-
|
|
|
+EXPORT_SYMBOL(sba_map_sg_attrs);
|
|
|
|
|
|
/**
|
|
|
- * sba_unmap_sg - unmap Scatter/Gather list
|
|
|
+ * sba_unmap_sg_attrs - unmap Scatter/Gather list
|
|
|
* @dev: instance of PCI owned by the driver that's asking.
|
|
|
* @sglist: array of buffer/length pairs
|
|
|
* @nents: number of entries in list
|
|
|
* @dir: R/W or both.
|
|
|
+ * @attrs: optional dma attributes
|
|
|
*
|
|
|
* See Documentation/DMA-mapping.txt
|
|
|
*/
|
|
|
-void sba_unmap_sg (struct device *dev, struct scatterlist *sglist, int nents, int dir)
|
|
|
+void sba_unmap_sg_attrs(struct device *dev, struct scatterlist *sglist,
|
|
|
+ int nents, int dir, struct dma_attrs *attrs)
|
|
|
{
|
|
|
#ifdef ASSERT_PDIR_SANITY
|
|
|
struct ioc *ioc;
|
|
@@ -1518,13 +1530,14 @@ void sba_unmap_sg (struct device *dev, struct scatterlist *sglist, int nents, in
|
|
|
ASSERT(ioc);
|
|
|
|
|
|
spin_lock_irqsave(&ioc->res_lock, flags);
|
|
|
- sba_check_pdir(ioc,"Check before sba_unmap_sg()");
|
|
|
+ sba_check_pdir(ioc,"Check before sba_unmap_sg_attrs()");
|
|
|
spin_unlock_irqrestore(&ioc->res_lock, flags);
|
|
|
#endif
|
|
|
|
|
|
while (nents && sglist->dma_length) {
|
|
|
|
|
|
- sba_unmap_single(dev, sglist->dma_address, sglist->dma_length, dir);
|
|
|
+ sba_unmap_single_attrs(dev, sglist->dma_address,
|
|
|
+ sglist->dma_length, dir, attrs);
|
|
|
sglist = sg_next(sglist);
|
|
|
nents--;
|
|
|
}
|
|
@@ -1533,11 +1546,12 @@ void sba_unmap_sg (struct device *dev, struct scatterlist *sglist, int nents, in
|
|
|
|
|
|
#ifdef ASSERT_PDIR_SANITY
|
|
|
spin_lock_irqsave(&ioc->res_lock, flags);
|
|
|
- sba_check_pdir(ioc,"Check after sba_unmap_sg()");
|
|
|
+ sba_check_pdir(ioc,"Check after sba_unmap_sg_attrs()");
|
|
|
spin_unlock_irqrestore(&ioc->res_lock, flags);
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
+EXPORT_SYMBOL(sba_unmap_sg_attrs);
|
|
|
|
|
|
/**************************************************************
|
|
|
*
|
|
@@ -2166,10 +2180,6 @@ sba_page_override(char *str)
|
|
|
__setup("sbapagesize=",sba_page_override);
|
|
|
|
|
|
EXPORT_SYMBOL(sba_dma_mapping_error);
|
|
|
-EXPORT_SYMBOL(sba_map_single);
|
|
|
-EXPORT_SYMBOL(sba_unmap_single);
|
|
|
-EXPORT_SYMBOL(sba_map_sg);
|
|
|
-EXPORT_SYMBOL(sba_unmap_sg);
|
|
|
EXPORT_SYMBOL(sba_dma_supported);
|
|
|
EXPORT_SYMBOL(sba_alloc_coherent);
|
|
|
EXPORT_SYMBOL(sba_free_coherent);
|