<p>Karthik Ramasubramanian has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/29541">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">drivers/elog: Group event log state information<br><br>Group event log state information together to manage them better during<br>different stages of coreboot.<br><br>BUG=b:117884485<br>BRANCH=None<br>TEST=Add an event log from romstage, boot to ChromeOS<br><br>Change-Id: I62792c0f5063c89ad11b512f1777c7ab8a2c13e5<br>Signed-off-by: Karthikeyan Ramasubramanian <kramasub@google.com><br>---<br>M src/drivers/elog/elog.c<br>1 file changed, 102 insertions(+), 58 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/41/29541/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/drivers/elog/elog.c b/src/drivers/elog/elog.c</span><br><span>index d3c01c2..d1a9f4f 100644</span><br><span>--- a/src/drivers/elog/elog.c</span><br><span>+++ b/src/drivers/elog/elog.c</span><br><span>@@ -16,6 +16,7 @@</span><br><span> #if IS_ENABLED(CONFIG_HAVE_ACPI_RESUME)</span><br><span> #include <arch/acpi.h></span><br><span> #endif</span><br><span style="color: hsl(120, 100%, 40%);">+#include <arch/early_variables.h></span><br><span> #include <bootstate.h></span><br><span> #include <cbmem.h></span><br><span> #include <console/console.h></span><br><span>@@ -42,33 +43,38 @@</span><br><span> #endif</span><br><span> </span><br><span> #define NV_NEEDS_ERASE (~(size_t)0)</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * Static variables for ELOG state</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static u16 full_threshold;</span><br><span style="color: hsl(0, 100%, 40%);">-static u16 shrink_size;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * The non-volatile storage chases the mirrored copy. When nv_last_write</span><br><span style="color: hsl(0, 100%, 40%);">- * is less than the mirrored last write the non-volatile storage needs</span><br><span style="color: hsl(0, 100%, 40%);">- * to be updated.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static size_t mirror_last_write;</span><br><span style="color: hsl(0, 100%, 40%);">-static size_t nv_last_write;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct region_device nv_dev;</span><br><span style="color: hsl(0, 100%, 40%);">-/* Device that mirrors the eventlog in memory. */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct mem_region_device mirror_dev;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static enum {</span><br><span style="color: hsl(120, 100%, 40%);">+enum elog_init_state {</span><br><span>     ELOG_UNINITIALIZED = 0,</span><br><span>      ELOG_INITIALIZED,</span><br><span>    ELOG_BROKEN,</span><br><span style="color: hsl(0, 100%, 40%);">-} elog_initialized = ELOG_UNINITIALIZED;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct elog_state {</span><br><span style="color: hsl(120, 100%, 40%);">+       u16 full_threshold;</span><br><span style="color: hsl(120, 100%, 40%);">+   u16 shrink_size;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * The non-volatile storage chases the mirrored copy. When nv_last_write</span><br><span style="color: hsl(120, 100%, 40%);">+       * is less than the mirrored last write the non-volatile storage needs</span><br><span style="color: hsl(120, 100%, 40%);">+         * to be updated.</span><br><span style="color: hsl(120, 100%, 40%);">+      */</span><br><span style="color: hsl(120, 100%, 40%);">+   size_t mirror_last_write;</span><br><span style="color: hsl(120, 100%, 40%);">+     size_t nv_last_write;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       struct region_device nv_dev;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Device that mirrors the eventlog in memory. */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct mem_region_device mirror_dev;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        enum elog_init_state elog_initialized;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct elog_state g_elog_state CAR_GLOBAL;</span><br><span> </span><br><span> static inline struct region_device *mirror_dev_get(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    return &mirror_dev.rdev;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return &g_elog_statep->mirror_dev.rdev;</span><br><span> }</span><br><span> </span><br><span> static size_t elog_events_start(void)</span><br><span>@@ -79,7 +85,9 @@</span><br><span> </span><br><span> static size_t elog_events_total_space(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    return region_device_sz(&nv_dev) - elog_events_start();</span><br><span style="color: hsl(120, 100%, 40%);">+   struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return region_device_sz(&g_elog_statep->nv_dev) - elog_events_start();</span><br><span> }</span><br><span> </span><br><span> static struct event_header *elog_get_event_buffer(size_t offset, size_t size)</span><br><span>@@ -89,8 +97,11 @@</span><br><span> </span><br><span> static struct event_header *elog_get_next_event_buffer(size_t size)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    elog_debug("ELOG: new event at offset 0x%zx\n", mirror_last_write);</span><br><span style="color: hsl(0, 100%, 40%);">-   return elog_get_event_buffer(mirror_last_write, size);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      elog_debug("ELOG: new event at offset 0x%zx\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                             g_elog_statep->mirror_last_write);</span><br><span style="color: hsl(120, 100%, 40%);">+ return elog_get_event_buffer(g_elog_statep->mirror_last_write, size);</span><br><span> }</span><br><span> </span><br><span> static void elog_put_event_buffer(struct event_header *event)</span><br><span>@@ -100,53 +111,72 @@</span><br><span> </span><br><span> static size_t elog_mirror_reset_last_write(void)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+       struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span>       /* Return previous write value. */</span><br><span style="color: hsl(0, 100%, 40%);">-      size_t prev = mirror_last_write;</span><br><span style="color: hsl(0, 100%, 40%);">-        mirror_last_write = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        size_t prev = g_elog_statep->mirror_last_write;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  g_elog_statep->mirror_last_write = 0;</span><br><span>     return prev;</span><br><span> }</span><br><span> </span><br><span> static void elog_mirror_increment_last_write(size_t size)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- mirror_last_write += size;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      g_elog_statep->mirror_last_write += size;</span><br><span> }</span><br><span> </span><br><span> static void elog_nv_reset_last_write(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        nv_last_write = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      g_elog_statep->nv_last_write = 0;</span><br><span> }</span><br><span> </span><br><span> static void elog_nv_increment_last_write(size_t size)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     nv_last_write += size;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      g_elog_statep->nv_last_write += size;</span><br><span> }</span><br><span> </span><br><span> static void elog_nv_needs_possible_erase(void)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+      struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* If last write is 0 it means it is already erased. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (nv_last_write != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         nv_last_write = NV_NEEDS_ERASE;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (g_elog_statep->nv_last_write != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+             g_elog_statep->nv_last_write = NV_NEEDS_ERASE;</span><br><span> }</span><br><span> </span><br><span> static bool elog_should_shrink(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return mirror_last_write >= full_threshold;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return g_elog_statep->mirror_last_write >=</span><br><span style="color: hsl(120, 100%, 40%);">+                              g_elog_statep->full_threshold;</span><br><span> }</span><br><span> </span><br><span> static bool elog_nv_needs_erase(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        return nv_last_write == NV_NEEDS_ERASE;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return g_elog_statep->nv_last_write == NV_NEEDS_ERASE;</span><br><span> }</span><br><span> </span><br><span> static bool elog_nv_needs_update(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       return nv_last_write != mirror_last_write;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return g_elog_statep->nv_last_write != g_elog_statep->mirror_last_write;</span><br><span> }</span><br><span> </span><br><span> static size_t elog_nv_region_to_update(size_t *offset)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  *offset = nv_last_write;</span><br><span style="color: hsl(0, 100%, 40%);">-        return mirror_last_write - nv_last_write;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      *offset = g_elog_statep->nv_last_write;</span><br><span style="color: hsl(120, 100%, 40%);">+    return g_elog_statep->mirror_last_write - g_elog_statep->nv_last_write;</span><br><span> }</span><br><span> </span><br><span> /*</span><br><span>@@ -318,6 +348,7 @@</span><br><span> {</span><br><span>      void *address;</span><br><span>       const struct region_device *rdev = mirror_dev_get();</span><br><span style="color: hsl(120, 100%, 40%);">+  struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span> </span><br><span>   if (!size)</span><br><span>           return;</span><br><span>@@ -331,7 +362,7 @@</span><br><span>                return;</span><br><span> </span><br><span>  /* Write the data to flash */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (rdev_writeat(&nv_dev, address, offset, size) != size)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rdev_writeat(&g_elog_statep->nv_dev, address, offset, size) != size)</span><br><span>              printk(BIOS_ERR, "ELOG: NV Write failed at 0x%zx, size 0x%zx\n",</span><br><span>                   offset, size);</span><br><span> </span><br><span>@@ -344,11 +375,12 @@</span><br><span>  */</span><br><span> static void elog_nv_erase(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       size_t size = region_device_sz(&nv_dev);</span><br><span style="color: hsl(120, 100%, 40%);">+  struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+        size_t size = region_device_sz(&g_elog_statep->nv_dev);</span><br><span>       elog_debug("%s()\n", __func__);</span><br><span> </span><br><span>        /* Erase the sectors in this region */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (rdev_eraseat(&nv_dev, 0, size) != size)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rdev_eraseat(&g_elog_statep->nv_dev, 0, size) != size)</span><br><span>            printk(BIOS_ERR, "ELOG: erase failure.\n");</span><br><span> }</span><br><span> </span><br><span>@@ -406,11 +438,13 @@</span><br><span>       elog_debug("elog_scan_flash()\n");</span><br><span>         void *mirror_buffer;</span><br><span>         const struct region_device *rdev = mirror_dev_get();</span><br><span style="color: hsl(0, 100%, 40%);">-    size_t size = region_device_sz(&nv_dev);</span><br><span style="color: hsl(120, 100%, 40%);">+  struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+        size_t size = region_device_sz(&g_elog_statep->nv_dev);</span><br><span> </span><br><span>   /* Fill memory buffer by reading from SPI */</span><br><span>         mirror_buffer = rdev_mmap_full(rdev);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (rdev_readat(&nv_dev, mirror_buffer, 0, size) != size) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rdev_readat(&g_elog_statep->nv_dev, mirror_buffer, 0, size) !=</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     size) {</span><br><span>              rdev_munmap(rdev, mirror_buffer);</span><br><span>            printk(BIOS_ERR, "ELOG: NV read failure.\n");</span><br><span>              return -1;</span><br><span>@@ -574,8 +608,10 @@</span><br><span> </span><br><span> static int elog_shrink(void)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     if (elog_should_shrink())</span><br><span style="color: hsl(0, 100%, 40%);">-               return elog_shrink_by_size(shrink_size);</span><br><span style="color: hsl(120, 100%, 40%);">+              return elog_shrink_by_size(g_elog_statep->shrink_size);</span><br><span>   return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -584,16 +620,19 @@</span><br><span>  */</span><br><span> static inline u8 *elog_flash_offset_to_address(void)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* Only support memory-mapped devices. */</span><br><span>    if (!IS_ENABLED(CONFIG_BOOT_DEVICE_MEMORY_MAPPED))</span><br><span>           return NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if (!region_device_sz(&nv_dev))</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!region_device_sz(&g_elog_statep->nv_dev))</span><br><span>                return NULL;</span><br><span> </span><br><span>     /* Get a view into the read-only boot device. */</span><br><span style="color: hsl(0, 100%, 40%);">-        return rdev_mmap(boot_device_ro(), region_device_offset(&nv_dev),</span><br><span style="color: hsl(0, 100%, 40%);">-                   region_device_sz(&nv_dev));</span><br><span style="color: hsl(120, 100%, 40%);">+       return rdev_mmap(boot_device_ro(),</span><br><span style="color: hsl(120, 100%, 40%);">+                    region_device_offset(&g_elog_statep->nv_dev),</span><br><span style="color: hsl(120, 100%, 40%);">+                  region_device_sz(&g_elog_statep->nv_dev));</span><br><span> }</span><br><span> </span><br><span> /*</span><br><span>@@ -605,7 +644,8 @@</span><br><span>       struct smbios_type15 *t = (struct smbios_type15 *)*current;</span><br><span>  int len = sizeof(struct smbios_type15);</span><br><span>      uintptr_t log_address;</span><br><span style="color: hsl(0, 100%, 40%);">-  size_t elog_size = region_device_sz(&nv_dev);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+        size_t elog_size = region_device_sz(&g_elog_statep->nv_dev);</span><br><span> </span><br><span>      if (IS_ENABLED(CONFIG_ELOG_CBMEM)) {</span><br><span>                 /* Save event log buffer into CBMEM for the OS to read */</span><br><span>@@ -659,7 +699,8 @@</span><br><span> {</span><br><span>         size_t total_size;</span><br><span>   size_t reserved_space = ELOG_MIN_AVAILABLE_ENTRIES * MAX_EVENT_SIZE;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct region_device *rdev = &nv_dev;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct region_device *rdev = &g_elog_statep->nv_dev;</span><br><span> </span><br><span>      elog_debug("%s()\n", __func__);</span><br><span> </span><br><span>@@ -682,10 +723,10 @@</span><br><span>        total_size = MIN(4*KiB, region_device_sz(rdev));</span><br><span>     rdev_chain(rdev, rdev, 0, total_size);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      full_threshold = total_size - reserved_space;</span><br><span style="color: hsl(0, 100%, 40%);">-   shrink_size = total_size * ELOG_SHRINK_PERCENTAGE / 100;</span><br><span style="color: hsl(120, 100%, 40%);">+      g_elog_statep->full_threshold = total_size - reserved_space;</span><br><span style="color: hsl(120, 100%, 40%);">+       g_elog_statep->shrink_size = total_size * ELOG_SHRINK_PERCENTAGE / 100;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (reserved_space > shrink_size) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (reserved_space > g_elog_statep->shrink_size) {</span><br><span>             printk(BIOS_ERR, "ELOG: SHRINK_PERCENTAGE too small\n");</span><br><span>           return -1;</span><br><span>   }</span><br><span>@@ -698,6 +739,7 @@</span><br><span>      size_t offset;</span><br><span>       size_t size;</span><br><span>         bool erase_needed;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span> </span><br><span>   /* Determine if any updates are required. */</span><br><span>         if (!elog_nv_needs_update())</span><br><span>@@ -729,7 +771,7 @@</span><br><span>   if (elog_scan_flash() < 0) {</span><br><span>              printk(BIOS_ERR, "ELOG: Sync back from NV storage failed.\n");</span><br><span>             elog_debug_dump_buffer("ELOG: Buffer from NV:\n");</span><br><span style="color: hsl(0, 100%, 40%);">-            elog_initialized = ELOG_BROKEN;</span><br><span style="color: hsl(120, 100%, 40%);">+               g_elog_statep->elog_initialized = ELOG_BROKEN;</span><br><span>            return -1;</span><br><span>   }</span><br><span> </span><br><span>@@ -758,8 +800,9 @@</span><br><span> {</span><br><span>     void *mirror_buffer;</span><br><span>         size_t elog_size;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct elog_state *g_elog_statep = car_get_var_ptr(&g_elog_state);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      switch (elog_initialized) {</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (g_elog_statep->elog_initialized) {</span><br><span>        case ELOG_UNINITIALIZED:</span><br><span>             break;</span><br><span>       case ELOG_INITIALIZED:</span><br><span>@@ -767,7 +810,7 @@</span><br><span>         case ELOG_BROKEN:</span><br><span>            return -1;</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       elog_initialized = ELOG_BROKEN;</span><br><span style="color: hsl(120, 100%, 40%);">+       g_elog_statep->elog_initialized = ELOG_BROKEN;</span><br><span> </span><br><span>        elog_debug("elog_init()\n");</span><br><span> </span><br><span>@@ -775,19 +818,20 @@</span><br><span>   if (elog_find_flash() < 0)</span><br><span>                return -1;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  elog_size = region_device_sz(&nv_dev);</span><br><span style="color: hsl(120, 100%, 40%);">+    elog_size = region_device_sz(&g_elog_statep->nv_dev);</span><br><span>         mirror_buffer = malloc(elog_size);</span><br><span>   if (!mirror_buffer) {</span><br><span>                printk(BIOS_ERR, "ELOG: Unable to allocate backing store\n");</span><br><span>              return -1;</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       mem_region_device_rw_init(&mirror_dev, mirror_buffer, elog_size);</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_region_device_rw_init(&g_elog_statep->mirror_dev, mirror_buffer,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                           elog_size);</span><br><span> </span><br><span>      /*</span><br><span>    * Mark as initialized to allow elog_init() to be called and deemed</span><br><span>   * successful in the prepare/shrink path which adds events.</span><br><span>   */</span><br><span style="color: hsl(0, 100%, 40%);">-     elog_initialized = ELOG_INITIALIZED;</span><br><span style="color: hsl(120, 100%, 40%);">+  g_elog_statep->elog_initialized = ELOG_INITIALIZED;</span><br><span> </span><br><span>   /* Load the log from flash and prepare the flash if necessary. */</span><br><span>    if (elog_scan_flash() < 0 && elog_prepare_empty() < 0) {</span><br><span>@@ -796,8 +840,8 @@</span><br><span>         }</span><br><span> </span><br><span>        printk(BIOS_INFO, "ELOG: area is %zu bytes, full threshold %d,"</span><br><span style="color: hsl(0, 100%, 40%);">-              " shrink size %d\n", region_device_sz(&nv_dev),</span><br><span style="color: hsl(0, 100%, 40%);">-            full_threshold, shrink_size);</span><br><span style="color: hsl(120, 100%, 40%);">+        " shrink size %d\n", region_device_sz(&g_elog_statep->nv_dev),</span><br><span style="color: hsl(120, 100%, 40%);">+                g_elog_statep->full_threshold, g_elog_statep->shrink_size);</span><br><span> </span><br><span>        if (elog_do_add_boot_count()) {</span><br><span>              elog_add_event_dword(ELOG_TYPE_BOOT, boot_count_read());</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/29541">change 29541</a>. To unsubscribe, or for help writing mail filters, 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/29541"/><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: I62792c0f5063c89ad11b512f1777c7ab8a2c13e5 </div>
<div style="display:none"> Gerrit-Change-Number: 29541 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Karthik Ramasubramanian <kramasub@google.com> </div>
<div style="display:none"> Gerrit-Reviewer: Karthikeyan Ramasubramanian <kramasub@chromium.org> </div>