1b660df3cSMarek Vasut /* 2b660df3cSMarek Vasut * Generic bounce buffer implementation 3b660df3cSMarek Vasut * 4b660df3cSMarek Vasut * Copyright (C) 2012 Marek Vasut <marex@denx.de> 5b660df3cSMarek Vasut * 6*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 7b660df3cSMarek Vasut */ 8b660df3cSMarek Vasut 9b660df3cSMarek Vasut #ifndef __INCLUDE_BOUNCEBUF_H__ 10b660df3cSMarek Vasut #define __INCLUDE_BOUNCEBUF_H__ 11b660df3cSMarek Vasut 1284d35b28SStephen Warren #include <linux/types.h> 1384d35b28SStephen Warren 14b660df3cSMarek Vasut /* 15b660df3cSMarek Vasut * GEN_BB_READ -- Data are read from the buffer eg. by DMA hardware. 16b660df3cSMarek Vasut * The source buffer is copied into the bounce buffer (if unaligned, otherwise 17b660df3cSMarek Vasut * the source buffer is used directly) upon start() call, then the operation 18b660df3cSMarek Vasut * requiring the aligned transfer happens, then the bounce buffer is lost upon 19b660df3cSMarek Vasut * stop() call. 20b660df3cSMarek Vasut */ 21b660df3cSMarek Vasut #define GEN_BB_READ (1 << 0) 22b660df3cSMarek Vasut /* 23b660df3cSMarek Vasut * GEN_BB_WRITE -- Data are written into the buffer eg. by DMA hardware. 24b660df3cSMarek Vasut * The source buffer starts in an undefined state upon start() call, then the 25b660df3cSMarek Vasut * operation requiring the aligned transfer happens, then the bounce buffer is 26b660df3cSMarek Vasut * copied into the destination buffer (if unaligned, otherwise destination 27b660df3cSMarek Vasut * buffer is used directly) upon stop() call. 28b660df3cSMarek Vasut */ 29b660df3cSMarek Vasut #define GEN_BB_WRITE (1 << 1) 30b660df3cSMarek Vasut /* 31b660df3cSMarek Vasut * GEN_BB_RW -- Data are read and written into the buffer eg. by DMA hardware. 32b660df3cSMarek Vasut * The source buffer is copied into the bounce buffer (if unaligned, otherwise 33b660df3cSMarek Vasut * the source buffer is used directly) upon start() call, then the operation 34b660df3cSMarek Vasut * requiring the aligned transfer happens, then the bounce buffer is copied 35b660df3cSMarek Vasut * into the destination buffer (if unaligned, otherwise destination buffer is 36b660df3cSMarek Vasut * used directly) upon stop() call. 37b660df3cSMarek Vasut */ 38b660df3cSMarek Vasut #define GEN_BB_RW (GEN_BB_READ | GEN_BB_WRITE) 39b660df3cSMarek Vasut 4084d35b28SStephen Warren struct bounce_buffer { 4184d35b28SStephen Warren /* Copy of data parameter passed to start() */ 4284d35b28SStephen Warren void *user_buffer; 4384d35b28SStephen Warren /* 4484d35b28SStephen Warren * DMA-aligned buffer. This field is always set to the value that 4584d35b28SStephen Warren * should be used for DMA; either equal to .user_buffer, or to a 4684d35b28SStephen Warren * freshly allocated aligned buffer. 4784d35b28SStephen Warren */ 4884d35b28SStephen Warren void *bounce_buffer; 4984d35b28SStephen Warren /* Copy of len parameter passed to start() */ 5084d35b28SStephen Warren size_t len; 5184d35b28SStephen Warren /* DMA-aligned buffer length */ 5284d35b28SStephen Warren size_t len_aligned; 5384d35b28SStephen Warren /* Copy of flags parameter passed to start() */ 5484d35b28SStephen Warren unsigned int flags; 5584d35b28SStephen Warren }; 5684d35b28SStephen Warren 57b660df3cSMarek Vasut /** 58b660df3cSMarek Vasut * bounce_buffer_start() -- Start the bounce buffer session 5984d35b28SStephen Warren * state: stores state passed between bounce_buffer_{start,stop} 60b660df3cSMarek Vasut * data: pointer to buffer to be aligned 61b660df3cSMarek Vasut * len: length of the buffer 62b660df3cSMarek Vasut * flags: flags describing the transaction, see above. 63b660df3cSMarek Vasut */ 6484d35b28SStephen Warren int bounce_buffer_start(struct bounce_buffer *state, void *data, 6584d35b28SStephen Warren size_t len, unsigned int flags); 66b660df3cSMarek Vasut /** 67b660df3cSMarek Vasut * bounce_buffer_stop() -- Finish the bounce buffer session 6884d35b28SStephen Warren * state: stores state passed between bounce_buffer_{start,stop} 69b660df3cSMarek Vasut */ 7084d35b28SStephen Warren int bounce_buffer_stop(struct bounce_buffer *state); 71b660df3cSMarek Vasut 72b660df3cSMarek Vasut #endif 73