Hello Arthur Heymans,
I'd like you to do a code review. Please visit
https://review.coreboot.org/c/coreboot/+/30499
to review the following change.
Change subject: mb/qemu-{i440fx,q35}: Use POSTCAR stage to load the ramstage ......................................................................
mb/qemu-{i440fx,q35}: Use POSTCAR stage to load the ramstage
Qemu does not have a real CAR but postcar stage is still useful to setup pagetables for x86_64 ramstage.
Change-Id: I6638534d99fde312e55b6a6be8c95e4cb25cca80 Signed-off-by: Arthur Heymans arthur@aheymans.xyz Signed-off-by: Patrick Rudolph siro@das-labor.org --- M src/lib/Makefile.inc M src/mainboard/emulation/qemu-i440fx/Kconfig M src/mainboard/emulation/qemu-i440fx/Makefile.inc A src/mainboard/emulation/qemu-i440fx/exit_car.S M src/mainboard/emulation/qemu-i440fx/romstage.c M src/mainboard/emulation/qemu-q35/Kconfig M src/mainboard/emulation/qemu-q35/Makefile.inc M src/mainboard/emulation/qemu-q35/romstage.c 8 files changed, 75 insertions(+), 2 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/99/30499/1
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc index 2fd4e4c..48dc664 100644 --- a/src/lib/Makefile.inc +++ b/src/lib/Makefile.inc @@ -132,6 +132,7 @@ ramstage-$(CONFIG_CONSOLE_CBMEM) += cbmem_console.c ramstage-$(CONFIG_BOOTSPLASH) += jpeg.c ramstage-$(CONFIG_TRACE) += trace.c +postcar-$(CONFIG_TRACE) += trace.c ramstage-$(CONFIG_COLLECT_TIMESTAMPS) += timestamp.c ramstage-$(CONFIG_COVERAGE) += libgcov.c ramstage-y += edid.c diff --git a/src/mainboard/emulation/qemu-i440fx/Kconfig b/src/mainboard/emulation/qemu-i440fx/Kconfig index eb9f011..3a507d3 100644 --- a/src/mainboard/emulation/qemu-i440fx/Kconfig +++ b/src/mainboard/emulation/qemu-i440fx/Kconfig @@ -14,6 +14,8 @@ select MAINBOARD_FORCE_NATIVE_VGA_INIT select BOOTBLOCK_CONSOLE select NO_CAR_GLOBAL_MIGRATION + select POSTCAR_STAGE + select POSTCAR_CONSOLE
config MAINBOARD_DIR string diff --git a/src/mainboard/emulation/qemu-i440fx/Makefile.inc b/src/mainboard/emulation/qemu-i440fx/Makefile.inc index 9e2880a..de790e6 100644 --- a/src/mainboard/emulation/qemu-i440fx/Makefile.inc +++ b/src/mainboard/emulation/qemu-i440fx/Makefile.inc @@ -2,3 +2,5 @@ ramstage-y += fw_cfg.c romstage-y += memory.c ramstage-y += memory.c +postcar-y += memory.c +postcar-y += exit_car.S diff --git a/src/mainboard/emulation/qemu-i440fx/exit_car.S b/src/mainboard/emulation/qemu-i440fx/exit_car.S new file mode 100644 index 0000000..74f6ed2 --- /dev/null +++ b/src/mainboard/emulation/qemu-i440fx/exit_car.S @@ -0,0 +1,23 @@ +/* + * This file is part of the coreboot project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2 of + * the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include <cpu/x86/mtrr.h> +#include <cpu/x86/cr.h> +/* jump directly to the main function, as there is no real CAR to tear down. */ +.text +.global chipset_teardown_car +chipset_teardown_car: + /* Set up new stack. */ + mov post_car_stack_top, %esp + /* Call C code */ + call main diff --git a/src/mainboard/emulation/qemu-i440fx/romstage.c b/src/mainboard/emulation/qemu-i440fx/romstage.c index e31394c..137dfbf 100644 --- a/src/mainboard/emulation/qemu-i440fx/romstage.c +++ b/src/mainboard/emulation/qemu-i440fx/romstage.c @@ -20,14 +20,35 @@ #include <cpu/intel/romstage.h> #include <timestamp.h> #include <program_loading.h> +#include <cpu/x86/mtrr.h> + +#include "memory.h"
asmlinkage void car_stage_entry(void) { + struct postcar_frame pcf; + console_init();
cbmem_recovery(0);
timestamp_add_now(TS_START_ROMSTAGE);
- run_ramstage(); + if (postcar_frame_init(&pcf, 5 * KiB)) + die("Unable to initialize postcar frame.\n"); + + /* Cache the ROM as WP just below 4GiB. */ + postcar_frame_add_romcache(&pcf, MTRR_TYPE_WRPROT); + + /* Cache memory below 4 GiB */ + postcar_frame_add_mtrr(&pcf, 0, qemu_get_memory_size() * KiB, + MTRR_TYPE_WRBACK); + + /* Cache memory beyond 4 GiB */ + if (qemu_get_high_memory_size() > 0) + postcar_frame_add_mtrr(&pcf, (4ULL * GiB), + qemu_get_high_memory_size() * KiB, + MTRR_TYPE_WRBACK); + + run_postcar_phase(&pcf); } diff --git a/src/mainboard/emulation/qemu-q35/Kconfig b/src/mainboard/emulation/qemu-q35/Kconfig index 1cc7148..07c15f3 100644 --- a/src/mainboard/emulation/qemu-q35/Kconfig +++ b/src/mainboard/emulation/qemu-q35/Kconfig @@ -13,6 +13,8 @@ select MAINBOARD_FORCE_NATIVE_VGA_INIT select BOOTBLOCK_CONSOLE select NO_CAR_GLOBAL_MIGRATION + select POSTCAR_STAGE + select POSTCAR_CONSOLE
config MAINBOARD_DIR string diff --git a/src/mainboard/emulation/qemu-q35/Makefile.inc b/src/mainboard/emulation/qemu-q35/Makefile.inc index 1c06d77..a0ac5dd 100644 --- a/src/mainboard/emulation/qemu-q35/Makefile.inc +++ b/src/mainboard/emulation/qemu-q35/Makefile.inc @@ -3,4 +3,6 @@ ramstage-y += ../qemu-i440fx/fw_cfg.c romstage-y += ../qemu-i440fx/memory.c
+postcar-y += ../qemu-i440fx/memory.c +postcar-y += ../qemu-i440fx/exit_car.S bootblock-y += bootblock.c diff --git a/src/mainboard/emulation/qemu-q35/romstage.c b/src/mainboard/emulation/qemu-q35/romstage.c index 2b8d935..badafdd 100644 --- a/src/mainboard/emulation/qemu-q35/romstage.c +++ b/src/mainboard/emulation/qemu-q35/romstage.c @@ -21,9 +21,13 @@ #include <timestamp.h> #include <southbridge/intel/i82801ix/i82801ix.h> #include <program_loading.h> +#include <cpu/x86/mtrr.h> + +#include "../qemu-i440fx/memory.h"
asmlinkage void car_stage_entry(void) { + struct postcar_frame pcf; i82801ix_early_init(); console_init();
@@ -31,5 +35,21 @@
timestamp_add_now(TS_START_ROMSTAGE);
- run_ramstage(); + if (postcar_frame_init(&pcf, 5 * KiB)) + die("Unable to initialize postcar frame.\n"); + + /* Cache the ROM as WP just below 4GiB. */ + postcar_frame_add_romcache(&pcf, MTRR_TYPE_WRPROT); + + /* Cache memory below 4 GiB */ + postcar_frame_add_mtrr(&pcf, 0, qemu_get_memory_size() * KiB, + MTRR_TYPE_WRBACK); + + /* Cache memory beyond 4 GiB */ + if (qemu_get_high_memory_size() > 0) + postcar_frame_add_mtrr(&pcf, (4ULL * GiB), + qemu_get_high_memory_size() * KiB, + MTRR_TYPE_WRBACK); + + run_postcar_phase(&pcf); }