[U-Boot] [PATCH 1/2] Flatten and solidify block_dev_desc layout
Che-Liang Chiou
clchiou at chromium.org
Fri Oct 21 08:31:47 CEST 2011
The block_dev_desc struct has #ifdef on lba48 and variable-size on lba
and so its layout varies from config to config. At least part_efi.c has
partially complained about this.
This patch makes lba48 be always defined and lba be fixed to largest
size that an LBA would need so that the block_dev_desc layout would be
an invariant with respect to configurations.
Doing so would waste a few extra bytes per struct block_dev_desc, which
I believe is not critical.
Signed-off-by: Che-Liang Chiou <clchiou at chromium.org>
---
disk/part_dos.c | 2 +-
disk/part_efi.c | 4 +---
drivers/mmc/mmc.c | 4 ++--
drivers/mmc/pxa_mmc.c | 2 +-
include/part.h | 4 +---
5 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/disk/part_dos.c b/disk/part_dos.c
index b5bcb37..a0938db 100644
--- a/disk/part_dos.c
+++ b/disk/part_dos.c
@@ -119,7 +119,7 @@ static void print_partition_extended (block_dev_desc_t *dev_desc, int ext_part_s
return;
}
if(i==DOS_PBR) {
- printf (" 1\t\t 0\t%10ld\t%2x\n",
+ printf (" 1\t\t 0\t%10lld\t%2x\n",
dev_desc->lba, buffer[DOS_PBR_MEDIA_TYPE_OFFSET]);
return;
}
diff --git a/disk/part_efi.c b/disk/part_efi.c
index 0a513c6..e779dc1 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -22,10 +22,8 @@
*/
/*
- * Problems with CONFIG_SYS_64BIT_LBA:
- *
* struct disk_partition.start in include/part.h is sized as ulong.
- * When CONFIG_SYS_64BIT_LBA is activated, lbaint_t changes from ulong to uint64_t.
+ * struct block_dev_desc.lba in the same header is sized as uint64_t.
* For now, it is cast back to ulong at assignment.
*
* This limits the maximum size of addressable storage to < 2 Terra Bytes
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 391bc2b..c17e495 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -265,7 +265,7 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
int timeout = 1000;
if ((start + blkcnt) > mmc->block_dev.lba) {
- printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
+ printf("MMC: block number 0x%lx exceeds max(0x%llx)\n",
start + blkcnt, mmc->block_dev.lba);
return 0;
}
@@ -393,7 +393,7 @@ static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst)
return 0;
if ((start + blkcnt) > mmc->block_dev.lba) {
- printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
+ printf("MMC: block number 0x%lx exceeds max(0x%llx)\n",
start + blkcnt, mmc->block_dev.lba);
return 0;
}
diff --git a/drivers/mmc/pxa_mmc.c b/drivers/mmc/pxa_mmc.c
index 48e21ef..67c33d4 100644
--- a/drivers/mmc/pxa_mmc.c
+++ b/drivers/mmc/pxa_mmc.c
@@ -541,7 +541,7 @@ static void mmc_decode_csd(uint32_t * resp)
mmc_dev.removable = 0;
mmc_dev.block_read = mmc_bread;
- printf("Detected: %lu blocks of %lu bytes (%luMB) ",
+ printf("Detected: %llu blocks of %lu bytes (%lluMB) ",
mmc_dev.lba,
mmc_dev.blksz,
mmc_dev.lba * mmc_dev.blksz / (1024 * 1024));
diff --git a/include/part.h b/include/part.h
index 1827767..be0a22e 100644
--- a/include/part.h
+++ b/include/part.h
@@ -33,10 +33,8 @@ typedef struct block_dev_desc {
unsigned char lun; /* target LUN */
unsigned char type; /* device type */
unsigned char removable; /* removable device */
-#ifdef CONFIG_LBA48
unsigned char lba48; /* device can use 48bit addr (ATA/ATAPI v7) */
-#endif
- lbaint_t lba; /* number of blocks */
+ uint64_t lba; /* number of blocks */
unsigned long blksz; /* block size */
char vendor [40+1]; /* IDE model, SCSI Vendor */
char product[20+1]; /* IDE Serial no, SCSI product */
--
1.7.3.1
More information about the U-Boot
mailing list