[U-Boot] [PATCHv2] common/memsize.c: Simplify RAM size detection

Eddy Petrișor eddy.petrisor at gmail.com
Tue Feb 9 15:35:57 CET 2016


2016-02-09 12:14 GMT+02:00 Hannes Schmelzer <hannes at schmelzer.or.at>:
>
> On 02.02.2016 21:15, Eddy Petrișor wrote:
>>
>> The case of memory of size 0 is not that different from a memory of any
>> other
>> size, so we remove the duplicate code and treat the small differences when
>> it
>> is the case.
>>
>> Signed-off-by: Eddy Petrișor <eddy.petrisor at gmail.com>
>> ---
>>
>> v2: Removed patman stuff from commit message
>>
>>   common/memsize.c | 47 +++++++++++++++++++++--------------------------
>>   1 file changed, 21 insertions(+), 26 deletions(-)
>>
>> diff --git a/common/memsize.c b/common/memsize.c
>> index 0fb9ba5..5c0d279 100644
>> --- a/common/memsize.c
>> +++ b/common/memsize.c
>> @@ -33,38 +33,28 @@ 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();
>> -               *addr = ~cnt;
>> -       }
>> -
>> -       addr = base;
>> -       sync();
>> -       save[i] = *addr;
>> -       sync();
>> -       *addr = 0;
>> -
>> -       sync();
>> -       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];
>> +               if (cnt) {
>> +                       i++;
>> +                       *addr = ~cnt;
>> +               } else {
>> +                       *addr = 0;
>>                 }
>> -               return (0);
>>         }
>>   -     for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
>> +       sync();
>> +       cnt = 0;
>> +       do {
>>                 addr = base + cnt;      /* pointer arith! */
>>                 val = *addr;
>> -               *addr = save[--i];
>> -               if (val != ~cnt) {
>> +               *addr = save[i--];
>> +               sync();
>> +               if (((cnt == 0) && (val != 0)) ||
>> +                   ((cnt != 0) && (val != ~cnt))) {
>>                         size = cnt * sizeof(long);
>>                         /*
>>                          * Restore the original data
>> @@ -74,11 +64,16 @@ 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);
>>   }
>
> Hi Eddy,
>
> this commit breaks my BuR AM335x boards.
> The board stucks at boot:
>
> U-Boot 2016.03-rc1-00195-g437cc77-dirty (Feb 09 2016 - 09:25:51 +0100)
>
> initcall: 8080a384
> U-Boot code: 80800000 -> 8083A6F4  BSS: -> 8088433C
> initcall: 8080a174
> initcall: 8080a3f0
> I2C: ready
> initcall: 8080a3d8
> DRAM:  initcall: 80800784
>
> has anybody else experience on am335x boards with this ?

Hi Hannes,

You are correct, it seems that during my clean up phase before sending
the patch I managed to send an outdated version of the patch.
The easiest fix is to add a 'break;' after the '*addr = 0;' part, but
the reported size will be incorrect.

I will work on a correct fixup.
Sorry for the inconvenience.


-- 
Eddy Petrișor


More information about the U-Boot mailing list