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>
diff --git a/src/cpu/intel/model_206ax/Kconfig b/src/cpu/intel/model_206ax/Kconfig
index 10c0ae3..649ef4e 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 860526b..d68ce09 100644
--- a/src/northbridge/intel/sandybridge/mrc_wrapper.S
+++ b/src/northbridge/intel/sandybridge/mrc_wrapper.S
@@ -25,3 +25,13 @@
 	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 d59aa86..dde5742 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 @@
 		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);