<p>Philipp Deppenwiese has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/28104">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">lib/fit_payload: Add coreboot tables support for FDT.<br><br>* Copy code of depthcharge boot/coreboot.c<br>  and modify it.<br><br>Change-Id: Ib714a021a24f51407558f484cd97aa58ecd43977<br>Signed-off-by: Philipp Deppenwiese <zaolin@das-labor.org><br>---<br>M src/lib/fit_payload.c<br>1 file changed, 58 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/04/28104/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/lib/fit_payload.c b/src/lib/fit_payload.c</span><br><span>index 9dbd878..430a597 100644</span><br><span>--- a/src/lib/fit_payload.c</span><br><span>+++ b/src/lib/fit_payload.c</span><br><span>@@ -29,6 +29,8 @@</span><br><span> #include <commonlib/compression.h></span><br><span> #include <lib.h></span><br><span> #include <fit_payload.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <boardid.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arch/cbconfig.h></span><br><span> </span><br><span> /* Pack the device_tree and place it at given position. */</span><br><span> static void pack_fdt(struct region *fdt, struct device_tree *dt)</span><br><span>@@ -96,6 +98,60 @@</span><br><span>     return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void coreboot_fdt_data(struct device_tree *tree)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    u32 addr_cells = 1, size_cells = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   static const char *firmware_path[] const = {"firmware", NULL};</span><br><span style="color: hsl(120, 100%, 40%);">+      struct device_tree_node *firmware_node = dt_find_node(tree->root,</span><br><span style="color: hsl(120, 100%, 40%);">+          firmware_path, &addr_cells, &size_cells, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        // Need to add 'ranges' to the intermediate node to make 'reg' work.</span><br><span style="color: hsl(120, 100%, 40%);">+  dt_add_bin_prop(firmware_node, "ranges", NULL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        static const char *coreboot_path[] const = {"coreboot", NULL};</span><br><span style="color: hsl(120, 100%, 40%);">+      struct device_tree_node *coreboot_node = dt_find_node(firmware_node,</span><br><span style="color: hsl(120, 100%, 40%);">+          coreboot_path, &addr_cells, &size_cells, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        dt_add_string_prop(coreboot_node, "compatible", (char *)"coreboot");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    // Fetch CB tables from cbmem</span><br><span style="color: hsl(120, 100%, 40%);">+ void *cbtable = cbmem_find(CBMEM_ID_CBTABLE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cbtable) {</span><br><span style="color: hsl(120, 100%, 40%);">+               printk(BIOS_WARNING, "FIT: No coreboot table found!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            return;</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%);">+   u64 reg_addrs[2];</span><br><span style="color: hsl(120, 100%, 40%);">+     u64 reg_sizes[2];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   // First 'reg' address range is the coreboot table.</span><br><span style="color: hsl(120, 100%, 40%);">+   struct lb_header *header = cbtable;</span><br><span style="color: hsl(120, 100%, 40%);">+   reg_addrs[0] = (uintptr_t)header;</span><br><span style="color: hsl(120, 100%, 40%);">+     reg_sizes[0] = header->header_bytes + header->table_bytes;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    // Second is the CBMEM area (which usually includes the coreboot table).</span><br><span style="color: hsl(120, 100%, 40%);">+      reg_addrs[1] = (uintptr_t)cbmem_top();</span><br><span style="color: hsl(120, 100%, 40%);">+        reg_sizes[1] = cbmem_overhead_size();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       dt_add_reg_prop(coreboot_node, reg_addrs, reg_sizes, 2,</span><br><span style="color: hsl(120, 100%, 40%);">+                       addr_cells, size_cells);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    // Expose board ID, SKU ID, and RAM code exported from coreboot to</span><br><span style="color: hsl(120, 100%, 40%);">+    // userspace.</span><br><span style="color: hsl(120, 100%, 40%);">+ if (board_id() != UNDEFINED_STRAPPING_ID) {</span><br><span style="color: hsl(120, 100%, 40%);">+           dt_add_u32_prop(coreboot_node,</span><br><span style="color: hsl(120, 100%, 40%);">+                                "board-id", board_id());</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (sku_id() != UNDEFINED_STRAPPING_ID) {</span><br><span style="color: hsl(120, 100%, 40%);">+             dt_add_u32_prop(coreboot_node,</span><br><span style="color: hsl(120, 100%, 40%);">+                                "sku-id", sku_id());</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ram_code() != UNDEFINED_STRAPPING_ID) {</span><br><span style="color: hsl(120, 100%, 40%);">+           dt_add_u32_prop(coreboot_node,</span><br><span style="color: hsl(120, 100%, 40%);">+                                "ram-code", ram_code());</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> /*</span><br><span>  * Parse the uImage FIT, choose a configuration and extract images.</span><br><span>  */</span><br><span>@@ -129,6 +185,8 @@</span><br><span>                     return;</span><br><span>              }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+         // Insert coreboot specific information</span><br><span style="color: hsl(120, 100%, 40%);">+               coreboot_fdt_data(dt);</span><br><span>               dt_apply_fixups(dt);</span><br><span> </span><br><span>             /* Update device_tree */</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/28104">change 28104</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/28104"/><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: Ib714a021a24f51407558f484cd97aa58ecd43977 </div>
<div style="display:none"> Gerrit-Change-Number: 28104 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Philipp Deppenwiese <zaolin.daisuki@gmail.com> </div>