All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] Revert "common/memsize.c: Simplify RAM size detection"
@ 2016-02-09 21:38 Hans de Goede
  2016-02-10  6:11 ` Eddy Petrișor
  2016-02-10 13:35 ` Tom Rini
  0 siblings, 2 replies; 6+ messages in thread
From: Hans de Goede @ 2016-02-09 21:38 UTC (permalink / raw)
  To: u-boot

This commit breaks bootup on sunxi boards, the get stuck
when running the main u-boot binary at:

CPU:   Allwinner H3 (SUN8I)
I2C:   ready
DRAM:

This reverts commit 8e7cba048baae68ee0916a8f52b4304277328d5e.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 common/memsize.c | 47 ++++++++++++++++++++++++++---------------------
 1 file changed, 26 insertions(+), 21 deletions(-)

diff --git a/common/memsize.c b/common/memsize.c
index 5c0d279..0fb9ba5 100644
--- a/common/memsize.c
+++ b/common/memsize.c
@@ -33,28 +33,38 @@ long get_ram_size(long *base, long maxsize)
 	long           size;
 	int            i = 0;
 
-	for (cnt = (maxsize / sizeof(long)) >> 1; cnt >= 0; cnt >>= 1) {
+	for (cnt = (maxsize / sizeof(long)) >> 1; cnt > 0; cnt >>= 1) {
 		addr = base + cnt;	/* pointer arith! */
 		sync();
-		save[i] = *addr;
+		save[i++] = *addr;
 		sync();
-		if (cnt) {
-			i++;
-			*addr = ~cnt;
-		} else {
-			*addr = 0;
-		}
+		*addr = ~cnt;
 	}
 
+	addr = base;
+	sync();
+	save[i] = *addr;
+	sync();
+	*addr = 0;
+
 	sync();
-	cnt = 0;
-	do {
+	if ((val = *addr) != 0) {
+		/* Restore the original data before leaving the function. */
+		sync();
+		*addr = save[i];
+		for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+			addr  = base + cnt;
+			sync();
+			*addr = save[--i];
+		}
+		return (0);
+	}
+
+	for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
 		addr = base + cnt;	/* pointer arith! */
 		val = *addr;
-		*addr = save[i--];
-		sync();
-		if (((cnt == 0) && (val != 0)) ||
-		    ((cnt != 0) && (val != ~cnt))) {
+		*addr = save[--i];
+		if (val != ~cnt) {
 			size = cnt * sizeof(long);
 			/*
 			 * Restore the original data
@@ -64,16 +74,11 @@ long get_ram_size(long *base, long maxsize)
 			     cnt < maxsize / sizeof(long);
 			     cnt <<= 1) {
 				addr  = base + cnt;
-				*addr = save[i--];
+				*addr = save[--i];
 			}
 			return (size);
 		}
-
-		if (cnt)
-			cnt = cnt << 1;
-		else
-			cnt = 1;
-	} while (cnt < maxsize / sizeof(long));
+	}
 
 	return (maxsize);
 }
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] Revert "common/memsize.c: Simplify RAM size detection"
  2016-02-09 21:38 [U-Boot] [PATCH] Revert "common/memsize.c: Simplify RAM size detection" Hans de Goede
@ 2016-02-10  6:11 ` Eddy Petrișor
  2016-02-10  8:20   ` Hans de Goede
  2016-02-10 13:35 ` Tom Rini
  1 sibling, 1 reply; 6+ messages in thread
From: Eddy Petrișor @ 2016-02-10  6:11 UTC (permalink / raw)
  To: u-boot

Hi Hans,

I sent a fixup patch yesterday (I managed somehow to send an outdated
patch), did you try the fixup patch?

http://lists.denx.de/pipermail/u-boot/2016-February/245080.html
Pe 9 feb. 2016 11:38 p.m., "Hans de Goede" <hdegoede@redhat.com> a scris:

> This commit breaks bootup on sunxi boards, the get stuck
> when running the main u-boot binary at:
>
> CPU:   Allwinner H3 (SUN8I)
> I2C:   ready
> DRAM:
>
> This reverts commit 8e7cba048baae68ee0916a8f52b4304277328d5e.
>
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
>  common/memsize.c | 47 ++++++++++++++++++++++++++---------------------
>  1 file changed, 26 insertions(+), 21 deletions(-)
>
> diff --git a/common/memsize.c b/common/memsize.c
> index 5c0d279..0fb9ba5 100644
> --- a/common/memsize.c
> +++ b/common/memsize.c
> @@ -33,28 +33,38 @@ long get_ram_size(long *base, long maxsize)
>         long           size;
>         int            i = 0;
>
> -       for (cnt = (maxsize / sizeof(long)) >> 1; cnt >= 0; cnt >>= 1) {
> +       for (cnt = (maxsize / sizeof(long)) >> 1; cnt > 0; cnt >>= 1) {
>                 addr = base + cnt;      /* pointer arith! */
>                 sync();
> -               save[i] = *addr;
> +               save[i++] = *addr;
>                 sync();
> -               if (cnt) {
> -                       i++;
> -                       *addr = ~cnt;
> -               } else {
> -                       *addr = 0;
> -               }
> +               *addr = ~cnt;
>         }
>
> +       addr = base;
> +       sync();
> +       save[i] = *addr;
> +       sync();
> +       *addr = 0;
> +
>         sync();
> -       cnt = 0;
> -       do {
> +       if ((val = *addr) != 0) {
> +               /* Restore the original data before leaving the function.
> */
> +               sync();
> +               *addr = save[i];
> +               for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
> +                       addr  = base + cnt;
> +                       sync();
> +                       *addr = save[--i];
> +               }
> +               return (0);
> +       }
> +
> +       for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
>                 addr = base + cnt;      /* pointer arith! */
>                 val = *addr;
> -               *addr = save[i--];
> -               sync();
> -               if (((cnt == 0) && (val != 0)) ||
> -                   ((cnt != 0) && (val != ~cnt))) {
> +               *addr = save[--i];
> +               if (val != ~cnt) {
>                         size = cnt * sizeof(long);
>                         /*
>                          * Restore the original data
> @@ -64,16 +74,11 @@ long get_ram_size(long *base, long maxsize)
>                              cnt < maxsize / sizeof(long);
>                              cnt <<= 1) {
>                                 addr  = base + cnt;
> -                               *addr = save[i--];
> +                               *addr = save[--i];
>                         }
>                         return (size);
>                 }
> -
> -               if (cnt)
> -                       cnt = cnt << 1;
> -               else
> -                       cnt = 1;
> -       } while (cnt < maxsize / sizeof(long));
> +       }
>
>         return (maxsize);
>  }
> --
> 2.5.0
>
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] Revert "common/memsize.c: Simplify RAM size detection"
  2016-02-10  6:11 ` Eddy Petrișor
@ 2016-02-10  8:20   ` Hans de Goede
  2016-02-10  9:00     ` Eddy Petrișor
  2016-02-10  9:36     ` Wolfgang Denk
  0 siblings, 2 replies; 6+ messages in thread
From: Hans de Goede @ 2016-02-10  8:20 UTC (permalink / raw)
  To: u-boot

Hi,

On 10-02-16 07:11, Eddy Petri?or wrote:
> Hi Hans,
>
> I sent a fixup patch yesterday (I managed somehow to send an outdated
> patch),

Ah I did not notice that one.

> did you try the fixup patch?

I just did try it, same results as Hannes the hang is gone, but now
the RAM size is misdedetected (it detects 2 GiB on a 1 GiB board).

It seems this code was as it was for a reason and that a revert
of your simplification is probably the best solution.

Regards,

Hans




>
> http://lists.denx.de/pipermail/u-boot/2016-February/245080.html
> Pe 9 feb. 2016 11:38 p.m., "Hans de Goede" <hdegoede@redhat.com> a scris:
>
>> This commit breaks bootup on sunxi boards, the get stuck
>> when running the main u-boot binary at:
>>
>> CPU:   Allwinner H3 (SUN8I)
>> I2C:   ready
>> DRAM:
>>
>> This reverts commit 8e7cba048baae68ee0916a8f52b4304277328d5e.
>>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>> ---
>>   common/memsize.c | 47 ++++++++++++++++++++++++++---------------------
>>   1 file changed, 26 insertions(+), 21 deletions(-)
>>
>> diff --git a/common/memsize.c b/common/memsize.c
>> index 5c0d279..0fb9ba5 100644
>> --- a/common/memsize.c
>> +++ b/common/memsize.c
>> @@ -33,28 +33,38 @@ long get_ram_size(long *base, long maxsize)
>>          long           size;
>>          int            i = 0;
>>
>> -       for (cnt = (maxsize / sizeof(long)) >> 1; cnt >= 0; cnt >>= 1) {
>> +       for (cnt = (maxsize / sizeof(long)) >> 1; cnt > 0; cnt >>= 1) {
>>                  addr = base + cnt;      /* pointer arith! */
>>                  sync();
>> -               save[i] = *addr;
>> +               save[i++] = *addr;
>>                  sync();
>> -               if (cnt) {
>> -                       i++;
>> -                       *addr = ~cnt;
>> -               } else {
>> -                       *addr = 0;
>> -               }
>> +               *addr = ~cnt;
>>          }
>>
>> +       addr = base;
>> +       sync();
>> +       save[i] = *addr;
>> +       sync();
>> +       *addr = 0;
>> +
>>          sync();
>> -       cnt = 0;
>> -       do {
>> +       if ((val = *addr) != 0) {
>> +               /* Restore the original data before leaving the function.
>> */
>> +               sync();
>> +               *addr = save[i];
>> +               for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
>> +                       addr  = base + cnt;
>> +                       sync();
>> +                       *addr = save[--i];
>> +               }
>> +               return (0);
>> +       }
>> +
>> +       for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
>>                  addr = base + cnt;      /* pointer arith! */
>>                  val = *addr;
>> -               *addr = save[i--];
>> -               sync();
>> -               if (((cnt == 0) && (val != 0)) ||
>> -                   ((cnt != 0) && (val != ~cnt))) {
>> +               *addr = save[--i];
>> +               if (val != ~cnt) {
>>                          size = cnt * sizeof(long);
>>                          /*
>>                           * Restore the original data
>> @@ -64,16 +74,11 @@ long get_ram_size(long *base, long maxsize)
>>                               cnt < maxsize / sizeof(long);
>>                               cnt <<= 1) {
>>                                  addr  = base + cnt;
>> -                               *addr = save[i--];
>> +                               *addr = save[--i];
>>                          }
>>                          return (size);
>>                  }
>> -
>> -               if (cnt)
>> -                       cnt = cnt << 1;
>> -               else
>> -                       cnt = 1;
>> -       } while (cnt < maxsize / sizeof(long));
>> +       }
>>
>>          return (maxsize);
>>   }
>> --
>> 2.5.0
>>
>>
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] Revert "common/memsize.c: Simplify RAM size detection"
  2016-02-10  8:20   ` Hans de Goede
@ 2016-02-10  9:00     ` Eddy Petrișor
  2016-02-10  9:36     ` Wolfgang Denk
  1 sibling, 0 replies; 6+ messages in thread
From: Eddy Petrișor @ 2016-02-10  9:00 UTC (permalink / raw)
  To: u-boot

2016-02-10 10:20 GMT+02:00 Hans de Goede <hdegoede@redhat.com>:
> Hi,
>
> On 10-02-16 07:11, Eddy Petri?or wrote:
>>
>> Hi Hans,
>>
>> I sent a fixup patch yesterday (I managed somehow to send an outdated
>> patch),
>
>
> Ah I did not notice that one.
>
>> did you try the fixup patch?
>
>
> I just did try it, same results as Hannes the hang is gone, but now
> the RAM size is misdedetected (it detects 2 GiB on a 1 GiB board).
>
> It seems this code was as it was for a reason and that a revert
> of your simplification is probably the best solution.

OK, agreed, that makes sense. My buggy HW (DDR unstable) doesn't help.

I will probably rework the patch and target the v2016.05 release.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] Revert "common/memsize.c: Simplify RAM size detection"
  2016-02-10  8:20   ` Hans de Goede
  2016-02-10  9:00     ` Eddy Petrișor
@ 2016-02-10  9:36     ` Wolfgang Denk
  1 sibling, 0 replies; 6+ messages in thread
From: Wolfgang Denk @ 2016-02-10  9:36 UTC (permalink / raw)
  To: u-boot

Dear Hans,

In message <56BAF2B1.3040507@redhat.com> you wrote:
> 
> It seems this code was as it was for a reason and that a revert
> of your simplification is probably the best solution.

Indeed. Over the past 15 years I have seen several attempts to
improve or simplify the mesize code.  Most did not make it into
mainline as they worked for the poster, but caused problems on some
other boards.

We had a similar "simplification" in 2012, see commit b8496cce and
revert in 3ab270d5, but all these attempts caused problems of some
kind, so the basic structure of the code is still exactly the same
as in the original version of 2004 (commit c83bf6a2).

Probably this is just Perfect Code (TM) which cannot improved further
:-)

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
The word "fit", as I understand it, means "appropriate to a purpose",
and I would say the body of the Dean is supremely appropriate to  the
purpose of sitting around all day and eating big heavy meals.
                                 - Terry Pratchett, _Moving Pictures_

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] Revert "common/memsize.c: Simplify RAM size detection"
  2016-02-09 21:38 [U-Boot] [PATCH] Revert "common/memsize.c: Simplify RAM size detection" Hans de Goede
  2016-02-10  6:11 ` Eddy Petrișor
@ 2016-02-10 13:35 ` Tom Rini
  1 sibling, 0 replies; 6+ messages in thread
From: Tom Rini @ 2016-02-10 13:35 UTC (permalink / raw)
  To: u-boot

On Tue, Feb 09, 2016 at 10:38:31PM +0100, Hans de Goede wrote:

> This commit breaks bootup on sunxi boards, the get stuck
> when running the main u-boot binary at:
> 
> CPU:   Allwinner H3 (SUN8I)
> I2C:   ready
> DRAM:
> 
> This reverts commit 8e7cba048baae68ee0916a8f52b4304277328d5e.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>

Applied to u-boot/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160210/17ab767d/attachment.sig>

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-02-10 13:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-09 21:38 [U-Boot] [PATCH] Revert "common/memsize.c: Simplify RAM size detection" Hans de Goede
2016-02-10  6:11 ` Eddy Petrișor
2016-02-10  8:20   ` Hans de Goede
2016-02-10  9:00     ` Eddy Petrișor
2016-02-10  9:36     ` Wolfgang Denk
2016-02-10 13:35 ` Tom Rini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.