From 765e5df0dddbb12927dbcc8a8315ed4c99357984 Mon Sep 17 00:00:00 2001 From: Jeremy Compostella Date: Thu, 1 Dec 2022 15:45:51 -0700 Subject: drivers/intel/gma: Hook up libgfxinit in romstage A mainboard port needs to: - select `CONFIG_MAINBOARD_HAS_EARLY_LIBGFXINIT' - implement the Ada package `GMA.Mainboard' with a single function `ports' that returns a list of ports to be probed for displays. - set the desired `GFX_GMA_DEFAULT_MMIO' IO memory address to use in romstage (and ramstage) for the graphic device. BUG=b:252792591 BRANCH=firmware-brya-14505.B TEST=libgfxinit compiles in romstage. libgfxinit successfully executes in romstage and ramstage using the requested MMIO setting on skolas. Change-Id: I3c2101de10dc5df54fe873e43bbe0f1c4dccff44 Signed-off-by: Jeremy Compostella Reviewed-on: https://review.coreboot.org/c/coreboot/+/70276 Reviewed-by: Tarun Tuli Tested-by: build bot (Jenkins) --- src/arch/x86/car.ld | 7 +++++ src/device/Kconfig | 31 ++++++++++++++++++++- src/drivers/intel/gma/Kconfig | 22 ++++++++++++--- src/drivers/intel/gma/Makefile.inc | 37 +++++++++++++++++++++----- src/soc/intel/common/block/graphics/graphics.c | 12 +++++++++ 5 files changed, 98 insertions(+), 11 deletions(-) diff --git a/src/arch/x86/car.ld b/src/arch/x86/car.ld index dc075c6801..87e3dbc849 100644 --- a/src/arch/x86/car.ld +++ b/src/arch/x86/car.ld @@ -72,6 +72,13 @@ * runtime. Therefore, they can be placed in the _bss region. */ #if CONFIG(ROMSTAGE_LIBHWBASE) *(.data.hw__*_E) +#endif +#if CONFIG(EARLY_GFX_GMA) + *(.data.gma*_E) + /* libgfxinit uses a boolean variable to track its initialization + * state. Since the initial value is False it can safely be placed in + * the _bss region. */ + *(.data.hw__gfx__gma__initialized) #endif . = ALIGN(ARCH_POINTER_ALIGN_SIZE); _ebss = .; diff --git a/src/device/Kconfig b/src/device/Kconfig index 1ff14a6571..e98644e34d 100644 --- a/src/device/Kconfig +++ b/src/device/Kconfig @@ -4,7 +4,7 @@ menu "Devices" config HAVE_VGA_TEXT_FRAMEBUFFER bool - depends on !NO_GFX_INIT + depends on !(NO_GFX_INIT && NO_EARLY_GFX_INIT) help Selected by graphics drivers that support legacy VGA text mode. @@ -58,6 +58,13 @@ config MAINBOARD_HAS_LIBGFXINIT Selected by mainboards that implement support for `libgfxinit`. Usually this requires a list of ports to be probed for displays. +config MAINBOARD_HAS_EARLY_LIBGFXINIT + def_bool n + help + Selected by mainboards that implement early (cache-as-ram + stage) support of `libgfxinit`. Usually this requires a list + of ports to be probed for displays. + choice prompt "Graphics initialization" default NO_GFX_INIT if VGA_ROM_RUN_DEFAULT && PAYLOAD_SEABIOS @@ -117,6 +124,28 @@ config NO_GFX_INIT endchoice +choice + prompt "Early (romstage) graphics initialization" + default MAINBOARD_USE_EARLY_LIBGFXINIT if MAINBOARD_HAS_EARLY_LIBGFXINIT + default NO_EARLY_GFX_INIT + +config NO_EARLY_GFX_INIT + bool "None" + help + Select this to not perform any graphics initialization at + romstage. + +config MAINBOARD_USE_EARLY_LIBGFXINIT + bool "Use libgfxinit" + depends on MAINBOARD_HAS_EARLY_LIBGFXINIT + select ROMSTAGE_VGA + help + Use the SPARK library `libgfxinit` for the romstage native + graphics initialization. This requires an Ada + toolchain. Graphics at romstage is limited to VGA text mode. + +endchoice + config PRE_GRAPHICS_DELAY_MS int "Graphics initialization delay in ms" default 0 diff --git a/src/drivers/intel/gma/Kconfig b/src/drivers/intel/gma/Kconfig index 87f6d125d2..8aed404f78 100644 --- a/src/drivers/intel/gma/Kconfig +++ b/src/drivers/intel/gma/Kconfig @@ -90,15 +90,31 @@ config GFX_GMA depends on MAINBOARD_USE_LIBGFXINIT || INTEL_GMA_LIBGFXINIT_EDID select RAMSTAGE_LIBHWBASE +config EARLY_GFX_GMA + def_bool y + depends on SOC_INTEL_ALDERLAKE + depends on MAINBOARD_USE_EARLY_LIBGFXINIT + select ROMSTAGE_LIBHWBASE + +config GFX_GMA_DEFAULT_MMIO + hex + depends on HWBASE_STATIC_MMIO && (GFX_GMA || EARLY_GFX_GMA) + help + Graphics device MMIO address. This is typically an unused + memory mapping region which can be allocated to the MMIO + region as graphics PCI device Base Address Range zero. + config GFX_GMA_PANEL_1_ON_EDP bool - depends on GFX_GMA || MAINBOARD_HAS_LIBGFXINIT + depends on GFX_GMA || MAINBOARD_HAS_LIBGFXINIT \ + || MAINBOARD_HAS_EARLY_LIBGFXINIT default n if GFX_GMA_PANEL_1_ON_LVDS default y config GFX_GMA_PANEL_1_ON_LVDS bool - depends on GFX_GMA || MAINBOARD_HAS_LIBGFXINIT + depends on GFX_GMA || MAINBOARD_HAS_LIBGFXINIT \ + || MAINBOARD_HAS_EARLY_LIBGFXINIT default y if NORTHBRIDGE_INTEL_GM45 || NORTHBRIDGE_INTEL_IRONLAKE default n @@ -111,7 +127,7 @@ config INTEL_GMA_OPREGION_2_1 bool default n -if GFX_GMA +if GFX_GMA || EARLY_GFX_GMA config GFX_GMA_DYN_CPU def_bool y diff --git a/src/drivers/intel/gma/Makefile.inc b/src/drivers/intel/gma/Makefile.inc index 5588e5af7b..82535f63f1 100644 --- a/src/drivers/intel/gma/Makefile.inc +++ b/src/drivers/intel/gma/Makefile.inc @@ -20,24 +20,39 @@ endif $(call add_vbt_to_cbfs, vbt.bin, $(call strip_quotes,$(CONFIG_INTEL_GMA_VBT_FILE))) -ifeq ($(CONFIG_GFX_GMA),y) +ifneq (,$(filter y, $(CONFIG_GFX_GMA) $(CONFIG_EARLY_GFX_GMA))) + +gfx-gma-stages = \ + $(if $(filter y,$(CONFIG_EARLY_GFX_GMA)),romstage) \ + $(if $(filter y,$(CONFIG_GFX_GMA)),ramstage) \ $(call add-special-class,gfxinit) -gfxinit-handler = $(eval ramstage-srcs += $(1)$(2)) +gfxinit-handler +=$(foreach stage, $(gfx-gma-stages), \ + $(eval $(stage)-srcs += $$(addprefix $(1),$(2)))) $(call add-special-class,gfxinit-gen) -gfxinit-gen-handler = \ +gfxinit-gen-handler += \ $(eval additional-dirs += $(dir $(2))) \ - $(eval ramstage-srcs += $(2)) \ - $(eval ramstage-ads-deps += $(2)) \ - $(eval ramstage-adb-deps += $(2)) \ + $(foreach stage, $(gfx-gma-stages), \ + $(eval $(stage)-srcs += $(2)) \ + $(eval $(stage)-ads-deps += $(2)) \ + $(eval $(stage)-adb-deps += $(2))) \ $(eval $(2): $(obj)/config.h) +ifeq ($(CONFIG_GFX_GMA_DEFAULT_MMIO),) CONFIG_GFX_GMA_DEFAULT_MMIO := 0 # dummy, will be overwritten at runtime +else +$(call to-ada-hex,CONFIG_GFX_GMA_DEFAULT_MMIO) +endif subdirs-y += ../../../../3rdparty/libgfxinit -ramstage-y += gma.ads gma.adb +$(foreach stage,$(gfx-gma-stages), \ + $(eval $(stage)-y += gma.ads gma.adb)) + +endif # CONFIG_GFX_GMA || CONFIG_EARLY_GFX_GMA + +ifeq ($(CONFIG_GFX_GMA),y) ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += gma-gfx_init.ads ifeq ($(CONFIG_LINEAR_FRAMEBUFFER),y) @@ -47,3 +62,11 @@ ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += text_fb/gma-gfx_init.adb endif endif # CONFIG_GFX_GMA + +ifeq ($(CONFIG_EARLY_GFX_GMA),y) + +romstage-$(CONFIG_MAINBOARD_USE_EARLY_LIBGFXINIT) += \ + gma-gfx_init.ads \ + text_fb/gma-gfx_init.adb + +endif # CONFIG_EARLY_GFX_GMA diff --git a/src/soc/intel/common/block/graphics/graphics.c b/src/soc/intel/common/block/graphics/graphics.c index e9a6a5dcdc..bc047277fb 100644 --- a/src/soc/intel/common/block/graphics/graphics.c +++ b/src/soc/intel/common/block/graphics/graphics.c @@ -173,6 +173,18 @@ static void graphics_dev_read_resources(struct device *dev) if (res_bar0->flags & IORESOURCE_PREFETCH) res_bar0->flags &= ~IORESOURCE_PREFETCH; } + + /* + * If libhwbase static MMIO driver is used, IGD BAR 0 has to be set to + * CONFIG_GFX_GMA_DEFAULT_MMIO for the libgfxinit to operate properly. + */ + if (CONFIG(MAINBOARD_USE_LIBGFXINIT) && CONFIG(HWBASE_STATIC_MMIO)) { + struct resource *res_bar0 = find_resource(dev, PCI_BASE_ADDRESS_0); + res_bar0->base = CONFIG_GFX_GMA_DEFAULT_MMIO; + res_bar0->flags |= IORESOURCE_ASSIGNED; + pci_dev_set_resources(dev); + res_bar0->flags |= IORESOURCE_FIXED; + } } const struct device_operations graphics_ops = { -- cgit v1.2.3