iova_domain.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 <xieyongji@bytedance.com>
  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. #define IOVA_START_PFN 1
  16. #define INVALID_PHYS_ADDR (~(phys_addr_t)0)
  17. struct vduse_bounce_map {
  18. struct page *bounce_page;
  19. struct page *user_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. void vduse_domain_sync_single_for_device(struct vduse_iova_domain *domain,
  40. dma_addr_t dma_addr, size_t size,
  41. enum dma_data_direction dir);
  42. void vduse_domain_sync_single_for_cpu(struct vduse_iova_domain *domain,
  43. dma_addr_t dma_addr, size_t size,
  44. enum dma_data_direction dir);
  45. dma_addr_t vduse_domain_map_page(struct vduse_iova_domain *domain,
  46. struct page *page, unsigned long offset,
  47. size_t size, enum dma_data_direction dir,
  48. unsigned long attrs);
  49. void vduse_domain_unmap_page(struct vduse_iova_domain *domain,
  50. dma_addr_t dma_addr, size_t size,
  51. enum dma_data_direction dir, unsigned long attrs);
  52. void *vduse_domain_alloc_coherent(struct vduse_iova_domain *domain,
  53. size_t size, dma_addr_t *dma_addr,
  54. gfp_t flag, unsigned long attrs);
  55. void vduse_domain_free_coherent(struct vduse_iova_domain *domain, size_t size,
  56. void *vaddr, dma_addr_t dma_addr,
  57. unsigned long attrs);
  58. void vduse_domain_reset_bounce_map(struct vduse_iova_domain *domain);
  59. int vduse_domain_add_user_bounce_pages(struct vduse_iova_domain *domain,
  60. struct page **pages, int count);
  61. void vduse_domain_remove_user_bounce_pages(struct vduse_iova_domain *domain);
  62. void vduse_domain_destroy(struct vduse_iova_domain *domain);
  63. struct vduse_iova_domain *vduse_domain_create(unsigned long iova_limit,
  64. size_t bounce_size);
  65. int vduse_domain_init(void);
  66. void vduse_domain_exit(void);
  67. #endif /* _VDUSE_IOVA_DOMAIN_H */