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 25 #ifndef __INCLUDE_BOUNCEBUF_H__ 26 #define __INCLUDE_BOUNCEBUF_H__ 27 28 #include <linux/types.h> 29 30 /* 31 * GEN_BB_READ -- Data are read from the buffer eg. by DMA hardware. 32 * The source buffer is copied into the bounce buffer (if unaligned, otherwise 33 * the source buffer is used directly) upon start() call, then the operation 34 * requiring the aligned transfer happens, then the bounce buffer is lost upon 35 * stop() call. 36 */ 37 #define GEN_BB_READ (1 << 0) 38 /* 39 * GEN_BB_WRITE -- Data are written into the buffer eg. by DMA hardware. 40 * The source buffer starts in an undefined state upon start() call, then the 41 * operation requiring the aligned transfer happens, then the bounce buffer is 42 * copied into the destination buffer (if unaligned, otherwise destination 43 * buffer is used directly) upon stop() call. 44 */ 45 #define GEN_BB_WRITE (1 << 1) 46 /* 47 * GEN_BB_RW -- Data are read and written into the buffer eg. by DMA hardware. 48 * The source buffer is copied into the bounce buffer (if unaligned, otherwise 49 * the source buffer is used directly) upon start() call, then the operation 50 * requiring the aligned transfer happens, then the bounce buffer is copied 51 * into the destination buffer (if unaligned, otherwise destination buffer is 52 * used directly) upon stop() call. 53 */ 54 #define GEN_BB_RW (GEN_BB_READ | GEN_BB_WRITE) 55 56 struct bounce_buffer { 57 /* Copy of data parameter passed to start() */ 58 void *user_buffer; 59 /* 60 * DMA-aligned buffer. This field is always set to the value that 61 * should be used for DMA; either equal to .user_buffer, or to a 62 * freshly allocated aligned buffer. 63 */ 64 void *bounce_buffer; 65 /* Copy of len parameter passed to start() */ 66 size_t len; 67 /* DMA-aligned buffer length */ 68 size_t len_aligned; 69 /* Copy of flags parameter passed to start() */ 70 unsigned int flags; 71 }; 72 73 /** 74 * bounce_buffer_start() -- Start the bounce buffer session 75 * state: stores state passed between bounce_buffer_{start,stop} 76 * data: pointer to buffer to be aligned 77 * len: length of the buffer 78 * flags: flags describing the transaction, see above. 79 */ 80 int bounce_buffer_start(struct bounce_buffer *state, void *data, 81 size_t len, unsigned int flags); 82 /** 83 * bounce_buffer_stop() -- Finish the bounce buffer session 84 * state: stores state passed between bounce_buffer_{start,stop} 85 */ 86 int bounce_buffer_stop(struct bounce_buffer *state); 87 88 #endif 89