[coreboot-gerrit] Patch set updated for coreboot: WIP: ifdtool: Do proper ser/deser of descriptor

Alexandru Gagniuc (mr.nuke.me@gmail.com) gerrit at coreboot.org
Wed Sep 23 16:12:47 CET 2015


Alexandru Gagniuc (mr.nuke.me at 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 at 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 at 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);



More information about the coreboot-gerrit mailing list