From 6486331cf66e35bcf01e1c15c4396af68b6eb4d4 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Tue, 25 Jul 2017 11:21:22 +0200
Subject: [PATCH 04/10] biosdecode: Add option --pir full
Add an option to decode the details of the PIR table.
This implements support request #109339:
https://savannah.nongnu.org/support/index.php?109339
---
biosdecode.c | 59 +++++++++++++++++++++++++++++++-------------------------
man/biosdecode.8 | 3 +++
2 files changed, 36 insertions(+), 26 deletions(-)
diff --git a/biosdecode.c b/biosdecode.c
index ad3d4bc..8293e61 100644
--- a/biosdecode.c
+++ b/biosdecode.c
@@ -73,12 +73,16 @@ struct opt
{
const char *devmem;
unsigned int flags;
+ unsigned char pir;
};
static struct opt opt;
#define FLAG_VERSION (1 << 0)
#define FLAG_HELP (1 << 1)
+#define PIR_SHORT 0
+#define PIR_FULL 1
+
struct bios_entry {
const char *anchor;
size_t anchor_len; /* computed */
@@ -386,32 +390,29 @@ static int pir_decode(const u8 *p, size_t len)
i, p[(i + 1) * 16], p[(i + 1) * 16 + 1] >> 3);
pir_slot_number(p[(i + 1) * 16 + 14]);
printf("\n");
-/* printf("\tSlot Entry %u\n", i);
- printf("\t\tID: %02x:%02x\n",
- p[(i + 1) * 16], p[(i + 1) * 16 + 1] >> 3);
- printf("\t\tLink Value for INTA#: %u\n",
- p[(i + 1) * 16 + 2]);
- printf("\t\tIRQ Bitmap for INTA#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 3));
- printf("\n");
- printf("\t\tLink Value for INTB#: %u\n",
- p[(i + 1) * 16 + 5]);
- printf("\t\tIRQ Bitmap for INTB#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 6));
- printf("\n");
- printf("\t\tLink Value for INTC#: %u\n",
- p[(i + 1) * 16 + 8]);
- printf("\t\tIRQ Bitmap for INTC#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 9));
- printf("\n");
- printf("\t\tLink Value for INTD#: %u\n",
- p[(i + 1) * 16 + 11]);
- printf("\t\tIRQ Bitmap for INTD#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 12));
- printf("\n");
- printf("\t\tSlot Number:");
- pir_slot_number(p[(i + 1) * 16 + 14]);
- printf("\n");*/
+ if (opt.pir == PIR_FULL)
+ {
+ printf("\t\tLink Value for INTA#: %u\n",
+ p[(i + 1) * 16 + 2]);
+ printf("\t\tIRQ Bitmap for INTA#:");
+ pir_irqs(WORD(p + (i + 1) * 16 + 3));
+ printf("\n");
+ printf("\t\tLink Value for INTB#: %u\n",
+ p[(i + 1) * 16 + 5]);
+ printf("\t\tIRQ Bitmap for INTB#:");
+ pir_irqs(WORD(p + (i + 1) * 16 + 6));
+ printf("\n");
+ printf("\t\tLink Value for INTC#: %u\n",
+ p[(i + 1) * 16 + 8]);
+ printf("\t\tIRQ Bitmap for INTC#:");
+ pir_irqs(WORD(p + (i + 1) * 16 + 9));
+ printf("\n");
+ printf("\t\tLink Value for INTD#: %u\n",
+ p[(i + 1) * 16 + 11]);
+ printf("\t\tIRQ Bitmap for INTD#:");
+ pir_irqs(WORD(p + (i + 1) * 16 + 12));
+ printf("\n");
+ }
}
return 1;
@@ -616,6 +617,7 @@ static int parse_command_line(int argc, char * const argv[])
const char *optstring = "d:hV";
struct option longopts[] = {
{ "dev-mem", required_argument, NULL, 'd' },
+ { "pir", required_argument, NULL, 'P' },
{ "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, 'V' },
{ NULL, 0, NULL, 0 }
@@ -627,6 +629,10 @@ static int parse_command_line(int argc, char * const argv[])
case 'd':
opt.devmem = optarg;
break;
+ case 'P':
+ if (strcmp(optarg, "full") == 0)
+ opt.pir = PIR_FULL;
+ break;
case 'h':
opt.flags |= FLAG_HELP;
break;
@@ -646,6 +652,7 @@ static void print_help(void)
"Usage: biosdecode [OPTIONS]\n"
"Options are:\n"
" -d, --dev-mem FILE Read memory from device FILE (default: " DEFAULT_MEM_DEV ")\n"
+ " --pir full Decode the details of the PCI IRQ routing table\n"
" -h, --help Display this help text and exit\n"
" -V, --version Display the version and exit\n";
diff --git a/man/biosdecode.8 b/man/biosdecode.8
index c39d6a0..a96eb68 100644
--- a/man/biosdecode.8
+++ b/man/biosdecode.8
@@ -60,6 +60,9 @@ program.
.BR "-d" ", " "--dev-mem FILE"
Read memory from device \fBFILE\fR (default: \fB/dev/mem\fR)
.TP
+.BR " " " " "--pir full"
+Decode the details of the PCI IRQ routing table
+.TP
.BR "-h" ", " "--help"
Display usage information and exit
.TP
--
2.9.5