dig_vtd_iommu.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include <linux/types.h>
  2. #include <linux/kernel.h>
  3. #include <linux/module.h>
  4. #include <linux/dma-mapping.h>
  5. #include <linux/intel-iommu.h>
  6. void *
  7. vtd_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
  8. gfp_t flags)
  9. {
  10. return intel_alloc_coherent(dev, size, dma_handle, flags);
  11. }
  12. EXPORT_SYMBOL_GPL(vtd_alloc_coherent);
  13. void
  14. vtd_free_coherent(struct device *dev, size_t size, void *vaddr,
  15. dma_addr_t dma_handle)
  16. {
  17. intel_free_coherent(dev, size, vaddr, dma_handle);
  18. }
  19. EXPORT_SYMBOL_GPL(vtd_free_coherent);
  20. dma_addr_t
  21. vtd_map_single_attrs(struct device *dev, void *addr, size_t size,
  22. int dir, struct dma_attrs *attrs)
  23. {
  24. return intel_map_single(dev, (phys_addr_t)addr, size, dir);
  25. }
  26. EXPORT_SYMBOL_GPL(vtd_map_single_attrs);
  27. void
  28. vtd_unmap_single_attrs(struct device *dev, dma_addr_t iova, size_t size,
  29. int dir, struct dma_attrs *attrs)
  30. {
  31. intel_unmap_single(dev, iova, size, dir);
  32. }
  33. EXPORT_SYMBOL_GPL(vtd_unmap_single_attrs);
  34. int
  35. vtd_map_sg_attrs(struct device *dev, struct scatterlist *sglist, int nents,
  36. int dir, struct dma_attrs *attrs)
  37. {
  38. return intel_map_sg(dev, sglist, nents, dir);
  39. }
  40. EXPORT_SYMBOL_GPL(vtd_map_sg_attrs);
  41. void
  42. vtd_unmap_sg_attrs(struct device *dev, struct scatterlist *sglist,
  43. int nents, int dir, struct dma_attrs *attrs)
  44. {
  45. intel_unmap_sg(dev, sglist, nents, dir);
  46. }
  47. EXPORT_SYMBOL_GPL(vtd_unmap_sg_attrs);
  48. int
  49. vtd_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
  50. {
  51. return 0;
  52. }
  53. EXPORT_SYMBOL_GPL(vtd_dma_mapping_error);
  54. extern int iommu_dma_supported(struct device *dev, u64 mask);
  55. struct dma_mapping_ops vtd_dma_ops = {
  56. .alloc_coherent = vtd_alloc_coherent,
  57. .free_coherent = vtd_free_coherent,
  58. .map_single_attrs = vtd_map_single_attrs,
  59. .unmap_single_attrs = vtd_unmap_single_attrs,
  60. .map_sg_attrs = vtd_map_sg_attrs,
  61. .unmap_sg_attrs = vtd_unmap_sg_attrs,
  62. .sync_single_for_cpu = machvec_dma_sync_single,
  63. .sync_sg_for_cpu = machvec_dma_sync_sg,
  64. .sync_single_for_device = machvec_dma_sync_single,
  65. .sync_sg_for_device = machvec_dma_sync_sg,
  66. .dma_supported_op = iommu_dma_supported,
  67. .mapping_error = vtd_dma_mapping_error,
  68. };