summaryrefslogtreecommitdiff
path: root/src/drivers/intel/gma
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/intel/gma')
-rw-r--r--src/drivers/intel/gma/opregion.c59
-rw-r--r--src/drivers/intel/gma/opregion.h14
2 files changed, 65 insertions, 8 deletions
diff --git a/src/drivers/intel/gma/opregion.c b/src/drivers/intel/gma/opregion.c
index ed2297a4fc..c52c06f12b 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_vbios(const u8 *vbios, struct region_device *rdev)
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;
+
+ if (rdev_chain(rdev, &addrspace_32bit.rdev, (uintptr_t)vbt,
+ vbt_data_size))
+ return CB_ERR;
- 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 8ef3dcf9be..e6d8648527 100644
--- a/src/drivers/intel/gma/opregion.h
+++ b/src/drivers/intel/gma/opregion.h
@@ -253,4 +253,18 @@ uintptr_t gma_get_gnvs_aslb(const void *gnvs);
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_ */