mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-16 14:08:45 +00:00
bootm: vxworks: Support Linux compatible standard DTB for ARM and PPC
Enhance do_bootm_vxworks() to support Linux compatible standard DTB for ARM and PPC, when the least significant bit of flags in VxWorks bootargs is set. Otherwise it falls back to the existing bootm flow which is now legacy. Signed-off-by: Lihua Zhao <lihua.zhao@windriver.com> Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
9a94a8994a
commit
1e26f64888
3 changed files with 53 additions and 2 deletions
|
@ -319,7 +319,7 @@ static void do_bootvx_fdt(bootm_headers_t *images)
|
||||||
puts("## vxWorks terminated\n");
|
puts("## vxWorks terminated\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_bootm_vxworks(int flag, int argc, char * const argv[],
|
static int do_bootm_vxworks_legacy(int flag, int argc, char * const argv[],
|
||||||
bootm_headers_t *images)
|
bootm_headers_t *images)
|
||||||
{
|
{
|
||||||
if (flag != BOOTM_STATE_OS_GO)
|
if (flag != BOOTM_STATE_OS_GO)
|
||||||
|
@ -336,6 +336,41 @@ int do_bootm_vxworks(int flag, int argc, char * const argv[],
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int do_bootm_vxworks(int flag, int argc, char * const argv[],
|
||||||
|
bootm_headers_t *images)
|
||||||
|
{
|
||||||
|
char *bootargs;
|
||||||
|
int pos;
|
||||||
|
unsigned long vxflags;
|
||||||
|
bool std_dtb = false;
|
||||||
|
|
||||||
|
/* get bootargs env */
|
||||||
|
bootargs = env_get("bootargs");
|
||||||
|
|
||||||
|
if (bootargs != NULL) {
|
||||||
|
for (pos = 0; pos < strlen(bootargs); pos++) {
|
||||||
|
/* find f=0xnumber flag */
|
||||||
|
if ((bootargs[pos] == '=') && (pos >= 1) &&
|
||||||
|
(bootargs[pos - 1] == 'f')) {
|
||||||
|
vxflags = simple_strtoul(&bootargs[pos + 1],
|
||||||
|
NULL, 16);
|
||||||
|
if (vxflags & VXWORKS_SYSFLG_STD_DTB)
|
||||||
|
std_dtb = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (std_dtb) {
|
||||||
|
if (flag & BOOTM_STATE_OS_PREP)
|
||||||
|
printf(" Using standard DTB\n");
|
||||||
|
return do_bootm_linux(flag, argc, argv, images);
|
||||||
|
} else {
|
||||||
|
if (flag & BOOTM_STATE_OS_PREP)
|
||||||
|
printf(" !!! WARNING !!! Using legacy DTB\n");
|
||||||
|
return do_bootm_vxworks_legacy(flag, argc, argv, images);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_CMD_ELF)
|
#if defined(CONFIG_CMD_ELF)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#
|
#
|
||||||
# Copyright (C) 2013, Miao Yan <miao.yan@windriver.com>
|
# Copyright (C) 2013, Miao Yan <miao.yan@windriver.com>
|
||||||
# Copyright (C) 2015-2018, Bin Meng <bmeng.cn@gmail.com>
|
# Copyright (C) 2015-2018, Bin Meng <bmeng.cn@gmail.com>
|
||||||
|
# Copyright (C) 2019, Lihua Zhao <lihua.zhao@windriver.com>
|
||||||
|
|
||||||
VxWorks Support
|
VxWorks Support
|
||||||
===============
|
===============
|
||||||
|
@ -24,6 +25,15 @@ From VxWorks 7, VxWorks starts adopting device tree as its hardware description
|
||||||
mechanism (for PowerPC and ARM), thus requiring boot interface changes.
|
mechanism (for PowerPC and ARM), thus requiring boot interface changes.
|
||||||
This section will describe the new interface.
|
This section will describe the new interface.
|
||||||
|
|
||||||
|
Since VxWorks 7 SR0640 release, VxWorks starts using Linux compatible standard
|
||||||
|
DTB for some boards. With that, the exact same bootm flow as used by Linux is
|
||||||
|
used, which includes board-specific DTB fix up. To keep backward compatibility,
|
||||||
|
only when the least significant bit of flags in bootargs is set, the standard
|
||||||
|
DTB will be used. Otherwise it falls back to the legacy bootm flow.
|
||||||
|
|
||||||
|
For legacy bootm flow, make sure the least significant bit of flags in bootargs
|
||||||
|
is cleared. The calling convention is described below:
|
||||||
|
|
||||||
For PowerPC, the calling convention of the new VxWorks entry point conforms to
|
For PowerPC, the calling convention of the new VxWorks entry point conforms to
|
||||||
the ePAPR standard, which is shown below (see ePAPR for more details):
|
the ePAPR standard, which is shown below (see ePAPR for more details):
|
||||||
|
|
||||||
|
@ -33,6 +43,9 @@ For ARM, the calling convention is shown below:
|
||||||
|
|
||||||
void (*kernel_entry)(void *fdt_addr)
|
void (*kernel_entry)(void *fdt_addr)
|
||||||
|
|
||||||
|
When using the Linux compatible standard DTB, the calling convention of VxWorks
|
||||||
|
entry point is exactly the same as the Linux kernel.
|
||||||
|
|
||||||
When booting a VxWorks 7 kernel (uImage format), the parameters passed to bootm
|
When booting a VxWorks 7 kernel (uImage format), the parameters passed to bootm
|
||||||
is like below:
|
is like below:
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,9 @@
|
||||||
|
|
||||||
#include <efi_api.h>
|
#include <efi_api.h>
|
||||||
|
|
||||||
|
/* Use Linux compatible standard DTB */
|
||||||
|
#define VXWORKS_SYSFLG_STD_DTB 0x1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Physical address of memory base for VxWorks x86
|
* Physical address of memory base for VxWorks x86
|
||||||
* This is LOCAL_MEM_LOCAL_ADRS in the VxWorks kernel configuration.
|
* This is LOCAL_MEM_LOCAL_ADRS in the VxWorks kernel configuration.
|
||||||
|
|
Loading…
Add table
Reference in a new issue