<p>Patrick Georgi has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/21897">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">soc/intel/common: refactor locate_vbt and vbt_get<br><br>Instead of having all callers provide a region_device just for the<br>purpose of reading vbt.bin, let locate_vbt handle its entire life cycle,<br>simplifying the VBT access API.<br><br>Change-Id: Ib85e55164e217050b67674d020d17b2edf5ad14d<br>Signed-off-by: Patrick Georgi <pgeorgi@google.com><br>---<br>M src/drivers/intel/fsp2_0/graphics.c<br>M src/soc/intel/apollolake/chip.c<br>M src/soc/intel/cannonlake/chip.c<br>M src/soc/intel/common/opregion.c<br>M src/soc/intel/common/vbt.c<br>M src/soc/intel/common/vbt.h<br>6 files changed, 24 insertions(+), 30 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/97/21897/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/src/drivers/intel/fsp2_0/graphics.c b/src/drivers/intel/fsp2_0/graphics.c<br>index e2ff7cf..f2888e8 100644<br>--- a/src/drivers/intel/fsp2_0/graphics.c<br>+++ b/src/drivers/intel/fsp2_0/graphics.c<br>@@ -96,10 +96,7 @@<br> <br> uintptr_t fsp_load_vbt(void)<br> {<br>- struct region_device rdev;<br>-   void *vbt_data = NULL;<br>-<br>-    vbt_data = locate_vbt(&rdev);<br>+    void *vbt_data = locate_vbt();<br> <br>     if (vbt_data == NULL)<br>                 printk(BIOS_NOTICE, "Could not locate a VBT file in CBFS\n");<br>diff --git a/src/soc/intel/apollolake/chip.c b/src/soc/intel/apollolake/chip.c<br>index 5759fb6..f122876 100644<br>--- a/src/soc/intel/apollolake/chip.c<br>+++ b/src/soc/intel/apollolake/chip.c<br>@@ -49,7 +49,6 @@<br> #include "chip.h"<br> <br> static void *vbt;<br>-static struct region_device vbt_rdev;<br> <br> static const char *soc_acpi_name(const struct device *dev)<br> {<br>@@ -317,7 +316,7 @@<br>         struct global_nvs_t *gnvs;<br> <br>         /* Save VBT info and mapping */<br>-      vbt = vbt_get(&vbt_rdev);<br>+        vbt = vbt_get();<br> <br>   /* Snapshot the current GPIO IRQ polarities. FSP is setting a<br>          * default policy that doesn't honor boards' requirements. */<br>@@ -354,9 +353,6 @@<br> <br> static void soc_final(void *data)<br> {<br>-        if (vbt)<br>-             rdev_munmap(&vbt_rdev, vbt);<br>-<br>   /* Disable global reset, just in case */<br>      pmc_global_reset_enable(0);<br>   /* Make sure payload/OS can't trigger global reset */<br>diff --git a/src/soc/intel/cannonlake/chip.c b/src/soc/intel/cannonlake/chip.c<br>index e1cf167..57a3224 100644<br>--- a/src/soc/intel/cannonlake/chip.c<br>+++ b/src/soc/intel/cannonlake/chip.c<br>@@ -26,7 +26,6 @@<br> #include <string.h><br> <br> static void *vbt;<br>-static struct region_device vbt_rdev;<br> <br> #if IS_ENABLED(CONFIG_HAVE_ACPI_TABLES)<br> static const char *soc_acpi_name(const struct device *dev)<br>@@ -164,17 +163,10 @@<br>                 dev->ops = &cpu_bus_ops;<br> }<br> <br>-static void soc_final(void *data)<br>-{<br>-       if (vbt)<br>-             rdev_munmap(&vbt_rdev, vbt);<br>-}<br>-<br> struct chip_operations soc_intel_cannonlake_ops = {<br>         CHIP_NAME("Intel Cannonlake")<br>       .enable_dev     = &soc_enable,<br>    .init           = &soc_init_pre_device,<br>-  .final          = &soc_final<br> };<br> <br> /* UPD parameters to be initialized before SiliconInit */<br>@@ -189,7 +181,7 @@<br>     parse_devicetree(params);<br> <br>  /* Save VBT info and mapping */<br>-      vbt = vbt_get(&vbt_rdev);<br>+        vbt = vbt_get();<br> <br>   /* Load VBT before devicetree-specific config. */<br>     params->GraphicsConfigPtr = (uintptr_t)vbt;<br>diff --git a/src/soc/intel/common/opregion.c b/src/soc/intel/common/opregion.c<br>index 1eb8609..b8111a0 100644<br>--- a/src/soc/intel/common/opregion.c<br>+++ b/src/soc/intel/common/opregion.c<br>@@ -23,11 +23,10 @@<br> <br> enum cb_err init_igd_opregion(igd_opregion_t *opregion)<br> {<br>-    struct region_device vbt_rdev;<br>        optionrom_vbt_t *vbt;<br>         optionrom_vbt_t *ext_vbt;<br> <br>- vbt = locate_vbt(&vbt_rdev);<br>+     vbt = locate_vbt();<br> <br>        if (!vbt) {<br>           printk(BIOS_ERR, "VBT couldn't be read\n");<br>@@ -63,8 +62,6 @@<br> <br>       /* FIXME We just assume we're mobile for now */<br>   opregion->header.mailboxes = MAILBOXES_MOBILE;<br>-<br>- rdev_munmap(&vbt_rdev, vbt);<br> <br>   return CB_SUCCESS;<br> }<br>diff --git a/src/soc/intel/common/vbt.c b/src/soc/intel/common/vbt.c<br>index 5b23843..ef4d696 100644<br>--- a/src/soc/intel/common/vbt.c<br>+++ b/src/soc/intel/common/vbt.c<br>@@ -17,6 +17,7 @@<br> #include <console/console.h><br> #include <arch/acpi.h><br> #include <bootmode.h><br>+#include <bootstate.h><br> #include <string.h><br> <br> #include "vbt.h"<br>@@ -31,7 +32,10 @@<br>   return vbt_filename;<br> }<br> <br>-void *locate_vbt(struct region_device *rdev)<br>+static struct region_device vbt_rdev;<br>+static void *vbt_data;<br>+<br>+void *locate_vbt(void)<br> {<br>   uint32_t vbtsig = 0;<br>  struct cbfsf file_desc;<br>@@ -43,18 +47,19 @@<br>          return NULL;<br>  }<br> <br>- cbfs_file_data(rdev, &file_desc);<br>-        rdev_readat(rdev, &vbtsig, 0, sizeof(uint32_t));<br>+ cbfs_file_data(&vbt_rdev, &file_desc);<br>+       rdev_readat(&vbt_rdev, &vbtsig, 0, sizeof(uint32_t));<br> <br>      if (vbtsig != VBT_SIGNATURE) {<br>                printk(BIOS_ERR, "Missing/invalid signature in VBT data file!\n");<br>          return NULL;<br>  }<br> <br>- return rdev_mmap_full(rdev);<br>+ vbt_data = rdev_mmap_full(&vbt_rdev);<br>+    return vbt_data;<br> }<br> <br>-void *vbt_get(struct region_device *rdev)<br>+void *vbt_get(void)<br> {<br>         if (!IS_ENABLED(CONFIG_RUN_FSP_GOP))<br>          return NULL;<br>@@ -65,5 +70,12 @@<br>              return NULL;<br>  if (!display_init_required())<br>                 return NULL;<br>- return locate_vbt(rdev);<br>+     return locate_vbt();<br> }<br>+<br>+static void unmap_vbt(void *unused)<br>+{<br>+        if (vbt_data)<br>+                rdev_munmap(&vbt_rdev, vbt_data);<br>+}<br>+BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_LOAD, BS_ON_EXIT, unmap_vbt, NULL);<br>diff --git a/src/soc/intel/common/vbt.h b/src/soc/intel/common/vbt.h<br>index 2d52fea..615af4b 100644<br>--- a/src/soc/intel/common/vbt.h<br>+++ b/src/soc/intel/common/vbt.h<br>@@ -28,10 +28,10 @@<br> const char *mainboard_vbt_filename(void);<br> <br> /* locate vbt.bin file. Returns a pointer to its content. */<br>-void *locate_vbt(struct region_device *rdev);<br>+void *locate_vbt(void);<br> /*<br>  * Returns VBT pointer and mapping after checking prerequisites for Pre OS<br>  * Graphics initialization<br>  */<br>-void *vbt_get(struct region_device *rdev);<br>+void *vbt_get(void);<br> #endif<br></pre><p>To view, visit <a href="https://review.coreboot.org/21897">change 21897</a>. To unsubscribe, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/21897"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ib85e55164e217050b67674d020d17b2edf5ad14d </div>
<div style="display:none"> Gerrit-Change-Number: 21897 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Georgi <pgeorgi@google.com> </div>