[U-Boot] [PATCH v2] disk/gpt: Fix GPT Partition handling for Blocksize != 512.

2013-03-26 Thread egbert . eich
From: Egbert Eich 

Disks beyond 2T in size use blocksizes of 4096 bytes. However a lot of
code in u-boot  still assumes a 512 byte blocksize.

Signed-off-by: Egbert Eich 
---
 disk/part_efi.c|   38 ++
 include/common.h   |   11 +--
 include/part.h |4 
 include/part_efi.h |2 --
 4 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/disk/part_efi.c b/disk/part_efi.c
index b3fd0e9..ba86aa5 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -114,7 +114,7 @@ static inline int is_bootable(gpt_entry *p)
 
 void print_part_efi(block_dev_desc_t * dev_desc)
 {
-   ALLOC_CACHE_ALIGN_BUFFER(gpt_header, gpt_head, 1);
+   ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, dev_desc->blksz);
gpt_entry *gpt_pte = NULL;
int i = 0;
char uuid[37];
@@ -161,7 +161,7 @@ void print_part_efi(block_dev_desc_t * dev_desc)
 int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
disk_partition_t * info)
 {
-   ALLOC_CACHE_ALIGN_BUFFER(gpt_header, gpt_head, 1);
+   ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, dev_desc->blksz);
gpt_entry *gpt_pte = NULL;
 
/* "part" argument must be at least 1 */
@@ -189,7 +189,7 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int 
part,
/* The ending LBA is inclusive, to calculate size, add 1 to it */
info->size = ((u64)le64_to_cpu(gpt_pte[part - 1].ending_lba) + 1)
 - info->start;
-   info->blksz = GPT_BLOCK_SIZE;
+   info->blksz = dev_desc->blksz;
 
sprintf((char *)info->name, "%s",
print_efiname(&gpt_pte[part - 1]));
@@ -209,7 +209,7 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int 
part,
 
 int test_part_efi(block_dev_desc_t * dev_desc)
 {
-   ALLOC_CACHE_ALIGN_BUFFER(legacy_mbr, legacymbr, 1);
+   ALLOC_CACHE_ALIGN_BUFFER_PAD(legacy_mbr, legacymbr, 1, dev_desc->blksz);
 
/* Read legacy MBR from block 0 and validate it */
if ((dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *)legacymbr) != 1)
@@ -310,9 +310,8 @@ static int string_uuid(char *uuid, u8 *dst)
 int write_gpt_table(block_dev_desc_t *dev_desc,
gpt_header *gpt_h, gpt_entry *gpt_e)
 {
-   const int pte_blk_num = (gpt_h->num_partition_entries
-   * sizeof(gpt_entry)) / dev_desc->blksz;
-
+   const int pte_blk_cnt = BLOCK_CNT((gpt_h->num_partition_entries
+  * sizeof(gpt_entry)), dev_desc);
u32 calc_crc32;
u64 val;
 
@@ -335,8 +334,8 @@ int write_gpt_table(block_dev_desc_t *dev_desc,
if (dev_desc->block_write(dev_desc->dev, 1, 1, gpt_h) != 1)
goto err;
 
-   if (dev_desc->block_write(dev_desc->dev, 2, pte_blk_num, gpt_e)
-   != pte_blk_num)
+   if (dev_desc->block_write(dev_desc->dev, 2, pte_blk_cnt, gpt_e)
+   != pte_blk_cnt)
goto err;
 
/* recalculate the values for the Second GPT Header */
@@ -351,7 +350,7 @@ int write_gpt_table(block_dev_desc_t *dev_desc,
 
if (dev_desc->block_write(dev_desc->dev,
  le32_to_cpu(gpt_h->last_usable_lba + 1),
- pte_blk_num, gpt_e) != pte_blk_num)
+ pte_blk_cnt, gpt_e) != pte_blk_cnt)
goto err;
 
if (dev_desc->block_write(dev_desc->dev,
@@ -461,13 +460,18 @@ int gpt_restore(block_dev_desc_t *dev_desc, char 
*str_disk_guid,
 {
int ret;
 
-   gpt_header *gpt_h = calloc(1, sizeof(gpt_header));
+   gpt_header *gpt_h = calloc(1, PAD_TO_BLOCKSIZE(sizeof(gpt_header),
+  dev_desc));
+   gpt_entry *gpt_e;
+
if (gpt_h == NULL) {
printf("%s: calloc failed!\n", __func__);
return -1;
}
 
-   gpt_entry *gpt_e = calloc(GPT_ENTRY_NUMBERS, sizeof(gpt_entry));
+   gpt_e = calloc(1, PAD_TO_BLOCKSIZE(GPT_ENTRY_NUMBERS
+  * sizeof(gpt_entry),
+  dev_desc));
if (gpt_e == NULL) {
printf("%s: calloc failed!\n", __func__);
free(gpt_h);
@@ -651,7 +655,7 @@ static int is_gpt_valid(block_dev_desc_t * dev_desc, 
unsigned long long lba,
 static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc,
 gpt_header * pgpt_head)
 {
-   size_t count = 0;
+   size_t count = 0, blk_cnt;
gpt_entry *pte = NULL;
 
if (!dev_desc || !pgpt_head) {
@@ -668,7 +672,8 @@ static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * 
dev_desc,
 
/* Allocate memory for PTE, remember to FREE */
if (count != 0) {
-   pte = memalign(ARCH_DMA_MINALIGN, count);
+   pte = memalign(ARCH_DMA_MINALIGN,
+ 

[U-Boot] [Patch v2] disk/gpt: Fix GPT partition handling for blocksize != 512

2013-04-09 Thread Egbert Eich
From: Egbert Eich 

Disks beyond 2T in size use blocksizes of 4096 bytes. However a lot of
code in u-boot  still assumes a 512 byte blocksize.
This patch fixes the handling of GPTs.

Signed-off-by: Egbert Eich 
---
Changes for v2:
  - Coding style fixes.

 disk/part_efi.c| 38 ++
 include/common.h   | 11 +--
 include/part.h |  4 
 include/part_efi.h |  2 --
 4 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/disk/part_efi.c b/disk/part_efi.c
index e9987f0..5986589 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -115,7 +115,7 @@ static inline int is_bootable(gpt_entry *p)
 
 void print_part_efi(block_dev_desc_t * dev_desc)
 {
-   ALLOC_CACHE_ALIGN_BUFFER(gpt_header, gpt_head, 1);
+   ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, dev_desc->blksz);
gpt_entry *gpt_pte = NULL;
int i = 0;
char uuid[37];
@@ -162,7 +162,7 @@ void print_part_efi(block_dev_desc_t * dev_desc)
 int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
disk_partition_t * info)
 {
-   ALLOC_CACHE_ALIGN_BUFFER(gpt_header, gpt_head, 1);
+   ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, dev_desc->blksz);
gpt_entry *gpt_pte = NULL;
 
/* "part" argument must be at least 1 */
@@ -190,7 +190,7 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int 
part,
/* The ending LBA is inclusive, to calculate size, add 1 to it */
info->size = ((u64)le64_to_cpu(gpt_pte[part - 1].ending_lba) + 1)
 - info->start;
-   info->blksz = GPT_BLOCK_SIZE;
+   info->blksz = dev_desc->blksz;
 
sprintf((char *)info->name, "%s",
print_efiname(&gpt_pte[part - 1]));
@@ -210,7 +210,7 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int 
part,
 
 int test_part_efi(block_dev_desc_t * dev_desc)
 {
-   ALLOC_CACHE_ALIGN_BUFFER(legacy_mbr, legacymbr, 1);
+   ALLOC_CACHE_ALIGN_BUFFER_PAD(legacy_mbr, legacymbr, 1, dev_desc->blksz);
 
/* Read legacy MBR from block 0 and validate it */
if ((dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *)legacymbr) != 1)
@@ -311,9 +311,8 @@ static int string_uuid(char *uuid, u8 *dst)
 int write_gpt_table(block_dev_desc_t *dev_desc,
gpt_header *gpt_h, gpt_entry *gpt_e)
 {
-   const int pte_blk_num = (gpt_h->num_partition_entries
-   * sizeof(gpt_entry)) / dev_desc->blksz;
-
+   const int pte_blk_cnt = BLOCK_CNT((gpt_h->num_partition_entries
+  * sizeof(gpt_entry)), dev_desc);
u32 calc_crc32;
u64 val;
 
@@ -336,8 +335,8 @@ int write_gpt_table(block_dev_desc_t *dev_desc,
if (dev_desc->block_write(dev_desc->dev, 1, 1, gpt_h) != 1)
goto err;
 
-   if (dev_desc->block_write(dev_desc->dev, 2, pte_blk_num, gpt_e)
-   != pte_blk_num)
+   if (dev_desc->block_write(dev_desc->dev, 2, pte_blk_cnt, gpt_e)
+   != pte_blk_cnt)
goto err;
 
/* recalculate the values for the Second GPT Header */
@@ -352,7 +351,7 @@ int write_gpt_table(block_dev_desc_t *dev_desc,
 
if (dev_desc->block_write(dev_desc->dev,
  le32_to_cpu(gpt_h->last_usable_lba + 1),
- pte_blk_num, gpt_e) != pte_blk_num)
+ pte_blk_cnt, gpt_e) != pte_blk_cnt)
goto err;
 
if (dev_desc->block_write(dev_desc->dev,
@@ -462,13 +461,18 @@ int gpt_restore(block_dev_desc_t *dev_desc, char 
*str_disk_guid,
 {
int ret;
 
-   gpt_header *gpt_h = calloc(1, sizeof(gpt_header));
+   gpt_header *gpt_h = calloc(1, PAD_TO_BLOCKSIZE(sizeof(gpt_header),
+  dev_desc));
+   gpt_entry *gpt_e;
+
if (gpt_h == NULL) {
printf("%s: calloc failed!\n", __func__);
return -1;
}
 
-   gpt_entry *gpt_e = calloc(GPT_ENTRY_NUMBERS, sizeof(gpt_entry));
+   gpt_e = calloc(1, PAD_TO_BLOCKSIZE(GPT_ENTRY_NUMBERS
+  * sizeof(gpt_entry),
+  dev_desc));
if (gpt_e == NULL) {
printf("%s: calloc failed!\n", __func__);
free(gpt_h);
@@ -652,7 +656,7 @@ static int is_gpt_valid(block_dev_desc_t * dev_desc, 
unsigned long long lba,
 static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc,
 gpt_header * pgpt_head)
 {
-   size_t count = 0;
+   size_t count = 0, blk_cnt;
gpt_entry *pte = NULL;
 
if (!dev_desc || !pgpt_head) {
@@ -669,7 +673,8 @@ static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * 
dev_desc,
 
/* Allocate memory for PTE, remember to FREE */
if (count != 0) {
-   pte = memalign(ARCH_DMA_MINALI