[U-Boot] [PATCH 2/3] common: rework bouncebuf implementation

Stephen Warren swarren at wwwdotorg.org
Tue Nov 6 20:30:26 CET 2012


On 11/05/2012 04:54 PM, Simon Glass wrote:
> Hi Stephen,
> 
> On Mon, Nov 5, 2012 at 3:04 PM, Stephen Warren <swarren at wwwdotorg.org> wrote:
>> From: Stephen Warren <swarren at nvidia.com>
>>
>> The current bouncebuf API requires all parameters to be passed to both
>> bounce_buffer_start() and bounce_buffer_stop(). This works fine when
>> both functions are called from the same place. However, Tegra's MMC
>> driver splits the data setup and post-processing steps between two
>> functions, and passing all that state around separately would be painful.
>> Modify the bouncebuf API to accept a state structure as a parameter, so
>> that only a single struct needs to be passed to both APIs.

>> diff --git a/common/bouncebuf.c b/common/bouncebuf.c

>> -int bounce_buffer_start(void **data, size_t len, void **backup, uint8_t flags)
>> +int bounce_buffer_start(struct bounce_buffer_state *state, void *data,
>> +                       size_t len, uint8_t flags)
>>  {
>> -       void *tmp;
>> -       size_t alen;
>> +       state->user_buffer = data;
>> +       state->bounce_buffer = data;
>> +       state->len = len;
>> +       state->len_aligned = roundup(len, ARCH_DMA_MINALIGN);
>> +       state->flags = flags;
>>
>> -       if (addr_aligned(*data, len)) {
>> -               *backup = NULL;
>> +       if (addr_aligned(data, len))
> 
> Maybe consider checking for data == NULL here, and return 0. This
> would allow you to remove your 'if (data)' checks in the tegra driver.
> Would need to update function description in the header file though.

That doesn't actually work out. The if (data) test in the Tegra driver
is checking whether a non-NULL "struct mmc_data *data" is passed to
Tegra's mmc_send_cmd(). That value isn't directly passed to
bounce_buffer_start(), but rather data->{src,dest}, which doesn't even
exist if (!data).


More information about the U-Boot mailing list