From 2902be86c1496244800ee15a148a4907bf9a3492 Mon Sep 17 00:00:00 2001 From: Bin Meng Date: Wed, 11 Apr 2018 22:02:07 -0700 Subject: [PATCH] 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 Reviewed-by: Christian Gmeiner --- cmd/elf.c | 20 +++++++------------- doc/README.vxworks | 18 +++++++----------- include/vxworks.h | 12 +++++++++--- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/cmd/elf.c b/cmd/elf.c index 19479bb706..ea09506c64 100644 --- a/cmd/elf.c +++ b/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 /* diff --git a/doc/README.vxworks b/doc/README.vxworks index 6700e1d163..3f9b8c182e 100644 --- a/doc/README.vxworks +++ b/doc/README.vxworks @@ -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. - -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. +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 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 diff --git a/include/vxworks.h b/include/vxworks.h index f69b0084ff..f600dfa337 100644 --- a/include/vxworks.h +++ b/include/vxworks.h @@ -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 -- 2.39.2