summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Rudolph <patrick.rudolph@9elements.com>2023-12-28 19:39:11 +0100
committerFelix Held <felix-coreboot@felixheld.de>2024-01-05 14:34:29 +0000
commit1d718def057770194f9fb5111201baf43ce7c838 (patch)
treeb85c0159e44462f5ff0b83cedd747be2b231249a
parent3052e9e6421cd5926b2b668c96a4d9cc040fcbf9 (diff)
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 <patrick.rudolph@9elements.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/79754 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
-rw-r--r--src/cpu/intel/model_206ax/Kconfig2
-rw-r--r--src/northbridge/intel/sandybridge/mrc_wrapper.S10
-rw-r--r--src/northbridge/intel/sandybridge/raminit_mrc.c11
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 <src/cpu/x86/64bit/prot2long.inc>
+
+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);