mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 13:43:28 +00:00
common: bouncebuf: Permit passing custom alignment check function
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@gmail.com> Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com> Cc: Masahiro Yamada <yamada.masahiro@socionext.com> Cc: Peng Fan <peng.fan@nxp.com> Cc: Simon Glass <sjg@chromium.org> Cc: Tom Rini <trini@konsulko.com>
This commit is contained in:
parent
453d21381b
commit
8074ffe335
2 changed files with 30 additions and 5 deletions
|
@ -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) {
|
||||
|
|
|
@ -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}
|
||||
|
|
Loading…
Reference in a new issue