Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * MMU-based software IOTLB.
0004  *
0005  * Copyright (C) 2020-2021 Bytedance Inc. and/or its affiliates. All rights reserved.
0006  *
0007  * Author: Xie Yongji <xieyongji@bytedance.com>
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 /* _VDUSE_IOVA_DOMAIN_H */