diff options
author | Patrick Georgi <pgeorgi@google.com> | 2018-05-03 19:15:13 +0200 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2018-05-09 13:48:07 +0000 |
commit | 4a3956d7cc07056fa8795d89972e288dfc270db7 (patch) | |
tree | 11674b5a7434411eb88d9210f8b1a4a591a01baa | |
parent | 60ad1a71325eb9a97a88f1853d876c8fc02f3f77 (diff) |
drivers/intel/gma, soc/intel/common: improve cooperation
Instead of both featuring their own VBT loaders, use a single one.
It's the compression-enabled one from soc/intel/common, but moved to
drivers/intel/gma.
The rationale (besides making all the Kconfig fluff easier) is that
drivers/intel/gma is used in some capacity on all platforms that load a
VBT, while soc/intel/common's VBT code is for use with FSP.
BUG=b:79365806
TEST=GOOGLE_FALCO and GOOGLE_CHELL both build, exercising both affected
code paths.
Change-Id: I8d149c8b480e457a4f3e947f46d49ab45c65ccdc
Signed-off-by: Patrick Georgi <pgeorgi@google.com>
Reviewed-on: https://review.coreboot.org/26039
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r-- | src/drivers/intel/gma/opregion.c | 59 | ||||
-rw-r--r-- | src/drivers/intel/gma/opregion.h | 14 | ||||
-rw-r--r-- | src/mainboard/google/reef/variants/coral/mainboard.c | 2 | ||||
-rw-r--r-- | src/soc/intel/common/vbt.c | 43 | ||||
-rw-r--r-- | src/soc/intel/common/vbt.h | 13 |
5 files changed, 67 insertions, 64 deletions
diff --git a/src/drivers/intel/gma/opregion.c b/src/drivers/intel/gma/opregion.c index ed2297a4fc..c52c06f12b 100644 --- a/src/drivers/intel/gma/opregion.c +++ b/src/drivers/intel/gma/opregion.c @@ -27,6 +27,46 @@ #include "intel_bios.h" #include "opregion.h" +__weak +const char *mainboard_vbt_filename(void) +{ + return "vbt.bin"; +} + +static char vbt_data[8 * KiB]; +static int vbt_data_used; + +void *locate_vbt(size_t *vbt_size) +{ + uint32_t vbtsig = 0; + + if (vbt_data_used == 1) + return (void *)vbt_data; + + const char *filename = mainboard_vbt_filename(); + + size_t file_size = cbfs_boot_load_file(filename, + vbt_data, sizeof(vbt_data), CBFS_TYPE_RAW); + + if (file_size == 0) + return NULL; + + if (vbt_size) + *vbt_size = file_size; + + memcpy(&vbtsig, vbt_data, sizeof(vbtsig)); + if (vbtsig != VBT_SIGNATURE) { + printk(BIOS_ERR, "Missing/invalid signature in VBT data file!\n"); + return NULL; + } + + printk(BIOS_INFO, "Found a VBT of %zu bytes after decompression\n", + file_size); + vbt_data_used = 1; + + return (void *)vbt_data; +} + /* Write ASLS PCI register and prepare SWSCI register. */ void intel_gma_opregion_register(uintptr_t opregion) { @@ -167,16 +207,19 @@ static enum cb_err locate_vbt_vbios(const u8 *vbios, struct region_device *rdev) static enum cb_err locate_vbt_cbfs(struct region_device *rdev) { - struct cbfsf file_desc; + size_t vbt_data_size; + void *vbt = locate_vbt(&vbt_data_size); - /* try to locate vbt.bin in CBFS */ - if (cbfs_boot_locate(&file_desc, "vbt.bin", NULL) == CB_SUCCESS) { - cbfs_file_data(rdev, &file_desc); - printk(BIOS_INFO, "GMA: Found VBT in CBFS\n"); - return CB_SUCCESS; - } + if (vbt == NULL) + return CB_ERR; + + if (rdev_chain(rdev, &addrspace_32bit.rdev, (uintptr_t)vbt, + vbt_data_size)) + return CB_ERR; - return CB_ERR; + printk(BIOS_INFO, "GMA: Found VBT in CBFS\n"); + + return CB_SUCCESS; } static enum cb_err locate_vbt_vbios_cbfs(struct region_device *rdev) diff --git a/src/drivers/intel/gma/opregion.h b/src/drivers/intel/gma/opregion.h index 8ef3dcf9be..e6d8648527 100644 --- a/src/drivers/intel/gma/opregion.h +++ b/src/drivers/intel/gma/opregion.h @@ -253,4 +253,18 @@ uintptr_t gma_get_gnvs_aslb(const void *gnvs); void gma_set_gnvs_aslb(void *gnvs, uintptr_t aslb); enum cb_err intel_gma_init_igd_opregion(igd_opregion_t *opregion); +/* + * Returns the CBFS filename of the VBT blob. + * + * The default implementation returns "vbt.bin", but other implementations can + * override this. + */ +const char *mainboard_vbt_filename(void); + +/* + * locate vbt.bin file. Returns a pointer to its content. + * If vbt_size is non-NULL, also return the vbt's size. + */ +void *locate_vbt(size_t *vbt_size); + #endif /* _COMMON_GMA_H_ */ diff --git a/src/mainboard/google/reef/variants/coral/mainboard.c b/src/mainboard/google/reef/variants/coral/mainboard.c index a45afc7070..bb2cdc14a9 100644 --- a/src/mainboard/google/reef/variants/coral/mainboard.c +++ b/src/mainboard/google/reef/variants/coral/mainboard.c @@ -14,11 +14,11 @@ */ #include <stdint.h> +#include <drivers/intel/gma/opregion.h> #include <ec/google/chromeec/ec.h> #include "baseboard/variants.h" #include <soc/cpu.h> #include <soc/intel/apollolake/chip.h> -#include <soc/intel/common/vbt.h> #include <soc/gpio.h> enum { diff --git a/src/soc/intel/common/vbt.c b/src/soc/intel/common/vbt.c index 50d3951179..ab52dc8d04 100644 --- a/src/soc/intel/common/vbt.c +++ b/src/soc/intel/common/vbt.c @@ -21,48 +21,7 @@ #include <bootstate.h> #include "vbt.h" - -#define VBT_SIGNATURE 0x54425624 - -__weak -const char *mainboard_vbt_filename(void) -{ - return "vbt.bin"; -} - -static char vbt_data[8 * KiB]; -static int vbt_data_used; - -void *locate_vbt(size_t *vbt_size) -{ - uint32_t vbtsig = 0; - - if (vbt_data_used == 1) - return (void *)vbt_data; - - const char *filename = mainboard_vbt_filename(); - - size_t file_size = cbfs_boot_load_file(filename, - vbt_data, sizeof(vbt_data), CBFS_TYPE_RAW); - - if (file_size == 0) - return NULL; - - if (vbt_size) - *vbt_size = file_size; - - memcpy(&vbtsig, vbt_data, sizeof(vbtsig)); - if (vbtsig != VBT_SIGNATURE) { - printk(BIOS_ERR, "Missing/invalid signature in VBT data file!\n"); - return NULL; - } - - printk(BIOS_INFO, "Found a VBT of %zu bytes after decompression\n", - file_size); - vbt_data_used = 1; - - return (void *)vbt_data; -} +#include <drivers/intel/gma/opregion.h> void *vbt_get(void) { diff --git a/src/soc/intel/common/vbt.h b/src/soc/intel/common/vbt.h index 1bc536e430..e5a17fb75a 100644 --- a/src/soc/intel/common/vbt.h +++ b/src/soc/intel/common/vbt.h @@ -20,19 +20,6 @@ #include <types.h> /* - * Returns the CBFS filename of the VBT blob. - * - * The default implementation returns "vbt.bin", but other implementations can - * override this. - */ -const char *mainboard_vbt_filename(void); - -/* - * locate vbt.bin file. Returns a pointer to its content. - * If vbt_size is non-NULL, also return the vbt's size. - */ -void *locate_vbt(size_t *vbt_size); -/* * Returns VBT pointer and mapping after checking prerequisites for Pre OS * Graphics initialization */ |