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:
parent
60ad1a7132
commit
4a3956d7cc
|
@ -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)
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue