reg_dumper: change and fix behavior when using dump files

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@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
Paulo Zanoni 2012-02-15 16:04:00 -02:00 committed by Daniel Vetter
parent ad87b06fd6
commit ecad594e02
2 changed files with 64 additions and 14 deletions

View File

@ -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)

View File

@ -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)) {