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>
This commit is contained in:
Patrick Georgi 2018-05-03 19:15:13 +02:00
parent 60ad1a7132
commit 4a3956d7cc
5 changed files with 67 additions and 64 deletions

View File

@ -27,6 +27,46 @@
#include "intel_bios.h" #include "intel_bios.h"
#include "opregion.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. */ /* Write ASLS PCI register and prepare SWSCI register. */
void intel_gma_opregion_register(uintptr_t opregion) 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) 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 (vbt == NULL)
if (cbfs_boot_locate(&file_desc, "vbt.bin", NULL) == CB_SUCCESS) { return CB_ERR;
cbfs_file_data(rdev, &file_desc);
printk(BIOS_INFO, "GMA: Found VBT in CBFS\n");
return CB_SUCCESS;
}
return CB_ERR; if (rdev_chain(rdev, &addrspace_32bit.rdev, (uintptr_t)vbt,
vbt_data_size))
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) static enum cb_err locate_vbt_vbios_cbfs(struct region_device *rdev)

View File

@ -253,4 +253,18 @@ uintptr_t gma_get_gnvs_aslb(const void *gnvs);
void gma_set_gnvs_aslb(void *gnvs, uintptr_t aslb); void gma_set_gnvs_aslb(void *gnvs, uintptr_t aslb);
enum cb_err intel_gma_init_igd_opregion(igd_opregion_t *opregion); 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_ */ #endif /* _COMMON_GMA_H_ */

View File

@ -14,11 +14,11 @@
*/ */
#include <stdint.h> #include <stdint.h>
#include <drivers/intel/gma/opregion.h>
#include <ec/google/chromeec/ec.h> #include <ec/google/chromeec/ec.h>
#include "baseboard/variants.h" #include "baseboard/variants.h"
#include <soc/cpu.h> #include <soc/cpu.h>
#include <soc/intel/apollolake/chip.h> #include <soc/intel/apollolake/chip.h>
#include <soc/intel/common/vbt.h>
#include <soc/gpio.h> #include <soc/gpio.h>
enum { enum {

View File

@ -21,48 +21,7 @@
#include <bootstate.h> #include <bootstate.h>
#include "vbt.h" #include "vbt.h"
#include <drivers/intel/gma/opregion.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;
}
void *vbt_get(void) void *vbt_get(void)
{ {

View File

@ -19,19 +19,6 @@
#include <commonlib/region.h> #include <commonlib/region.h>
#include <types.h> #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 * Returns VBT pointer and mapping after checking prerequisites for Pre OS
* Graphics initialization * Graphics initialization