gfp_t gfp, struct dma_attrs *attrs);
#define dma_alloc_coherent(d, s, h, f) dma_alloc_attrs(d, s, h, f, NULL)
+#define dma_alloc_at_coherent(d, s, h, f) dma_alloc_at_attrs(d, s, h, f, NULL)
-static inline void *dma_alloc_attrs(struct device *dev, size_t size,
+static inline void *dma_alloc_at_attrs(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flag,
struct dma_attrs *attrs)
{
return cpu_addr;
}
+static inline void *dma_alloc_attrs(struct device *dev, size_t size,
+ dma_addr_t *dma_handle, gfp_t flag,
+ struct dma_attrs *attrs)
+{
+ *dma_handle = DMA_ERROR_CODE;
+ return dma_alloc_at_attrs(dev, size, dma_handle, flag, attrs);
+}
+
/**
* arm_dma_free - free memory allocated by arm_dma_alloc
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
* Create a mapping in device IO address space for specified pages
*/
static dma_addr_t
-__iommu_create_mapping(struct device *dev, struct page **pages, size_t size)
+____iommu_create_mapping(struct device *dev, dma_addr_t *req,
+ struct page **pages, size_t size)
{
struct dma_iommu_mapping *mapping = dev->archdata.mapping;
unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT;
dma_addr_t dma_addr, iova;
int i, ret = DMA_ERROR_CODE;
- dma_addr = __alloc_iova(mapping, size);
+ if (req)
+ dma_addr = __alloc_iova_at(mapping, req, size);
+ else
+ dma_addr = __alloc_iova(mapping, size);
+
if (dma_addr == DMA_ERROR_CODE)
return dma_addr;
return DMA_ERROR_CODE;
}
+static dma_addr_t
+__iommu_create_mapping(struct device *dev, struct page **pages, size_t size)
+{
+ return ____iommu_create_mapping(dev, NULL, pages, size);
+}
+
static int __iommu_remove_mapping(struct device *dev, dma_addr_t iova, size_t size)
{
struct dma_iommu_mapping *mapping = dev->archdata.mapping;
* platform--see CONFIG_HUGETLB_PAGE. */
gfp &= ~(__GFP_COMP);
- *handle = DMA_ERROR_CODE;
size = PAGE_ALIGN(size);
if (gfp & GFP_ATOMIC)
if (!pages)
return NULL;
- *handle = __iommu_create_mapping(dev, pages, size);
+ if (*handle == DMA_ERROR_CODE)
+ *handle = __iommu_create_mapping(dev, pages, size);
+ else
+ *handle = ____iommu_create_mapping(dev, handle, pages, size);
+
if (*handle == DMA_ERROR_CODE)
goto err_buffer;