0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef _VDUSE_IOVA_DOMAIN_H
0012 #define _VDUSE_IOVA_DOMAIN_H
0013
0014 #include <linux/iova.h>
0015 #include <linux/dma-mapping.h>
0016 #include <linux/vhost_iotlb.h>
0017 #include <linux/rwlock.h>
0018
0019 #define IOVA_START_PFN 1
0020
0021 #define INVALID_PHYS_ADDR (~(phys_addr_t)0)
0022
0023 struct vduse_bounce_map {
0024 struct page *bounce_page;
0025 u64 orig_phys;
0026 };
0027
0028 struct vduse_iova_domain {
0029 struct iova_domain stream_iovad;
0030 struct iova_domain consistent_iovad;
0031 struct vduse_bounce_map *bounce_maps;
0032 size_t bounce_size;
0033 unsigned long iova_limit;
0034 int bounce_map;
0035 struct vhost_iotlb *iotlb;
0036 spinlock_t iotlb_lock;
0037 struct file *file;
0038 bool user_bounce_pages;
0039 rwlock_t bounce_lock;
0040 };
0041
0042 int vduse_domain_set_map(struct vduse_iova_domain *domain,
0043 struct vhost_iotlb *iotlb);
0044
0045 void vduse_domain_clear_map(struct vduse_iova_domain *domain,
0046 struct vhost_iotlb *iotlb);
0047
0048 dma_addr_t vduse_domain_map_page(struct vduse_iova_domain *domain,
0049 struct page *page, unsigned long offset,
0050 size_t size, enum dma_data_direction dir,
0051 unsigned long attrs);
0052
0053 void vduse_domain_unmap_page(struct vduse_iova_domain *domain,
0054 dma_addr_t dma_addr, size_t size,
0055 enum dma_data_direction dir, unsigned long attrs);
0056
0057 void *vduse_domain_alloc_coherent(struct vduse_iova_domain *domain,
0058 size_t size, dma_addr_t *dma_addr,
0059 gfp_t flag, unsigned long attrs);
0060
0061 void vduse_domain_free_coherent(struct vduse_iova_domain *domain, size_t size,
0062 void *vaddr, dma_addr_t dma_addr,
0063 unsigned long attrs);
0064
0065 void vduse_domain_reset_bounce_map(struct vduse_iova_domain *domain);
0066
0067 int vduse_domain_add_user_bounce_pages(struct vduse_iova_domain *domain,
0068 struct page **pages, int count);
0069
0070 void vduse_domain_remove_user_bounce_pages(struct vduse_iova_domain *domain);
0071
0072 void vduse_domain_destroy(struct vduse_iova_domain *domain);
0073
0074 struct vduse_iova_domain *vduse_domain_create(unsigned long iova_limit,
0075 size_t bounce_size);
0076
0077 int vduse_domain_init(void);
0078
0079 void vduse_domain_exit(void);
0080
0081 #endif