[U-Boot] [PATCH v2 1/2] usb: align buffers at cacheline

Simon Glass sjg at chromium.org
Mon Feb 27 18:03:15 CET 2012


Hi Marek,

On Mon, Feb 27, 2012 at 8:49 AM, Marek Vasut <marex at denx.de> wrote:
>> As DMA expects the buffers to be equal and larger then
>> cache lines, This aligns buffers at cacheline.
>>
>> Signed-off-by: Puneet Saxena <puneets at nvidia.com>
>> Signed-off-by: Jim Lin <jilin at nvidia.com>
>> ---
>>
>
> First of all, thanks for this patch, it really helps. But, there are a few
> things that concern me.
>
>> Changes for V2:
>>     - Use "ARCH_DMA_MINALIGN" directly
>>     - Use "ALIGN" to align size as cacheline
>>     - Removed headers from usb.h
>>     - Send 8 bytes of device descriptor size to read
>>       Max packet size
>> scsi.h header is needed to avoid extra memcpy from local buffer
>> to global buffer.
>>
>>  common/cmd_usb.c            |    3 +-
>>  common/usb.c                |   61
>> ++++++++++++++++++++++++------------------ common/usb_storage.c        |
>> 59 +++++++++++++++++++---------------------- disk/part_dos.c             |
>>    2 +-
>>  drivers/usb/host/ehci-hcd.c |    8 +++++
>>  include/scsi.h              |    4 ++-
>>  6 files changed, 77 insertions(+), 60 deletions(-)
>>
>> diff --git a/common/cmd_usb.c b/common/cmd_usb.c
>> index 320667f..bca9d94 100644
>> --- a/common/cmd_usb.c
>> +++ b/common/cmd_usb.c
>> @@ -150,7 +150,8 @@ void usb_display_class_sub(unsigned char dclass,
>> unsigned char subclass,
>>
>>  void usb_display_string(struct usb_device *dev, int index)
>>  {
>> -     char buffer[256];
>> +     ALLOC_CACHE_ALIGN_BUFFER(char, buffer, 256);
>
> Why not memalign(), do you want to allocate on stack so badly ?

This issue came up with MMC and there was a strong request not to
sprinkle the code with malloc. In fact the macro above was devised at
some cost just to solve this problem.

[snip]
>>  {
>>       int tries;
>> -     struct usb_port_status portsts;
>> +     ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1);
>
> Looking at all this stuff, it's already allocated on stack. Ok, I already
> outlined first option -- memalign(), but that'd really put quite a strain on the
> memory allocator -- the other option (and maybe even better) is to use
> __attribute__((aligned)), which will allow the compiler to reorder data
> allocated on the stack so the array you create is aligned and not much space
> around on the stack is wasted. Apparently, ALLOC_CACHE_ALIGN_BUFFER() wastes a
> lot of space on the stack.

There was quite a bit of discussion about this related to MMC. I think
the current solution is the result of that discussion...

Regards,
Simon


More information about the U-Boot mailing list