[U-Boot] [PATCH 4/4] x86: Add infrastructure to extract an e820 table from the coreboot tables

Graeme Russ graeme.russ at gmail.com
Fri Dec 2 22:36:11 CET 2011


Hi Gabe,

On 03/12/11 08:24, Gabe Black wrote:
> 
> 
> On Fri, Dec 2, 2011 at 1:14 PM, Graeme Russ <graeme.russ at gmail.com
> <mailto:graeme.russ at gmail.com>> wrote:
> 
>     Hi Gabe,
> 
>     On 30/11/11 17:07, Gabe Black wrote:
>     > Signed-off-by: Gabe Black <gabeblack at chromium.org
>     <mailto:gabeblack at chromium.org>>
>     > ---
>     >  arch/x86/cpu/coreboot/sdram.c |   32 ++++++++++++++++++++++++++------
>     >  arch/x86/include/asm/zimage.h |    5 +++++
>     >  arch/x86/lib/zimage.c         |   10 ++++++++++
>     >  3 files changed, 41 insertions(+), 6 deletions(-)
>     >
>     > diff --git a/arch/x86/cpu/coreboot/sdram.c
>     b/arch/x86/cpu/coreboot/sdram.c
>     > index b5b086b..ce73467 100644
>     > --- a/arch/x86/cpu/coreboot/sdram.c
>     > +++ b/arch/x86/cpu/coreboot/sdram.c
>     > @@ -23,6 +23,8 @@
>     >   */
>     >
>     >  #include <common.h>
>     > +#include <malloc.h>
>     > +#include <asm/e820.h>
>     >  #include <asm/u-boot-x86.h>
>     >  #include <asm/global_data.h>
>     >  #include <asm/ic/coreboot/sysinfo.h>
>     > @@ -30,18 +32,36 @@
>     >
>     >  DECLARE_GLOBAL_DATA_PTR;
>     >
>     > +unsigned install_e820_map(unsigned max_entries, struct e820entry
>     *entries)
>     > +{
>     > +     int i;
>     > +
>     > +     unsigned num_entries = min(lib_sysinfo.n_memranges, max_entries);
>     > +     if (num_entries < lib_sysinfo.n_memranges) {
>     > +             printf("Warning: Limiting e820 map to %d entries.\n",
>     > +                     num_entries);
>     > +     }
>     > +     for (i = 0; i < num_entries; i++) {
>     > +             struct memrange *memrange = &lib_sysinfo.memrange[i];
>     > +
>     > +             entries[i].addr = memrange->base;
>     > +             entries[i].size = memrange->size;
>     > +             entries[i].type = memrange->type;
>     > +     }
>     > +     return num_entries;
>     > +}
>     > +
>     >  int dram_init_f(void)
>     >  {
>     >       int i;
>     >       phys_size_t ram_size = 0;
>     > +
>     >       for (i = 0; i < lib_sysinfo.n_memranges; i++) {
>     > -             unsigned long long end = \
>     > -                     lib_sysinfo.memrange[i].base +
>     > -                     lib_sysinfo.memrange[i].size;
>     > -             if (lib_sysinfo.memrange[i].type == CB_MEM_RAM &&
>     > -                     end > ram_size) {
>     > +             struct memrange *memrange = &lib_sysinfo.memrange[i];
>     > +             unsigned long long end = memrange->base + memrange->size;
>     > +
>     > +             if (memrange->type == CB_MEM_RAM && end > ram_size)
>     >                       ram_size = end;
>     > -             }
>     >       }
>     >       gd->ram_size = ram_size;
>     >       if (ram_size == 0)
> 
>     Please fold these changes to dram_init_f() into the second patch
> 
>     > diff --git a/arch/x86/include/asm/zimage.h
>     b/arch/x86/include/asm/zimage.h
>     > index a02637f..b172048 100644
>     > --- a/arch/x86/include/asm/zimage.h
>     > +++ b/arch/x86/include/asm/zimage.h
>     > @@ -24,6 +24,8 @@
>     >  #ifndef _ASM_ZIMAGE_H_
>     >  #define _ASM_ZIMAGE_H_
>     >
>     > +#include <asm/e820.h>
>     > +
>     >  /* linux i386 zImage/bzImage header. Offsets relative to
>     >   * the start of the image */
>     >
>     > @@ -65,6 +67,9 @@
>     >  #define BZIMAGE_LOAD_ADDR  0x100000
>     >  #define ZIMAGE_LOAD_ADDR   0x10000
>     >
>     > +/* Implementation defined function to install an e820 map. */
>     > +unsigned install_e820_map(unsigned max_entries, struct e820entry *);
>     > +
>     >  void *load_zimage(char *image, unsigned long kernel_size,
>     >                 unsigned long initrd_addr, unsigned long initrd_size,
>     >                 int auto_boot);
>     > diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
>     > index 6843ff6..1fde13f 100644
>     > --- a/arch/x86/lib/zimage.c
>     > +++ b/arch/x86/lib/zimage.c
>     > @@ -51,6 +51,16 @@
>     >
>     >  #define COMMAND_LINE_SIZE    2048
>     >
>     > +unsigned generic_install_e820_map(unsigned max_entries,
>     > +                               struct e820entry *entries)
>     > +{
>     > +     return 0;
>     > +}
>     > +
>     > +unsigned install_e820_map(unsigned max_entries,
>     > +                       struct e820entry *entries)
>     > +     __attribute__((weak, alias("generic_install_e820_map")));
>     > +
>     >  static void build_command_line(char *command_line, int auto_boot)
>     >  {
>     >       char *env_command_line;
> 
>     I think all of the e820 code can be moved into your 32-bit boot protocol
>     patch series
> 
>     Regards,
> 
>     Graeme
> 
> 
> 
> The changes which gather e820 information from the coreboot tables don't
> really have anything specifically to do with the zboot command. The e820
> information could be gathered another way (or generated on the spot like
> you're doing) and the e820 info could be consumed by something else like
> the bootm command. They are not a single logical change and should not be
> merged.

Well to 32-bit boot protocol requires a function that fills out the e820
map which is what install_e820_map() does so, IMHO, they really belong
together. Maybe we fold the two patch series together (git does not care
for series of patches) as:

1) x86, coreboot: Import code from coreboot's libpayload to parse the
coreboot table
2) x86, coreboot: Determine the ram size using the coreboot tables
3) x86: Clean up the x86 zimage code in preparation to extend it
4) x86: Add support for booting Linux using the 32 bit boot protocol
5) x86, coreboot: Populate e820 tables from coreboot tables
6) x86: Refactor the zboot innards so they can be reused with a vboot image
7) x86: Add support for specifying an initrd with the zboot command

4) would include adding the generic_install_e820_map() function
5) would add the coreboot specific implementation

Regards,

Graeme


More information about the U-Boot mailing list