drivers/intel/gma, soc/intel/common: improve cooperation

Instead of both featuring their own VBT loaders, use a single one.
It's the compression-enabled one from soc/intel/common, but moved to
drivers/intel/gma.

The rationale (besides making all the Kconfig fluff easier) is that
drivers/intel/gma is used in some capacity on all platforms that load a
VBT, while soc/intel/common's VBT code is for use with FSP.

BUG=b:79365806
TEST=GOOGLE_FALCO and GOOGLE_CHELL both build, exercising both affected
code paths.

Change-Id: I8d149c8b480e457a4f3e947f46d49ab45c65ccdc
Signed-off-by: Patrick Georgi <pgeorgi@google.com>
Reviewed-on: https://review.coreboot.org/26039
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/src/drivers/intel/gma/opregion.c b/src/drivers/intel/gma/opregion.c
index ed2297a..c52c06f1 100644
--- a/src/drivers/intel/gma/opregion.c
+++ b/src/drivers/intel/gma/opregion.c
@@ -27,6 +27,46 @@
 #include "intel_bios.h"
 #include "opregion.h"
 
+__weak
+const char *mainboard_vbt_filename(void)
+{
+	return "vbt.bin";
+}
+
+static char vbt_data[8 * KiB];
+static int vbt_data_used;
+
+void *locate_vbt(size_t *vbt_size)
+{
+	uint32_t vbtsig = 0;
+
+	if (vbt_data_used == 1)
+		return (void *)vbt_data;
+
+	const char *filename = mainboard_vbt_filename();
+
+	size_t file_size = cbfs_boot_load_file(filename,
+		vbt_data, sizeof(vbt_data), CBFS_TYPE_RAW);
+
+	if (file_size == 0)
+		return NULL;
+
+	if (vbt_size)
+		*vbt_size = file_size;
+
+	memcpy(&vbtsig, vbt_data, sizeof(vbtsig));
+	if (vbtsig != VBT_SIGNATURE) {
+		printk(BIOS_ERR, "Missing/invalid signature in VBT data file!\n");
+		return NULL;
+	}
+
+	printk(BIOS_INFO, "Found a VBT of %zu bytes after decompression\n",
+		file_size);
+	vbt_data_used = 1;
+
+	return (void *)vbt_data;
+}
+
 /* Write ASLS PCI register and prepare SWSCI register. */
 void intel_gma_opregion_register(uintptr_t opregion)
 {
@@ -167,16 +207,19 @@
 
 static enum cb_err locate_vbt_cbfs(struct region_device *rdev)
 {
-	struct cbfsf file_desc;
+	size_t vbt_data_size;
+	void *vbt = locate_vbt(&vbt_data_size);
 
-	/* try to locate vbt.bin in CBFS */
-	if (cbfs_boot_locate(&file_desc, "vbt.bin", NULL) == CB_SUCCESS) {
-		cbfs_file_data(rdev, &file_desc);
-		printk(BIOS_INFO, "GMA: Found VBT in CBFS\n");
-		return CB_SUCCESS;
-	}
+	if (vbt == NULL)
+		return CB_ERR;
 
-	return CB_ERR;
+	if (rdev_chain(rdev, &addrspace_32bit.rdev, (uintptr_t)vbt,
+	    vbt_data_size))
+		return CB_ERR;
+
+	printk(BIOS_INFO, "GMA: Found VBT in CBFS\n");
+
+	return CB_SUCCESS;
 }
 
 static enum cb_err locate_vbt_vbios_cbfs(struct region_device *rdev)
diff --git a/src/drivers/intel/gma/opregion.h b/src/drivers/intel/gma/opregion.h
index 8ef3dcf..e6d8648 100644
--- a/src/drivers/intel/gma/opregion.h
+++ b/src/drivers/intel/gma/opregion.h
@@ -253,4 +253,18 @@
 void gma_set_gnvs_aslb(void *gnvs, uintptr_t aslb);
 enum cb_err intel_gma_init_igd_opregion(igd_opregion_t *opregion);
 
+/*
+ * Returns the CBFS filename of the VBT blob.
+ *
+ * The default implementation returns "vbt.bin", but other implementations can
+ * override this.
+ */
+const char *mainboard_vbt_filename(void);
+
+/*
+ * locate vbt.bin file. Returns a pointer to its content.
+ * If vbt_size is non-NULL, also return the vbt's size.
+ */
+void *locate_vbt(size_t *vbt_size);
+
 #endif /* _COMMON_GMA_H_ */
diff --git a/src/mainboard/google/reef/variants/coral/mainboard.c b/src/mainboard/google/reef/variants/coral/mainboard.c
index a45afc7..bb2cdc1 100644
--- a/src/mainboard/google/reef/variants/coral/mainboard.c
+++ b/src/mainboard/google/reef/variants/coral/mainboard.c
@@ -14,11 +14,11 @@
  */
 
 #include <stdint.h>
+#include <drivers/intel/gma/opregion.h>
 #include <ec/google/chromeec/ec.h>
 #include "baseboard/variants.h"
 #include <soc/cpu.h>
 #include <soc/intel/apollolake/chip.h>
-#include <soc/intel/common/vbt.h>
 #include <soc/gpio.h>
 
 enum {
diff --git a/src/soc/intel/common/vbt.c b/src/soc/intel/common/vbt.c
index 50d3951..ab52dc8 100644
--- a/src/soc/intel/common/vbt.c
+++ b/src/soc/intel/common/vbt.c
@@ -21,48 +21,7 @@
 #include <bootstate.h>
 
 #include "vbt.h"
-
-#define VBT_SIGNATURE 0x54425624
-
-__weak
-const char *mainboard_vbt_filename(void)
-{
-	return "vbt.bin";
-}
-
-static char vbt_data[8 * KiB];
-static int vbt_data_used;
-
-void *locate_vbt(size_t *vbt_size)
-{
-	uint32_t vbtsig = 0;
-
-	if (vbt_data_used == 1)
-		return (void *)vbt_data;
-
-	const char *filename = mainboard_vbt_filename();
-
-	size_t file_size = cbfs_boot_load_file(filename,
-		vbt_data, sizeof(vbt_data), CBFS_TYPE_RAW);
-
-	if (file_size == 0)
-		return NULL;
-
-	if (vbt_size)
-		*vbt_size = file_size;
-
-	memcpy(&vbtsig, vbt_data, sizeof(vbtsig));
-	if (vbtsig != VBT_SIGNATURE) {
-		printk(BIOS_ERR, "Missing/invalid signature in VBT data file!\n");
-		return NULL;
-	}
-
-	printk(BIOS_INFO, "Found a VBT of %zu bytes after decompression\n",
-		file_size);
-	vbt_data_used = 1;
-
-	return (void *)vbt_data;
-}
+#include <drivers/intel/gma/opregion.h>
 
 void *vbt_get(void)
 {
diff --git a/src/soc/intel/common/vbt.h b/src/soc/intel/common/vbt.h
index 1bc536e..e5a17fb 100644
--- a/src/soc/intel/common/vbt.h
+++ b/src/soc/intel/common/vbt.h
@@ -20,19 +20,6 @@
 #include <types.h>
 
 /*
- * Returns the CBFS filename of the VBT blob.
- *
- * The default implementation returns "vbt.bin", but other implementations can
- * override this.
- */
-const char *mainboard_vbt_filename(void);
-
-/*
- * locate vbt.bin file. Returns a pointer to its content.
- * If vbt_size is non-NULL, also return the vbt's size.
- */
-void *locate_vbt(size_t *vbt_size);
-/*
  * Returns VBT pointer and mapping after checking prerequisites for Pre OS
  * Graphics initialization
  */