[PATCH] smbios: arm64: Allow table to be written at a fixed addr
Simon Glass
sjg at chromium.org
Mon Oct 23 09:04:14 CEST 2023
Hi Caleb,
On Sat, 21 Oct 2023 at 01:43, Caleb Connolly <caleb.connolly at linaro.org> wrote:
>
> Hi Simon,
>
> On 21/10/2023 01:45, Simon Glass wrote:
> > U-Boot typically sets up its malloc() pool near the top of memory. On
> > ARM64 systems this can result in an SMBIOS table above 4GB which is
> > not supported by SMBIOSv2.
> >
> > Work around this problem by providing a new option to choose an address
> > just below 4GB, if needed.
> I may well be missing something here, but I don't quite understand the
> justification behind the original patch [1] which caused this regression.
>
> I'm currently preparing support for a few different Qualcomm boards
> which have different memory layouts, so far it's been possible to avoid
> having any fixed addresses, so the same u-boot image can be used on all
> of them (with just a different DTB).
What sort of memory layout do you have? I could enhance the patch to
find the top of a memory bank below 4GB, perhaps? E.g. see the
'bdinfo' command.
>
> As I mentioned before, efi_allocate_pages() seems to work fine from
> install_smbios_table(), I haven't delved into the code too much but I
> wonder if this could be an acceptable solution?
Unfortunately that function is EFI-specific. The function can only be
called once EFI is inited. We only want to do that if booting with
EFI.
The tables are written at the start of U-Boot, partly because that is
how it is done on x86 and partly so the 'acpi' command actually works.
The EFI code ended up writing a separate set of tables, which is of
course not correct.
I did look at creating an API in U-Boot to alloc memory below 4GB but
then decided that for just this one use case it might not be worth it.
>
> Barring that, could we use an environment variable to pass this address
> in? Although I think that might not be a very desirable solution.
>
> I appreciate you taking the time to prepare this patch and CC me. If
> nobody else objects to this patch then I'd prefer to avoid blocking it.
> In either case, I'd greatly appreciate any input on the above
> suggestions so that I can implement a solution for my boards.
I would like it to be automatic. I assumed on ARM64 that there is
memory available at 3.99GB if U-Boot has relocated to above 4GB, but
as above I could make this more clever.
Regards,
Simon
>
> Thanks and regards,
>
> [1]:
> https://lore.kernel.org/u-boot/20230920030027.1385833-16-sjg@chromium.org/
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > ---
> >
> > lib/Kconfig | 17 +++++++++++++++++
> > lib/efi_loader/efi_smbios.c | 12 ++++++++++++
> > 2 files changed, 29 insertions(+)
> >
> > diff --git a/lib/Kconfig b/lib/Kconfig
> > index f6ca559897e7..a77f2f3e9089 100644
> > --- a/lib/Kconfig
> > +++ b/lib/Kconfig
> > @@ -994,6 +994,23 @@ config GENERATE_SMBIOS_TABLE
> > See also SMBIOS_SYSINFO which allows SMBIOS values to be provided in
> > the devicetree.
> >
> > +config SMBIOS_TABLE_FIXED
> > + bool "Place the SMBIOS table at a special address"
> > + depends on GENERATE_SMBIOS_TABLE && ARM64 && SMBIOS && EFI_LOADER
> > + default y
> > + help
> > + Use this option to place the SMBIOS table at a fixed address.
> > +
> > + U-Boot typically sets up its malloc() pool near the top of memory. On
> > + ARM64 systems this can result in an SMBIOS table above 4GB which is
> > + not supported by SMBIOSv2. This option works around this problem by
> > + chosing an address just below 4GB, if needed.
> > +
> > +config SMBIOS_TABLE_FIXED_ADDR
> > + hex "Fixed address for use for SMBIOS table"
> > + depends on SMBIOS_TABLE_FIXED
> > + default 0xffff0000
> > +
> > endmenu
> >
> > config LIB_RATIONAL
> > diff --git a/lib/efi_loader/efi_smbios.c b/lib/efi_loader/efi_smbios.c
> > index 48446f654d9b..84ea027ea48c 100644
> > --- a/lib/efi_loader/efi_smbios.c
> > +++ b/lib/efi_loader/efi_smbios.c
> > @@ -61,6 +61,18 @@ static int install_smbios_table(void)
> > return log_msg_ret("mem", -ENOMEM);
> >
> > addr = map_to_sysmem(buf);
> > +
> > + /*
> > + * Deal with a fixed address if needed. For simplicity we assume that
> > + * the SMBIOS-table size is <64KB and that the malloc region does not
> > + * straddle the 4GB boundary.
> > + */
> > + if (IS_ENABLED(CONFIG_SMBIOS_TABLE_FIXED) && addr >= SZ_4G - SZ_64K) {
> > + addr = IF_ENABLED_INT(CONFIG_SMBIOS_TABLE_FIXED,
> > + CONFIG_SMBIOS_TABLE_FIXED_ADDR);
> > + log_warning("Forcing SMBIOS table to address %lx\n", addr);
> > + }
> > +
> > if (!write_smbios_table(addr)) {
> > log_err("Failed to write SMBIOS table\n");
> > return log_msg_ret("smbios", -EINVAL);
>
> --
> // Caleb (they/them)
More information about the U-Boot
mailing list