summaryrefslogtreecommitdiff
path: root/lib/chromeos
diff options
context:
space:
mode:
authorChe-Liang Chiou <clchiou@chromium.org>2011-07-02 02:59:05 +0800
committerSimon Glass <sjg@chromium.org>2011-08-29 10:58:42 -0700
commite6810c3099876d58f0525d592a391ed2031a3298 (patch)
tree6e464742f62eceac296c805dd216698d4281454c /lib/chromeos
parent43ba0ec710b4f7a1f40401444fee7af700733347 (diff)
CHROMIUM: crossystem: [2] write crossystem data into a device tree
BUG=chromium-os:15744 TEST=see first patch Change-Id: I6bb713572831c739dc83c0fb18e79edd401ace32 Reviewed-on: http://gerrit.chromium.org/gerrit/3574 Reviewed-by: Che-Liang Chiou <clchiou@chromium.org> Tested-by: Che-Liang Chiou <clchiou@chromium.org>
Diffstat (limited to 'lib/chromeos')
-rw-r--r--lib/chromeos/crossystem_data.c52
1 files changed, 50 insertions, 2 deletions
diff --git a/lib/chromeos/crossystem_data.c b/lib/chromeos/crossystem_data.c
index eafbf170d5a..1e9f646947f 100644
--- a/lib/chromeos/crossystem_data.c
+++ b/lib/chromeos/crossystem_data.c
@@ -99,8 +99,56 @@ int crossystem_data_set_recovery_reason(crossystem_data_t *cdata,
int crossystem_data_embed_into_fdt(crossystem_data_t *cdata, void *fdt,
uint32_t *size_ptr)
{
- /* TODO implement later */
- return 0;
+ char path[] = "/crossystem";
+ int nodeoffset, err;
+
+ err = fdt_open_into(fdt, fdt,
+ fdt_totalsize(fdt) + sizeof(*cdata) + 4096);
+ if (err < 0) {
+ VBDEBUG(PREFIX "fail to resize fdt: %s\n", fdt_strerror(err));
+ return 1;
+ }
+ *size_ptr = fdt_totalsize(fdt);
+
+ nodeoffset = fdt_add_subnodes_from_path(fdt, 0, path);
+ if (nodeoffset < 0) {
+ VBDEBUG(PREFIX "fail to create subnode %s: %s\n", path,
+ fdt_strerror(nodeoffset));
+ return 1;
+ }
+
+#define set_scalar_prop(f) \
+ err |= fdt_setprop_cell(fdt, nodeoffset, #f, cdata->f)
+#define set_array_prop(f) \
+ err |= fdt_setprop(fdt, nodeoffset, #f, cdata->f, sizeof(cdata->f))
+#define set_string_prop(f) \
+ err |= fdt_setprop_string(fdt, nodeoffset, #f, cdata->f)
+
+ err = 0;
+ set_scalar_prop(total_size);
+ set_string_prop(signature);
+ set_scalar_prop(version);
+ set_scalar_prop(nvcxt_lba);
+ set_array_prop(vbnv);
+ set_array_prop(nvcxt_cache);
+ set_scalar_prop(write_protect_sw);
+ set_scalar_prop(recovery_sw);
+ set_scalar_prop(developer_sw);
+ set_array_prop(binf);
+ set_scalar_prop(chsw);
+ set_string_prop(hwid);
+ set_string_prop(fwid);
+ set_string_prop(frid);
+ set_scalar_prop(fmap_base);
+ set_array_prop(vbshared_data);
+
+#undef set_scalar_prop
+#undef set_array_prop
+#undef set_string_prop
+
+ if (err)
+ VBDEBUG(PREFIX "fail to store all properties into fdt\n");
+ return err;
}
void crossystem_data_dump(crossystem_data_t *cdata)