[coreboot-gerrit] Change in coreboot[master]: drv/intel/gma: Use cbfs vbt.bin if present

Patrick Rudolph (Code Review) gerrit at coreboot.org
Mon Apr 3 18:33:01 CEST 2017


Patrick Rudolph has uploaded a new change for review. ( https://review.coreboot.org/19085 )

Change subject: drv/intel/gma: Use cbfs vbt.bin if present
......................................................................

drv/intel/gma: Use cbfs vbt.bin if present

Prefer VBT from CBFS's vbt.bin if present.

Tested on GM45 (Lenovo T500) using Microsoft's
Windows 7.

Change-Id: Ibb8edc61f3d9db9ed8789151cf10d7f92fe6cfcd
Signed-off-by: Patrick Rudolph <siro at das-labor.org>
---
M src/drivers/intel/gma/vbt.c
1 file changed, 62 insertions(+), 19 deletions(-)


  git pull ssh://review.coreboot.org:29418/coreboot refs/changes/85/19085/1

diff --git a/src/drivers/intel/gma/vbt.c b/src/drivers/intel/gma/vbt.c
index 58d63da..464a8a1 100644
--- a/src/drivers/intel/gma/vbt.c
+++ b/src/drivers/intel/gma/vbt.c
@@ -25,6 +25,7 @@
 #include <device/pci_ids.h>
 #include <device/pci_rom.h>
 #include <cbmem.h>
+#include <cbfs.h>
 
 #include "i915.h"
 #include "intel_bios.h"
@@ -136,29 +137,71 @@
 	return NULL;
 }
 
-static int init_opregion_vbt(struct device *dev, igd_opregion_t *opregion)
+static enum cb_err locate_vbt(struct region_device *rdev)
 {
-	void *vbios = NULL;
-	printk(BIOS_DEBUG, "Init IGD OpRegion.\n");
+	uint32_t vbtsig = 0;
+	struct cbfsf file_desc;
 
-	if (IS_ENABLED(CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT))
-		vbios = validate_intel_oprom((void *)PCI_VGA_RAM_IMAGE_START);
-	if (!vbios)
-		vbios = validate_intel_oprom((void *)pci_rom_probe(dev));
-
-	printk(BIOS_DEBUG, " ... VBIOS found at %p\n", vbios);
-	optionrom_header_t *oprom = (optionrom_header_t *)vbios;
-	optionrom_vbt_t *vbt = (optionrom_vbt_t *)(vbios +
-						oprom->vbt_offset);
-
-	if (read32(vbt->hdr_signature) != VBT_SIGNATURE) {
-		printk(BIOS_DEBUG, "VBT not found!\n");
-		return 1;
+	if (cbfs_boot_locate(&file_desc, "vbt.bin", NULL) < 0) {
+		printk(BIOS_ERR, "Could not locate a VBT file in in CBFS\n");
+		return CB_ERR;
 	}
 
-	memcpy(opregion->header.vbios_version, vbt->coreblock_biosbuild, 4);
-	memcpy(opregion->vbt.gvd1, vbt, vbt->hdr_vbt_size < 7168 ?
-						vbt->hdr_vbt_size : 7168);
+	cbfs_file_data(rdev, &file_desc);
+	rdev_readat(rdev, &vbtsig, 0, sizeof(uint32_t));
+
+	if (vbtsig != VBT_SIGNATURE) {
+		printk(BIOS_ERR, "Missing/invalid signature in VBT data file!\n");
+		return CB_ERR;
+	}
+
+	return CB_SUCCESS;
+}
+
+static int init_opregion_vbt(struct device *dev, igd_opregion_t *opregion)
+{
+	struct region_device vbt_rdev;
+	optionrom_header_t *oprom;
+	optionrom_vbt_t *vbt;
+	void *vbios = NULL;
+	printk(BIOS_DEBUG, "Init IGD OpRegion\n");
+
+	if (locate_vbt(&vbt_rdev) != CB_ERR) {
+		printk(BIOS_DEBUG, "Using vbt.bin\n");
+
+		vbt = (optionrom_vbt_t *)rdev_mmap_full(&vbt_rdev);
+		if (!vbt)
+			return 1;
+
+		memcpy(opregion->header.vbios_version, vbt->coreblock_biosbuild, 4);
+		memcpy(opregion->vbt.gvd1, vbt, vbt->hdr_vbt_size < 7168 ?
+							vbt->hdr_vbt_size : 7168);
+
+		rdev_munmap(&vbt_rdev, vbt);
+	} else {
+		printk(BIOS_DEBUG, "Extracting VBT from VBIOS\n");
+
+		if (IS_ENABLED(CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT))
+			vbios = validate_intel_oprom((void *)PCI_VGA_RAM_IMAGE_START);
+		if (!vbios)
+			vbios = validate_intel_oprom((void *)pci_rom_probe(dev));
+		if (!vbios) {
+			printk(BIOS_DEBUG, "VBIOS not found.\n");
+			return 1;
+		}
+		printk(BIOS_DEBUG, "VBIOS found at %p\n", vbios);
+		oprom = (optionrom_header_t *)vbios;
+		vbt = (optionrom_vbt_t *)(vbios + oprom->vbt_offset);
+
+		if (read32(vbt->hdr_signature) != VBT_SIGNATURE) {
+			printk(BIOS_DEBUG, "VBT not found!\n");
+			return 1;
+		}
+
+		memcpy(opregion->header.vbios_version, vbt->coreblock_biosbuild, 4);
+		memcpy(opregion->vbt.gvd1, vbt, vbt->hdr_vbt_size < 7168 ?
+							vbt->hdr_vbt_size : 7168);
+	}
 
 	return 0;
 }

-- 
To view, visit https://review.coreboot.org/19085
To unsubscribe, visit https://review.coreboot.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibb8edc61f3d9db9ed8789151cf10d7f92fe6cfcd
Gerrit-PatchSet: 1
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Owner: Patrick Rudolph <siro at das-labor.org>



More information about the coreboot-gerrit mailing list