[U-Boot] [PATCH 7/8] mtd/nand/ubi: assortment of alignment fixes

Marek Vasut
2015-07-03T13:44:05Z

On Thursday, July 02, 2015 at 11:35:19 PM, Scott Wood wrote:
> On Thu, 2015-07-02 at 07:53 +0200, Marek Vasut wrote:
> > On Thursday, July 02, 2015 at 01:04:52 AM, Marcel Ziswiler wrote:
> > > From: Marcel Ziswiler <marcel.ziswiler@toradex.com>
> > >
> > > Various U-Boot adoptions/extensions to MTD/NAND/UBI did not take buffer
> > > alignment into account which led to failures of the following form:
> > >
> > > ERROR: v7_dcache_inval_range - start address is not aligned -
> > > 0x1f7f0108 ERROR: v7_dcache_inval_range - stop address is not aligned
> > > - 0x1f7f1108
> > >
> > > Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
> >
> > What about using ALLOC_CACHE_ALIGN_BUFFER() and friends instead ? See
> > include/common.h for their definition, this is what those functions are
> > exactly for.
>
> ALLOC_CACHE_ALIGN_BUFFER() is for statically allocating an aligned buffer.

You're confusing this with DEFINE_ALIGN_BUFFER, no ?

> Dynamically allocating an aligned buffer is exactly what memalign() is for.

Isn't memalign()ed memory aligned only to the start address, while the end
address (and thus the length) is not aligned ? This is what memalign(3) has
to say:

"
The function posix_memalign() allocates size bytes and places the
address of the allocated memory in *memptr. The address of the
allo? cated memory will be a multiple of alignment, which must
be a power of two and a multiple of sizeof(void *). If size is 0,
then the value placed in *memptr is either NULL, or a unique pointer
value that can later be successfully passed to free(3).

The obsolete function memalign() allocates size bytes and returns a
pointer to the allocated memory. The memory address will be a mul?
tiple of alignment, which must be a power of two.
"

Best regards,
Marek Vasut