OpenSBI is the default firmware in Qemu and has various firmware loading options. Currently, qemu loader uses fw_jump which has a compile time pre-defined address where fdt & kernel image must reside. This puts a constraint on image size of the Linux kernel depending on the fdt location and available memory. However, fw_dynamic allows the loader to specify the next stage location (i.e. Linux kernel/U-Boot) in memory and other configurable boot options available in OpenSBI. Add support for OpenSBI dynamic firmware loading support. This doesn't break existing setup and fw_jump will continue to work as it is. Any other firmware will continue to work without any issues as long as it doesn't expect anything specific from loader in "a2" register. Signed-off-by: Atish Patra <atish.patra@wdc.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Bin Meng <bin.meng@windriver.com> Tested-by: Bin Meng <bin.meng@windriver.com> Message-Id: <20200701183949.398134-4-atish.patra@wdc.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
59 lines
1.9 KiB
C
59 lines
1.9 KiB
C
/* SPDX-License-Identifier: BSD-2-Clause */
|
|
/*
|
|
* Copyright (c) 2019 Western Digital Corporation or its affiliates.
|
|
*
|
|
* Based on include/sbi/{fw_dynamic.h,sbi_scratch.h} from the OpenSBI project.
|
|
*/
|
|
#ifndef OPENSBI_H
|
|
#define OPENSBI_H
|
|
|
|
/** Expected value of info magic ('OSBI' ascii string in hex) */
|
|
#define FW_DYNAMIC_INFO_MAGIC_VALUE 0x4942534f
|
|
|
|
/** Maximum supported info version */
|
|
#define FW_DYNAMIC_INFO_VERSION 0x2
|
|
|
|
/** Possible next mode values */
|
|
#define FW_DYNAMIC_INFO_NEXT_MODE_U 0x0
|
|
#define FW_DYNAMIC_INFO_NEXT_MODE_S 0x1
|
|
#define FW_DYNAMIC_INFO_NEXT_MODE_M 0x3
|
|
|
|
enum sbi_scratch_options {
|
|
/** Disable prints during boot */
|
|
SBI_SCRATCH_NO_BOOT_PRINTS = (1 << 0),
|
|
/** Enable runtime debug prints */
|
|
SBI_SCRATCH_DEBUG_PRINTS = (1 << 1),
|
|
};
|
|
|
|
/** Representation dynamic info passed by previous booting stage */
|
|
struct fw_dynamic_info {
|
|
/** Info magic */
|
|
target_long magic;
|
|
/** Info version */
|
|
target_long version;
|
|
/** Next booting stage address */
|
|
target_long next_addr;
|
|
/** Next booting stage mode */
|
|
target_long next_mode;
|
|
/** Options for OpenSBI library */
|
|
target_long options;
|
|
/**
|
|
* Preferred boot HART id
|
|
*
|
|
* It is possible that the previous booting stage uses same link
|
|
* address as the FW_DYNAMIC firmware. In this case, the relocation
|
|
* lottery mechanism can potentially overwrite the previous booting
|
|
* stage while other HARTs are still running in the previous booting
|
|
* stage leading to boot-time crash. To avoid this boot-time crash,
|
|
* the previous booting stage can specify last HART that will jump
|
|
* to the FW_DYNAMIC firmware as the preferred boot HART.
|
|
*
|
|
* To avoid specifying a preferred boot HART, the previous booting
|
|
* stage can set it to -1UL which will force the FW_DYNAMIC firmware
|
|
* to use the relocation lottery mechanism.
|
|
*/
|
|
target_long boot_hart;
|
|
};
|
|
|
|
#endif
|