[coreboot-gerrit] Patch set updated for coreboot: drivers/intel/fsp2_0: Add VBT locate helper function

Andrey Petrov (andrey.petrov@intel.com) gerrit at coreboot.org
Fri May 13 05:16:15 CEST 2016


Andrey Petrov (andrey.petrov at intel.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/14805

-gerrit

commit 85328c9e269779e8a68a7627851675fbcc3996a1
Author: Abhay Kumar <abhay.kumar at intel.com>
Date:   Fri May 6 17:02:44 2016 -0700

    drivers/intel/fsp2_0: Add VBT locate helper function
    
    Add fsp_locate_vbt() helper function that locates VBT file.
    
    Change-Id: Ibda3be48e8ae8b70c6cc1d7ea7248e0c91e955f4
    Signed-off-by: Abhay Kumar <abhay.kumar at intel.com>
    Signed-off-by: Andrey Petrov <andrey.petrov at intel.com>
---
 src/drivers/intel/fsp2_0/graphics.c         | 27 +++++++++++++++++++++------
 src/drivers/intel/fsp2_0/include/fsp/util.h |  6 ++++--
 src/drivers/intel/fsp2_0/silicon_init.c     | 16 ++++++++++++++--
 src/soc/intel/apollolake/chip.c             |  3 ---
 4 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/src/drivers/intel/fsp2_0/graphics.c b/src/drivers/intel/fsp2_0/graphics.c
index 1480179..929b186 100644
--- a/src/drivers/intel/fsp2_0/graphics.c
+++ b/src/drivers/intel/fsp2_0/graphics.c
@@ -93,13 +93,28 @@ enum cb_err fsp_fill_lb_framebuffer(struct lb_framebuffer *framebuffer)
 	return CB_SUCCESS;
 }
 
-uintptr_t fsp_load_vbt(void)
+struct region_device* fsp_locate_vbt(struct cbfsf *file_desc)
 {
-	void *vbt;
+	uint32_t *vbt_file, vbt_signature;
+	struct region_device *res = NULL;
 
-	vbt = cbfs_boot_map_with_leak("vbt.bin", CBFS_TYPE_RAW, NULL);
-	if (!vbt)
-		printk(BIOS_NOTICE, "Could not locate a VBT file in CBFS\n");
+	if (cbfs_boot_locate(file_desc, "vbt.bin", NULL)) {
+		printk(BIOS_ERR, "Could not locate a VBT file in in CBFS\n");
+		return res;
+	}
+
+	vbt_file = rdev_mmap(&file_desc->data, 0, sizeof(uint32_t));
+
+	if (!vbt_file)
+		return res;
+
+	vbt_signature = *vbt_file;
+	rdev_munmap(&file_desc->data, vbt_file);
+
+	if (vbt_signature != VBT_SIGNATURE)
+		printk(BIOS_ERR, "Invalid signature in VBT data file!\n");
+        else
+		res = &file_desc->data;
 
-	return (uintptr_t)vbt;
+	return res;
 }
diff --git a/src/drivers/intel/fsp2_0/include/fsp/util.h b/src/drivers/intel/fsp2_0/include/fsp/util.h
index d9d9539..c71fc33 100644
--- a/src/drivers/intel/fsp2_0/include/fsp/util.h
+++ b/src/drivers/intel/fsp2_0/include/fsp/util.h
@@ -16,6 +16,8 @@
 #include <boot/coreboot_tables.h>
 #include <fsp/info_header.h>
 #include <memrange.h>
+#include <commonlib/region.h>
+#include <cbfs.h>
 
 /*
  * Hand-off-block handling functions that depend on CBMEM, and thus can only
@@ -36,7 +38,7 @@ void fsp_print_memory_resource_hobs(const void *hob_list);
 /* Load an FSP binary into CBFS, and fill the associated fsp_header struct */
 enum cb_err fsp_load_binary(struct fsp_header *hdr, const char *name,
 			    struct range_entry *r);
-/* Load a vbt.bin file for graphics. Returns 0 if a valid VBT is not found. */
-uintptr_t fsp_load_vbt(void);
+/* Locate vbt.bin file for graphics. Returns NULL if a valid VBT is not found. */
+struct region_device* fsp_locate_vbt(struct cbfsf *file_desc);
 
 #endif /* _FSP2_0_UTIL_H_ */
diff --git a/src/drivers/intel/fsp2_0/silicon_init.c b/src/drivers/intel/fsp2_0/silicon_init.c
index e7d8c54..2a452a7 100644
--- a/src/drivers/intel/fsp2_0/silicon_init.c
+++ b/src/drivers/intel/fsp2_0/silicon_init.c
@@ -28,6 +28,9 @@ static enum fsp_status do_silicon_init(struct fsp_header *hdr)
 	struct FSPS_UPD upd, *supd;
 	fsp_silicon_init_fn silicon_init;
 	enum fsp_status status;
+	optionrom_vbt_t *vbt;
+	struct region_device *vbt_rdev;
+	struct cbfsf file_desc;
 
 	supd = (struct FSPS_UPD *) (hdr->cfg_region_offset + hdr->image_base);
 
@@ -38,15 +41,24 @@ static enum fsp_status do_silicon_init(struct fsp_header *hdr)
 
 	memcpy(&upd, supd, sizeof(upd));
 
+	vbt_rdev = fsp_locate_vbt(&file_desc);
+	if (vbt_rdev != NULL) {
+		vbt = rdev_mmap(vbt_rdev, 0, region_device_sz(vbt_rdev));
+		upd.FspsConfig.GraphicsConfigPtr = (uintptr_t) vbt;
+	} else
+		upd.FspsConfig.GraphicsConfigPtr = (uintptr_t)NULL;
+
 	/* Give SoC/mainboard a chance to populate entries */
 	platform_fsp_silicon_init_params_cb(&upd);
 
 	timestamp_add_now(TS_FSP_SILICON_INIT_START);
 	silicon_init = (void *) (hdr->image_base +
-				 hdr->silicon_init_entry_offset);
-	status = silicon_init(&upd);
+						hdr->silicon_init_entry_offset);
 	timestamp_add_now(TS_FSP_SILICON_INIT_END);
 
+	status = silicon_init(&upd);
+	if(vbt_rdev != NULL)
+		rdev_munmap(vbt_rdev,vbt);
 	printk(BIOS_DEBUG, "FspSiliconInit returned 0x%08x\n", status);
 	return status;
 }
diff --git a/src/soc/intel/apollolake/chip.c b/src/soc/intel/apollolake/chip.c
index 6e0a90f..e2809c7 100644
--- a/src/soc/intel/apollolake/chip.c
+++ b/src/soc/intel/apollolake/chip.c
@@ -83,9 +83,6 @@ void platform_fsp_silicon_init_params_cb(struct FSPS_UPD *silupd)
         struct FSP_S_CONFIG *silconfig = &silupd->FspsConfig;
 	static struct soc_intel_apollolake_config *cfg;
 
-	/* Load VBT before devicetree-specific config. */
-	silconfig->GraphicsConfigPtr = fsp_load_vbt();
-
 	struct device *dev = NB_DEV_ROOT;
 	if (!dev || !dev->chip_info) {
 		printk(BIOS_ERR, "BUG! Could not find SOC devicetree config\n");



More information about the coreboot-gerrit mailing list