On 4/4/20 7:45 PM, Marek Vasut wrote: > Add extended version of the bounce_buffer_start(), which permits passing in > a custom alignment checker function for the buffer. This is useful e.g. on > systems with various DMA restrictions and where the checker function might > be more complex than a simple CPU cache alignment check. > > Signed-off-by: Marek Vasut <marek.vasut+rene...@gmail.com> > Cc: Daniel Schwierzeck <daniel.schwierz...@gmail.com> > Cc: Masahiro Yamada <yamada.masah...@socionext.com> > Cc: Peng Fan <peng....@nxp.com> > Cc: Simon Glass <s...@chromium.org> > Cc: Tom Rini <tr...@konsulko.com> > --- > V2: No change > --- > common/bouncebuf.c | 20 +++++++++++++++----- > include/bouncebuf.h | 15 +++++++++++++++ > 2 files changed, 30 insertions(+), 5 deletions(-) > > diff --git a/common/bouncebuf.c b/common/bouncebuf.c > index 614eb36c78..0ace152b98 100644 > --- a/common/bouncebuf.c > +++ b/common/bouncebuf.c > @@ -31,17 +31,19 @@ static int addr_aligned(struct bounce_buffer *state) > return 1; > } > > -int bounce_buffer_start(struct bounce_buffer *state, void *data, > - size_t len, unsigned int flags) > +int bounce_buffer_start_extalign(struct bounce_buffer *state, void *data, > + size_t len, unsigned int flags, > + size_t alignment, > + int (*addr_is_aligned)(struct bounce_buffer > *state)) > { > state->user_buffer = data; > state->bounce_buffer = data; > state->len = len; > - state->len_aligned = roundup(len, ARCH_DMA_MINALIGN); > + state->len_aligned = roundup(len, alignment); > state->flags = flags; > > - if (!addr_aligned(state)) { > - state->bounce_buffer = memalign(ARCH_DMA_MINALIGN, > + if (!addr_is_aligned(state)) {
how about checking condition whether addr_is_aligned function is present or not at here? Best Regards, Jaehoon Chung > + state->bounce_buffer = memalign(alignment, > state->len_aligned); > if (!state->bounce_buffer) > return -ENOMEM; > @@ -62,6 +64,14 @@ int bounce_buffer_start(struct bounce_buffer *state, void > *data, > return 0; > } > > +int bounce_buffer_start(struct bounce_buffer *state, void *data, > + size_t len, unsigned int flags) > +{ > + return bounce_buffer_start_extalign(state, data, len, flags, > + ARCH_DMA_MINALIGN, > + addr_aligned); > +} > + > int bounce_buffer_stop(struct bounce_buffer *state) > { > if (state->flags & GEN_BB_WRITE) { > diff --git a/include/bouncebuf.h b/include/bouncebuf.h > index fd9b0f3b28..7427bd12e2 100644 > --- a/include/bouncebuf.h > +++ b/include/bouncebuf.h > @@ -62,6 +62,21 @@ struct bounce_buffer { > */ > int bounce_buffer_start(struct bounce_buffer *state, void *data, > size_t len, unsigned int flags); > + > +/** > + * bounce_buffer_start() -- Start the bounce buffer session with external > align check function > + * state: stores state passed between bounce_buffer_{start,stop} > + * data: pointer to buffer to be aligned > + * len: length of the buffer > + * flags: flags describing the transaction, see above. > + * alignment: alignment of the newly allocated bounce buffer > + * addr_is_aligned: function for checking the alignment instead of the > default one > + */ > +int bounce_buffer_start_extalign(struct bounce_buffer *state, void *data, > + size_t len, unsigned int flags, > + size_t alignment, > + int (*addr_is_aligned)(struct bounce_buffer > *state)); > + > /** > * bounce_buffer_stop() -- Finish the bounce buffer session > * state: stores state passed between bounce_buffer_{start,stop} >