public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
* [IGT PATCH 0/4] intel_bios_reader updates
@ 2013-10-08 18:15 Jani Nikula
  2013-10-08 18:15 ` [IGT PATCH 1/4] intel_bios_reader: add size temp variable as a shorthand for finfo.st_size Jani Nikula
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Jani Nikula @ 2013-10-08 18:15 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Add some verbosity to the bios reader, and hex dump also the sections we
currently don't parse.

BR,
Jani.


Jani Nikula (4):
  intel_bios_reader: add size temp variable as a shorthand for
    finfo.st_size
  intel_bios_reader: prepare for dumping all sections
  intel_bios_reader: dump all sections, including unknown ones
  intel_bios_reader: dump all edp device info structs

 tools/intel_bios_reader.c |  533 +++++++++++++++++++++++----------------------
 1 file changed, 270 insertions(+), 263 deletions(-)

-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [IGT PATCH 1/4] intel_bios_reader: add size temp variable as a shorthand for finfo.st_size
  2013-10-08 18:15 [IGT PATCH 0/4] intel_bios_reader updates Jani Nikula
@ 2013-10-08 18:15 ` Jani Nikula
  2013-10-08 18:15 ` [IGT PATCH 2/4] intel_bios_reader: prepare for dumping all sections Jani Nikula
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Jani Nikula @ 2013-10-08 18:15 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 tools/intel_bios_reader.c |   46 +++++++++++++++++++++++----------------------
 1 file changed, 24 insertions(+), 22 deletions(-)

diff --git a/tools/intel_bios_reader.c b/tools/intel_bios_reader.c
index 493fb63..d30026e 100644
--- a/tools/intel_bios_reader.c
+++ b/tools/intel_bios_reader.c
@@ -835,6 +835,7 @@ int main(int argc, char **argv)
 	int vbt_off, bdb_off, i;
 	const char *filename = "bios";
 	struct stat finfo;
+	int size;
 	struct bdb_block *block;
 	char signature[17];
 	char *devid_string;
@@ -860,12 +861,13 @@ int main(int argc, char **argv)
 		       strerror(errno));
 		return 1;
 	}
+	size = finfo.st_size;
 
-	if (finfo.st_size == 0) {
+	if (size == 0) {
 		int len = 0, ret;
-		finfo.st_size = 8192;
-		VBIOS = malloc (finfo.st_size);
-		while ((ret = read(fd, VBIOS + len, finfo.st_size - len))) {
+		size = 8192;
+		VBIOS = malloc (size);
+		while ((ret = read(fd, VBIOS + len, size - len))) {
 			if (ret < 0) {
 				printf("failed to read \"%s\": %s\n", filename,
 				       strerror(errno));
@@ -873,13 +875,13 @@ int main(int argc, char **argv)
 			}
 
 			len += ret;
-			if (len == finfo.st_size) {
-				finfo.st_size *= 2;
-				VBIOS = realloc(VBIOS, finfo.st_size);
+			if (len == size) {
+				size *= 2;
+				VBIOS = realloc(VBIOS, size);
 			}
 		}
 	} else {
-		VBIOS = mmap(NULL, finfo.st_size, PROT_READ, MAP_SHARED, fd, 0);
+		VBIOS = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
 		if (VBIOS == MAP_FAILED) {
 			printf("failed to map \"%s\": %s\n", filename, strerror(errno));
 			return 1;
@@ -887,7 +889,7 @@ int main(int argc, char **argv)
 	}
 
 	/* Scour memory looking for the VBT signature */
-	for (i = 0; i + 4 < finfo.st_size; i++) {
+	for (i = 0; i + 4 < size; i++) {
 		if (!memcmp(VBIOS + i, "$VBT", 4)) {
 			vbt_off = i;
 			vbt = (struct vbt_header *)(VBIOS + i);
@@ -903,7 +905,7 @@ int main(int argc, char **argv)
 	printf("VBT vers: %d.%d\n", vbt->version / 100, vbt->version % 100);
 
 	bdb_off = vbt_off + vbt->bdb_offset;
-	if (bdb_off >= finfo.st_size - sizeof(struct bdb_header)) {
+	if (bdb_off >= size - sizeof(struct bdb_header)) {
 		printf("Invalid VBT found, BDB points beyond end of data block\n");
 		return 1;
 	}
@@ -916,7 +918,7 @@ int main(int argc, char **argv)
 
 	printf("Available sections: ");
 	for (i = 0; i < 256; i++) {
-		block = find_section(i, finfo.st_size);
+		block = find_section(i, size);
 		if (!block)
 			continue;
 		printf("%d ", i);
@@ -929,19 +931,19 @@ int main(int argc, char **argv)
 	if (devid == -1)
 	    printf("Warning: could not find PCI device ID!\n");
 
-	dump_general_features(finfo.st_size);
-	dump_general_definitions(finfo.st_size);
-	dump_child_devices(finfo.st_size);
-	dump_lvds_options(finfo.st_size);
-	dump_lvds_data(finfo.st_size);
-	dump_lvds_ptr_data(finfo.st_size);
-	dump_backlight_info(finfo.st_size);
+	dump_general_features(size);
+	dump_general_definitions(size);
+	dump_child_devices(size);
+	dump_lvds_options(size);
+	dump_lvds_data(size);
+	dump_lvds_ptr_data(size);
+	dump_backlight_info(size);
 
-	dump_sdvo_lvds_options(finfo.st_size);
-	dump_sdvo_panel_dtds(finfo.st_size);
+	dump_sdvo_lvds_options(size);
+	dump_sdvo_panel_dtds(size);
 
-	dump_driver_feature(finfo.st_size);
-	dump_edp(finfo.st_size);
+	dump_driver_feature(size);
+	dump_edp(size);
 
 	return 0;
 }
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [IGT PATCH 2/4] intel_bios_reader: prepare for dumping all sections
  2013-10-08 18:15 [IGT PATCH 0/4] intel_bios_reader updates Jani Nikula
  2013-10-08 18:15 ` [IGT PATCH 1/4] intel_bios_reader: add size temp variable as a shorthand for finfo.st_size Jani Nikula
@ 2013-10-08 18:15 ` Jani Nikula
  2013-10-08 18:15 ` [IGT PATCH 3/4] intel_bios_reader: dump all sections, including unknown ones Jani Nikula
  2013-10-08 18:15 ` [IGT PATCH 4/4] intel_bios_reader: dump all edp device info structs Jani Nikula
  3 siblings, 0 replies; 5+ messages in thread
From: Jani Nikula @ 2013-10-08 18:15 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Dump sections through a table based on the section id.

Hex dump the section. This works also for unknown sections.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 tools/intel_bios_reader.c |  342 +++++++++++++++++++++------------------------
 1 file changed, 160 insertions(+), 182 deletions(-)

diff --git a/tools/intel_bios_reader.c b/tools/intel_bios_reader.c
index d30026e..30c3470 100644
--- a/tools/intel_bios_reader.c
+++ b/tools/intel_bios_reader.c
@@ -70,6 +70,7 @@ struct bdb_block {
 };
 
 struct bdb_header *bdb;
+struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs;
 static int tv_present;
 static int lvds_present;
 static int panel_type;
@@ -115,19 +116,9 @@ static struct bdb_block *find_section(int section_id, int length)
 	return NULL;
 }
 
-static void dump_general_features(int length)
+static void dump_general_features(const struct bdb_block *block)
 {
-	struct bdb_general_features *features;
-	struct bdb_block *block;
-
-	block = find_section(BDB_GENERAL_FEATURES, length);
-
-	if (!block)
-		return;
-
-	features = block->data;
-
-	printf("General features block:\n");
+	struct bdb_general_features *features = block->data;
 
 	printf("\tPanel fitting: ");
 	switch (features->panel_fitting) {
@@ -172,25 +163,13 @@ static void dump_general_features(int length)
 
 	tv_present = 1;		/* should be based on whether TV DAC exists */
 	lvds_present = 1;	/* should be based on IS_MOBILE() */
-
-	free(block);
 }
 
-static void dump_backlight_info(int length)
+static void dump_backlight_info(const struct bdb_block *block)
 {
-	struct bdb_block *block;
-	struct bdb_lvds_backlight *backlight;
+	struct bdb_lvds_backlight *backlight = block->data;
 	struct blc_struct *blc;
 
-	block = find_section(BDB_LVDS_BACKLIGHT, length);
-
-	if (!block)
-		return;
-
-	backlight = block->data;
-
-	printf("Backlight info block (len %d):\n", block->size);
-
 	if (sizeof(struct blc_struct) != backlight->blcstruct_size) {
 		printf("\tBacklight struct sizes don't match (expected %zu, got %u), skipping\n",
 		     sizeof(struct blc_struct), backlight->blcstruct_size);
@@ -345,23 +324,13 @@ static void dump_child_device(struct child_device_config *child)
 	}
 }
 
-static void dump_general_definitions(int length)
+static void dump_general_definitions(const struct bdb_block *block)
 {
-	struct bdb_block *block;
-	struct bdb_general_definitions *defs;
+	struct bdb_general_definitions *defs = block->data;
 	struct child_device_config *child;
 	int i;
 	int child_device_num;
 
-	block = find_section(BDB_GENERAL_DEFINITIONS, length);
-
-	if (!block)
-		return;
-
-	defs = block->data;
-
-	printf("General definitions block:\n");
-
 	printf("\tCRT DDC GMBUS addr: 0x%02x\n", defs->crt_ddc_gmbus_pin);
 	printf("\tUse ACPI DPMS CRT power states: %s\n",
 	       YESNO(defs->dpms_acpi));
@@ -374,25 +343,14 @@ static void dump_general_definitions(int length)
 	child_device_num = (block->size - sizeof(*defs)) / sizeof(*child);
 	for (i = 0; i < child_device_num; i++)
 		dump_child_device(&defs->devices[i]);
-	free(block);
 }
 
-static void dump_child_devices(int length)
+static void dump_child_devices(const struct bdb_block *block)
 {
-	struct bdb_block *block;
-	struct bdb_child_devices *child_devs;
+	struct bdb_child_devices *child_devs = block->data;
 	struct child_device_config *child;
 	int i;
 
-	block = find_section(BDB_CHILD_DEVICE_TABLE, length);
-	if (!block) {
-		printf("No child device table found\n");
-		return;
-	}
-
-	child_devs = block->data;
-
-	printf("Child devices block:\n");
 	for (i = 0; i < DEVICE_CHILD_SIZE; i++) {
 		child = &child_devs->children[i];
 		/* Skip nonexistent children */
@@ -408,24 +366,11 @@ static void dump_child_devices(int length)
 		printf("\t\tDVO config: 0x%02x\n", child->dvo_cfg);
 		printf("\t\tDVO wiring: 0x%02x\n", child->dvo_wiring);
 	}
-
-	free(block);
 }
 
-static void dump_lvds_options(int length)
+static void dump_lvds_options(const struct bdb_block *block)
 {
-	struct bdb_block *block;
-	struct bdb_lvds_options *options;
-
-	block = find_section(BDB_LVDS_OPTIONS, length);
-	if (!block) {
-		printf("No LVDS options block\n");
-		return;
-	}
-
-	options = block->data;
-
-	printf("LVDS options block:\n");
+	struct bdb_lvds_options *options = block->data;
 
 	panel_type = options->panel_type;
 	printf("\tPanel type: %d\n", panel_type);
@@ -437,54 +382,22 @@ static void dump_lvds_options(int length)
 	printf("\tPFIT enhanced text mode: %s\n",
 	       YESNO(options->pfit_text_mode_enhanced));
 	printf("\tPFIT mode: %d\n", options->pfit_mode);
-
-	free(block);
 }
 
-static void dump_lvds_ptr_data(int length)
+static void dump_lvds_ptr_data(const struct bdb_block *block)
 {
-	struct bdb_block *block;
-	struct bdb_lvds_lfp_data *lvds_data;
-	struct bdb_lvds_lfp_data_ptrs *ptrs;
-	struct lvds_fp_timing *fp_timing;
-	struct bdb_lvds_lfp_data_entry *entry;
-	int lfp_data_size;
+	struct bdb_lvds_lfp_data_ptrs *ptrs = block->data;
 
-	block = find_section(BDB_LVDS_LFP_DATA_PTRS, length);
-	if (!block) {
-		printf("No LFP data pointers block\n");
-		return;
-	}
-	ptrs = block->data;
+	printf("\tNumber of entries: %d\n", ptrs->lvds_entries);
 
-	block = find_section(BDB_LVDS_LFP_DATA, length);
-	if (!block) {
-		printf("No LVDS data block\n");
-		return;
-	}
-	lvds_data = block->data;
-
-	lfp_data_size =
-	    ptrs->ptr[1].fp_timing_offset - ptrs->ptr[0].fp_timing_offset;
-	entry =
-	    (struct bdb_lvds_lfp_data_entry *)((uint8_t *) lvds_data->data +
-					       (lfp_data_size * panel_type));
-	fp_timing = &entry->fp_timing;
-
-	printf("LVDS timing pointer data:\n");
-	printf("  Number of entries: %d\n", ptrs->lvds_entries);
-
-	printf("\tpanel type %02i: %dx%d\n", panel_type, fp_timing->x_res,
-	       fp_timing->y_res);
-
-	free(block);
+	/* save for use by dump_lvds_data() */
+	lvds_lfp_data_ptrs = ptrs;
 }
 
-static void dump_lvds_data(int length)
+static void dump_lvds_data(const struct bdb_block *block)
 {
-	struct bdb_block *block;
-	struct bdb_lvds_lfp_data *lvds_data;
-	struct bdb_lvds_lfp_data_ptrs *ptrs;
+	struct bdb_lvds_lfp_data *lvds_data = block->data;
+	struct bdb_lvds_lfp_data_ptrs *ptrs = lvds_lfp_data_ptrs;
 	int num_entries;
 	int i;
 	int hdisplay, hsyncstart, hsyncend, htotal;
@@ -492,29 +405,20 @@ static void dump_lvds_data(int length)
 	float clock;
 	int lfp_data_size, dvo_offset;
 
-	block = find_section(BDB_LVDS_LFP_DATA_PTRS, length);
-	if (!block) {
+	if (!ptrs) {
 		printf("No LVDS ptr block\n");
 		return;
 	}
-	ptrs = block->data;
+
 	lfp_data_size =
 	    ptrs->ptr[1].fp_timing_offset - ptrs->ptr[0].fp_timing_offset;
 	dvo_offset =
 	    ptrs->ptr[0].dvo_timing_offset - ptrs->ptr[0].fp_timing_offset;
-	free(block);
 
-	block = find_section(BDB_LVDS_LFP_DATA, length);
-	if (!block) {
-		printf("No LVDS data block\n");
-		return;
-	}
-
-	lvds_data = block->data;
 	num_entries = block->size / lfp_data_size;
 
-	printf("LVDS panel data block (preferred block marked with '*'):\n");
-	printf("  Number of entries: %d\n", num_entries);
+	printf("  Number of entries: %d (preferred block marked with '*')\n",
+	       num_entries);
 
 	for (i = 0; i < num_entries; i++) {
 		uint8_t *lfp_data_ptr =
@@ -560,22 +464,12 @@ static void dump_lvds_data(int length)
 		       (hsyncend > htotal || vsyncend > vtotal) ?
 		       "BAD!" : "good");
 	}
-	free(block);
 }
 
-static void dump_driver_feature(int length)
+static void dump_driver_feature(const struct bdb_block *block)
 {
-	struct bdb_block *block;
-	struct bdb_driver_feature *feature;
-
-	block = find_section(BDB_DRIVER_FEATURES, length);
-	if (!block) {
-		printf("No Driver feature data block\n");
-		return;
-	}
-	feature = block->data;
+	struct bdb_driver_feature *feature = block->data;
 
-	printf("Driver feature Data Block:\n");
 	printf("\tBoot Device Algorithm: %s\n", feature->boot_dev_algorithm ?
 	       "driver default" : "os default");
 	printf("\tBlock display switching when DVD active: %s\n",
@@ -636,23 +530,14 @@ static void dump_driver_feature(int length)
 	printf("\tLegacy CRT max Y: %d\n", feature->legacy_crt_max_y);
 	printf("\tLegacy CRT max refresh: %d\n",
 	       feature->legacy_crt_max_refresh);
-	free(block);
 }
 
-static void dump_edp(int length)
+static void dump_edp(const struct bdb_block *block)
 {
-	struct bdb_block *block;
-	struct bdb_edp *edp;
+	struct bdb_edp *edp = block->data;
 	int bpp;
 
-	block = find_section(BDB_EDP, length);
-	if (!block) {
-		printf("No EDP data block\n");
-		return;
-	}
-	edp = block->data;
-
-	printf("eDP block: type %d\n", panel_type);
+	printf("\tPanel type %d\n", panel_type);
 	printf("\tPower Sequence: T3 %d T7 %d T9 %d T10 %d T12 %d\n",
 		edp->power_seqs[panel_type].t3,
 		edp->power_seqs[panel_type].t7,
@@ -674,6 +559,7 @@ static void dump_edp(int length)
 		printf("30bpp\n");
 		break;
 	}
+
 	printf("\teDP sDRRs MSA timing delay: %d\n", edp->sdrrs_msa_timing_delay);
 	printf("\tLink params:\n");
 	printf("\t\trate: ");
@@ -723,7 +609,6 @@ static void dump_edp(int length)
 		printf("1.2V\n");
 		break;
 	}
-	free(block);
 }
 
 static void
@@ -755,43 +640,22 @@ print_detail_timing_data(struct lvds_dvo_timing2 *dvo_timing)
 	printf("\tclock: %d\n", dvo_timing->clock * 10);
 }
 
-static void dump_sdvo_panel_dtds(int length)
+static void dump_sdvo_panel_dtds(const struct bdb_block *block)
 {
-	struct bdb_block *block;
-	struct lvds_dvo_timing2 *dvo_timing;
+	struct lvds_dvo_timing2 *dvo_timing = block->data;
 	int n, count;
 
-	block = find_section(BDB_SDVO_PANEL_DTDS, length);
-	if (!block) {
-		printf("No SDVO panel dtds block\n");
-		return;
-	}
-
-	printf("SDVO panel dtds:\n");
 	count = block->size / sizeof(struct lvds_dvo_timing2);
-	dvo_timing = block->data;
 	for (n = 0; n < count; n++) {
 		printf("%d:\n", n);
 		print_detail_timing_data(dvo_timing++);
 	}
-
-	free(block);
 }
 
-static void dump_sdvo_lvds_options(int length)
+static void dump_sdvo_lvds_options(const struct bdb_block *block)
 {
-	struct bdb_block *block;
-	struct bdb_sdvo_lvds_options *options;
+	struct bdb_sdvo_lvds_options *options = block->data;
 
-	block = find_section(BDB_SDVO_LVDS_OPTIONS, length);
-	if (!block) {
-		printf("No SDVO LVDS options block\n");
-		return;
-	}
-
-	options = block->data;
-
-	printf("SDVO LVDS options block:\n");
 	printf("\tbacklight: %d\n", options->panel_backlight);
 	printf("\th40 type: %d\n", options->h40_set_panel_type);
 	printf("\ttype: %d\n", options->panel_type);
@@ -807,8 +671,6 @@ static void dump_sdvo_lvds_options(int length)
 	printf("\tmisc[1]: %x\n", options->panel_misc_bits_2);
 	printf("\tmisc[2]: %x\n", options->panel_misc_bits_3);
 	printf("\tmisc[3]: %x\n", options->panel_misc_bits_4);
-
-	free(block);
 }
 
 static int
@@ -828,6 +690,121 @@ get_device_id(unsigned char *bios)
     return device;
 }
 
+struct dumper {
+	uint8_t id;
+	const char *name;
+	void (*dump)(const struct bdb_block *block);
+};
+
+struct dumper dumpers[] = {
+	{
+		.id = BDB_GENERAL_FEATURES,
+		.name = "General features block",
+		.dump = dump_general_features,
+	},
+	{
+		.id = BDB_GENERAL_DEFINITIONS,
+		.name = "General definitions block",
+		.dump = dump_general_definitions,
+	},
+	{
+		.id = BDB_CHILD_DEVICE_TABLE,
+		.name = "Child devices block",
+		.dump = dump_child_devices,
+	},
+	{
+		.id = BDB_LVDS_OPTIONS,
+		.name = "LVDS options block",
+		.dump = dump_lvds_options,
+	},
+	{
+		.id = BDB_LVDS_LFP_DATA_PTRS,
+		.name = "LVDS timing pointer data",
+		.dump = dump_lvds_ptr_data,
+	},
+	{
+		.id = BDB_LVDS_LFP_DATA,
+		.name = "LVDS panel data block",
+		.dump = dump_lvds_data,
+	},
+	{
+		.id = BDB_LVDS_BACKLIGHT,
+		.name = "Backlight info block",
+		.dump = dump_backlight_info,
+	},
+	{
+		.id = BDB_SDVO_LVDS_OPTIONS,
+		.name = "SDVO LVDS options block",
+		.dump = dump_sdvo_lvds_options,
+	},
+	{
+		.id = BDB_SDVO_PANEL_DTDS,
+		.name = "SDVO panel dtds",
+		.dump = dump_sdvo_panel_dtds,
+	},
+	{
+		.id = BDB_DRIVER_FEATURES,
+		.name = "Driver feature data block",
+		.dump = dump_driver_feature,
+	},
+	{
+		.id = BDB_EDP,
+		.name = "eDP block",
+		.dump = dump_edp,
+	},
+};
+
+static void hex_dump(const struct bdb_block *block)
+{
+	int i;
+	uint8_t *p = block->data;
+
+	for (i = 0; i < block->size; i++) {
+		if (i % 16 == 0)
+			printf("\t%04x: ", i);
+		printf("%02x", p[i]);
+		if (i % 16 == 15) {
+			if (i + 1 < block->size)
+				printf("\n");
+		} else if (i % 8 == 7) {
+			printf("  ");
+		} else {
+			printf(" ");
+		}
+	}
+	printf("\n\n");
+}
+
+static void dump_section(int section_id, int size)
+{
+	struct dumper *dumper = NULL;
+	const struct bdb_block *block;
+	int i;
+
+	block = find_section(section_id, size);
+	if (!block) {
+		printf("No section %d\n", section_id);
+		return;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(dumpers); i++) {
+		if (block->id == dumpers[i].id) {
+			dumper = &dumpers[i];
+			break;
+		}
+	}
+
+	if (dumper && dumper->name)
+		printf("BDB block %d - %s:\n", block->id, dumper->name);
+	else
+		printf("BDB block %d:\n", block->id);
+
+	hex_dump(block);
+	if (dumper && dumper->dump)
+		dumper->dump(block);
+	printf("\n");
+}
+
 int main(int argc, char **argv)
 {
 	int fd;
@@ -917,6 +894,7 @@ int main(int argc, char **argv)
 	printf("BDB vers: %d\n", bdb->version);
 
 	printf("Available sections: ");
+
 	for (i = 0; i < 256; i++) {
 		block = find_section(i, size);
 		if (!block)
@@ -931,19 +909,19 @@ int main(int argc, char **argv)
 	if (devid == -1)
 	    printf("Warning: could not find PCI device ID!\n");
 
-	dump_general_features(size);
-	dump_general_definitions(size);
-	dump_child_devices(size);
-	dump_lvds_options(size);
-	dump_lvds_data(size);
-	dump_lvds_ptr_data(size);
-	dump_backlight_info(size);
+	dump_section(BDB_GENERAL_FEATURES, size);
+	dump_section(BDB_GENERAL_DEFINITIONS, size);
+	dump_section(BDB_CHILD_DEVICE_TABLE, size);
+	dump_section(BDB_LVDS_OPTIONS, size);
+	dump_section(BDB_LVDS_LFP_DATA_PTRS, size);
+	dump_section(BDB_LVDS_LFP_DATA, size);
+	dump_section(BDB_LVDS_BACKLIGHT, size);
 
-	dump_sdvo_lvds_options(size);
-	dump_sdvo_panel_dtds(size);
+	dump_section(BDB_SDVO_LVDS_OPTIONS, size);
+	dump_section(BDB_SDVO_PANEL_DTDS, size);
 
-	dump_driver_feature(size);
-	dump_edp(size);
+	dump_section(BDB_DRIVER_FEATURES, size);
+	dump_section(BDB_EDP, size);
 
 	return 0;
 }
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [IGT PATCH 3/4] intel_bios_reader: dump all sections, including unknown ones
  2013-10-08 18:15 [IGT PATCH 0/4] intel_bios_reader updates Jani Nikula
  2013-10-08 18:15 ` [IGT PATCH 1/4] intel_bios_reader: add size temp variable as a shorthand for finfo.st_size Jani Nikula
  2013-10-08 18:15 ` [IGT PATCH 2/4] intel_bios_reader: prepare for dumping all sections Jani Nikula
@ 2013-10-08 18:15 ` Jani Nikula
  2013-10-08 18:15 ` [IGT PATCH 4/4] intel_bios_reader: dump all edp device info structs Jani Nikula
  3 siblings, 0 replies; 5+ messages in thread
From: Jani Nikula @ 2013-10-08 18:15 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

We still need to dump some of the known sections explicitly due to
dependencies on information extracted, such as LFP data pointers and
panel_type.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 tools/intel_bios_reader.c |   12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/tools/intel_bios_reader.c b/tools/intel_bios_reader.c
index 30c3470..e906efd 100644
--- a/tools/intel_bios_reader.c
+++ b/tools/intel_bios_reader.c
@@ -779,13 +779,16 @@ static void dump_section(int section_id, int size)
 {
 	struct dumper *dumper = NULL;
 	const struct bdb_block *block;
+	static int done[256];
 	int i;
 
+	if (done[section_id])
+		return;
+	done[section_id] = 1;
+
 	block = find_section(section_id, size);
-	if (!block) {
-		printf("No section %d\n", section_id);
+	if (!block)
 		return;
-	}
 
 	for (i = 0; i < ARRAY_SIZE(dumpers); i++) {
 		if (block->id == dumpers[i].id) {
@@ -923,5 +926,8 @@ int main(int argc, char **argv)
 	dump_section(BDB_DRIVER_FEATURES, size);
 	dump_section(BDB_EDP, size);
 
+	for (i = 0; i < 256; i++)
+		dump_section(i, size);
+
 	return 0;
 }
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [IGT PATCH 4/4] intel_bios_reader: dump all edp device info structs
  2013-10-08 18:15 [IGT PATCH 0/4] intel_bios_reader updates Jani Nikula
                   ` (2 preceding siblings ...)
  2013-10-08 18:15 ` [IGT PATCH 3/4] intel_bios_reader: dump all sections, including unknown ones Jani Nikula
@ 2013-10-08 18:15 ` Jani Nikula
  3 siblings, 0 replies; 5+ messages in thread
From: Jani Nikula @ 2013-10-08 18:15 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 tools/intel_bios_reader.c |  165 +++++++++++++++++++++++++--------------------
 1 file changed, 93 insertions(+), 72 deletions(-)

diff --git a/tools/intel_bios_reader.c b/tools/intel_bios_reader.c
index e906efd..19b0fd9 100644
--- a/tools/intel_bios_reader.c
+++ b/tools/intel_bios_reader.c
@@ -535,79 +535,100 @@ static void dump_driver_feature(const struct bdb_block *block)
 static void dump_edp(const struct bdb_block *block)
 {
 	struct bdb_edp *edp = block->data;
-	int bpp;
-
-	printf("\tPanel type %d\n", panel_type);
-	printf("\tPower Sequence: T3 %d T7 %d T9 %d T10 %d T12 %d\n",
-		edp->power_seqs[panel_type].t3,
-		edp->power_seqs[panel_type].t7,
-		edp->power_seqs[panel_type].t9,
-		edp->power_seqs[panel_type].t10,
-		edp->power_seqs[panel_type].t12);
-
-	bpp = (edp->color_depth >> (panel_type * 2)) & 3;
-
-	printf("\tPanel color depth: ");
-	switch (bpp) {
-	case EDP_18BPP:
-		printf("18bpp\n");
-		break;
-	case EDP_24BPP:
-		printf("24bpp\n");
-		break;
-	case EDP_30BPP:
-		printf("30bpp\n");
-		break;
-	}
+	int bpp, msa;
+	int i;
 
-	printf("\teDP sDRRs MSA timing delay: %d\n", edp->sdrrs_msa_timing_delay);
-	printf("\tLink params:\n");
-	printf("\t\trate: ");
-	if (edp->link_params[panel_type].rate == EDP_RATE_1_62)
-		printf("1.62G\n");
-	else if (edp->link_params[panel_type].rate == EDP_RATE_2_7)
-		printf("2.7G\n");
-	printf("\t\tlanes: ");
-	switch (edp->link_params[panel_type].lanes) {
-	case EDP_LANE_1:
-		printf("x1 mode\n");
-		break;
-	case EDP_LANE_2:
-		printf("x2 mode\n");
-		break;
-	case EDP_LANE_4:
-		printf("x4 mode\n");
-		break;
-	}
-	printf("\t\tpre-emphasis: ");
-	switch (edp->link_params[panel_type].preemphasis) {
-	case EDP_PREEMPHASIS_NONE:
-		printf("none\n");
-		break;
-	case EDP_PREEMPHASIS_3_5dB:
-		printf("3.5dB\n");
-		break;
-	case EDP_PREEMPHASIS_6dB:
-		printf("6dB\n");
-		break;
-	case EDP_PREEMPHASIS_9_5dB:
-		printf("9.5dB\n");
-		break;
-	}
-	printf("\t\tvswing: ");
-	switch (edp->link_params[panel_type].vswing) {
-	case EDP_VSWING_0_4V:
-		printf("0.4V\n");
-		break;
-	case EDP_VSWING_0_6V:
-		printf("0.6V\n");
-		break;
-	case EDP_VSWING_0_8V:
-		printf("0.8V\n");
-		break;
-	case EDP_VSWING_1_2V:
-		printf("1.2V\n");
-		break;
+	for (i = 0; i < 16; i++) {
+		printf("\tPanel %d%s\n", i, panel_type == i ? " *" : "");
+
+		printf("\t\tPower Sequence: T3 %d T7 %d T9 %d T10 %d T12 %d\n",
+		       edp->power_seqs[i].t3,
+		       edp->power_seqs[i].t7,
+		       edp->power_seqs[i].t9,
+		       edp->power_seqs[i].t10,
+		       edp->power_seqs[i].t12);
+
+		bpp = (edp->color_depth >> (i * 2)) & 3;
+
+		printf("\t\tPanel color depth: ");
+		switch (bpp) {
+		case EDP_18BPP:
+			printf("18 bpp\n");
+			break;
+		case EDP_24BPP:
+			printf("24 bpp\n");
+			break;
+		case EDP_30BPP:
+			printf("30 bpp\n");
+			break;
+		default:
+			printf("(unknown value %d)\n", bpp);
+			break;
+		}
+
+		msa = (edp->sdrrs_msa_timing_delay >> (i * 2)) & 3;
+		printf("\t\teDP sDRRS MSA Delay: Lane %d\n", msa + 1);
+
+		printf("\t\tLink params:\n");
+		printf("\t\t\trate: ");
+		if (edp->link_params[i].rate == EDP_RATE_1_62)
+			printf("1.62G\n");
+		else if (edp->link_params[i].rate == EDP_RATE_2_7)
+			printf("2.7G\n");
+		printf("\t\t\tlanes: ");
+		switch (edp->link_params[i].lanes) {
+		case EDP_LANE_1:
+			printf("x1 mode\n");
+			break;
+		case EDP_LANE_2:
+			printf("x2 mode\n");
+			break;
+		case EDP_LANE_4:
+			printf("x4 mode\n");
+			break;
+		default:
+			printf("(unknown value %d)\n",
+			       edp->link_params[i].lanes);
+			break;
+		}
+		printf("\t\t\tpre-emphasis: ");
+		switch (edp->link_params[i].preemphasis) {
+		case EDP_PREEMPHASIS_NONE:
+			printf("none\n");
+			break;
+		case EDP_PREEMPHASIS_3_5dB:
+			printf("3.5dB\n");
+			break;
+		case EDP_PREEMPHASIS_6dB:
+			printf("6dB\n");
+			break;
+		case EDP_PREEMPHASIS_9_5dB:
+			printf("9.5dB\n");
+			break;
+		default:
+			printf("(unknown value %d)\n",
+			       edp->link_params[i].preemphasis);
+			break;
+		}
+		printf("\t\t\tvswing: ");
+		switch (edp->link_params[i].vswing) {
+		case EDP_VSWING_0_4V:
+			printf("0.4V\n");
+			break;
+		case EDP_VSWING_0_6V:
+			printf("0.6V\n");
+			break;
+		case EDP_VSWING_0_8V:
+			printf("0.8V\n");
+			break;
+		case EDP_VSWING_1_2V:
+			printf("1.2V\n");
+			break;
+		default:
+			printf("(unknown value %d)\n",
+			       edp->link_params[i].vswing);
+			break;
+		}
 	}
 }
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-10-08 18:18 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-08 18:15 [IGT PATCH 0/4] intel_bios_reader updates Jani Nikula
2013-10-08 18:15 ` [IGT PATCH 1/4] intel_bios_reader: add size temp variable as a shorthand for finfo.st_size Jani Nikula
2013-10-08 18:15 ` [IGT PATCH 2/4] intel_bios_reader: prepare for dumping all sections Jani Nikula
2013-10-08 18:15 ` [IGT PATCH 3/4] intel_bios_reader: dump all sections, including unknown ones Jani Nikula
2013-10-08 18:15 ` [IGT PATCH 4/4] intel_bios_reader: dump all edp device info structs Jani Nikula

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox