Hi

Thank you for your review

Am 19. Januar 2026 11:22:07 MEZ schrieb Quentin Schulz 
<[email protected]>:
>Hi Frank,
>
>On 1/18/26 11:50 AM, Frank Wunderlich wrote:
>> From: Frank Wunderlich <[email protected]>
>> 
>> Add a command for getting detected ram size with possibility to write
>> to environment variable.
>> 
>> example usage:
>> 
>> BPI-R4> msize
>> 4294967296
>> BPI-R4> msize m
>> 4096m
>> BPI-R4> msize g
>> 4g
>> BPI-R4> msize g ramsize
>> BPI-R4> printenv ramsize
>> ramsize=4
>> BPI-R4>
>> 
>> board with 8GB ram:
>> 
>> BPI-R4> msize
>> 8589934592
>> BPI-R4> msize m
>> 8192m
>> BPI-R4> msize g
>> 8g
>> BPI-R4> msize g ramsize
>> BPI-R4> printenv ramsize
>> ramsize=8
>> BPI-R4>
>> 
>> Signed-off-by: Frank Wunderlich <[email protected]>
>> ---
>> v4: drop rounding to full MB/GB as it leads to wrong display
>> v3: add missing ifdefs
>> v2: add Kconfig entry
>> ---
>>   cmd/Kconfig |  5 +++++
>>   cmd/mem.c   | 32 ++++++++++++++++++++++++++++++++
>>   2 files changed, 37 insertions(+)
>> 
>> diff --git a/cmd/Kconfig b/cmd/Kconfig
>> index 5c611fb3016e..b82b17195b7e 100644
>> --- a/cmd/Kconfig
>> +++ b/cmd/Kconfig
>> @@ -974,6 +974,11 @@ config CMD_RANDOM
>>      help
>>        random - fill memory with random data
>>   +config CMD_MEMSIZE
>> +    bool "memsize"
>> +    help
>> +      Get RAM via command for use in scripts.
>> +
>
>Only available if CMD_MEMORY is set, so need a depends on.
>
>I'm wondering if this new command isn't more suited in cmd/meminfo.c? Maybe 
>even extend the meminfo command instead of creating a new one?

Can put it in meminfo too with depency cmd_memory.

>>   config CMD_MEMTEST
>>      bool "memtest"
>>      help
>> diff --git a/cmd/mem.c b/cmd/mem.c
>> index d5d7ca2790bd..9dcfeacbbcc5 100644
>> --- a/cmd/mem.c
>> +++ b/cmd/mem.c
>> @@ -33,6 +33,7 @@
>>   #include <linux/compiler.h>
>>   #include <linux/ctype.h>
>>   #include <linux/delay.h>
>> +#include <linux/sizes.h>
>>     DECLARE_GLOBAL_DATA_PTR;
>>   @@ -711,6 +712,29 @@ static int do_mem_loopw(struct cmd_tbl *cmdtp, int 
>> flag, int argc,
>>   }
>>   #endif /* CONFIG_LOOPW */
>>   +#ifdef CONFIG_CMD_MEMSIZE
>> +static int do_mem_size(struct cmd_tbl *cmdtp, int flag, int argc,
>> +                   char *const argv[])
>> +{
>> +    u64 memsize = gd->ram_size;
>> +
>> +    if (argc > 1) {
>> +            if (!strcmp(argv[1], "m"))
>> +                    memsize = memsize / SZ_1M;
>> +            else if (!strcmp(argv[1], "g"))
>> +                    memsize = memsize / SZ_1G;
>> +            if (argc > 2)
>> +                    env_set_ulong(argv[2], memsize);
>> +            else
>> +                    printf("%lld%s\n", memsize, argv[1]);
>> +    } else {
>> +            printf("%lld\n", memsize);
>> +    }
>
>Flatten this like so:
>
>"""
>if (argc <= 1) {
>    printf("%lld\n", memsize);
>    return 0;
>}
>
>if (!strcmp(argv[1], "m"))
>    memsize = memsize / SZ_1M;
>else if (!strcmp(argv[1], "g"))
>    memsize = memsize / SZ_1G;
>if (argc > 2)
>    env_set_ulong(argv[2], memsize);
>else
>    printf("%lld%s\n", memsize, argv[1]);
>return 0;
>"""
>
>Otherwise I see a few issues:
>- rounding not made explicit, (also it's truncating and not rounding I believe 
>here?). Why not print the actual value here as a float (of course, not using 
>floats)? I vaguely remember some of my Rockchip board printing 1.5GiB when 
>booting up (cannot verify because this happens due to a bug in the SDRAM init 
>and isn't easily reproducible). We do have some boards with 256, 512MiB of RAM 
>so we should be clear whether we are printing 0 or 0.25 since that will 
>influence how to do math operations with the variable containing the value.

I have dropped my previous round because it leads to wrong values and i wanted 
to avoid floating point numbers. But yes 2 decimal digits seem to be needed to 
give correct output. I guess var is then string,not any floating point type.

So for GB sonething like this:

u64 ram_gb_x100 = GB_X100(gd->ram_size);
char buf[16];

snprintf(buf, sizeof(buf), "%llu.%02llu",
         ram_gb_x100 / 100,
         ram_gb_x100 % 100);

env_set("ram_size_gb", buf);

>- what if I want to save the byte size in a variable? With the current 
>implementation, only mebibyte or gibibyte sizes can be stored. I would suggest 
>to argc-- if m or g is passed, and then compare against argc > 1 in which case 
>you'd use this third (in case m or g is passed) or second (if they aren't) 
>argument to store the value.

Good idea, thinking about how to implement this the correct way :) as varname 
could be "g" or "b" too.

>- missing documentation on the base for the environment variable. We have some 
>commands setting hex digits in variables, some others in decimal, so this 
>needs to be made explicit so that people know if they need to translate stuff 
>before using it (or how to compare two numbers against each other). Here it's 
>decimal according to the code (maybe we should have it in hex instead? I am 
>not sure what is the expected base for variables :/).

As i want to use it in scripts to choose correct bl2 file for bananapi r4. Imho 
decimal is better to read here,but it should be mentioned in doc.

>> +
>> +    return 0;
>> +}
>> +#endif /* CONFIG_CMD_MEMSIZE */
>> +
>>   #ifdef CONFIG_CMD_MEMTEST
>>   static ulong mem_test_alt(volatile ulong *buf, ulong start_addr, ulong 
>> end_addr,
>>                        volatile ulong *dummy)
>> @@ -1404,6 +1428,14 @@ U_BOOT_CMD(
>>   );
>>   #endif /* CONFIG_LOOPW */
>>   +#ifdef CONFIG_CMD_MEMSIZE
>> +U_BOOT_CMD(
>> +    msize,  3,      1,      do_mem_size,
>> +    "get detected ram size, optional set env variable with value",
>> +    "[m, g] [envvar]"
>
>Explain m and g so the user knows when typing help msize.
>
>We need tests in test/cmd/ and a new entry in doc/usage/cmd/ for this new 
>command.

I see this note in checkpatch,but as i rely on dynamic value and i saw no test 
for mem yet.

>Cheers,
>Quentin


regards Frank

Reply via email to