diff options
author | Lukasz Majewski <lukma@denx.de> | 2017-10-27 12:28:10 +0200 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2017-11-06 09:59:01 -0500 |
commit | bb021013ba1ea4f7ade55ed932ab9d807e8a09ea (patch) | |
tree | 8ccc5708fd1741fa62e472b8423bc2a22e3d80b4 /disk | |
parent | 76b9cbab25f832a25e51c50a221c0f1ff3632b7c (diff) | |
download | u-boot-bb021013ba1ea4f7ade55ed932ab9d807e8a09ea.tar.gz |
gpt: Use cache aligned buffers for gpt_h and gpt_e
Before this patch one could receive following errors when executing
"gpt write" command on machine with cache enabled:
display5 factory > gpt write mmc ${mmcdev} ${partitions}
Writing GPT:
CACHE: Misaligned operation at range [4ef8f7f0, 4ef8f9f0]
CACHE: Misaligned operation at range [4ef8f9f8, 4ef939f8]
CACHE: Misaligned operation at range [4ef8f9f8, 4ef939f8]
CACHE: Misaligned operation at range [4ef8f7f0, 4ef8f9f0]
success!
To alleviate this problem - the calloc()s have been replaced with
malloc_cache_aligned() and memset().
After those changes the buffers are properly aligned (with both start
address and size) to SoC cache line.
Signed-off-by: Lukasz Majewski <lukma@denx.de>
Diffstat (limited to 'disk')
-rw-r--r-- | disk/part_efi.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/disk/part_efi.c b/disk/part_efi.c index 7862beeea6..f6f5bee8cd 100644 --- a/disk/part_efi.c +++ b/disk/part_efi.c @@ -622,25 +622,27 @@ int gpt_fill_header(struct blk_desc *dev_desc, gpt_header *gpt_h, int gpt_restore(struct blk_desc *dev_desc, char *str_disk_guid, disk_partition_t *partitions, int parts_count) { - int ret; - - gpt_header *gpt_h = calloc(1, PAD_TO_BLOCKSIZE(sizeof(gpt_header), - dev_desc)); + gpt_header *gpt_h; gpt_entry *gpt_e; + int ret, size; + size = PAD_TO_BLOCKSIZE(sizeof(gpt_header), dev_desc); + gpt_h = malloc_cache_aligned(size); if (gpt_h == NULL) { printf("%s: calloc failed!\n", __func__); return -1; } + memset(gpt_h, 0, size); - gpt_e = calloc(1, PAD_TO_BLOCKSIZE(GPT_ENTRY_NUMBERS - * sizeof(gpt_entry), - dev_desc)); + size = PAD_TO_BLOCKSIZE(GPT_ENTRY_NUMBERS * sizeof(gpt_entry), + dev_desc); + gpt_e = malloc_cache_aligned(size); if (gpt_e == NULL) { printf("%s: calloc failed!\n", __func__); free(gpt_h); return -1; } + memset(gpt_e, 0, size); /* Generate Primary GPT header (LBA1) */ ret = gpt_fill_header(dev_desc, gpt_h, str_disk_guid, parts_count); |