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

Graeme Russ graeme.russ at gmail.com
Sun Dec 4 01:52:08 CET 2011


Hi Gabe,

Last nit, I promise, and then I'll apply it all to u-boot-x86/next

On 03/12/11 22:18, Gabe Black wrote:
> Also approximate the size of RAM using the largest RAM address available
> in the tables. There may be areas which are marked as reserved which are
> actually at the end of RAM.
> 
> Signed-off-by: Gabe Black <gabeblack at chromium.org>
> ---
> Changes in v2:
> - Moved the coreboot specfic e820 function into this patch.
> 
>  arch/x86/cpu/coreboot/sdram.c |   38 +++++++++++++++++++++++++++++++++++++-
>  arch/x86/include/asm/zimage.h |    5 +++++
>  2 files changed, 42 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/x86/cpu/coreboot/sdram.c b/arch/x86/cpu/coreboot/sdram.c
> index b56085a..f8fdac6 100644
> --- a/arch/x86/cpu/coreboot/sdram.c
> +++ b/arch/x86/cpu/coreboot/sdram.c
> @@ -23,13 +23,49 @@
>   */
>  
>  #include <common.h>
> +#include <malloc.h>
> +#include <asm/e820.h>
>  #include <asm/u-boot-x86.h>
> +#include <asm/global_data.h>
> +#include <asm/arch-coreboot/sysinfo.h>
> +#include <asm/arch-coreboot/tables.h>
>  
>  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)
>  {
> -	gd->ram_size = 64*1024*1024;
> +	int i;
> +	phys_size_t ram_size = 0;
> +
> +	for (i = 0; i < lib_sysinfo.n_memranges; i++) {
> +		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)
> +		return -1;
>  	return 0;
>  }
>  
> diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
> index 8ee6a74..3a68bb0 100644
> --- a/arch/x86/include/asm/zimage.h
> +++ b/arch/x86/include/asm/zimage.h

The zimage.h changes belong in patch 3

> @@ -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 */
>  
> @@ -44,6 +46,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 *);
> +

Should be u8 as boot_params.e820_entries is u8 (__u8 really, but we don't
use the kernel data types)

>  void *load_zimage(char *image, unsigned long kernel_size,
>  		  unsigned long initrd_addr, unsigned long initrd_size,
>  		  int auto_boot, void **load_address);

Regards,

Graeme


More information about the U-Boot mailing list