summaryrefslogtreecommitdiff
path: root/src/soc/intel/meteorlake
diff options
context:
space:
mode:
authorJeremy Compostella <jeremy.compostella@intel.com>2023-10-20 14:06:36 -0700
committerSubrata Banik <subratabanik@google.com>2023-12-11 05:07:23 +0000
commit79c09ba3b6a16aebc72a528fd82d70cd8b2fec41 (patch)
treed7fe6f2eb2b3726f126ccbf892f969073929a408 /src/soc/intel/meteorlake
parente46af3fca48f0d624d1380bca1e40741cb2c1caa (diff)
soc/intel/mtl: Display Sign-of-Life message using FSP-M
Meteor Lake Firmware Support Package (FSP-M) for ChromeOS includes an pre-memory graphics driver which can be leveraged to display a text message thanks to the following FSP-M UPD (Updateable Product Data): - VgaInitControl (bitfield): Bit 0: Turn on graphics, setup VGA text mode and display `VgaMessage' text centered on the screen. Bit 1: Clear text and tear down VGA text mode and graphics before returning from FSP-M. - VbtPtr (address): Pointer to the VBT (Video BIOS Tables) binary. - VbtSize (unsigned int): Size of the VBT binary. - LidStatus (boolean): Due to limited resources at early boot stages, the text message is displayed on a single monitor. The lid status helps decide which display is the most appropriate. 0: Lid is closed: show the text message on the external display if available, do not display anything otherwise. 1: Lid is open: show the message on the internal display if available, use an external display if available otherwise. - VgaMessage (string): Text message to display. If the `SOC_INTEL_METEORLAKE_SIGN_OF_LIFE' flag is set, coreboot configures the UPDs above to display a text message during memory training and CSME update. The text message can be configured via the locale text mechanism using the `memory_training_desc' name. The `SOC_INTEL_METEORLAKE_SIGN_OF_LIFE' selects the LZ4 compression algorithm for VBT because LZMA decompression is not available in romstage by default and adding LZMA support increases the romstage binary size more than the VBT binary is reduced. BUG=b:279173035 TEST=Text message is displayed during memory training on a rex board Change-Id: I8e7772582b1895fa8e38780932346683be998558 Signed-off-by: Jeremy Compostella <jeremy.compostella@intel.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/78244 Reviewed-by: Kapil Porwal <kapilporwal@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Subrata Banik <subratabanik@google.com> Reviewed-by: Eric Lai <ericllai@google.com>
Diffstat (limited to 'src/soc/intel/meteorlake')
-rw-r--r--src/soc/intel/meteorlake/Kconfig9
-rw-r--r--src/soc/intel/meteorlake/romstage/fsp_params.c55
2 files changed, 64 insertions, 0 deletions
diff --git a/src/soc/intel/meteorlake/Kconfig b/src/soc/intel/meteorlake/Kconfig
index e95756f35b..bd5014eaa1 100644
--- a/src/soc/intel/meteorlake/Kconfig
+++ b/src/soc/intel/meteorlake/Kconfig
@@ -457,4 +457,13 @@ config SOC_INTEL_COMMON_BLOCK_ACPI_SLP_S0_FREQ_HZ
config CPU_INTEL_COMMON_RESERVED_PHYS_ADDR_BITS
default 4
+config SOC_INTEL_METEORLAKE_SIGN_OF_LIFE
+ bool
+ default y if !SOC_INTEL_METEORLAKE_PRE_PRODUCTION_SILICON
+ depends on MAINBOARD_HAS_CHROMEOS
+ select VBT_CBFS_COMPRESSION_DEFAULT_LZ4
+ help
+ Enable the FSP-M Sign-of-Life feature to display a
+ configurable text message on screen during memory training
+ and CSME update.
endif
diff --git a/src/soc/intel/meteorlake/romstage/fsp_params.c b/src/soc/intel/meteorlake/romstage/fsp_params.c
index 81ad9dd6a4..704cb54dbf 100644
--- a/src/soc/intel/meteorlake/romstage/fsp_params.c
+++ b/src/soc/intel/meteorlake/romstage/fsp_params.c
@@ -1,18 +1,22 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <assert.h>
+#include <bootmode.h>
#include <console/console.h>
#include <cpu/intel/common/common.h>
#include <cpu/intel/cpu_ids.h>
#include <cpu/x86/msr.h>
#include <device/device.h>
+#include <device/pci.h>
#include <drivers/wifi/generic/wifi.h>
#include <fsp/fsp_debug_event.h>
#include <fsp/util.h>
#include <intelbasecode/ramtop.h>
#include <intelblocks/cpulib.h>
+#include <intelblocks/cse.h>
#include <intelblocks/pcie_rp.h>
#include <option.h>
+#include <soc/cpu.h>
#include <soc/gpio_soc_defs.h>
#include <soc/iomap.h>
#include <soc/msr.h>
@@ -22,6 +26,7 @@
#include <soc/soc_chip.h>
#include <soc/soc_info.h>
#include <string.h>
+#include <ux_locales.h>
#define FSP_CLK_NOTUSED 0xFF
#define FSP_CLK_LAN 0x70
@@ -418,6 +423,52 @@ static void soc_memory_init_params(FSP_M_CONFIG *m_cfg,
fill_fspm_params[i](m_cfg, config);
}
+#define UX_MEMORY_TRAINING_DESC "memory_training_desc"
+
+#define VGA_INIT_CONTROL_ENABLE BIT(0)
+/* Tear down legacy VGA mode before exiting FSP-M. */
+#define VGA_INIT_CONTROL_TEAR_DOWN BIT(1)
+
+static void fill_fspm_sign_of_life(FSP_M_CONFIG *m_cfg,
+ FSPM_ARCH_UPD *arch_upd)
+{
+ void *vbt;
+ size_t vbt_size;
+ uint32_t vga_init_control = 0;
+
+ /* Memory training. */
+ if (!arch_upd->NvsBufferPtr)
+ vga_init_control = VGA_INIT_CONTROL_ENABLE |
+ VGA_INIT_CONTROL_TEAR_DOWN;
+
+ if (is_cse_fw_update_required())
+ vga_init_control = VGA_INIT_CONTROL_ENABLE;
+
+ if (!vga_init_control)
+ return;
+
+ const char *text = ux_locales_get_text(UX_MEMORY_TRAINING_DESC);
+ /* No localized text found; fallback to built-in English. */
+ if (!text)
+ text = "Your device is finishing an update. "
+ "This may take 1-2 minutes.\n"
+ "Please do not turn off your device.";
+
+ vbt = cbfs_map("vbt.bin", &vbt_size);
+ if (!vbt) {
+ printk(BIOS_ERR, "Could not load vbt.bin\n");
+ return;
+ }
+
+ printk(BIOS_INFO, "Enabling FSP-M Sign-of-Life\n");
+
+ m_cfg->VgaInitControl = vga_init_control;
+ m_cfg->VbtPtr = (UINT32)vbt;
+ m_cfg->VbtSize = vbt_size;
+ m_cfg->LidStatus = CONFIG(VBOOT_LID_SWITCH) ? get_lid_switch() : CONFIG(RUN_FSP_GOP);
+ m_cfg->VgaMessage = (UINT32)text;
+}
+
void platform_fsp_memory_init_params_cb(FSPM_UPD *mupd, uint32_t version)
{
const struct soc_intel_meteorlake_config *config;
@@ -443,6 +494,10 @@ void platform_fsp_memory_init_params_cb(FSPM_UPD *mupd, uint32_t version)
config = config_of_soc();
soc_memory_init_params(m_cfg, config);
+
+ if (CONFIG(SOC_INTEL_METEORLAKE_SIGN_OF_LIFE))
+ fill_fspm_sign_of_life(m_cfg, arch_upd);
+
mainboard_memory_init_params(mupd);
}