From 1d718def057770194f9fb5111201baf43ce7c838 Mon Sep 17 00:00:00 2001 From: Patrick Rudolph Date: Thu, 28 Dec 2023 19:39:11 +0100 Subject: [PATCH] northbridge/intel/sandybridge: Enable x86_64 for mrc.bin Enable x86_64 support for MRC.bin: - Add a wrapper function for console printing that calls into long mode to call native do_putchar - Remove Kconfig guard for x86_64 when MRC is being used Tested: Booted Lenovo X220 using mrc.bin under x86_64 and MRC is able to print to the console. Change-Id: I21ffcb5f5d4bf155593e8111531bdf0ed7071dfc Signed-off-by: Patrick Rudolph Reviewed-on: https://review.coreboot.org/c/coreboot/+/79754 Tested-by: build bot (Jenkins) Reviewed-by: Arthur Heymans --- src/cpu/intel/model_206ax/Kconfig | 2 +- src/northbridge/intel/sandybridge/mrc_wrapper.S | 10 ++++++++++ src/northbridge/intel/sandybridge/raminit_mrc.c | 11 +++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/cpu/intel/model_206ax/Kconfig b/src/cpu/intel/model_206ax/Kconfig index 10c0ae3d3e..649ef4ee00 100644 --- a/src/cpu/intel/model_206ax/Kconfig +++ b/src/cpu/intel/model_206ax/Kconfig @@ -1,7 +1,7 @@ config CPU_INTEL_MODEL_206AX bool select ARCH_X86 - select HAVE_EXP_X86_64_SUPPORT if USE_NATIVE_RAMINIT + select HAVE_EXP_X86_64_SUPPORT select SSE2 select UDELAY_TSC select TSC_MONOTONIC_TIMER diff --git a/src/northbridge/intel/sandybridge/mrc_wrapper.S b/src/northbridge/intel/sandybridge/mrc_wrapper.S index 860526b03c..d68ce091a4 100644 --- a/src/northbridge/intel/sandybridge/mrc_wrapper.S +++ b/src/northbridge/intel/sandybridge/mrc_wrapper.S @@ -25,3 +25,13 @@ mrc_wrapper: mov %ebp, %esp popal ret + + /* + * Callback for MRC to print a character on the console. + * As MRC is x86_32 call into long mode and use the x86_64 + * function do_putchar to print to console. + */ + +#include + +prot2lm_wrapper do_putchar diff --git a/src/northbridge/intel/sandybridge/raminit_mrc.c b/src/northbridge/intel/sandybridge/raminit_mrc.c index d59aa8687f..dde5742e8b 100644 --- a/src/northbridge/intel/sandybridge/raminit_mrc.c +++ b/src/northbridge/intel/sandybridge/raminit_mrc.c @@ -52,6 +52,7 @@ /* Assembly functions: */ void mrc_wrapper(void *func_ptr, uint32_t arg1); +void __prot2lm_do_putchar(uint8_t byte); static void save_mrc_data(struct pei_data *pei_data) { @@ -154,8 +155,14 @@ static void sdram_initialize(struct pei_data *pei_data) system_reset(); } - /* Pass console handler in pei_data */ - pei_data->tx_byte_ptr = (uintptr_t)do_putchar; + /* + * Pass console handler in pei_data. On x86_64 provide a wrapper around + * do_putchar that switches to long mode before calling do_putchar. + */ + if (ENV_X86_64) + pei_data->tx_byte_ptr = (uintptr_t)__prot2lm_do_putchar; + else + pei_data->tx_byte_ptr = (uintptr_t)do_putchar; /* Locate and call UEFI System Agent binary. */ entry = cbfs_map("mrc.bin", NULL);