[coreboot-gerrit] Change in coreboot[master]: drivers/intel/gma: Search VBT in VBIOS

Patrick Rudolph (Code Review) gerrit at coreboot.org
Sat Apr 15 12:55:25 CEST 2017


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

Change subject: drivers/intel/gma: Search VBT in VBIOS
......................................................................

drivers/intel/gma: Search VBT in VBIOS

For native gfx init the legacy address 0xc0000 is searched.
Additionally the CBFS is searched for the matching PCI
Option ROM.
The VBT address will be set if a valid table is found.

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


  git pull ssh://review.coreboot.org:29418/coreboot refs/changes/14/19314/1

diff --git a/src/drivers/intel/gma/opregion.c b/src/drivers/intel/gma/opregion.c
index 25c0a58..207f187 100644
--- a/src/drivers/intel/gma/opregion.c
+++ b/src/drivers/intel/gma/opregion.c
@@ -16,26 +16,71 @@
 #include <console/console.h>
 #include <string.h>
 #include <cbmem.h>
-
+#include <device/pci.h>
 #include <drivers/intel/gma/opregion.h>
+#include <drivers/intel/gma/i915.h>
+#include <lib.h>
 #include "opregion.h"
-#include "vbt.h"
+
+static struct region_device vbt_rdev;
+
+static int map_vbt(optionrom_vbt_t **vbt)
+{
+	struct device *dev;
+	const struct rom_header *rom;
+
+	/* Search for vbt.bin first */
+	if (locate_vbt(&vbt_rdev) == CB_SUCCESS) {
+		*vbt = rdev_mmap_full(&vbt_rdev);
+
+		if (*vbt)
+			return 0;
+	}
+	printk(BIOS_DEBUG, "CBFS VBT not found or invalid.\n");
+
+	/* Find VBIOS in legacy PCI ROM area */
+	if (IS_ENABLED(CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT) &&
+		!locate_vbt_vbios((void *)0xc0000)) {
+		/* The following fields are already validated: */
+		optionrom_header_t *oprom = (optionrom_header_t *)0xc0000;
+		*vbt = (optionrom_vbt_t *)(oprom + oprom->vbt_offset);
+		return 0;
+	}
+	printk(BIOS_DEBUG,
+		   "VBIOS at 0xc0000 not found or invalid.\n");
+
+	/* Find PCI VBIOS to extract VBT */
+	dev = dev_find_slot(0, PCI_DEVFN(2, 0));
+	rom = pci_rom_probe(dev);
+
+	if (rom && !locate_vbt_vbios((void *)rom)) {
+		/* The following fields are already validated: */
+		optionrom_header_t *oprom = (optionrom_header_t *)rom;
+		*vbt = (optionrom_vbt_t *)(oprom + oprom->vbt_offset);
+		return 0;
+	}
+	printk(BIOS_DEBUG,
+		   "VBIOS for PCI 0:02:00 not found or invalid.\n");
+
+	*vbt = NULL;
+	return 1;
+}
+
+static int unmap_vbt(optionrom_vbt_t *vbt)
+{
+	if (locate_vbt(&vbt_rdev) == CB_SUCCESS)
+		return rdev_munmap(&vbt_rdev, vbt);
+	/* Nothing to do for memory mapped VBIOS */
+	return 0;
+}
 
 int init_igd_opregion(igd_opregion_t *opregion)
 {
-	struct region_device vbt_rdev;
 	optionrom_vbt_t *vbt;
 	optionrom_vbt_t *ext_vbt;
 
-	if (locate_vbt(&vbt_rdev) == CB_ERR) {
-		printk(BIOS_ERR, "VBT not found\n");
-		return 0;
-	};
-
-	vbt = rdev_mmap_full(&vbt_rdev);
-
-	if (!vbt) {
-		printk(BIOS_ERR, "VBT couldn't be read\n");
+	if (map_vbt(&vbt)) {
+		printk(BIOS_ERR, "VBT not found.\n");
 		return 0;
 	}
 
@@ -69,7 +114,7 @@
 	/* FIXME We just assume we're mobile for now */
 	opregion->header.mailboxes = MAILBOXES_MOBILE;
 
-	rdev_munmap(&vbt_rdev, vbt);
+	unmap_vbt(vbt);
 
 	return 1;
 }

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id0f8bb494e7574978a6ff34984faebb94c513010
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