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

Eddy Petrișor
2016-02-09T14:35:57Z

2016-02-09 12:14 GMT+02:00 Hannes Schmelzer <hannes@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@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