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>
Reviewed-on: https://review.coreboot.org/25927
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
Patrick Georgi 2018-04-30 15:14:35 +02:00
parent e134db2535
commit 77034fa7d4
2 changed files with 15 additions and 21 deletions

View File

@ -24,6 +24,7 @@ ramstage-$(CONFIG_INTEL_GMA_ACPI) += opregion.c
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)

View File

@ -30,34 +30,35 @@ const char *mainboard_vbt_filename(void)
return "vbt.bin";
}
static struct region_device vbt_rdev;
static void *vbt_data;
static char vbt_data[8 * KiB];
static int vbt_data_used;
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(&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 %zu bytes after decompression\n",
file_size);
vbt_data_used = 1;
return (void *)vbt_data;
}
void *vbt_get(void)
@ -73,11 +74,3 @@ void *vbt_get(void)
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);