[U-Boot] [PATCH v2 3/8] x86: slimbootloader: Add memory configuration

Park, Aiden aiden.park at intel.com
Mon Jul 8 16:40:57 UTC 2019


Hi Bin,

> -----Original Message-----
> From: Bin Meng [mailto:bmeng.cn at gmail.com]
> Sent: Tuesday, July 2, 2019 7:13 AM
> To: Park, Aiden <aiden.park at intel.com>
> Cc: U-Boot Mailing List <u-boot at lists.denx.de>; Simon Glass
> <sjg at chromium.org>
> Subject: Re: [PATCH v2 3/8] x86: slimbootloader: Add memory configuration
> 
> Hi Aiden,
> 
> On Wed, Jun 26, 2019 at 7:18 AM Park, Aiden <aiden.park at intel.com> wrote:
> >
> > - Get memory size from the memory map info hob
> > - Set ram top for U-Boot relocation lower than 4GB
> > - Provide e820 entries from the memory map info hob
> >
> > Signed-off-by: Aiden Park <aiden.park at intel.com>
> > ---
> >  arch/x86/cpu/slimbootloader/Makefile          |   2 +-
> >  arch/x86/cpu/slimbootloader/dram.c            | 139 ++++++++++++++++++
> >  .../asm/arch-slimbootloader/slimbootloader.h  |  38 +++++
> >  3 files changed, 178 insertions(+), 1 deletion(-)  create mode 100644
> > arch/x86/cpu/slimbootloader/dram.c
> >
> > diff --git a/arch/x86/cpu/slimbootloader/Makefile
> > b/arch/x86/cpu/slimbootloader/Makefile
> > index 620fc8a139..4b0b3e71c9 100644
> > --- a/arch/x86/cpu/slimbootloader/Makefile
> > +++ b/arch/x86/cpu/slimbootloader/Makefile
> > @@ -2,4 +2,4 @@
> >  #
> >  # Copyright (C) 2019 Intel Corporation <www.intel.com>
> >
> > -obj-y += car.o slimbootloader.o hob.o
> > +obj-y += car.o slimbootloader.o hob.o dram.o
> > diff --git a/arch/x86/cpu/slimbootloader/dram.c
> > b/arch/x86/cpu/slimbootloader/dram.c
> > new file mode 100644
> > index 0000000000..1defdad1c9
> > --- /dev/null
> > +++ b/arch/x86/cpu/slimbootloader/dram.c
> > @@ -0,0 +1,139 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +/*
> > + * Copyright (C) 2019 Intel Corporation <www.intel.com>  */
> > +
> > +#include <common.h>
> > +#include <linux/sizes.h>
> > +#include <asm/e820.h>
> > +#include <asm/arch/slimbootloader.h>
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +/**
> > + * This returns a data pointer of memory map info from the guid hob.
> > + *
> > + * @return: A data pointer of memory map info hob  */ static void
> > +*get_memory_map_info(void) {
> > +       const struct efi_guid guid = LOADER_MEMORY_MAP_INFO_GUID;
> > +
> > +       return get_next_guid_hob_data(&guid, gd->arch.hob_list); }
> > +
> > +/**
> > + * This is to give usable memory region information for u-boot relocation.
> > + * so search usable memory region lower than 4GB.
> > + * The memory map entries from Slim Bootloader hob are already sorted.
> > + *
> > + * @total_size: The memory size that u-boot occupies
> > + * @return    : The top available memory address lower than 4GB
> > + */
> > +ulong board_get_usable_ram_top(ulong total_size) {
> > +       struct memory_map_info *data = NULL;
> > +       int i = 0;
> > +       phys_addr_t addr_start = 0;
> > +       phys_addr_t addr_end = 0;
> > +       ulong ram_top = 0;
> > +
> > +       data = (struct memory_map_info *)get_memory_map_info();
> > +       if (!data)
> > +               panic("memory map info hob not found\n");
> > +
> > +       /* sorted memory map entries, so reversed search */
> > +       for (i = data->count - 1; i >= 0; i--) {
> > +               if (data->entry[i].type != E820_RAM)
> > +                       continue;
> > +
> > +               addr_start = data->entry[i].addr;
> > +               addr_end = addr_start + data->entry[i].size;
> > +
> > +               if (addr_start > SZ_4G)
> > +                       continue;
> > +
> > +               if (addr_end > SZ_4G)
> > +                       addr_end = SZ_4G;
> > +
> > +               if (addr_end < total_size)
> > +                       continue;
> > +
> > +               /* to relocate u-boot at 4K aligned memory */
> > +               addr_end = rounddown(addr_end - total_size, SZ_4K);
> > +               if (addr_end >= addr_start) {
> > +                       ram_top = (ulong)addr_end + total_size;
> > +                       break;
> > +               }
> > +       }
> > +
> > +       if (!ram_top)
> > +               panic("failed to find available memory for
> > + relocation!");
> > +
> > +       return ram_top;
> > +}
> > +
> > +/**
> > + * The memory initialization has already been done in previous Slim
> > +Bootloader
> > + * stage thru FSP-M. Instead, this sets the ram_size from the memory
> > +map info
> > + * hob.
> 
> Is the memory map info created by the FSP, or created by the slim
> bootloader? If it is created by newer FSPs, I think such function is eligible for
> FSP based board to use in the future.
As described in serial port hob, this is not provided from FSP, but generated from Slim Bootloader. All these HOBs are eligible for Slim Bootloader based boards.
> 
> > + */
> > +int dram_init(void)
> > +{
> > +       struct memory_map_info *data = NULL;
> > +       int i = 0;
> > +       phys_size_t ram_size = 0;
> > +
> > +       data = (struct memory_map_info *)get_memory_map_info();
> > +       if (!data)
> > +               panic("memory map info hob not found\n");
> > +
> > +       /* sorted memory map entries, so reversed search */
> > +       for (i = data->count - 1; i >= 0; i--) {
> > +               if (data->entry[i].type != E820_RAM)
> > +                       continue;
> > +
> > +               /* simply use the highest usable memory address as ram
> > + size */
> 
> This indicates the memory map info is sorted, from highest address to lowest
> address. Need some comments.
Let me add more comment here. Thanks.
> 
> > +               ram_size = data->entry[i].addr + data->entry[i].size;
> > +               break;
> > +       }
> > +
> > +       if (!ram_size)
> > +               panic("failed to detect memory size");
> > +
> > +       gd->ram_size = ram_size;
> > +       return 0;
> > +}
> > +
> > +int dram_init_banksize(void)
> > +{
> > +       /* simply use a single bank to have whole size for now */
> > +       if (CONFIG_NR_DRAM_BANKS) {
> > +               gd->bd->bi_dram[0].start = 0;
> > +               gd->bd->bi_dram[0].size = gd->ram_size;
> > +       }
> > +       return 0;
> > +}
> > +
> > +unsigned int install_e820_map(unsigned int max_entries,
> > +                             struct e820_entry *entries) {
> > +       struct memory_map_info *data = NULL;
> > +       int i = 0;
> > +       unsigned int num_entries = 0;
> > +
> > +       data = (struct memory_map_info *)get_memory_map_info();
> > +       if (!data) {
> > +               debug("memory map info hob not found\n");
> > +               return 0;
> > +       }
> > +
> > +       for (i = 0; i < data->count; i++) {
> > +               entries[num_entries].addr = data->entry[i].addr;
> > +               entries[num_entries].size = data->entry[i].size;
> > +               entries[num_entries].type = data->entry[i].type;
> > +               num_entries++;
> > +       }
> > +
> > +       return num_entries;
> > +}
> > diff --git a/arch/x86/include/asm/arch-slimbootloader/slimbootloader.h
> > b/arch/x86/include/asm/arch-slimbootloader/slimbootloader.h
> > index bd1f4ee374..c85201e711 100644
> > --- a/arch/x86/include/asm/arch-slimbootloader/slimbootloader.h
> > +++ b/arch/x86/include/asm/arch-slimbootloader/slimbootloader.h
> > @@ -10,6 +10,44 @@
> >  #include <asm/fsp/fsp_types.h>
> >  #include <asm/fsp/fsp_hob.h>
> >
> > +#define LOADER_MEMORY_MAP_INFO_GUID \
> > +       { \
> > +       0xa1ff7424, 0x7a1a, 0x478e, \
> > +       { 0xa9, 0xe4, 0x92, 0xf3, 0x57, 0xd1, 0x28, 0x32 } \
> > +       }
> > +
> > +/**
> > + * A single entry of memory map information
> > + *
> > + * @addr: start address of a memory map entry
> > + * @size: size of a memory map entry
> > + * @type: ram:1, reserved:2, acpi:3, nvs:4, unusable:5
> > + * @flag: only used in Slim Bootloader
> > + * @rsvd: padding for alignment
> > + */
> > +struct memory_map_entry {
> > +       phys_addr_t     addr;
> > +       phys_size_t     size;
> > +       u8      type;
> > +       u8      flag;
> > +       u8      rsvd[6];
> > +} __packed;
> > +
> > +/**
> > + * This includes all memory map entries which are sorted.
> > + *
> > + * @rev  : revision of memory_map_info structure. currently 1.
> > + * @rsvd : padding for alignment
> > + * @count: the number of memory map entries
> > + * @entry: array of all memory map entries  */ struct memory_map_info
> > +{
> > +       u8      rev;
> > +       u8      rsvd[3];
> > +       u32     count;
> > +       struct memory_map_entry entry[0]; } __packed;
> > +
> >  /**
> >   * This returns a pointer to hob data buffer if the given guid hob is found.
> >   *
> 
> Regards,
> Bin

Best Regards,
Aiden


More information about the U-Boot mailing list