[PATCH] board_f: show_dram_config: Print also real DRAM size

Sean Anderson sean.anderson at seco.com
Mon Sep 12 23:58:09 CEST 2022



On 9/12/22 2:56 PM, Pali Rohár wrote:
> On Monday 12 September 2022 07:34:47 Simon Glass wrote:
>> Hi Pali,
>> 
>> On Sun, 11 Sept 2022 at 03:39, Pali Rohár <pali at kernel.org> wrote:
>> >
>> > 32-bit U-Boot builds cannot use more than around 2 GB of DDR memory. But on
>> > some platforms/boards it is possible to connect also 4 GB SODIMM DDR memory.
>> > U-Boot currently prints only effective size of RAM which can use, which may
>> > be misleading as somebody would expect that this line prints total size of
>> > connected DDR modules. So change show_dram_config code to prints both real
>> > and effective DRAM size if they are different. If they are same then print
>> > just one number like before. It is possible that effective size is just few
>> > bytes smaller than the real size, so print both numbers only in case
>> > function print_size() prints formats them differently.
>> >
>> > Signed-off-by: Pali Rohár <pali at kernel.org>
>> > ---
>> >  common/board_f.c | 31 ++++++++++++++++++++++++++++++-
>> >  1 file changed, 30 insertions(+), 1 deletion(-)
>> >
>> > diff --git a/common/board_f.c b/common/board_f.c
>> > index 9e34fbee147e..3131a06db940 100644
>> > --- a/common/board_f.c
>> > +++ b/common/board_f.c
>> > @@ -54,6 +54,7 @@
>> >  #include <asm/sections.h>
>> >  #include <dm/root.h>
>> >  #include <linux/errno.h>
>> > +#include <linux/log2.h>
>> >
>> >  /*
>> >   * Pointer to initial global data area
>> > @@ -213,6 +214,30 @@ static int announce_dram_init(void)
>> >         return 0;
>> >  }
>> >
>> > +/*
>> > + * Check if the sizes in their natural units written in decimal format with
>> > + * one fraction number are same.
>> > + */
>> > +static int sizes_near(unsigned long long size1, unsigned long long size2)
>> > +{
>> > +       unsigned int size1_scale = ilog2(size1) / 10 * 10;
>> > +       unsigned int size1_val = (10 * size1 + ((1ULL << size1_scale) >> 1)) >> size1_scale;
>> > +       unsigned int size2_scale = ilog2(size2) / 10 * 10;
>> > +       unsigned int size2_val = (10 * size2 + ((1ULL << size2_scale) >> 1)) >> size2_scale;
>> 
>> Can you put that expression into a function with a comment, etc.? It
>> is a bit hard to understand.
> 
> Ok.
> 
>> > +
>> > +       if (size1_val == 10240) {
>> > +               size1_val = 10;
>> > +               size1_scale += 10;
>> > +       }
>> > +
>> > +       if (size2_val == 10240) {
>> > +               size2_val = 10;
>> > +               size2_scale += 10;
>> > +       }
>> 
>> If you are doing the same thing to each, why bother? It should not
>> affect the expression below, should it? :
> 
> This is interesting question, and the answer it that it is required and
> affects comparison expression below. For example for the case when size1
> is below 1GB limit, size2 is above 1GB limit and both values are near.
> Imagine that size1 is approaching value 1GB from the left and size2 from
> the right side.
> 
>> > +
>> > +       return size1_scale == size2_scale && size1_val == size2_val;
>> > +}
>> > +
>> >  static int show_dram_config(void)
>> >  {
>> >         unsigned long long size;
>> > @@ -229,7 +254,11 @@ static int show_dram_config(void)
>> >         }
>> >         debug("\nDRAM:  ");
>> >
>> > -       print_size(size, "");
>> > +       print_size(gd->ram_size, "");
>> > +       if (!sizes_near(gd->ram_size, size)) {
>> > +               printf(" (effective ");
>> > +               print_size(size, ")");
>> > +       }
>> >         board_add_ram_info(0);
>> >         putc('\n');
>> >
>> > --
>> > 2.20.1
>> >
>> 
>> Can we make this testable somehow? You could put the new code into a
>> lib/ function, perhaps, and call it from a C unit test in test/lib ?
>> 
>> Regards,
>> Simon
> 
> Meh... I do not know how to test such code. Due to size / optimization
> requirements it is not a good idea to make function outside of board_f.c
> file.
> 

You can use TEST_STATIC from test/export.h this case.

--Sean


More information about the U-Boot mailing list