device/Kconfig: Put gfx init methods into a `choice`

Provide all gfx init methods as a Kconfig `choice`. This elimates the
option to select native gfx init along with running a Video BIOS. It's
been only theoretically useful in one corner case: Hybrid graphics
where only one controller is supported by native gfx init. Though I
suppose in that case it's fair to assume that one would use SeaBIOS to
run the VBIOS.

For the case that we want the payload to initialize graphics or no
pre-boot graphics at all, the new symbol NO_GFX_INIT was added to the
choice. If multiple options are available, the default is chosen as
follows:

  * NO_GFX_INIT, if we add a Video BIOS and the payload is SeaBIOS,
  * VGA_ROM_RUN, if we add a Video BIOS and the payload is not SeaBIOS,
  * NATIVE_VGA_INIT, if we don't add a Video BIOS.

As a side effect, libgfxinit is now an independent choice.

Change-Id: I06bc65ecf3724f299f59888a97219fdbd3d2d08b
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: https://review.coreboot.org/19814
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
diff --git a/src/device/Kconfig b/src/device/Kconfig
index 841f224..0637c69 100644
--- a/src/device/Kconfig
+++ b/src/device/Kconfig
@@ -42,39 +42,36 @@
 config MAINBOARD_FORCE_NATIVE_VGA_INIT
 	def_bool n
 	depends on MAINBOARD_HAS_NATIVE_VGA_INIT || MAINBOARD_HAS_LIBGFXINIT
-	select MAINBOARD_DO_NATIVE_VGA_INIT
 	help
 	  Selected by mainboards / chipsets whose graphics driver can't or
 	  shouldn't be disabled.
 
-config MAINBOARD_DO_NATIVE_VGA_INIT
-	bool "Use native graphics initialization"
-	depends on MAINBOARD_HAS_NATIVE_VGA_INIT
-	default n
-	help
-	  Some mainboards, such as the Google Link, allow initializing the display
-	  without the need of a binary only VGA OPROM. Enabling this option may be
-	  faster, but also lacks flexibility in setting modes.
-
-	  If unsure, say N.
-
 config MAINBOARD_HAS_LIBGFXINIT
 	def_bool n
-	select MAINBOARD_HAS_NATIVE_VGA_INIT
 	help
 	  Selected by mainboards that implement support for `libgfxinit`.
 	  Usually this requires a list of ports to be probed for displays.
 
+choice
+	prompt "Graphics initialization"
+	default NO_GFX_INIT if VGA_BIOS && PAYLOAD_SEABIOS
+	default VGA_ROM_RUN if VGA_BIOS
+
+config MAINBOARD_DO_NATIVE_VGA_INIT
+	bool "Use native graphics init"
+	depends on MAINBOARD_HAS_NATIVE_VGA_INIT
+	help
+	  Some mainboards, such as the Google Link, allow initializing the
+	  display without the need of a binary only VGA OPROM. Enabling this
+	  option may be faster, but also lacks flexibility in setting modes.
+
 config MAINBOARD_USE_LIBGFXINIT
-	bool "Use libgfxinit for native graphics initialization"
-	depends on MAINBOARD_DO_NATIVE_VGA_INIT
+	bool "Use libgfxinit"
 	depends on MAINBOARD_HAS_LIBGFXINIT
 	select HAVE_VGA_TEXT_FRAMEBUFFER
 	select HAVE_LINEAR_FRAMEBUFFER
 	select RAMSTAGE_LIBHWBASE
 	select VGA if VGA_TEXT_FRAMEBUFFER
-	select NO_EDID_FILL_FB
-	default n
 	help
 	  Use the SPARK library `libgfxinit` for the native graphics
 	  initialization. This requires an Ada toolchain.
@@ -82,12 +79,10 @@
 # TODO: Explain differences (if any) for onboard cards.
 config VGA_ROM_RUN
 	bool "Run VGA Option ROMs"
-	default n if PAYLOAD_SEABIOS
-	default y if !PAYLOAD_SEABIOS
-	depends on PCI && !MAINBOARD_DO_NATIVE_VGA_INIT
+	depends on PCI && !MAINBOARD_FORCE_NATIVE_VGA_INIT
 	select HAVE_VGA_TEXT_FRAMEBUFFER
 	help
-	  Execute VGA Option ROMs in coreboot if found. This is required
+	  Execute VGA Option ROMs in coreboot if found. This can be used
 	  to enable PCI/AGP/PCI-E video cards when not using a SeaBIOS
 	  payload.
 
@@ -95,7 +90,15 @@
 	  more complete BIOS interrupt services available than coreboot,
 	  which some option ROMs require in order to function correctly.
 
-	  If unsure, say N when using SeaBIOS as payload, Y otherwise.
+config NO_GFX_INIT
+	bool "None"
+	depends on !MAINBOARD_FORCE_NATIVE_VGA_INIT
+	help
+	  Select this to not perform any graphics initialization in
+	  coreboot. This is useful if the payload (e.g. SeaBIOS) can
+	  initialize graphics or if pre-boot graphics are not required.
+
+endchoice
 
 config S3_VGA_ROM_RUN
 	bool "Re-run VGA Option ROMs on S3 resume"
diff --git a/src/mainboard/asus/kfsn4-dre/Kconfig b/src/mainboard/asus/kfsn4-dre/Kconfig
index 0920056..3e9f3f3 100644
--- a/src/mainboard/asus/kfsn4-dre/Kconfig
+++ b/src/mainboard/asus/kfsn4-dre/Kconfig
@@ -81,10 +81,6 @@
 	bool
 	default y
 
-config MAINBOARD_DO_NATIVE_VGA_INIT
-	bool
-	default y
-
 config MAINBOARD_POWER_ON_AFTER_POWER_FAIL
 	bool
 	default y
diff --git a/src/mainboard/asus/kfsn4-dre_k8/Kconfig b/src/mainboard/asus/kfsn4-dre_k8/Kconfig
index 8bd2146..0d13a4e 100644
--- a/src/mainboard/asus/kfsn4-dre_k8/Kconfig
+++ b/src/mainboard/asus/kfsn4-dre_k8/Kconfig
@@ -87,10 +87,6 @@
 	bool
 	default y
 
-config MAINBOARD_DO_NATIVE_VGA_INIT
-	bool
-	default y
-
 config MAINBOARD_POWER_ON_AFTER_POWER_FAIL
 	bool
 	default y
diff --git a/src/mainboard/google/slippy/Kconfig b/src/mainboard/google/slippy/Kconfig
index 1d889df..e24e2f7 100644
--- a/src/mainboard/google/slippy/Kconfig
+++ b/src/mainboard/google/slippy/Kconfig
@@ -15,7 +15,6 @@
 	select MAINBOARD_HAS_LPC_TPM
 	select INTEL_INT15
 	select MAINBOARD_HAS_LIBGFXINIT
-	select MAINBOARD_USE_LIBGFXINIT if MAINBOARD_DO_NATIVE_VGA_INIT
 
 if BOARD_GOOGLE_BASEBOARD_SLIPPY
 
diff --git a/src/mainboard/sapphire/pureplatinumh61/Kconfig b/src/mainboard/sapphire/pureplatinumh61/Kconfig
index f9458a6..6ade9b5 100644
--- a/src/mainboard/sapphire/pureplatinumh61/Kconfig
+++ b/src/mainboard/sapphire/pureplatinumh61/Kconfig
@@ -14,7 +14,6 @@
 	select HAVE_CMOS_DEFAULT
 	select HAVE_ACPI_RESUME
 	select MAINBOARD_HAS_LIBGFXINIT
-	select MAINBOARD_USE_LIBGFXINIT if MAINBOARD_DO_NATIVE_VGA_INIT
 	select INTEL_INT15
 	select UDELAY_TSC
 	select SERIRQ_CONTINUOUS_MODE
diff --git a/src/northbridge/intel/haswell/gma.c b/src/northbridge/intel/haswell/gma.c
index a7478de..1379539 100644
--- a/src/northbridge/intel/haswell/gma.c
+++ b/src/northbridge/intel/haswell/gma.c
@@ -443,7 +443,7 @@
 	/* Pre panel init */
 	gma_setup_panel(dev);
 
-	if (IS_ENABLED(CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT)) {
+	if (IS_ENABLED(CONFIG_MAINBOARD_USE_LIBGFXINIT)) {
 		printk(BIOS_SPEW, "NATIVE graphics, run native enable\n");
 		physbase = pci_read_config32(dev, 0x5c) & ~0xf;
 		gma_gfxinit(gtt_res->base, linearfb_res->base,
diff --git a/src/northbridge/intel/nehalem/gma.c b/src/northbridge/intel/nehalem/gma.c
index 0af8d6c..43ca4b6 100644
--- a/src/northbridge/intel/nehalem/gma.c
+++ b/src/northbridge/intel/nehalem/gma.c
@@ -1008,39 +1008,41 @@
 	/* Init graphics power management */
 	gma_pm_init_pre_vbios(dev);
 
-#if !CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT
-	/* PCI Init, will run VBIOS */
-	pci_dev_init(dev);
-#else
-	u32 physbase;
-	struct northbridge_intel_nehalem_config *conf = dev->chip_info;
-	struct resource *lfb_res;
-	struct resource *pio_res;
+	if (IS_ENABLED(CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT) ||
+	    IS_ENABLED(CONFIG_MAINBOARD_USE_LIBGFXINIT)) {
+		u32 physbase;
+		struct northbridge_intel_nehalem_config *conf = dev->chip_info;
+		struct resource *lfb_res;
+		struct resource *pio_res;
 
-	lfb_res = find_resource(dev, PCI_BASE_ADDRESS_2);
-	pio_res = find_resource(dev, PCI_BASE_ADDRESS_4);
+		lfb_res = find_resource(dev, PCI_BASE_ADDRESS_2);
+		pio_res = find_resource(dev, PCI_BASE_ADDRESS_4);
 
-	physbase = pci_read_config32(dev, 0x5c) & ~0xf;
+		physbase = pci_read_config32(dev, 0x5c) & ~0xf;
 
-	if (gtt_res && gtt_res->base && physbase && pio_res && pio_res->base
-	    && lfb_res && lfb_res->base) {
-		printk(BIOS_SPEW, "Initializing VGA without OPROM. MMIO 0x%llx\n",
-		       gtt_res->base);
-		if (IS_ENABLED(CONFIG_MAINBOARD_USE_LIBGFXINIT)) {
-			int lightup_ok;
-			gma_gfxinit(gtt_res->base, lfb_res->base,
-				    physbase, &lightup_ok);
-		} else {
-			intel_gma_init(conf, res2mmio(gtt_res, 0, 0), physbase,
-				       pio_res->base, lfb_res->base);
+		if (gtt_res && gtt_res->base && physbase &&
+		    pio_res && pio_res->base && lfb_res && lfb_res->base) {
+			printk(BIOS_SPEW,
+			       "Initializing VGA without OPROM. MMIO 0x%llx\n",
+			       gtt_res->base);
+			if (IS_ENABLED(CONFIG_MAINBOARD_USE_LIBGFXINIT)) {
+				int lightup_ok;
+				gma_gfxinit(gtt_res->base, lfb_res->base,
+					    physbase, &lightup_ok);
+			} else {
+				intel_gma_init(conf, res2mmio(gtt_res, 0, 0),
+					physbase, pio_res->base, lfb_res->base);
+			}
 		}
+
+		/* Linux relies on VBT for panel info. */
+		generate_fake_intel_oprom(&conf->gfx, dev,
+					  "$VBT IRONLAKE-MOBILE");
+	} else {
+		/* PCI Init, will run VBIOS */
+		pci_dev_init(dev);
 	}
 
-	/* Linux relies on VBT for panel info. */
-	generate_fake_intel_oprom(&conf->gfx, dev, "$VBT IRONLAKE-MOBILE");
-#endif
-
-
 	/* Post VBIOS init */
 	gma_pm_init_post_vbios(dev);
 }
diff --git a/src/northbridge/intel/pineview/Kconfig b/src/northbridge/intel/pineview/Kconfig
index cf659ef..1af8d3c 100644
--- a/src/northbridge/intel/pineview/Kconfig
+++ b/src/northbridge/intel/pineview/Kconfig
@@ -26,12 +26,9 @@
 	select VGA
 	select MAINBOARD_HAS_NATIVE_VGA_INIT
 	select HAVE_VGA_TEXT_FRAMEBUFFER if MAINBOARD_DO_NATIVE_VGA_INIT
+	select INTEL_EDID if MAINBOARD_DO_NATIVE_VGA_INIT
 	select RELOCATABLE_RAMSTAGE
 
-config MAINBOARD_DO_NATIVE_VGA_INIT
-	def_bool y
-	select INTEL_EDID
-
 config BOOTBLOCK_NORTHBRIDGE_INIT
 	string
 	default "northbridge/intel/pineview/bootblock.c"
diff --git a/src/northbridge/intel/sandybridge/Kconfig b/src/northbridge/intel/sandybridge/Kconfig
index ad1ceae..b52807c 100644
--- a/src/northbridge/intel/sandybridge/Kconfig
+++ b/src/northbridge/intel/sandybridge/Kconfig
@@ -59,7 +59,9 @@
 	select VGA
 	select MAINBOARD_HAS_NATIVE_VGA_INIT
 
-config MAINBOARD_DO_NATIVE_VGA_INIT
+config IF_NATIVE_VGA_INIT
+	def_bool y
+	depends on MAINBOARD_DO_NATIVE_VGA_INIT
 	select VGA
 	select INTEL_EDID
 	select HAVE_LINEAR_FRAMEBUFFER
diff --git a/src/northbridge/intel/sandybridge/gma.c b/src/northbridge/intel/sandybridge/gma.c
index 868a961..bc64fe6 100644
--- a/src/northbridge/intel/sandybridge/gma.c
+++ b/src/northbridge/intel/sandybridge/gma.c
@@ -595,7 +595,8 @@
 	/* Post VBIOS init */
 	gma_pm_init_post_vbios(dev);
 
-	if (IS_ENABLED(CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT)) {
+	if (IS_ENABLED(CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT) ||
+	    IS_ENABLED(CONFIG_MAINBOARD_USE_LIBGFXINIT)) {
 		/* This should probably run before post VBIOS init. */
 		printk(BIOS_SPEW, "Initializing VGA without OPROM.\n");
 		u8 *mmiobase;