[U-Boot] [PATCH] LaCie kirkwood boards: allow disk > 2TB

From: Frédéric Leroy fredo@starox.org
For big disk support, we need LBA addressing on 64 bits --- include/configs/lacie_kw.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/configs/lacie_kw.h b/include/configs/lacie_kw.h index 09b5798..847afcd 100644 --- a/include/configs/lacie_kw.h +++ b/include/configs/lacie_kw.h @@ -111,6 +111,7 @@ #define CONFIG_ENV_SPI_MAX_HZ 20000000 /* 20Mhz */ #define CONFIG_SYS_IDE_MAXBUS 1 #define CONFIG_SYS_IDE_MAXDEVICE 1 +#define CONFIG_SYS_64BIT_LBA /* Allow disk > 2.1TB */ #if defined(CONFIG_D2NET_V2) #define CONFIG_SYS_PROMPT "d2v2> " #elif defined(CONFIG_NET2BIG_V2)

On Mon, Jun 10, 2013 at 03:30:53PM +0200, Frederic Leroy wrote:
From: Frédéric Leroy fredo@starox.org
For big disk support, we need LBA addressing on 64 bits
include/configs/lacie_kw.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/configs/lacie_kw.h b/include/configs/lacie_kw.h index 09b5798..847afcd 100644 --- a/include/configs/lacie_kw.h +++ b/include/configs/lacie_kw.h @@ -111,6 +111,7 @@ #define CONFIG_ENV_SPI_MAX_HZ 20000000 /* 20Mhz */ #define CONFIG_SYS_IDE_MAXBUS 1 #define CONFIG_SYS_IDE_MAXDEVICE 1 +#define CONFIG_SYS_64BIT_LBA /* Allow disk > 2.1TB */
Hi Frederic,
I see a comment at disk/part_efi.c:25. It claims that maximum size of addressable storage is limited to 2TB even with CONFIG_SYS_64BIT_LBA enabled. Is that not true anymore ?
Regards,
Simon
#if defined(CONFIG_D2NET_V2) #define CONFIG_SYS_PROMPT "d2v2> "
#elif defined(CONFIG_NET2BIG_V2)
1.8.1.2

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Le 10/06/2013 15:44, Simon Guinot a écrit :
On Mon, Jun 10, 2013 at 03:30:53PM +0200, Frederic Leroy wrote:
From: Frédéric Leroy fredo@starox.org
For big disk support, we need LBA addressing on 64 bits
include/configs/lacie_kw.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/configs/lacie_kw.h b/include/configs/lacie_kw.h index 09b5798..847afcd 100644 --- a/include/configs/lacie_kw.h +++ b/include/configs/lacie_kw.h @@ -111,6 +111,7 @@ #define CONFIG_ENV_SPI_MAX_HZ 20000000 /* 20Mhz */ #define CONFIG_SYS_IDE_MAXBUS 1 #define CONFIG_SYS_IDE_MAXDEVICE 1 +#define CONFIG_SYS_64BIT_LBA /* Allow disk > 2.1TB */
Hi Frederic,
I see a comment at disk/part_efi.c:25. It claims that maximum size of addressable storage is limited to 2TB even with CONFIG_SYS_64BIT_LBA enabled. Is that not true anymore ?
I didn't see this comment. With my patch, the "ide reset" command recognize nicely a 3TB harddrive. Else, it reports the size % 2TB and then u-boot reports error in the GPT.
I can read the GPT and boot from a loaded file from the first partition. However, an "ext2ls" on a partition at the end of the disk outputs garbage.
At least, the patch allow to use the first 2 TB for booting.
Regards,
- -- Frédéric

On Mon, Jun 10, 2013 at 04:20:49PM +0200, Frédéric Leroy wrote:
Le 10/06/2013 15:44, Simon Guinot a écrit :
On Mon, Jun 10, 2013 at 03:30:53PM +0200, Frederic Leroy wrote:
From: Frédéric Leroy fredo@starox.org
For big disk support, we need LBA addressing on 64 bits
include/configs/lacie_kw.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/configs/lacie_kw.h b/include/configs/lacie_kw.h index 09b5798..847afcd 100644 --- a/include/configs/lacie_kw.h +++ b/include/configs/lacie_kw.h @@ -111,6 +111,7 @@ #define CONFIG_ENV_SPI_MAX_HZ 20000000 /* 20Mhz */ #define CONFIG_SYS_IDE_MAXBUS 1 #define CONFIG_SYS_IDE_MAXDEVICE 1 +#define CONFIG_SYS_64BIT_LBA /* Allow disk > 2.1TB */
Hi Frederic,
I see a comment at disk/part_efi.c:25. It claims that maximum size of addressable storage is limited to 2TB even with CONFIG_SYS_64BIT_LBA enabled. Is that not true anymore ?
I didn't see this comment. With my patch, the "ide reset" command recognize nicely a 3TB harddrive. Else, it reports the size % 2TB and then u-boot reports error in the GPT.
I can read the GPT and boot from a loaded file from the first partition. However, an "ext2ls" on a partition at the end of the disk outputs garbage.
At least, the patch allow to use the first 2 TB for booting.
Acked-by: Simon Guinot simon.guinot@sequanux.org
I add Prafulla to the Cc recipient. He is the one who will pick your patch eventually.
Regards,
Simon

Hi Simon,
On Mon, 10 Jun 2013 16:29:26 +0200, Simon Guinot simon.guinot@sequanux.org wrote:
On Mon, Jun 10, 2013 at 04:20:49PM +0200, Frédéric Leroy wrote:
Le 10/06/2013 15:44, Simon Guinot a écrit :
On Mon, Jun 10, 2013 at 03:30:53PM +0200, Frederic Leroy wrote:
From: Frédéric Leroy fredo@starox.org
For big disk support, we need LBA addressing on 64 bits
include/configs/lacie_kw.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/configs/lacie_kw.h b/include/configs/lacie_kw.h index 09b5798..847afcd 100644 --- a/include/configs/lacie_kw.h +++ b/include/configs/lacie_kw.h @@ -111,6 +111,7 @@ #define CONFIG_ENV_SPI_MAX_HZ 20000000 /* 20Mhz */ #define CONFIG_SYS_IDE_MAXBUS 1 #define CONFIG_SYS_IDE_MAXDEVICE 1 +#define CONFIG_SYS_64BIT_LBA /* Allow disk > 2.1TB */
Hi Frederic,
I see a comment at disk/part_efi.c:25. It claims that maximum size of addressable storage is limited to 2TB even with CONFIG_SYS_64BIT_LBA enabled. Is that not true anymore ?
I didn't see this comment. With my patch, the "ide reset" command recognize nicely a 3TB harddrive. Else, it reports the size % 2TB and then u-boot reports error in the GPT.
I can read the GPT and boot from a loaded file from the first partition. However, an "ext2ls" on a partition at the end of the disk outputs garbage.
At least, the patch allow to use the first 2 TB for booting.
Acked-by: Simon Guinot simon.guinot@sequanux.org
I add Prafulla to the Cc recipient. He is the one who will pick your patch eventually.
Not necessarily, as this is only a target configuration change, not a SoC change -- actually, nothing in the patch is related to Marvell SoCs. This patch could go directly in mainline even, but usually I do the picking up if it's an ARM target.
Regards,
Simon
Amicalement,

Hi Frederic,
On Mon, 10 Jun 2013 15:30:53 +0200, Frederic Leroy fredo@starox.org wrote:
From: Frédéric Leroy fredo@starox.org
For big disk support, we need LBA addressing on 64 bits
include/configs/lacie_kw.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/configs/lacie_kw.h b/include/configs/lacie_kw.h index 09b5798..847afcd 100644 --- a/include/configs/lacie_kw.h +++ b/include/configs/lacie_kw.h @@ -111,6 +111,7 @@ #define CONFIG_ENV_SPI_MAX_HZ 20000000 /* 20Mhz */ #define CONFIG_SYS_IDE_MAXBUS 1 #define CONFIG_SYS_IDE_MAXDEVICE 1 +#define CONFIG_SYS_64BIT_LBA /* Allow disk > 2.1TB */ #if defined(CONFIG_D2NET_V2) #define CONFIG_SYS_PROMPT "d2v2> " #elif defined(CONFIG_NET2BIG_V2)
With gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) this patch causes the following warning for all boards:
cmd_ide.c:992:4: warning: right shift count >= width of type [enabled by default]
Amicalement,

Le 13/06/2013 13:33, Albert ARIBAUD a écrit :
With gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) this patch causes the following warning for all boards:
cmd_ide.c:992:4: warning: right shift count >= width of type [enabled by default]
Amicalement,
I will convert every ide block number to 64 bit for disk and partitions. I guess CONFIG_LBA48 is also broken in common/cmd_ide.c :
ulong ide_write(int device, ulong blknr, lbaint_t blkcnt, const void *buffer) { ulong n = 0; unsigned char c;
#ifdef CONFIG_LBA48 unsigned char lba48 = 0;
if (blknr & 0x0000fffff0000000ULL) { <= issue /* more than 28 bits used, use 48bit mode */ lba48 = 1; } #endif
I hope this won't break anything, it is a big change impacting everybody :(
Sincèrement,

Hi Frédéric,
On Thu, 13 Jun 2013 15:03:49 +0200, Frédéric Leroy fredo@starox.org wrote:
Le 13/06/2013 13:33, Albert ARIBAUD a écrit :
With gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) this patch causes the following warning for all boards:
cmd_ide.c:992:4: warning: right shift count >= width of type [enabled by default]
Amicalement,
I will convert every ide block number to 64 bit for disk and partitions.
Be careful that some struct fields representing sector / block number might be 32-bit for an external reason, e.g. in partition tables.
I guess CONFIG_LBA48 is also broken in common/cmd_ide.c :
ulong ide_write(int device, ulong blknr, lbaint_t blkcnt, const void *buffer) { ulong n = 0; unsigned char c;
#ifdef CONFIG_LBA48 unsigned char lba48 = 0;
if (blknr & 0x0000fffff0000000ULL) { <= issue /* more than 28 bits used, use 48bit mode */ lba48 = 1; }
#endif
How is this broken exactly, and what is the fix?
I hope this won't break anything, it is a big change impacting everybody :(
It would affect everybody but within a well-delimited feature, which is disk access. Tests on a few targets with disks of various sizes should be enough.
Sincèrement,
Amicalement,

Le 13/06/2013 15:21, Albert ARIBAUD a écrit :
I guess CONFIG_LBA48 is also broken in common/cmd_ide.c :
ulong ide_write(int device, ulong blknr, lbaint_t blkcnt, const void *buffer) { ulong n = 0; unsigned char c;
#ifdef CONFIG_LBA48 unsigned char lba48 = 0;
if (blknr & 0x0000fffff0000000ULL) { <= issue /* more than 28 bits used, use 48bit mode */ lba48 = 1; }
#endif
How is this broken exactly, and what is the fix?
If you have a device with 0x100000000 blocks and a target architecture with sizeof(ulong)=32, then it will fail to switch to lba48. The right thing to do is to use lbaint_t instead of ulong blknr.

Frédéric Leroy fredo@starox.org writes:
I will convert every ide block number to 64 bit for disk and partitions. I guess CONFIG_LBA48 is also broken in common/cmd_ide.c :
FWIW, I have a patch pending for this already. But it's necessarily pretty invasive and I'm not even sure yet that I've found all places that need to be adapted. It works fine on CuBox Pro and builds without warnings for all ARM boards and sandbox (or at least MAKEALL succeeds with -Werror added to a few places).
Not sure whether I'll get around to working on it this weekend, but I'll try to at least post the patch tomorrow so others can test it.
Sascha

With CONFIG_SYS_64BIT_LBA, lbaint_t gets defined as a 64-bit type, which is required to represent block numbers for storage devices that exceed 2TiB (the block size usually is 512B), e.g. recent hard drives.
For some obscure reason, the current U-Boot code uses lbaint_t for the number of blocks to read (a rather optimistic estimation of how RAM sizes will evolve), but not for the starting address. Trying to access blocks beyond the 2TiB boundary will simply wrap around and read a block within the 0..2TiB range.
We now use lbaint_t for block start addresses, too. This required changes to all block drivers as the signature of block_read(), block_write() and block_erase() in block_dev_desc_t changed.
Signed-off-by: Sascha Silbe t-uboot@infra-silbe.de --- Functionality tested on CuBox Pro with a Western Digital WD30EFRX hard disk (3TB). Build tested for all arm boards and sandbox.
Testing on other boards and architectures would be appreciated.
Fixes for typos, style errors etc. are explicitly out of scope for this patch, even those checkpatch complains about because they appear on or near lines touched by the patch. They are unrelated to the issue at hand and can be fixed up later. Mixing in unrelated changes would just make harder to revert any problematic change.
common/cmd_ide.c | 14 +++++++------- common/usb_storage.c | 8 ++++---- drivers/mmc/mmc.c | 17 +++++++++-------- include/ide.h | 5 +++-- include/part.h | 6 +++--- 5 files changed, 26 insertions(+), 24 deletions(-)
diff --git a/common/cmd_ide.c b/common/cmd_ide.c index 78b4aa7..59e95df 100644 --- a/common/cmd_ide.c +++ b/common/cmd_ide.c @@ -830,7 +830,7 @@ static void ide_ident(block_dev_desc_t *dev_desc)
/* ------------------------------------------------------------------------- */
-ulong ide_read(int device, ulong blknr, lbaint_t blkcnt, void *buffer) +ulong ide_read(int device, lbaint_t blknr, lbaint_t blkcnt, void *buffer) { ulong n = 0; unsigned char c; @@ -844,7 +844,7 @@ ulong ide_read(int device, ulong blknr, lbaint_t blkcnt, void *buffer) lba48 = 1; } #endif - debug("ide_read dev %d start %lX, blocks " LBAF " buffer at %lX\n", + debug("ide_read dev %d start " LBAF ", blocks " LBAF " buffer at %lX\n", device, blknr, blkcnt, (ulong) buffer);
ide_led(DEVICE_LED(device), 1); /* LED on */ @@ -934,8 +934,8 @@ ulong ide_read(int device, ulong blknr, lbaint_t blkcnt, void *buffer)
if ((c & (ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR)) != ATA_STAT_DRQ) { - printf("Error (no IRQ) dev %d blk %ld: status %#02x\n", - device, blknr, c); + printf("Error (no IRQ) dev %d blk " LBAF ": status " + "%#02x\n", device, blknr, c); break; }
@@ -954,7 +954,7 @@ IDE_READ_E: /* ------------------------------------------------------------------------- */
-ulong ide_write(int device, ulong blknr, lbaint_t blkcnt, const void *buffer) +ulong ide_write(int device, lbaint_t blknr, lbaint_t blkcnt, const void *buffer) { ulong n = 0; unsigned char c; @@ -1022,8 +1022,8 @@ ulong ide_write(int device, ulong blknr, lbaint_t blkcnt, const void *buffer)
if ((c & (ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR)) != ATA_STAT_DRQ) { - printf("Error (no IRQ) dev %d blk %ld: status %#02x\n", - device, blknr, c); + printf("Error (no IRQ) dev %d blk " LBAF ": status " + "%#02x\n", device, blknr, c); goto WR_OUT; }
diff --git a/common/usb_storage.c b/common/usb_storage.c index 457970f..4599d03 100644 --- a/common/usb_storage.c +++ b/common/usb_storage.c @@ -170,9 +170,9 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *us, block_dev_desc_t *dev_desc); int usb_storage_probe(struct usb_device *dev, unsigned int ifnum, struct us_data *ss); -unsigned long usb_stor_read(int device, unsigned long blknr, +unsigned long usb_stor_read(int device, lbaint_t blknr, lbaint_t blkcnt, void *buffer); -unsigned long usb_stor_write(int device, unsigned long blknr, +unsigned long usb_stor_write(int device, lbaint_t blknr, lbaint_t blkcnt, const void *buffer); struct usb_device * usb_get_dev_index(int index); void uhci_show_temp_int_td(void); @@ -1054,7 +1054,7 @@ static void usb_bin_fixup(struct usb_device_descriptor descriptor, } #endif /* CONFIG_USB_BIN_FIXUP */
-unsigned long usb_stor_read(int device, unsigned long blknr, +unsigned long usb_stor_read(int device, lbaint_t blknr, lbaint_t blkcnt, void *buffer) { lbaint_t start, blks; @@ -1127,7 +1127,7 @@ retry_it: return blkcnt; }
-unsigned long usb_stor_write(int device, unsigned long blknr, +unsigned long usb_stor_write(int device, lbaint_t blknr, lbaint_t blkcnt, const void *buffer) { lbaint_t start, blks; diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 0a2f535..3b01434 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -254,7 +254,7 @@ err_out: }
static unsigned long -mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt) +mmc_berase(int dev_num, lbaint_t start, lbaint_t blkcnt) { int err = 0; struct mmc *mmc = find_mmc_device(dev_num); @@ -266,7 +266,8 @@ mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt)
if ((start % mmc->erase_grp_size) || (blkcnt % mmc->erase_grp_size)) printf("\n\nCaution! Your devices Erase group is 0x%x\n" - "The erase range would be change to 0x%lx~0x%lx\n\n", + "The erase range would be change to " + "0x" LBAF "~0x" LBAF "\n\n", mmc->erase_grp_size, start & ~(mmc->erase_grp_size - 1), ((start + blkcnt + mmc->erase_grp_size) & ~(mmc->erase_grp_size - 1)) - 1); @@ -289,14 +290,14 @@ mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt) }
static ulong -mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src) +mmc_write_blocks(struct mmc *mmc, lbaint_t start, lbaint_t blkcnt, const void*src) { struct mmc_cmd cmd; struct mmc_data data; 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" LBAF " exceeds max(0x" LBAF ")\n", start + blkcnt, mmc->block_dev.lba); return 0; } @@ -344,7 +345,7 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src) }
static ulong -mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src) +mmc_bwrite(int dev_num, lbaint_t start, lbaint_t blkcnt, const void*src) { lbaint_t cur, blocks_todo = blkcnt;
@@ -367,7 +368,7 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src) return blkcnt; }
-static int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, +static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start, lbaint_t blkcnt) { struct mmc_cmd cmd; @@ -406,7 +407,7 @@ static int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, return blkcnt; }
-static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst) +static ulong mmc_bread(int dev_num, lbaint_t start, lbaint_t blkcnt, void *dst) { lbaint_t cur, blocks_todo = blkcnt;
@@ -418,7 +419,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" LBAF " exceeds max(0x" LBAF ")\n", start + blkcnt, mmc->block_dev.lba); return 0; } diff --git a/include/ide.h b/include/ide.h index afea85c..f691a74 100644 --- a/include/ide.h +++ b/include/ide.h @@ -54,8 +54,9 @@ typedef ulong lbaint_t; */
void ide_init(void); -ulong ide_read(int device, ulong blknr, lbaint_t blkcnt, void *buffer); -ulong ide_write(int device, ulong blknr, lbaint_t blkcnt, const void *buffer); +ulong ide_read(int device, lbaint_t blknr, lbaint_t blkcnt, void *buffer); +ulong ide_write(int device, lbaint_t blknr, lbaint_t blkcnt, + const void *buffer);
#ifdef CONFIG_IDE_PREINIT int ide_preinit(void); diff --git a/include/part.h b/include/part.h index f7c7cc5..35c1c5b 100644 --- a/include/part.h +++ b/include/part.h @@ -43,15 +43,15 @@ typedef struct block_dev_desc { char product[20+1]; /* IDE Serial no, SCSI product */ char revision[8+1]; /* firmware revision */ unsigned long (*block_read)(int dev, - unsigned long start, + lbaint_t start, lbaint_t blkcnt, void *buffer); unsigned long (*block_write)(int dev, - unsigned long start, + lbaint_t start, lbaint_t blkcnt, const void *buffer); unsigned long (*block_erase)(int dev, - unsigned long start, + lbaint_t start, lbaint_t blkcnt); void *priv; /* driver private struct pointer */ }block_dev_desc_t;

Hello Sascha,
With CONFIG_SYS_64BIT_LBA, lbaint_t gets defined as a 64-bit type, which is required to represent block numbers for storage devices that exceed 2TiB (the block size usually is 512B), e.g. recent hard drives.
For some obscure reason, the current U-Boot code uses lbaint_t for the number of blocks to read (a rather optimistic estimation of how RAM sizes will evolve), but not for the starting address. Trying to access blocks beyond the 2TiB boundary will simply wrap around and read a block within the 0..2TiB range.
We now use lbaint_t for block start addresses, too. This required changes to all block drivers as the signature of block_read(), block_write() and block_erase() in block_dev_desc_t changed.
Signed-off-by: Sascha Silbe t-uboot@infra-silbe.de
Functionality tested on CuBox Pro with a Western Digital WD30EFRX hard disk (3TB). Build tested for all arm boards and sandbox.
Testing on other boards and architectures would be appreciated.
Fixes for typos, style errors etc. are explicitly out of scope for this patch, even those checkpatch complains about because they appear on or near lines touched by the patch. They are unrelated to the issue at hand and can be fixed up later. Mixing in unrelated changes would just make harder to revert any problematic change.
Quick review looks OK.
Best regards, Marek Vasut

On Mon, 17 Jun 2013 22:26:00 +0200, Marek Vasut marex@denx.de wrote:
Hello Sascha,
With CONFIG_SYS_64BIT_LBA, lbaint_t gets defined as a 64-bit type, which is required to represent block numbers for storage devices that exceed 2TiB (the block size usually is 512B), e.g. recent hard drives.
For some obscure reason, the current U-Boot code uses lbaint_t for the number of blocks to read (a rather optimistic estimation of how RAM sizes will evolve), but not for the starting address. Trying to access blocks beyond the 2TiB boundary will simply wrap around and read a block within the 0..2TiB range.
We now use lbaint_t for block start addresses, too. This required changes to all block drivers as the signature of block_read(), block_write() and block_erase() in block_dev_desc_t changed.
Signed-off-by: Sascha Silbe t-uboot@infra-silbe.de
Functionality tested on CuBox Pro with a Western Digital WD30EFRX hard disk (3TB). Build tested for all arm boards and sandbox.
Testing on other boards and architectures would be appreciated.
Fixes for typos, style errors etc. are explicitly out of scope for this patch, even those checkpatch complains about because they appear on or near lines touched by the patch. They are unrelated to the issue at hand and can be fixed up later. Mixing in unrelated changes would just make harder to revert any problematic change.
Quick review looks OK.
Best regards, Marek Vasut
Anyone could test Sascha's patch? Especially Frédédic, can you test it and see how this works with your enabling 64-bit LBA on LaCie kirkwood products?
Amicalement,

On Fri, Jun 14, 2013 at 01:07:25PM +0200, Sascha Silbe wrote:
With CONFIG_SYS_64BIT_LBA, lbaint_t gets defined as a 64-bit type, which is required to represent block numbers for storage devices that exceed 2TiB (the block size usually is 512B), e.g. recent hard drives.
For some obscure reason, the current U-Boot code uses lbaint_t for the number of blocks to read (a rather optimistic estimation of how RAM sizes will evolve), but not for the starting address. Trying to access blocks beyond the 2TiB boundary will simply wrap around and read a block within the 0..2TiB range.
We now use lbaint_t for block start addresses, too. This required changes to all block drivers as the signature of block_read(), block_write() and block_erase() in block_dev_desc_t changed.
Signed-off-by: Sascha Silbe t-uboot@infra-silbe.de
Applied to u-boot/master, thanks!
participants (7)
-
Albert ARIBAUD
-
Frederic Leroy
-
Frédéric Leroy
-
Marek Vasut
-
Sascha Silbe
-
Simon Guinot
-
Tom Rini