summaryrefslogtreecommitdiffstats
path: root/ich_descriptors.c
diff options
context:
space:
mode:
authorNico Huber <nico.huber@secunet.com>2013-06-14 11:55:26 +0200
committerNico Huber <nico.h@gmx.de>2017-06-14 11:43:32 +0200
commit305f417ea565a18c1e87dcf5d97307369b721c6c (patch)
tree75fd4a1087415f99a64d0a5f26eaddcb54969883 /ich_descriptors.c
parentad18631b59d814b38bb6757df93fac17937a6bc9 (diff)
downloadflashrom-305f417ea565a18c1e87dcf5d97307369b721c6c.tar.gz
flashrom-305f417ea565a18c1e87dcf5d97307369b721c6c.tar.bz2
flashrom-305f417ea565a18c1e87dcf5d97307369b721c6c.zip
Add option to read ROM layout from IFD
Add an option --ifd to read the ROM layout from an Intel Firmware Descriptor (IFD). Works the same as the -l option, if given, -i specifies the images to update. v2: o Rebased on libflashrom, use libflashrom interface. o Use functions from ich_descriptors.c. v3: o Move ich_descriptors.o to LIB_OBJS, thus build it independent of arch and programmers. o Bail out if we aren't compiled for little endian. o Update flashrom.8.tmpl. v4: o Incorporated David's comments. o Removed single-character `-d` option. v5: Changed region names to match the output of `ifdtool --layout ...` Change-Id: Ifafff2bf6d5c5e62283416b3269723f81fdc0fa3 Signed-off-by: Nico Huber <nico.huber@secunet.com> Reviewed-on: https://review.coreboot.org/17953 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'ich_descriptors.c')
-rw-r--r--ich_descriptors.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/ich_descriptors.c b/ich_descriptors.c
index a0b2c9ae6..b6453cea0 100644
--- a/ich_descriptors.c
+++ b/ich_descriptors.c
@@ -23,6 +23,7 @@
#ifdef ICH_DESCRIPTORS_FROM_DUMP_ONLY
#include <stdio.h>
+#include <string.h>
#define print(t, ...) printf(__VA_ARGS__)
#endif
@@ -38,7 +39,7 @@
#include "programmer.h"
#ifndef min
-#define min(a, b) (a < b) ? a : b
+#define min(a, b) (((a) < (b)) ? (a) : (b))
#endif
void prettyprint_ich_reg_vscc(uint32_t reg_val, int verbosity, bool print_vcl)
@@ -916,4 +917,42 @@ int read_ich_descriptors_via_fdo(void *spibar, struct ich_descriptors *desc)
msg_pdbg2(" done.\n");
return ICH_RET_OK;
}
+
+/**
+ * @brief Read a layout from the dump of an Intel ICH descriptor.
+ *
+ * @param layout Pointer where to store the layout.
+ * @param dump The descriptor dump to read from.
+ * @param len The length of the descriptor dump.
+ *
+ * @return 0 on success,
+ * 1 if the descriptor couldn't be parsed.
+ */
+int layout_from_ich_descriptors(struct ich_layout *const layout, const void *const dump, const size_t len)
+{
+ static const char *regions[] = { "fd", "bios", "me", "gbe", "pd" };
+
+ struct ich_descriptors desc;
+ if (read_ich_descriptors_from_dump(dump, len, &desc))
+ return 1;
+
+ memset(layout, 0x00, sizeof(*layout));
+
+ size_t i, j;
+ for (i = 0, j = 0; i < min(desc.content.NR + 1, ARRAY_SIZE(regions)); ++i) {
+ const chipoff_t base = ICH_FREG_BASE(desc.region.FLREGs[i]);
+ const chipoff_t limit = ICH_FREG_LIMIT(desc.region.FLREGs[i]) + 0xfff;
+ if (limit <= base)
+ continue;
+ layout->entries[j].start = base;
+ layout->entries[j].end = limit;
+ layout->entries[j].included = false;
+ snprintf(layout->entries[j].name, sizeof(layout->entries[j].name), "%s", regions[i]);
+ ++j;
+ }
+ layout->base.entries = layout->entries;
+ layout->base.num_entries = j;
+ return 0;
+}
+
#endif /* ICH_DESCRIPTORS_FROM_DUMP_ONLY */