bus_dma.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #ifndef _MACHINE_BUS_DMA_H_
  2. #define _MACHINE_BUS_DMA_H_
  3. #define WANT_INLINE_DMAMAP
  4. #include <sys/bus_dma.h>
  5. #include <machine/bus_dma_impl.h>
  6. /*
  7. * Allocate a handle for mapping from kva/uva/physical
  8. * address space into bus device space.
  9. */
  10. static inline int
  11. bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp)
  12. {
  13. struct bus_dma_tag_common *tc;
  14. tc = (struct bus_dma_tag_common *)dmat;
  15. return (tc->impl->map_create(dmat, flags, mapp));
  16. }
  17. /*
  18. * Destroy a handle for mapping from kva/uva/physical
  19. * address space into bus device space.
  20. */
  21. static inline int
  22. bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map)
  23. {
  24. struct bus_dma_tag_common *tc;
  25. tc = (struct bus_dma_tag_common *)dmat;
  26. return (tc->impl->map_destroy(dmat, map));
  27. }
  28. /*
  29. * Allocate a piece of memory that can be efficiently mapped into
  30. * bus device space based on the constraints listed in the dma tag.
  31. * A dmamap to for use with dmamap_load is also allocated.
  32. */
  33. static inline int
  34. bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags,
  35. bus_dmamap_t *mapp)
  36. {
  37. struct bus_dma_tag_common *tc;
  38. tc = (struct bus_dma_tag_common *)dmat;
  39. return (tc->impl->mem_alloc(dmat, vaddr, flags, mapp));
  40. }
  41. /*
  42. * Free a piece of memory and it's allociated dmamap, that was allocated
  43. * via bus_dmamem_alloc.
  44. */
  45. static inline void
  46. bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
  47. {
  48. struct bus_dma_tag_common *tc;
  49. tc = (struct bus_dma_tag_common *)dmat;
  50. tc->impl->mem_free(dmat, vaddr, map);
  51. }
  52. /*
  53. * Release the mapping held by map.
  54. */
  55. static inline void
  56. bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
  57. {
  58. struct bus_dma_tag_common *tc;
  59. tc = (struct bus_dma_tag_common *)dmat;
  60. tc->impl->map_unload(dmat, map);
  61. }
  62. static inline void
  63. bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
  64. {
  65. struct bus_dma_tag_common *tc;
  66. tc = (struct bus_dma_tag_common *)dmat;
  67. tc->impl->map_sync(dmat, map, op);
  68. }
  69. static inline int
  70. _bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf,
  71. bus_size_t buflen, int flags, bus_dma_segment_t *segs, int *segp)
  72. {
  73. struct bus_dma_tag_common *tc;
  74. tc = (struct bus_dma_tag_common *)dmat;
  75. return (tc->impl->load_phys(dmat, map, buf, buflen, flags, segs,
  76. segp));
  77. }
  78. static inline int
  79. _bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, struct vm_page **ma,
  80. bus_size_t tlen, int ma_offs, int flags, bus_dma_segment_t *segs,
  81. int *segp)
  82. {
  83. struct bus_dma_tag_common *tc;
  84. tc = (struct bus_dma_tag_common *)dmat;
  85. return (tc->impl->load_ma(dmat, map, ma, tlen, ma_offs, flags,
  86. segs, segp));
  87. }
  88. static inline int
  89. _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
  90. bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs,
  91. int *segp)
  92. {
  93. struct bus_dma_tag_common *tc;
  94. tc = (struct bus_dma_tag_common *)dmat;
  95. return (tc->impl->load_buffer(dmat, map, buf, buflen, pmap, flags, segs,
  96. segp));
  97. }
  98. static inline void
  99. _bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map,
  100. struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg)
  101. {
  102. struct bus_dma_tag_common *tc;
  103. tc = (struct bus_dma_tag_common *)dmat;
  104. tc->impl->map_waitok(dmat, map, mem, callback, callback_arg);
  105. }
  106. static inline bus_dma_segment_t *
  107. _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
  108. bus_dma_segment_t *segs, int nsegs, int error)
  109. {
  110. struct bus_dma_tag_common *tc;
  111. tc = (struct bus_dma_tag_common *)dmat;
  112. return (tc->impl->map_complete(dmat, map, segs, nsegs, error));
  113. }
  114. #endif /* !_MACHINE_BUS_DMA_H_ */