diff mbox

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

Message ID 1370871053-14524-1-git-send-email-fredo@starox.org
State Changes Requested
Delegated to: Albert ARIBAUD
Headers show

Commit Message

Frederic Leroy June 10, 2013, 1:30 p.m. UTC
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(+)

Comments

Frederic Leroy June 10, 2013, 2:20 p.m. UTC | #1
-----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
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQGcBAEBAgAGBQJRteDBAAoJEJVX96CfzRSe7CsMAJF7A6b29E4jTH9p2uBSLYDZ
Rg1Oeag0J9UI44LKfhAjexfDP0I0gF8B+IB4ZQ1VZiKeNL3Udocy+J57KBzoefi1
SY39c8uw8qWszxJqxdZ0n+MGNMRL3cKsOaNtG5Jf81knohl5OVjmiscdzy/0MNB/
+zPB3tsydAjPnR1B8J655jqXlcH0Cd23BX7cJoufnJN6jfaiPdBsurobIfKkLwrO
Pd1WLxcaZN+GwqRnYJkB6Y4yuYZwfLelhBkqUDVJy/dF38YBHzjHUmq1YUdS7ret
flMexv1UrqWO6QCVQ95e3nTFmRkH2Dqyi8JkyfMHFzuhOzidRtSYSxVS9ArqdRA8
7fHRshEA6FY62tiQ4aMZ9vj0tq3Vjy0QZKkOfpwUw338oVHyeCdpVJR3O4vkzzqh
NGIjA+fmJMTWT69J7Is53ZmheoSK0Ih/LEvyMYXyzSJsq+qodKqYsDwYfaHsVbjK
ti9yaCwozotaJoauB2bXWM8AjJfnE8Y2U0/AHOjX6g==
=Nisn
-----END PGP SIGNATURE-----
Albert ARIBAUD June 13, 2013, 11:33 a.m. UTC | #2
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,
Frederic Leroy June 13, 2013, 1:03 p.m. UTC | #3
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,
Albert ARIBAUD June 13, 2013, 1:21 p.m. UTC | #4
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,
Frederic Leroy June 13, 2013, 1:36 p.m. UTC | #5
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.
Sascha Silbe June 13, 2013, 8:32 p.m. UTC | #6
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
diff mbox

Patch

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)