[U-Boot] [PATCH] Revert "common/memsize.c: Simplify RAM size detection"
Hans de Goede
hdegoede at redhat.com
Wed Feb 10 09:20:01 CET 2016
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 at 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 at 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
>>
>>
>
More information about the U-Boot
mailing list