forked from Minki/linux
68efd7d2fb
The 'order' parameter for IOMMU-aware dma-mapping implementation was introduced mainly as a hack to reduce size of the bitmap used for tracking IO virtual address space. Since now it is possible to dynamically resize the bitmap, this hack is not needed and can be removed without any impact on the client devices. This way the parameters for arm_iommu_create_mapping() becomes much easier to understand. 'size' parameter now means the maximum supported IO address space size. The code will allocate (resize) bitmap in chunks, ensuring that a single chunk is not larger than a single memory page to avoid unreliable allocations of size larger than PAGE_SIZE in atomic context. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
39 lines
969 B
C
39 lines
969 B
C
#ifndef ASMARM_DMA_IOMMU_H
|
|
#define ASMARM_DMA_IOMMU_H
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#include <linux/mm_types.h>
|
|
#include <linux/scatterlist.h>
|
|
#include <linux/dma-debug.h>
|
|
#include <linux/kmemcheck.h>
|
|
#include <linux/kref.h>
|
|
|
|
struct dma_iommu_mapping {
|
|
/* iommu specific data */
|
|
struct iommu_domain *domain;
|
|
|
|
unsigned long **bitmaps; /* array of bitmaps */
|
|
unsigned int nr_bitmaps; /* nr of elements in array */
|
|
unsigned int extensions;
|
|
size_t bitmap_size; /* size of a single bitmap */
|
|
size_t bits; /* per bitmap */
|
|
unsigned int size; /* per bitmap */
|
|
dma_addr_t base;
|
|
|
|
spinlock_t lock;
|
|
struct kref kref;
|
|
};
|
|
|
|
struct dma_iommu_mapping *
|
|
arm_iommu_create_mapping(struct bus_type *bus, dma_addr_t base, size_t size);
|
|
|
|
void arm_iommu_release_mapping(struct dma_iommu_mapping *mapping);
|
|
|
|
int arm_iommu_attach_device(struct device *dev,
|
|
struct dma_iommu_mapping *mapping);
|
|
void arm_iommu_detach_device(struct device *dev);
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif
|