From: Paulo Zanoni <paulo.r.zanoni at intel.com> Before this patch, handling dump files was wrong: - when HAS_PCH_SPLIT was specified, intel_reg_dumper segfaulted inside intel_check_pch() - the "devid" variable was used but not set - there was no way to specify the device id of the machine used to generate the dump file This patch fixes this behavior with the following changes: - the HAS_PCH_SPLIT variable is gone - there is now a '-d' argument that can be used to specify the device id used to interpret the results - when a dump file is used but the '-d' argument is not provided, an Ironlake machine is assumed Signed-off-by: Paulo Zanoni <paulo.r.zanoni at intel.com> --- man/intel_reg_dumper.man | 23 +++++++++++++------ tools/intel_reg_dumper.c | 55 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 64 insertions(+), 14 deletions(-) diff --git a/man/intel_reg_dumper.man b/man/intel_reg_dumper.man index 63f3dcd..89f6b9f 100644 --- a/man/intel_reg_dumper.man +++ b/man/intel_reg_dumper.man @@ -4,7 +4,7 @@ .SH NAME intel_reg_dumper \- Decode a bunch of Intel GPU registers for debugging .SH SYNOPSIS -.B intel_reg_dumper [ file ] +.B intel_reg_dumper [ options ] [ file ] .SH DESCRIPTION .B intel_reg_dumper is a tool to read and decode the values of many Intel GPU registers. It is @@ -14,11 +14,20 @@ argument is present, the registers will be decoded from the given file instead of the current registers. Use the .B intel_reg_snapshot tool to generate such files. -.SH ENVIRONMENT -.BR HAS_PCH_SPLIT -.PP -If set, decode as though the GPU has a PCH split. This is only necessary for -Intel HD (Ironlake) and later register dumps in files; live decodes get this -correct automatically. + +When the +.B file +argument is present and the +.B -d +argument is not present, +.B intel_reg_dumper +will assume the file was generated on an Ironlake machine. +.SH OPTIONS +.TP +.B -d id +when a dump file is used, use 'id' as device id (in hex) +.TP +.B -h +prints a help message .SH SEE ALSO .BR intel_reg_snapshot(1) diff --git a/tools/intel_reg_dumper.c b/tools/intel_reg_dumper.c index 66470c4..346fa2c 100644 --- a/tools/intel_reg_dumper.c +++ b/tools/intel_reg_dumper.c @@ -30,9 +30,10 @@ #include <stdio.h> #include <string.h> #include <err.h> +#include <unistd.h> #include "intel_gpu_tools.h" -static uint32_t devid; +static uint32_t devid = 0; #define DEBUGSTRING(func) static void func(char *result, int len, int reg, uint32_t val) @@ -2072,21 +2073,61 @@ intel_dump_regs(void) } } +static void print_usage(void) +{ + printf("Usage: intel_reg_dumper [options] [file]\n" + "Options:\n" + " -d id when a dump file is used, use 'id' as device id (in " + "hex)\n" + " -h prints this help\n"); +} + int main(int argc, char** argv) { struct pci_device *pci_dev; + int opt; + char *file = NULL; - if (argc == 2) - intel_map_file(argv[1]); - else { + while ((opt = getopt(argc, argv, "d:h")) != -1) { + switch (opt) { + case 'd': + devid = strtol(optarg, NULL, 16); + break; + case 'h': + print_usage(); + return 0; + default: + print_usage(); + return 1; + } + } + if (optind < argc) + file = argv[optind]; + + if (file) { + intel_map_file(file); + if (devid) { + if (IS_GEN5(devid)) + pch = PCH_IBX; + else + pch = PCH_CPT; + } else { + printf("Dumping from file without -d argument. " + "Assuming Ironlake machine.\n"); + devid = 0x0042; + pch = PCH_IBX; + } + } else { pci_dev = intel_get_pci_device(); - devid = pci_dev->device_id; /* XXX not true when mapping! */ + devid = pci_dev->device_id; intel_get_mmio(pci_dev); + + if (HAS_PCH_SPLIT(devid)) + intel_check_pch(); } - if (HAS_PCH_SPLIT(devid) || getenv("HAS_PCH_SPLIT")) { - intel_check_pch(); + if (HAS_PCH_SPLIT(devid)) { ironlake_dump_regs(); } else if (IS_945GM(devid)) { -- 1.7.9