mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
bootvx: x86: Prepare e820 related stuff from the given kernel memory base address
At present two environment variables 'e820data'/'e820info' are required to boot a VxWorks x86 kernel, but this is superfluous. The offset of these two tables are actually at a fixed offset from the kernel memory base address and we can provide the kernel memory base address to U-Boot via only one variable 'vx_phys_mem_base'. Note as it name indicates, the physical address should be provided. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
This commit is contained in:
parent
2ad3d088d2
commit
2902be86c1
3 changed files with 22 additions and 26 deletions
20
cmd/elf.c
20
cmd/elf.c
|
@ -209,6 +209,7 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
char build_buf[128]; /* Buffer for building the bootline */
|
||||
int ptr = 0;
|
||||
#ifdef CONFIG_X86
|
||||
ulong base;
|
||||
struct e820info *info;
|
||||
struct e820entry *data;
|
||||
#endif
|
||||
|
@ -335,25 +336,18 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
|
||||
#ifdef CONFIG_X86
|
||||
/*
|
||||
* Since E820 information is critical to the kernel, if we don't
|
||||
* specify these in the environments, use a default one.
|
||||
* Get VxWorks's physical memory base address from environment,
|
||||
* if we don't specify it in the environment, use a default one.
|
||||
*/
|
||||
tmp = env_get("e820data");
|
||||
if (tmp)
|
||||
data = (struct e820entry *)simple_strtoul(tmp, NULL, 16);
|
||||
else
|
||||
data = (struct e820entry *)VXWORKS_E820_DATA_ADDR;
|
||||
tmp = env_get("e820info");
|
||||
if (tmp)
|
||||
info = (struct e820info *)simple_strtoul(tmp, NULL, 16);
|
||||
else
|
||||
info = (struct e820info *)VXWORKS_E820_INFO_ADDR;
|
||||
base = env_get_hex("vx_phys_mem_base", VXWORKS_PHYS_MEM_BASE);
|
||||
data = (struct e820entry *)(base + E820_DATA_OFFSET);
|
||||
info = (struct e820info *)(base + E820_INFO_OFFSET);
|
||||
|
||||
memset(info, 0, sizeof(struct e820info));
|
||||
info->sign = E820_SIGNATURE;
|
||||
info->entries = install_e820_map(E820MAX, data);
|
||||
info->addr = (info->entries - 1) * sizeof(struct e820entry) +
|
||||
VXWORKS_E820_DATA_ADDR;
|
||||
E820_DATA_OFFSET;
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
@ -67,17 +67,13 @@ look like VxWorks hangs somewhere as nothing outputs on the serial console.
|
|||
|
||||
x86-specific information
|
||||
------------------------
|
||||
Before loading an x86 kernel, two additional environment variables need to be
|
||||
provided. They are "e820data" and "e820info", which represent the address of
|
||||
E820 table and E820 information (defined by VxWorks) in system memory.
|
||||
Before loading an x86 kernel, one additional environment variable need to be
|
||||
provided. This is "vx_phys_mem_base", which represent the physical memory
|
||||
base address of VxWorks.
|
||||
|
||||
Check VxWorks kernel configuration to look for BIOS_E820_DATA_START and
|
||||
BIOS_E820_INFO_START, and assign their values to "e820data" and "e820info"
|
||||
accordingly. If neither of these two are supplied, U-Boot assumes a default
|
||||
location at 0x4000 for "e820data" and 0x4a00 for "e820info". Typical values
|
||||
for "e820data" and "e820info" are 0x104000 and 0x104a00. But there is one
|
||||
exception on Intel Galileo, where "e820data" and "e820info" should be left
|
||||
unset, which assume the default location for VxWorks.
|
||||
Check VxWorks kernel configuration to look for LOCAL_MEM_LOCAL_ADRS. For
|
||||
VxWorks 7, this is normally a virtual address and you need find out its
|
||||
corresponding physical address and assign its value to "vx_phys_mem_base".
|
||||
|
||||
For boards on which ACPI is not supported by U-Boot yet, VxWorks kernel must
|
||||
be configured to use MP table and virtual wire interrupt mode. This requires
|
||||
|
|
|
@ -8,10 +8,16 @@
|
|||
#ifndef _VXWORKS_H_
|
||||
#define _VXWORKS_H_
|
||||
|
||||
/*
|
||||
* Physical address of memory base for VxWorks x86
|
||||
* This is LOCAL_MEM_LOCAL_ADRS in the VxWorks kernel configuration.
|
||||
*/
|
||||
#define VXWORKS_PHYS_MEM_BASE 0x100000
|
||||
|
||||
/*
|
||||
* VxWorks x86 E820 related stuff
|
||||
*
|
||||
* VxWorks on x86 gets E820 information from pre-defined address @
|
||||
* VxWorks on x86 gets E820 information from pre-defined offset @
|
||||
* 0x4a00 and 0x4000. At 0x4a00 it's an information table defined
|
||||
* by VxWorks and the actual E820 table entries starts from 0x4000.
|
||||
* As defined by the BIOS E820 spec, the maximum number of E820 table
|
||||
|
@ -20,8 +26,8 @@
|
|||
* information that is retrieved from the BIOS E820 call and saved
|
||||
* later for sanity test during the kernel boot-up.
|
||||
*/
|
||||
#define VXWORKS_E820_DATA_ADDR 0x4000
|
||||
#define VXWORKS_E820_INFO_ADDR 0x4a00
|
||||
#define E820_DATA_OFFSET 0x4000
|
||||
#define E820_INFO_OFFSET 0x4a00
|
||||
|
||||
/* E820 info signatiure "SMAP" - System MAP */
|
||||
#define E820_SIGNATURE 0x534d4150
|
||||
|
|
Loading…
Reference in a new issue