bouncebuf.h 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * Generic bounce buffer implementation
  3. *
  4. * Copyright (C) 2012 Marek Vasut <marex@denx.de>
  5. *
  6. * See file CREDITS for list of people who contributed to this
  7. * project.
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License as
  11. * published by the Free Software Foundation; either version 2 of
  12. * the License, or (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  22. * MA 02111-1307 USA
  23. */
  24. #ifndef __INCLUDE_BOUNCEBUF_H__
  25. #define __INCLUDE_BOUNCEBUF_H__
  26. #include <linux/types.h>
  27. /*
  28. * GEN_BB_READ -- Data are read from the buffer eg. by DMA hardware.
  29. * The source buffer is copied into the bounce buffer (if unaligned, otherwise
  30. * the source buffer is used directly) upon start() call, then the operation
  31. * requiring the aligned transfer happens, then the bounce buffer is lost upon
  32. * stop() call.
  33. */
  34. #define GEN_BB_READ (1 << 0)
  35. /*
  36. * GEN_BB_WRITE -- Data are written into the buffer eg. by DMA hardware.
  37. * The source buffer starts in an undefined state upon start() call, then the
  38. * operation requiring the aligned transfer happens, then the bounce buffer is
  39. * copied into the destination buffer (if unaligned, otherwise destination
  40. * buffer is used directly) upon stop() call.
  41. */
  42. #define GEN_BB_WRITE (1 << 1)
  43. /*
  44. * GEN_BB_RW -- Data are read and written into the buffer eg. by DMA hardware.
  45. * The source buffer is copied into the bounce buffer (if unaligned, otherwise
  46. * the source buffer is used directly) upon start() call, then the operation
  47. * requiring the aligned transfer happens, then the bounce buffer is copied
  48. * into the destination buffer (if unaligned, otherwise destination buffer is
  49. * used directly) upon stop() call.
  50. */
  51. #define GEN_BB_RW (GEN_BB_READ | GEN_BB_WRITE)
  52. struct bounce_buffer {
  53. /* Copy of data parameter passed to start() */
  54. void *user_buffer;
  55. /*
  56. * DMA-aligned buffer. This field is always set to the value that
  57. * should be used for DMA; either equal to .user_buffer, or to a
  58. * freshly allocated aligned buffer.
  59. */
  60. void *bounce_buffer;
  61. /* Copy of len parameter passed to start() */
  62. size_t len;
  63. /* DMA-aligned buffer length */
  64. size_t len_aligned;
  65. /* Copy of flags parameter passed to start() */
  66. unsigned int flags;
  67. };
  68. /**
  69. * bounce_buffer_start() -- Start the bounce buffer session
  70. * state: stores state passed between bounce_buffer_{start,stop}
  71. * data: pointer to buffer to be aligned
  72. * len: length of the buffer
  73. * flags: flags describing the transaction, see above.
  74. */
  75. int bounce_buffer_start(struct bounce_buffer *state, void *data,
  76. size_t len, unsigned int flags);
  77. /**
  78. * bounce_buffer_stop() -- Finish the bounce buffer session
  79. * state: stores state passed between bounce_buffer_{start,stop}
  80. */
  81. int bounce_buffer_stop(struct bounce_buffer *state);
  82. #endif