summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorbms <bms@FreeBSD.org>2006-11-09 11:39:34 +0000
committerbms <bms@FreeBSD.org>2006-11-09 11:39:34 +0000
commit8d49d67d0a6eddec9c6b857df67b9b14c6b682b5 (patch)
tree139cecc223cfde7390c09f436200ba7370006427 /tools
parenta5378c36b69ce240171627c9abf9f3223a853195 (diff)
downloadFreeBSD-src-8d49d67d0a6eddec9c6b857df67b9b14c6b682b5.zip
FreeBSD-src-8d49d67d0a6eddec9c6b857df67b9b14c6b682b5.tar.gz
Rewrite the format of pirtool output to match what the kernel currently
prints out if bootverbose is set. This is to facilitate the code being removed from the kernel at a later date. While we're here, fix the __packed structures, and add some other PCI interrupt router IDs. Submitted by: jhb (with some tweaks) MFC after: 3 weeks
Diffstat (limited to 'tools')
-rw-r--r--tools/tools/pirtool/pirtable.h14
-rw-r--r--tools/tools/pirtool/pirtool.c102
2 files changed, 66 insertions, 50 deletions
diff --git a/tools/tools/pirtool/pirtable.h b/tools/tools/pirtool/pirtable.h
index cce6902..765a738 100644
--- a/tools/tools/pirtool/pirtable.h
+++ b/tools/tools/pirtool/pirtable.h
@@ -51,23 +51,23 @@ typedef struct {
u_int8_t bus; /* bus number of this device */
u_int8_t devfunc; /* only upper 5 device bits valid */
u_int8_t inta_link; /* how INTA is linked */
- u_int8_t inta_irqs[2]; /* how INTA may be routed (bitset) */
+ u_int16_t inta_irqs; /* how INTA may be routed (bitset) */
u_int8_t intb_link;
- u_int8_t intb_irqs[2];
+ u_int16_t intb_irqs;
u_int8_t intc_link;
- u_int8_t intc_irqs[2];
+ u_int16_t intc_irqs;
u_int8_t intd_link;
- u_int8_t intd_irqs[2]; /* how this pin may be routed */
+ u_int16_t intd_irqs; /* how this pin may be routed */
u_int8_t slot; /* physical slot number on bus,
* slot 0 if motherboard */
u_int8_t reserved00; /* must be zero */
-} pir_entry_t __packed;
+} __packed pir_entry_t;
typedef struct {
u_int32_t signature; /* $PIR */
u_int8_t minor; /* minor version (0) */
u_int8_t major; /* major version (1) */
- u_int16_t size; /* total size of tab;e */
+ u_int16_t size; /* total size of table */
u_int8_t bus; /* Bus number of router */
u_int8_t devfunc; /* Dev/Func of router */
u_int16_t excl_irqs; /* PCI Exclusive IRQs */
@@ -77,6 +77,6 @@ typedef struct {
u_int8_t reserved00[11]; /* Must be zero */
u_int8_t checksum; /* Inverse mod-256 sum of table bytes */
pir_entry_t entry[1]; /* 1..N device entries */
-} pir_table_t __packed;
+} __packed pir_table_t;
#endif /* _PIRTABLE_H */
diff --git a/tools/tools/pirtool/pirtool.c b/tools/tools/pirtool/pirtool.c
index 5e13b50..4dd5d4f 100644
--- a/tools/tools/pirtool/pirtool.c
+++ b/tools/tools/pirtool/pirtool.c
@@ -56,7 +56,9 @@ void usage(void);
void banner(void);
pir_table_t *find_pir_table(unsigned char *base);
void dump_pir_table(pir_table_t *pir, char *map_addr);
-void print_irq_line(char line, u_int8_t link, u_int8_t irqs[2]);
+void pci_print_irqmask(u_int16_t irqs);
+void print_irq_line(int entry, pir_entry_t *p, char line, u_int8_t link,
+ u_int16_t irqs);
char *lookup_southbridge(u_int32_t id);
char *progname = NULL;
@@ -130,7 +132,7 @@ void
banner(void)
{
- fprintf(stderr, "PIRTOOL for FreeBSD (c) 2002 Bruce M. Simpson\r\n");
+ fprintf(stderr, "PIRTOOL (c) 2002-2006 Bruce M. Simpson\r\n");
fprintf(stderr,
"---------------------------------------------\r\n\r\n");
}
@@ -180,6 +182,26 @@ find_pir_table(unsigned char *base)
}
void
+pci_print_irqmask(u_int16_t irqs)
+{
+ int i, first;
+
+ if (irqs == 0) {
+ printf("none");
+ return;
+ }
+ first = 1;
+ for (i = 0; i < 16; i++, irqs >>= 1)
+ if (irqs & 1) {
+ if (!first)
+ printf(" ");
+ else
+ first = 0;
+ printf("%d", i);
+ }
+}
+
+void
dump_pir_table(pir_table_t *pir, char *map_addr)
{
int i, num_slots;
@@ -192,12 +214,7 @@ dump_pir_table(pir_table_t *pir, char *map_addr)
"0x%02x: Signature: %c%c%c%c\r\n"
"0x%02x: Version: %u.%u\r\n"
"0x%02x: Size: %u bytes (%u entries)\r\n"
- "0x%02x: Device: %u:%u:%u\r\n"
- "0x%02x: PCI Exclusive IRQs: 0x%08lX\r\n"
- "0x%02x: Compatible with: 0x%08X %s\r\n"
- "0x%02x: Miniport Data: 0x%08X\r\n"
- "0x%02x: Checksum: 0x%02X\r\n"
- "\r\n",
+ "0x%02x: Device: %u:%u:%u\r\n",
(u_int32_t)(((char *)pir - map_addr) + PIR_BASE),
offsetof(pir_table_t, signature),
((char *)&pir->signature)[0],
@@ -212,9 +229,16 @@ dump_pir_table(pir_table_t *pir, char *map_addr)
offsetof(pir_table_t, bus),
pir->bus,
PIR_DEV(pir->devfunc),
- PIR_FUNC(pir->devfunc),
- offsetof(pir_table_t, excl_irqs),
- pir->excl_irqs,
+ PIR_FUNC(pir->devfunc));
+ printf(
+ "0x%02x: PCI Exclusive IRQs: ",
+ offsetof(pir_table_t, excl_irqs));
+ pci_print_irqmask(pir->excl_irqs);
+ printf("\r\n"
+ "0x%02x: Compatible with: 0x%08X %s\r\n"
+ "0x%02x: Miniport Data: 0x%08X\r\n"
+ "0x%02x: Checksum: 0x%02X\r\n"
+ "\r\n",
offsetof(pir_table_t, compatible),
pir->compatible,
lookup_southbridge(pir->compatible),
@@ -225,14 +249,12 @@ dump_pir_table(pir_table_t *pir, char *map_addr)
p = pend = &pir->entry[0];
pend += num_slots;
+ printf("Entry Location Bus Device Pin Link IRQs\n");
for (i = 0; p < pend; i++, p++) {
- printf("Entry %u: Device %u:%u:%u Slot %u%s\r\n", i, p->bus,
- PIR_DEV(p->devfunc), PIR_FUNC(p->devfunc),
- p->slot, p->slot == 0 ? " (on-board)" : "");
- print_irq_line('A', p->inta_link, p->inta_irqs);
- print_irq_line('B', p->intb_link, p->intb_irqs);
- print_irq_line('C', p->intc_link, p->intc_irqs);
- print_irq_line('D', p->intd_link, p->intd_irqs);
+ print_irq_line(i, p, 'A', p->inta_link, p->inta_irqs);
+ print_irq_line(i, p, 'B', p->intb_link, p->intb_irqs);
+ print_irq_line(i, p, 'C', p->intc_link, p->intc_irqs);
+ print_irq_line(i, p, 'D', p->intd_link, p->intd_irqs);
}
}
@@ -240,33 +262,23 @@ dump_pir_table(pir_table_t *pir, char *map_addr)
* Print interrupt map for a given PCI interrupt line.
*/
void
-print_irq_line(char line, u_int8_t link, u_int8_t irqs[2])
+print_irq_line(int entry, pir_entry_t *p, char line, u_int8_t link,
+ u_int16_t irqs)
{
- u_int16_t map;
- int i;
- printf("\tINT%c: %02xh ", line, link);
- if (link == 0) {
- printf("(not connected)\r\n");
+ if (link == 0)
return;
- }
- map = irqs[1];
- map <<= 8;
- map |= irqs[0];
- if (map == 0) {
- printf("(not routable)\r\n");
- return;
- }
-
- printf("routable irqs:");
- for (i = 0; i < 16; i++) {
- if (map & 0x1)
- printf(" %d", i);
- map >>= 1;
- }
+ printf("%3d ", entry);
+ if (p->slot == 0)
+ printf("embedded ");
+ else
+ printf("slot %-3d ", p->slot);
- printf("\r\n");
+ printf(" %3d %3d %c 0x%02x ", p->bus, PIR_DEV(p->devfunc),
+ line, link);
+ pci_print_irqmask(irqs);
+ printf("\n");
}
/*
@@ -277,12 +289,16 @@ lookup_southbridge(u_int32_t id)
{
switch (id) {
+ case 0x157310b9:
+ return ("ALi M1573 (Hypertransport)");
case 0x06861106:
- return ("VIA VT82C686/686A/686B");
+ return ("VIA VT82C686/686A/686B (Apollo)");
case 0x122E8086:
- return ("Intel 82371FB (Triton I)");
+ return ("Intel 82371FB (Triton I/PIIX)");
+ case 0x26418086:
+ return ("Intel 82801FBM (ICH6M)");
case 0x70008086:
- return ("Intel 82371SB (Triton II/PIIX3)");
+ return ("Intel 82371SB (Natoma/Triton II/PIIX3)");
default:
return ("unknown chipset");
}
OpenPOWER on IntegriCloud