
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