summaryrefslogtreecommitdiff
path: root/src/soc
diff options
context:
space:
mode:
authorPatrick Georgi <pgeorgi@google.com>2017-10-05 18:10:09 +0200
committerPatrick Georgi <pgeorgi@google.com>2017-10-06 16:59:31 +0000
commit9d3de2649f46cc85269b4877f0d6e715a4fec5aa (patch)
tree3c5dc7955bc90ff0a2c6c097f1c6453f3ec35bd7 /src/soc
parentcba7316c2662ee1c916345b034ca08dad43984f7 (diff)
downloadcoreboot-9d3de2649f46cc85269b4877f0d6e715a4fec5aa.tar.xz
soc/intel/common: refactor locate_vbt and vbt_get
Instead of having all callers provide a region_device just for the purpose of reading vbt.bin, let locate_vbt handle its entire life cycle, simplifying the VBT access API. Change-Id: Ib85e55164e217050b67674d020d17b2edf5ad14d Signed-off-by: Patrick Georgi <pgeorgi@google.com> Reviewed-on: https://review.coreboot.org/21897 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc')
-rw-r--r--src/soc/intel/apollolake/chip.c6
-rw-r--r--src/soc/intel/cannonlake/chip.c10
-rw-r--r--src/soc/intel/common/opregion.c5
-rw-r--r--src/soc/intel/common/vbt.c28
-rw-r--r--src/soc/intel/common/vbt.h4
5 files changed, 27 insertions, 26 deletions
diff --git a/src/soc/intel/apollolake/chip.c b/src/soc/intel/apollolake/chip.c
index 5759fb6f4c..f122876ab6 100644
--- a/src/soc/intel/apollolake/chip.c
+++ b/src/soc/intel/apollolake/chip.c
@@ -49,7 +49,6 @@
#include "chip.h"
static void *vbt;
-static struct region_device vbt_rdev;
static const char *soc_acpi_name(const struct device *dev)
{
@@ -317,7 +316,7 @@ static void soc_init(void *data)
struct global_nvs_t *gnvs;
/* Save VBT info and mapping */
- vbt = vbt_get(&vbt_rdev);
+ vbt = vbt_get();
/* Snapshot the current GPIO IRQ polarities. FSP is setting a
* default policy that doesn't honor boards' requirements. */
@@ -354,9 +353,6 @@ static void soc_init(void *data)
static void soc_final(void *data)
{
- if (vbt)
- rdev_munmap(&vbt_rdev, vbt);
-
/* Disable global reset, just in case */
pmc_global_reset_enable(0);
/* Make sure payload/OS can't trigger global reset */
diff --git a/src/soc/intel/cannonlake/chip.c b/src/soc/intel/cannonlake/chip.c
index e1cf167629..57a32244ca 100644
--- a/src/soc/intel/cannonlake/chip.c
+++ b/src/soc/intel/cannonlake/chip.c
@@ -26,7 +26,6 @@
#include <string.h>
static void *vbt;
-static struct region_device vbt_rdev;
#if IS_ENABLED(CONFIG_HAVE_ACPI_TABLES)
static const char *soc_acpi_name(const struct device *dev)
@@ -164,17 +163,10 @@ static void soc_enable(device_t dev)
dev->ops = &cpu_bus_ops;
}
-static void soc_final(void *data)
-{
- if (vbt)
- rdev_munmap(&vbt_rdev, vbt);
-}
-
struct chip_operations soc_intel_cannonlake_ops = {
CHIP_NAME("Intel Cannonlake")
.enable_dev = &soc_enable,
.init = &soc_init_pre_device,
- .final = &soc_final
};
/* UPD parameters to be initialized before SiliconInit */
@@ -189,7 +181,7 @@ void platform_fsp_silicon_init_params_cb(FSPS_UPD *supd)
parse_devicetree(params);
/* Save VBT info and mapping */
- vbt = vbt_get(&vbt_rdev);
+ vbt = vbt_get();
/* Load VBT before devicetree-specific config. */
params->GraphicsConfigPtr = (uintptr_t)vbt;
diff --git a/src/soc/intel/common/opregion.c b/src/soc/intel/common/opregion.c
index 1eb8609ada..b8111a0760 100644
--- a/src/soc/intel/common/opregion.c
+++ b/src/soc/intel/common/opregion.c
@@ -23,11 +23,10 @@
enum cb_err init_igd_opregion(igd_opregion_t *opregion)
{
- struct region_device vbt_rdev;
optionrom_vbt_t *vbt;
optionrom_vbt_t *ext_vbt;
- vbt = locate_vbt(&vbt_rdev);
+ vbt = locate_vbt();
if (!vbt) {
printk(BIOS_ERR, "VBT couldn't be read\n");
@@ -64,7 +63,5 @@ enum cb_err init_igd_opregion(igd_opregion_t *opregion)
/* FIXME We just assume we're mobile for now */
opregion->header.mailboxes = MAILBOXES_MOBILE;
- rdev_munmap(&vbt_rdev, vbt);
-
return CB_SUCCESS;
}
diff --git a/src/soc/intel/common/vbt.c b/src/soc/intel/common/vbt.c
index c36f797c9b..eba7d40430 100644
--- a/src/soc/intel/common/vbt.c
+++ b/src/soc/intel/common/vbt.c
@@ -17,6 +17,7 @@
#include <console/console.h>
#include <arch/acpi.h>
#include <bootmode.h>
+#include <bootstate.h>
#include "vbt.h"
@@ -28,11 +29,17 @@ const char *mainboard_vbt_filename(void)
return "vbt.bin";
}
-void *locate_vbt(struct region_device *rdev)
+static struct region_device vbt_rdev;
+static void *vbt_data;
+
+void *locate_vbt(void)
{
uint32_t vbtsig = 0;
struct cbfsf file_desc;
+ if (vbt_data != NULL)
+ return vbt_data;
+
const char *filename = mainboard_vbt_filename();
if (cbfs_boot_locate(&file_desc, filename, NULL) < 0) {
@@ -40,18 +47,19 @@ void *locate_vbt(struct region_device *rdev)
return NULL;
}
- cbfs_file_data(rdev, &file_desc);
- rdev_readat(rdev, &vbtsig, 0, sizeof(uint32_t));
+ cbfs_file_data(&vbt_rdev, &file_desc);
+ rdev_readat(&vbt_rdev, &vbtsig, 0, sizeof(uint32_t));
if (vbtsig != VBT_SIGNATURE) {
printk(BIOS_ERR, "Missing/invalid signature in VBT data file!\n");
return NULL;
}
- return rdev_mmap_full(rdev);
+ vbt_data = rdev_mmap_full(&vbt_rdev);
+ return vbt_data;
}
-void *vbt_get(struct region_device *rdev)
+void *vbt_get(void)
{
if (!IS_ENABLED(CONFIG_RUN_FSP_GOP))
return NULL;
@@ -62,5 +70,13 @@ void *vbt_get(struct region_device *rdev)
return NULL;
if (!display_init_required())
return NULL;
- return locate_vbt(rdev);
+ 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);
diff --git a/src/soc/intel/common/vbt.h b/src/soc/intel/common/vbt.h
index 2d52fea6ed..615af4b29c 100644
--- a/src/soc/intel/common/vbt.h
+++ b/src/soc/intel/common/vbt.h
@@ -28,10 +28,10 @@
const char *mainboard_vbt_filename(void);
/* locate vbt.bin file. Returns a pointer to its content. */
-void *locate_vbt(struct region_device *rdev);
+void *locate_vbt(void);
/*
* Returns VBT pointer and mapping after checking prerequisites for Pre OS
* Graphics initialization
*/
-void *vbt_get(struct region_device *rdev);
+void *vbt_get(void);
#endif