arch/x86: Init firmware pointer for EC SMSC KBC1098/KBC1126 at build time
According to util/kbc1126/README.md, for these ECs to work, the address and size of their two firmware should be written to $s-0x100` (`$s` means the image size, done with kbc1126_ec_insert), which means that every existing section (especially those used to store code) should not overlap this address, otherwise the bootblock will get damaged when inserting firmwares of the EC. In this commit, ecfw_ptr is a structure initialized at build time according to CONFIG_KBC1126_FW1_OFFSET and CONFIG_KBC1126_FW2_OFFSET (to do so, they should be redefined as hex), and linked to CONFIG_ECFW_PTR_ADDR within bootblock, so kbc1126_ec_insert is not needed at build time any more. Test passed on Elitebook Folio 9470m. Signed-off-by: Bill XIE <persmule@hardenedlinux.org> Change-Id: I4f0de0c4d7283e630242fbe84a46e0547783c49e Reviewed-on: https://review.coreboot.org/c/coreboot/+/51671 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nico Huber <nico.h@gmx.de>
This commit is contained in:
@@ -340,4 +340,23 @@ config MEMLAYOUT_LD_FILE
|
||||
string
|
||||
default "src/arch/x86/memlayout.ld"
|
||||
|
||||
# Some EC need an "EC firmware pointer" (a data structure hinting the address
|
||||
# of its firmware blobs) being put at a fixed position. Its space
|
||||
# (__section__(".ecfw_ptr")) should be reserved if it lies in the range of a
|
||||
# stage. Different EC may have different format and/or value for it. The actual
|
||||
# address of EC firmware pointer should be provided in the Kconfig of the EC
|
||||
# requiring it, and its value could be filled by linking a read-only global
|
||||
# data object to the section above.
|
||||
|
||||
config ECFW_PTR_ADDR
|
||||
hex
|
||||
help
|
||||
Address of reserved space for EC firmware pointer, which should not
|
||||
overlap other data such as reset vector or FIT pointer if present.
|
||||
|
||||
config ECFW_PTR_SIZE
|
||||
int
|
||||
help
|
||||
Size of reserved space for EC firmware pointer
|
||||
|
||||
endif
|
||||
|
@@ -31,7 +31,7 @@ SECTIONS {
|
||||
*/
|
||||
PROGRAM_SZ = SIZEOF(.text) + 512;
|
||||
|
||||
. = MIN(_ID_SECTION, _FIT_POINTER) - EARLYASM_SZ;
|
||||
. = MIN(_ECFW_PTR, MIN(_ID_SECTION, _FIT_POINTER)) - EARLYASM_SZ;
|
||||
. = CONFIG(SIPI_VECTOR_IN_ROM) ? ALIGN(4096) : ALIGN(16);
|
||||
BOOTBLOCK_TOP = .;
|
||||
.init (.) : {
|
||||
@@ -56,6 +56,13 @@ SECTIONS {
|
||||
_ID_SECTION_END = SIZEOF(.fit_pointer) && SIZEOF(.id) > 0x28 ? 0xffffff80 : _X86_RESET_VECTOR;
|
||||
_ID_SECTION = _ID_SECTION_END - SIZEOF(.id);
|
||||
|
||||
. = _ECFW_PTR;
|
||||
.ecfw_ptr (.): {
|
||||
ASSERT((SIZEOF(.ecfw_ptr) == CONFIG_ECFW_PTR_SIZE), "Size of ecfw_ptr is incorrect");
|
||||
KEEP(*(.ecfw_ptr));
|
||||
}
|
||||
_ECFW_PTR = SIZEOF(.ecfw_ptr) ? CONFIG_ECFW_PTR_ADDR : _X86_RESET_VECTOR;
|
||||
|
||||
. = _FIT_POINTER;
|
||||
.fit_pointer (.): {
|
||||
KEEP(*(.fit_pointer));
|
||||
|
Reference in New Issue
Block a user