<p>Patrick Rudolph has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/25633">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">lib/bootmem: Introduce custom bootmem tags<br><br>Introduce bootmem custom memory tags and use them instead of reusing<br>LB_MEM tags.<br><br>Tested with uImage payload on Cavium SoC.<br><br>Change-Id: I7be8fa792fc7933ca218ecd43d250d3a9c55caa6<br>Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com><br>---<br>M src/arch/x86/tables.c<br>M src/include/bootmem.h<br>M src/lib/bootmem.c<br>M src/lib/imd_cbmem.c<br>M src/lib/selfboot.c<br>5 files changed, 66 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/33/25633/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/arch/x86/tables.c b/src/arch/x86/tables.c</span><br><span>index 057f665..0a9a3d5 100644</span><br><span>--- a/src/arch/x86/tables.c</span><br><span>+++ b/src/arch/x86/tables.c</span><br><span>@@ -266,5 +266,5 @@</span><br><span>      /* Memory from 0 through the forwarding_table is reserved. */</span><br><span>        const uintptr_t base = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   bootmem_add_range(base, forwarding_table - base, LB_MEM_TABLE);</span><br><span style="color: hsl(120, 100%, 40%);">+       bootmem_add_range(base, forwarding_table - base, BM_MEM_TABLE);</span><br><span> }</span><br><span>diff --git a/src/include/bootmem.h b/src/include/bootmem.h</span><br><span>index 10c8d51..bfe31f2 100644</span><br><span>--- a/src/include/bootmem.h</span><br><span>+++ b/src/include/bootmem.h</span><br><span>@@ -20,6 +20,22 @@</span><br><span> #include <stdint.h></span><br><span> #include <boot/coreboot_tables.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * Bootmem types match to LB_MEM tags.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Start at 17 to make sure that the caller doesn't provide LB_MEM tags.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+enum bootmem_type {</span><br><span style="color: hsl(120, 100%, 40%);">+   BM_MEM_FIRST = 17,      /* First entry in this list */</span><br><span style="color: hsl(120, 100%, 40%);">+        BM_MEM_RAM,             /* Memory anyone can use */</span><br><span style="color: hsl(120, 100%, 40%);">+   BM_MEM_RESERVED,        /* Don't use this memory region */</span><br><span style="color: hsl(120, 100%, 40%);">+        BM_MEM_ACPI,            /* ACPI Tables */</span><br><span style="color: hsl(120, 100%, 40%);">+     BM_MEM_NVS,             /* ACPI NVS Memory */</span><br><span style="color: hsl(120, 100%, 40%);">+ BM_MEM_UNUSABLE,        /* Unusable address space */</span><br><span style="color: hsl(120, 100%, 40%);">+  BM_MEM_VENDOR_RSVD,     /* Vendor Reserved */</span><br><span style="color: hsl(120, 100%, 40%);">+ BM_MEM_TABLE,           /* Ram configuration tables are kept in */</span><br><span style="color: hsl(120, 100%, 40%);">+    BM_MEM_LAST,            /* Last entry in this list */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</span><br><span>  * Initialize the memory address space prior to payload loading. The bootmem</span><br><span>  * serves as the source for the lb_mem table.</span><br><span>@@ -30,7 +46,8 @@</span><br><span> void bootmem_arch_add_ranges(void);</span><br><span> </span><br><span> /* Add a range of a given type to the bootmem address space. */</span><br><span style="color: hsl(0, 100%, 40%);">-void bootmem_add_range(uint64_t start, uint64_t size, uint32_t type);</span><br><span style="color: hsl(120, 100%, 40%);">+void bootmem_add_range(uint64_t start, uint64_t size,</span><br><span style="color: hsl(120, 100%, 40%);">+                     const enum bootmem_type tag);</span><br><span> </span><br><span> /* Write memory coreboot table. */</span><br><span> void bootmem_write_memory_table(struct lb_memory *mem);</span><br><span>diff --git a/src/lib/bootmem.c b/src/lib/bootmem.c</span><br><span>index ea02a16..9d30b25 100644</span><br><span>--- a/src/lib/bootmem.c</span><br><span>+++ b/src/lib/bootmem.c</span><br><span>@@ -20,9 +20,34 @@</span><br><span> #include <cbmem.h></span><br><span> #include <device/resource.h></span><br><span> #include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <assert.h></span><br><span> </span><br><span> static struct memranges bootmem;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Convert bootmem tag to LB_MEM tag */</span><br><span style="color: hsl(120, 100%, 40%);">+static uint32_t bootmem_to_lb_tag(const enum bootmem_type tag)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (tag) {</span><br><span style="color: hsl(120, 100%, 40%);">+                case BM_MEM_RAM:</span><br><span style="color: hsl(120, 100%, 40%);">+                      return LB_MEM_RAM;</span><br><span style="color: hsl(120, 100%, 40%);">+            case BM_MEM_RESERVED:</span><br><span style="color: hsl(120, 100%, 40%);">+                 return LB_MEM_RESERVED;</span><br><span style="color: hsl(120, 100%, 40%);">+               case BM_MEM_ACPI:</span><br><span style="color: hsl(120, 100%, 40%);">+                     return LB_MEM_ACPI;</span><br><span style="color: hsl(120, 100%, 40%);">+           case BM_MEM_NVS:</span><br><span style="color: hsl(120, 100%, 40%);">+                      return LB_MEM_NVS;</span><br><span style="color: hsl(120, 100%, 40%);">+            case BM_MEM_UNUSABLE:</span><br><span style="color: hsl(120, 100%, 40%);">+                 return LB_MEM_UNUSABLE;</span><br><span style="color: hsl(120, 100%, 40%);">+               case BM_MEM_VENDOR_RSVD:</span><br><span style="color: hsl(120, 100%, 40%);">+                      return LB_MEM_VENDOR_RSVD;</span><br><span style="color: hsl(120, 100%, 40%);">+            case BM_MEM_TABLE:</span><br><span style="color: hsl(120, 100%, 40%);">+                    return LB_MEM_TABLE;</span><br><span style="color: hsl(120, 100%, 40%);">+          default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      printk(BIOS_ERR, "ERROR: Unsupported tag %u\n", tag);</span><br><span style="color: hsl(120, 100%, 40%);">+                       return LB_MEM_RESERVED;</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%);">+</span><br><span> void bootmem_init(void)</span><br><span> {</span><br><span>       const unsigned long cacheable = IORESOURCE_CACHEABLE;</span><br><span>@@ -34,8 +59,8 @@</span><br><span>     * that each overlapping range will take over the next. Therefore,</span><br><span>    * add cacheable resources as RAM then add the reserved resources.</span><br><span>    */</span><br><span style="color: hsl(0, 100%, 40%);">-     memranges_init(bm, cacheable, cacheable, LB_MEM_RAM);</span><br><span style="color: hsl(0, 100%, 40%);">-   memranges_add_resources(bm, reserved, reserved, LB_MEM_RESERVED);</span><br><span style="color: hsl(120, 100%, 40%);">+     memranges_init(bm, cacheable, cacheable, BM_MEM_RAM);</span><br><span style="color: hsl(120, 100%, 40%);">+ memranges_add_resources(bm, reserved, reserved, BM_MEM_RESERVED);</span><br><span> </span><br><span>        /* Add memory used by CBMEM. */</span><br><span>      cbmem_add_bootmem();</span><br><span>@@ -43,9 +68,12 @@</span><br><span>    bootmem_arch_add_ranges();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void bootmem_add_range(uint64_t start, uint64_t size, uint32_t type)</span><br><span style="color: hsl(120, 100%, 40%);">+void bootmem_add_range(uint64_t start, uint64_t size,</span><br><span style="color: hsl(120, 100%, 40%);">+                       const enum bootmem_type tag)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        memranges_insert(&bootmem, start, size, type);</span><br><span style="color: hsl(120, 100%, 40%);">+    assert (tag > BM_MEM_FIRST && tag < BM_MEM_LAST);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     memranges_insert(&bootmem, start, size, tag);</span><br><span> }</span><br><span> </span><br><span> void bootmem_write_memory_table(struct lb_memory *mem)</span><br><span>@@ -60,7 +88,7 @@</span><br><span>     memranges_each_entry(r, &bootmem) {</span><br><span>              lb_r->start = pack_lb64(range_entry_base(r));</span><br><span>             lb_r->size = pack_lb64(range_entry_size(r));</span><br><span style="color: hsl(0, 100%, 40%);">-         lb_r->type = range_entry_tag(r);</span><br><span style="color: hsl(120, 100%, 40%);">+           lb_r->type = bootmem_to_lb_tag(range_entry_tag(r));</span><br><span> </span><br><span>           lb_r++;</span><br><span>              mem->size += sizeof(struct lb_memory_range);</span><br><span>@@ -68,21 +96,21 @@</span><br><span> }</span><br><span> </span><br><span> struct range_strings {</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned long tag;</span><br><span style="color: hsl(120, 100%, 40%);">+    enum bootmem_type tag;</span><br><span>       const char *str;</span><br><span> };</span><br><span> </span><br><span> static const struct range_strings type_strings[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      { LB_MEM_RAM, "RAM" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { LB_MEM_RESERVED, "RESERVED" },</span><br><span style="color: hsl(0, 100%, 40%);">-      { LB_MEM_ACPI, "ACPI" },</span><br><span style="color: hsl(0, 100%, 40%);">-      { LB_MEM_NVS, "NVS" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { LB_MEM_UNUSABLE, "UNUSABLE" },</span><br><span style="color: hsl(0, 100%, 40%);">-      { LB_MEM_VENDOR_RSVD, "VENDOR RESERVED" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { LB_MEM_TABLE, "CONFIGURATION TABLES" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { BM_MEM_RAM, "RAM" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { BM_MEM_RESERVED, "RESERVED" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { BM_MEM_ACPI, "ACPI" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { BM_MEM_NVS, "NVS" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { BM_MEM_UNUSABLE, "UNUSABLE" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { BM_MEM_VENDOR_RSVD, "VENDOR RESERVED" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { BM_MEM_TABLE, "CONFIGURATION TABLES" },</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static const char *bootmem_range_string(unsigned long tag)</span><br><span style="color: hsl(120, 100%, 40%);">+static const char *bootmem_range_string(const enum bootmem_type tag)</span><br><span> {</span><br><span>   int i;</span><br><span> </span><br><span>@@ -119,7 +147,7 @@</span><br><span>                     break;</span><br><span> </span><br><span>           if (start >= range_entry_base(r) && end <= range_entry_end(r)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (range_entry_tag(r) == LB_MEM_RAM)</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (range_entry_tag(r) == BM_MEM_RAM)</span><br><span>                                return 1;</span><br><span>            }</span><br><span>    }</span><br><span>@@ -142,7 +170,7 @@</span><br><span>              if (range_entry_size(r) < size)</span><br><span>                   continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           if (range_entry_tag(r) != LB_MEM_RAM)</span><br><span style="color: hsl(120, 100%, 40%);">+         if (range_entry_tag(r) != BM_MEM_RAM)</span><br><span>                        continue;</span><br><span> </span><br><span>                if (range_entry_base(r) >= max_addr)</span><br><span>@@ -169,7 +197,7 @@</span><br><span>        begin = end - size;</span><br><span> </span><br><span>      /* Mark buffer as unusuable for future buffer use. */</span><br><span style="color: hsl(0, 100%, 40%);">-   bootmem_add_range(begin, size, LB_MEM_UNUSABLE);</span><br><span style="color: hsl(120, 100%, 40%);">+      bootmem_add_range(begin, size, BM_MEM_UNUSABLE);</span><br><span> </span><br><span>         return (void *)(uintptr_t)begin;</span><br><span> }</span><br><span>diff --git a/src/lib/imd_cbmem.c b/src/lib/imd_cbmem.c</span><br><span>index 5713c2c..23dd74b 100644</span><br><span>--- a/src/lib/imd_cbmem.c</span><br><span>+++ b/src/lib/imd_cbmem.c</span><br><span>@@ -299,7 +299,7 @@</span><br><span>         size_t size = 0;</span><br><span> </span><br><span>         imd_region_used(cbmem_get_imd(), &baseptr, &size);</span><br><span style="color: hsl(0, 100%, 40%);">-      bootmem_add_range((uintptr_t)baseptr, size, LB_MEM_TABLE);</span><br><span style="color: hsl(120, 100%, 40%);">+    bootmem_add_range((uintptr_t)baseptr, size, BM_MEM_TABLE);</span><br><span> }</span><br><span> </span><br><span> #if ENV_RAMSTAGE || (IS_ENABLED(CONFIG_EARLY_CBMEM_LIST) \</span><br><span>diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c</span><br><span>index 160e8f5..20886b4 100644</span><br><span>--- a/src/lib/selfboot.c</span><br><span>+++ b/src/lib/selfboot.c</span><br><span>@@ -381,7 +381,7 @@</span><br><span>                  */</span><br><span>          if (check_regions) {</span><br><span>                         bootmem_add_range(ptr->s_dstaddr, ptr->s_memsz,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     LB_MEM_UNUSABLE);</span><br><span style="color: hsl(120, 100%, 40%);">+                                     BM_MEM_UNUSABLE);</span><br><span>          }</span><br><span> </span><br><span>                if (!overlaps_coreboot(ptr))</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/25633">change 25633</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/25633"/><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: I7be8fa792fc7933ca218ecd43d250d3a9c55caa6 </div>
<div style="display:none"> Gerrit-Change-Number: 25633 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <patrick.rudolph@9elements.com> </div>