Patrick Georgi has uploaded this change for review. ( https://review.coreboot.org/25927
Change subject: intel/common: compress VBT ......................................................................
intel/common: compress VBT
It's pretty well compressible which helps when space is tight. The code encodes the assumption that the VBT is 8kb or less. Haven't seen a larger one yet.
BUG=b:77971803,b:78541692 TEST=build, see that vbt.bin is compressed, boot, check log that the reported VBT size is correct.
Change-Id: Ie25bca21d9edc408f441a292bbe2ab0459948ec4 Signed-off-by: Patrick Georgi pgeorgi@google.com --- M src/drivers/intel/gma/Makefile.inc M src/soc/intel/common/vbt.c 2 files changed, 14 insertions(+), 21 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/25927/1
diff --git a/src/drivers/intel/gma/Makefile.inc b/src/drivers/intel/gma/Makefile.inc index ab799ef..0bcf590 100644 --- a/src/drivers/intel/gma/Makefile.inc +++ b/src/drivers/intel/gma/Makefile.inc @@ -24,6 +24,7 @@ cbfs-files-$(CONFIG_INTEL_GMA_ADD_VBT_DATA_FILE) += vbt.bin vbt.bin-file := $(call strip_quotes,$(CONFIG_INTEL_GMA_VBT_FILE)) vbt.bin-type := raw +vbt.bin-compression := lzma
ifeq ($(CONFIG_MAINBOARD_USE_LIBGFXINIT),y)
diff --git a/src/soc/intel/common/vbt.c b/src/soc/intel/common/vbt.c index 3d8f2bf..1e591a0 100644 --- a/src/soc/intel/common/vbt.c +++ b/src/soc/intel/common/vbt.c @@ -30,34 +30,34 @@ return "vbt.bin"; }
-static struct region_device vbt_rdev; -static void *vbt_data; +static char vbt_data[8192]; +static int vbt_data_used = 0;
void *locate_vbt(void) { uint32_t vbtsig = 0; - struct cbfsf file_desc;
- if (vbt_data != NULL) - return vbt_data; + if (vbt_data_used == 1) + return (void *)vbt_data;
const char *filename = mainboard_vbt_filename();
- if (cbfs_boot_locate(&file_desc, filename, NULL) < 0) { - printk(BIOS_ERR, "Could not locate a VBT file in in CBFS\n"); + size_t file_size = cbfs_boot_load_file(filename, + vbt_data, sizeof(vbt_data), CBFS_TYPE_RAW); + + if (file_size == 0) return NULL; - }
- cbfs_file_data(&vbt_rdev, &file_desc); - rdev_readat(&vbt_rdev, &vbtsig, 0, sizeof(uint32_t)); - + memcpy((void *)&vbtsig, vbt_data, sizeof(vbtsig)); if (vbtsig != VBT_SIGNATURE) { printk(BIOS_ERR, "Missing/invalid signature in VBT data file!\n"); return NULL; }
- vbt_data = rdev_mmap_full(&vbt_rdev); - return vbt_data; + printk(BIOS_INFO, "Found a VBT of %zd bytes after decompression\n", file_size); + vbt_data_used = 1; + + return (void *)vbt_data; }
void *vbt_get(void) @@ -73,11 +73,3 @@ return NULL; return locate_vbt(); } - -static void unmap_vbt(void *unused) -{ - if (vbt_data) - rdev_munmap(&vbt_rdev, vbt_data); -} -BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_LOAD, BS_ON_EXIT, unmap_vbt, NULL); -BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, unmap_vbt, NULL);