Alexandru Gagniuc (mr.nuke.me@gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/11635
-gerrit
commit 6f295f3f5ee2c51c3e90210024c1854366e85f27 Author: Alexandru Gagniuc mr.nuke.me@gmail.com Date: Mon Sep 14 09:47:24 2015 -0700
WIP: ifdtool: Do proper ser/deser of descriptor
Change-Id: Iccc063d08beb2fcafe9af910a0b1b984fcbc134f Signed-off-by: Alexandru Gagniuc mr.nuke.me@gmail.com --- util/ifdtool/Makefile | 5 +- util/ifdtool/ifd_drv_bin.c | 126 +++++++++++++++++++++++++++++++++++++++++++++ util/ifdtool/ifdtool.c | 87 ++++++++++++++++++------------- util/ifdtool/ifdtool.h | 36 +++++++++++++ 4 files changed, 218 insertions(+), 36 deletions(-)
diff --git a/util/ifdtool/Makefile b/util/ifdtool/Makefile index 02a02c4..9036952 100644 --- a/util/ifdtool/Makefile +++ b/util/ifdtool/Makefile @@ -25,7 +25,10 @@ PREFIX = /usr/local CFLAGS = -O2 -g -Wall -W -Werror LDFLAGS =
-OBJS = ifdtool.o +OBJS = ifdtool.o ifd_drv_bin.o + +# Until we have a better way to pull in commonlib, her it goes: +CFLAGS += -I../../src/commonlib/include
all: dep $(PROGRAM)
diff --git a/util/ifdtool/ifd_drv_bin.c b/util/ifdtool/ifd_drv_bin.c new file mode 100644 index 0000000..c9ca743 --- /dev/null +++ b/util/ifdtool/ifd_drv_bin.c @@ -0,0 +1,126 @@ + +#include "ifdtool.h" +#include "commonlib/endian.h" + +#include <stdlib.h> + +static void des_flmap0(struct flash_descriptor *desc, uint32_t flmap0) +{ + desc->num_regions = (flmap0 >> 24) & 7; + desc->frba_offset = ((flmap0 >> 16) & 0xff) << 4; + desc->num_components = ((flmap0 >> 8) & 0x3) + 1; + desc->fcba_offset = ((flmap0 >> 0) & 0xff) << 4; +} + +static uint32_t ser_flmap0(const struct flash_descriptor *desc) +{ + uint32_t flmap0; + + flmap0 = (desc->num_regions & 0x7) << 24; + flmap0 |= ((desc->frba_offset >> 4) & 0xff) << 16; + flmap0 |= ((desc->num_components - 1) & 0x3) << 8; + flmap0 |= ((desc->fcba_offset >> 4) & 0xff) << 0; + + return flmap0; +} + +static void des_flmap1(struct flash_descriptor *desc, uint32_t flmap1) +{ + desc->num_pch_straps = (flmap1 >> 24) & 0xff; + desc->fpsba_offset = ((flmap1 >> 16) & 0xff) << 4; + desc->num_masters = (flmap1 >> 8) & 3; + desc->fmba_offset = ((flmap1 >> 0) & 0xff) << 4; +} + +static uint32_t ser_flmap1(const struct flash_descriptor *desc) +{ + uint32_t flmap1; + + flmap1 = (desc->num_pch_straps & 0xff) << 24; + flmap1 |= ((desc->fpsba_offset >> 4) & 0xff) << 16; + flmap1 |= (desc->num_masters & 0x3) << 8; + flmap1 |= ((desc->fmba_offset >> 4) & 0xff) << 0; + + return flmap1; +} + +static void des_flmap2(struct flash_descriptor *desc, uint32_t flmap2) +{ + desc->iccriba_offset = ((flmap2 >> 16) & 0xff) << 4; + desc->num_pch_straps = (flmap2 >> 8) & 0xff; + desc->fmsba_offset = ((flmap2 >> 0) & 0xff) << 4; +} + +static uint32_t ser_flmap2(const struct flash_descriptor *desc) +{ + uint32_t flmap2; + + flmap2 = ((desc->iccriba_offset >> 4) & 0xff) << 16; + flmap2 |= (desc->num_pch_straps & 0x3) << 8; + flmap2 |= ((desc->fmsba_offset >> 4) & 0xff) << 0; + + return flmap2; +} + +static void des_flumap1(struct flash_descriptor *desc, uint32_t flumap1) +{ + desc->vtba_len = ((flumap1 >> 8) & 0xff) / 2; + desc->vtba_offset = ((flumap1 >> 0) & 0xff) << 4; +} + +static uint32_t ser_flumap1(const struct flash_descriptor *desc) +{ + uint32_t flumap1; + + flumap1 = ((desc->vtba_len * 2) & 0xff) << 8; + flumap1 |= ((desc->vtba_offset >> 4) & 0xff) << 0; + + return flumap1; +} + +static void vscc_deserialize_jid(struct vscc_entry *vscc, uint32_t jid) +{ + vscc->spi_device_id[1] = (jid >> 16) & 0xff; + vscc->spi_device_id[0] = (jid >> 8) & 0xff; + vscc->spi_vendor_id = jid & 0xff; +} + +static void deserialize_vtba(struct vscc_entry *vtba, uint8_t num_entries, + const void *stream) +{ + size_t i; + const uint8_t *base = stream; + + for (i = 0; i < num_entries; i++, base += 8) { + vtba[i].vscc = read_le32(base + 0); + vscc_deserialize_jid(vtba + i, read_le32(base + 4)); + } +} + +void read_flash_descriptor(struct flash_descriptor *desc, const void *fud) +{ + const uint8_t *ifd_regs = fud; + + des_flmap0(desc, read_le32(ifd_regs + 0x04)); + des_flmap1(desc, read_le32(ifd_regs + 0x08)); + des_flmap2(desc, read_le32(ifd_regs + 0x0C)); + des_flumap1(desc, read_le32(ifd_regs + 0xeec)); + + /* FIXME: check malloc result */ + desc->vtba = malloc(desc->vtba_len * sizeof(*desc->vtba)); + deserialize_vtba(desc->vtba, desc->vtba_len, ifd_regs + desc->vtba_offset); +} + +void dont_compile_fail_me(void) +{ + des_flmap0(NULL, 0); + ser_flmap0(NULL); + des_flmap1(NULL, 0); + ser_flmap1(NULL); + des_flmap2(NULL, 0); + ser_flmap2(NULL); + des_flumap1(NULL, 0); + ser_flumap1(NULL); + + vscc_deserialize_jid(NULL, 0); +} diff --git a/util/ifdtool/ifdtool.c b/util/ifdtool/ifdtool.c index feaffa8..a69d83e 100644 --- a/util/ifdtool/ifdtool.c +++ b/util/ifdtool/ifdtool.c @@ -18,6 +18,7 @@ */
#include <unistd.h> +#include <stdbool.h> #include <stdlib.h> #include <stdio.h> #include <string.h> @@ -25,6 +26,8 @@ #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> + +#include "commonlib/endian.h" #include "ifdtool.h"
#ifndef O_BINARY @@ -33,7 +36,7 @@
static int ifd_version;
-static const struct region_name region_names[MAX_REGIONS] = { +static const struct region_name region_names_old_yester_years[9] = { { "Flash Descriptor", "fd" }, { "BIOS", "bios" }, { "Intel ME", "me" }, @@ -45,15 +48,29 @@ static const struct region_name region_names[MAX_REGIONS] = { { "EC", "ec" }, };
-static fdbar_t *find_fd(char *image, int size) +static const struct region_name region_names[9] = { + { "Flash Descriptor", "fd" }, + { "IFWI", "bios" }, + { "TXE", "me" }, + { "Platform Data", "pd" }, + { "Device Expansion", "bs0" }, + { "Reserved", "res1" }, + { "Reserved", "res2" }, + { "Reserved", "res3" }, + { "Reserved", "res4" }, +}; + +static void *find_fd(void *image, size_t size) { - int i, found = 0; + size_t i; + bool found = false; + uint8_t *base = image;
/* Scan for FD signature */ for (i = 0; i < (size - 4); i += 4) { - if (*(uint32_t *) (image + i) == 0x0FF0A55A) { - found = 1; - break; // signature found. + if (read_le32(base + i) == 0x0FF0A55A) { + found = true; + break; /* signature found. */ } }
@@ -62,7 +79,7 @@ static fdbar_t *find_fd(char *image, int size) return NULL; }
- return (fdbar_t *) (image + i); + return base + i; }
/* @@ -221,7 +238,7 @@ static int region_num(const char *name)
static const char *region_filename(int region_type) { - static const char *region_filenames[MAX_REGIONS] = { + static const char *region_filenames[9] = { "flashregion_0_flashdescriptor.bin", "flashregion_1_bios.bin", "flashregion_2_intel_me.bin", @@ -513,14 +530,14 @@ static void dump_fmsba(fmsba_t * fmsba) printf("????: 0x%08x\n", fmsba->data[3]); }
-static void dump_jid(uint32_t jid) +static void dump_jid(const struct vscc_entry *vscc) { printf(" SPI Componend Device ID 1: 0x%02x\n", - (jid >> 16) & 0xff); + vscc->spi_device_id[1]); printf(" SPI Componend Device ID 0: 0x%02x\n", - (jid >> 8) & 0xff); + vscc->spi_device_id[0]); printf(" SPI Componend Vendor ID: 0x%02x\n", - jid & 0xff); + vscc->spi_vendor_id); }
static void dump_vscc(uint32_t vscc) @@ -574,17 +591,17 @@ static void dump_vscc(uint32_t vscc) } }
-static void dump_vtba(vtba_t *vtba, int vtl) +static void dump_vtba(struct vscc_entry *vtba, size_t vtba_len) { int i; - int num = (vtl >> 1) < 8 ? (vtl >> 1) : 8; + int num = vtba_len;
printf("ME VSCC table:\n"); for (i = 0; i < num; i++) { - printf(" JID%d: 0x%08x\n", i, vtba->entry[i].jid); - dump_jid(vtba->entry[i].jid); - printf(" VSCC%d: 0x%08x\n", i, vtba->entry[i].vscc); - dump_vscc(vtba->entry[i].vscc); + //printf(" JID%d: 0x%08x\n", i, vtba->entry[i].jid); + dump_jid(vtba + i); + printf(" VSCC%d: 0x%08x\n", i, vtba[i].vscc); + dump_vscc(vtba[i].vscc); } printf("\n"); } @@ -604,34 +621,34 @@ static void dump_oem(uint8_t *oem)
static void dump_fd(char *image, int size) { + struct flash_descriptor desc; fdbar_t *fdb = find_fd(image, size); if (!fdb) exit(EXIT_FAILURE);
+ read_flash_descriptor(&desc,fdb); + printf("FLMAP0: 0x%08x\n", fdb->flmap0); - printf(" NR: %d\n", (fdb->flmap0 >> 24) & 7); - printf(" FRBA: 0x%x\n", ((fdb->flmap0 >> 16) & 0xff) << 4); - printf(" NC: %d\n", ((fdb->flmap0 >> 8) & 3) + 1); - printf(" FCBA: 0x%x\n", ((fdb->flmap0) & 0xff) << 4); + printf(" NR: %d\n", desc.num_regions); + printf(" FRBA: 0x%x\n", desc.frba_offset); + printf(" NC: %d\n", desc.num_components); + printf(" FCBA: 0x%x\n", desc.fcba_offset);
printf("FLMAP1: 0x%08x\n", fdb->flmap1); - printf(" ISL: 0x%02x\n", (fdb->flmap1 >> 24) & 0xff); - printf(" FPSBA: 0x%x\n", ((fdb->flmap1 >> 16) & 0xff) << 4); - printf(" NM: %d\n", (fdb->flmap1 >> 8) & 3); - printf(" FMBA: 0x%x\n", ((fdb->flmap1) & 0xff) << 4); + printf(" ISL: 0x%02x\n", desc.num_pch_straps); + printf(" FPSBA: 0x%x\n", desc.fpsba_offset); + printf(" NM: %d\n", desc.num_masters); + printf(" FMBA: 0x%x\n", desc.fmba_offset);
printf("FLMAP2: 0x%08x\n", fdb->flmap2); - printf(" PSL: 0x%04x\n", (fdb->flmap2 >> 8) & 0xffff); - printf(" FMSBA: 0x%x\n", ((fdb->flmap2) & 0xff) << 4); + printf(" PSL: 0x%04x\n", desc.num_cpu_straps); + printf(" FMSBA: 0x%x\n", desc.fmsba_offset);
printf("FLUMAP1: 0x%08x\n", fdb->flumap1); - printf(" Intel ME VSCC Table Length (VTL): %d\n", - (fdb->flumap1 >> 8) & 0xff); - printf(" Intel ME VSCC Table Base Address (VTBA): 0x%06x\n\n", - (fdb->flumap1 & 0xff) << 4); - dump_vtba((vtba_t *) - (image + ((fdb->flumap1 & 0xff) << 4)), - (fdb->flumap1 >> 8) & 0xff); + printf(" Intel ME VSCC Table Length (VTL): %d\n", desc.vtba_len); + printf(" Intel ME VSCC Table Base Address (VTBA): 0x%06x\n\n", desc.vtba_offset); + + dump_vtba(desc.vtba, desc.vtba_len); dump_oem((uint8_t *)image + 0xf00); dump_frba((frba_t *) (image + (((fdb->flmap0 >> 16) & 0xff) << 4))); diff --git a/util/ifdtool/ifdtool.h b/util/ifdtool/ifdtool.h index 195d91c..6bafd0d 100644 --- a/util/ifdtool/ifdtool.h +++ b/util/ifdtool/ifdtool.h @@ -130,6 +130,14 @@ typedef struct { uint32_t vscc; } vscc_t;
+struct vscc_entry { + uint32_t vscc; + /* Jid */ + uint8_t spi_device_id[2]; + uint8_t spi_vendor_id; +}; + + typedef struct { // Actual number of entries specified in vtl vscc_t entry[8]; @@ -143,3 +151,31 @@ struct region_name { char *pretty; char *terse; }; + +struct flash_descriptor +{ + /* FLMAP0 */ + uint8_t num_regions; + uint16_t frba_offset; + uint8_t num_components; + uint16_t fcba_offset; + + /* FLMAP1 */ + uint8_t num_pch_straps; + uint16_t fpsba_offset; + uint8_t num_masters; + uint16_t fmba_offset; + + /* FLMAP2 */ + uint16_t iccriba_offset; + uint8_t num_cpu_straps; + uint16_t fmsba_offset; + + /* FLUMAP1 */ + uint8_t vtba_len; + uint16_t vtba_offset; + + struct vscc_entry *vtba; +}; + +void read_flash_descriptor(struct flash_descriptor *desc, const void *fud);