iova_domain.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * MMU-based software IOTLB.
  4. *
  5. * Copyright (C) 2020-2021 Bytedance Inc. and/or its affiliates. All rights reserved.
  6. *
  7. * Author: Xie Yongji <[email protected]>
  8. *
  9. */
  10. #ifndef _VDUSE_IOVA_DOMAIN_H
  11. #define _VDUSE_IOVA_DOMAIN_H
  12. #include <linux/iova.h>
  13. #include <linux/dma-mapping.h>
  14. #include <linux/vhost_iotlb.h>
  15. #include <linux/rwlock.h>
  16. #define IOVA_START_PFN 1
  17. #define INVALID_PHYS_ADDR (~(phys_addr_t)0)
  18. struct vduse_bounce_map {
  19. struct page *bounce_page;
  20. u64 orig_phys;
  21. };
  22. struct vduse_iova_domain {
  23. struct iova_domain stream_iovad;
  24. struct iova_domain consistent_iovad;
  25. struct vduse_bounce_map *bounce_maps;
  26. size_t bounce_size;
  27. unsigned long iova_limit;
  28. int bounce_map;
  29. struct vhost_iotlb *iotlb;
  30. spinlock_t iotlb_lock;
  31. struct file *file;
  32. bool user_bounce_pages;
  33. rwlock_t bounce_lock;
  34. };
  35. int vduse_domain_set_map(struct vduse_iova_domain *domain,
  36. struct vhost_iotlb *iotlb);
  37. void vduse_domain_clear_map(struct vduse_iova_domain *domain,
  38. struct vhost_iotlb *iotlb);
  39. dma_addr_t vduse_domain_map_page(struct vduse_iova_domain *domain,
  40. struct page *page, unsigned long offset,
  41. size_t size, enum dma_data_direction dir,
  42. unsigned long attrs);
  43. void vduse_domain_unmap_page(struct vduse_iova_domain *domain,
  44. dma_addr_t dma_addr, size_t size,
  45. enum dma_data_direction dir, unsigned long attrs);
  46. void *vduse_domain_alloc_coherent(struct vduse_iova_domain *domain,
  47. size_t size, dma_addr_t *dma_addr,
  48. gfp_t flag, unsigned long attrs);
  49. void vduse_domain_free_coherent(struct vduse_iova_domain *domain, size_t size,
  50. void *vaddr, dma_addr_t dma_addr,
  51. unsigned long attrs);
  52. void vduse_domain_reset_bounce_map(struct vduse_iova_domain *domain);
  53. int vduse_domain_add_user_bounce_pages(struct vduse_iova_domain *domain,
  54. struct page **pages, int count);
  55. void vduse_domain_remove_user_bounce_pages(struct vduse_iova_domain *domain);
  56. void vduse_domain_destroy(struct vduse_iova_domain *domain);
  57. struct vduse_iova_domain *vduse_domain_create(unsigned long iova_limit,
  58. size_t bounce_size);
  59. int vduse_domain_init(void);
  60. void vduse_domain_exit(void);
  61. #endif /* _VDUSE_IOVA_DOMAIN_H */