Message ID | 20200404104506.386314-1-marek.vasut+renesas@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | [V2,1/5] common: bouncebuf: Permit passing custom alignment check function | expand |
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+renesas at gmail.com> > Cc: Daniel Schwierzeck <daniel.schwierzeck at gmail.com> > Cc: Masahiro Yamada <yamada.masahiro at socionext.com> > Cc: Peng Fan <peng.fan at nxp.com> > Cc: Simon Glass <sjg at chromium.org> > Cc: Tom Rini <trini at 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} >
On 4/6/20 4:58 AM, Jaehoon Chung wrote: > 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+renesas at gmail.com> >> Cc: Daniel Schwierzeck <daniel.schwierzeck at gmail.com> >> Cc: Masahiro Yamada <yamada.masahiro at socionext.com> >> Cc: Peng Fan <peng.fan at nxp.com> >> Cc: Simon Glass <sjg at chromium.org> >> Cc: Tom Rini <trini at 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? If it's not present, then you're misusing this function.
On 4/6/20 7:55 PM, Marek Vasut wrote: > On 4/6/20 4:58 AM, Jaehoon Chung wrote: >> 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+renesas at gmail.com> >>> Cc: Daniel Schwierzeck <daniel.schwierzeck at gmail.com> >>> Cc: Masahiro Yamada <yamada.masahiro at socionext.com> >>> Cc: Peng Fan <peng.fan at nxp.com> >>> Cc: Simon Glass <sjg at chromium.org> >>> Cc: Tom Rini <trini at 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? > > If it's not present, then you're misusing this function. Right, i'm misusing this function at that case. But i think that someone can do it like me. It's just my opinion. :) Best Regards, Jaehoon Chung > >
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)) { + 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}
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+renesas at gmail.com> Cc: Daniel Schwierzeck <daniel.schwierzeck at gmail.com> Cc: Masahiro Yamada <yamada.masahiro at socionext.com> Cc: Peng Fan <peng.fan at nxp.com> Cc: Simon Glass <sjg at chromium.org> Cc: Tom Rini <trini at konsulko.com> --- V2: No change --- common/bouncebuf.c | 20 +++++++++++++++----- include/bouncebuf.h | 15 +++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-)