Add support for printing out the contents of a PCI BIOS $PIR interrupt
routing table on the console. Eventually it will be printed during verbose boots.
This commit is contained in:
parent
cea0a89545
commit
fbabd7bec2
@ -66,6 +66,8 @@ static int pci_cfgintr_linked(struct PIR_entry *pe, int pin);
|
|||||||
static int pci_cfgintr_search(struct PIR_entry *pe, int bus, int device, int matchpin, int pin);
|
static int pci_cfgintr_search(struct PIR_entry *pe, int bus, int device, int matchpin, int pin);
|
||||||
static int pci_cfgintr_virgin(struct PIR_entry *pe, int pin);
|
static int pci_cfgintr_virgin(struct PIR_entry *pe, int pin);
|
||||||
|
|
||||||
|
static void pci_print_irqmask(u_int16_t irqs);
|
||||||
|
static void pci_print_route_table(struct PIR_table *prt, int size);
|
||||||
static int pcibios_cfgread(int bus, int slot, int func, int reg, int bytes);
|
static int pcibios_cfgread(int bus, int slot, int func, int reg, int bytes);
|
||||||
static void pcibios_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
static void pcibios_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
||||||
static int pcibios_cfgopen(void);
|
static int pcibios_cfgopen(void);
|
||||||
@ -73,8 +75,8 @@ static int pcireg_cfgread(int bus, int slot, int func, int reg, int bytes);
|
|||||||
static void pcireg_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
static void pcireg_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
||||||
static int pcireg_cfgopen(void);
|
static int pcireg_cfgopen(void);
|
||||||
|
|
||||||
static struct PIR_table *pci_route_table;
|
static struct PIR_table *pci_route_table;
|
||||||
static int pci_route_count;
|
static int pci_route_count;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some BIOS writers seem to want to ignore the spec and put
|
* Some BIOS writers seem to want to ignore the spec and put
|
||||||
@ -487,6 +489,56 @@ pci_cfgintr_virgin(struct PIR_entry *pe, int pin)
|
|||||||
return(PCI_INVALID_IRQ);
|
return(PCI_INVALID_IRQ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dump the contents of a PCI BIOS Interrupt Routing Table to the console.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
pci_print_route_table(struct PIR_table *prt, int size)
|
||||||
|
{
|
||||||
|
struct PIR_entry *entry;
|
||||||
|
struct PIR_intpin *intpin;
|
||||||
|
int i, pin;
|
||||||
|
|
||||||
|
printf("PCI-Only Interrupts: ");
|
||||||
|
pci_print_irqmask(prt->pt_header.ph_pci_irqs);
|
||||||
|
printf("\nLocation Bus Device Pin Link IRQs\n");
|
||||||
|
entry = &prt->pt_entry[0];
|
||||||
|
for (i = 0; i < size; i++, entry++) {
|
||||||
|
intpin = &entry->pe_intpin[0];
|
||||||
|
for (pin = 0; pin < 4; pin++, intpin++)
|
||||||
|
if (intpin->link != 0) {
|
||||||
|
if (entry->pe_slot == 0)
|
||||||
|
printf("embedded ");
|
||||||
|
else
|
||||||
|
printf("slot %-3d ", entry->pe_slot);
|
||||||
|
printf(" %3d %3d %c 0x%02x ",
|
||||||
|
entry->pe_bus, entry->pe_device,
|
||||||
|
'A' + pin, intpin->link);
|
||||||
|
pci_print_irqmask(intpin->irqs);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Config space access using BIOS functions
|
* Config space access using BIOS functions
|
||||||
|
@ -66,6 +66,8 @@ static int pci_cfgintr_linked(struct PIR_entry *pe, int pin);
|
|||||||
static int pci_cfgintr_search(struct PIR_entry *pe, int bus, int device, int matchpin, int pin);
|
static int pci_cfgintr_search(struct PIR_entry *pe, int bus, int device, int matchpin, int pin);
|
||||||
static int pci_cfgintr_virgin(struct PIR_entry *pe, int pin);
|
static int pci_cfgintr_virgin(struct PIR_entry *pe, int pin);
|
||||||
|
|
||||||
|
static void pci_print_irqmask(u_int16_t irqs);
|
||||||
|
static void pci_print_route_table(struct PIR_table *prt, int size);
|
||||||
static int pcibios_cfgread(int bus, int slot, int func, int reg, int bytes);
|
static int pcibios_cfgread(int bus, int slot, int func, int reg, int bytes);
|
||||||
static void pcibios_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
static void pcibios_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
||||||
static int pcibios_cfgopen(void);
|
static int pcibios_cfgopen(void);
|
||||||
@ -73,8 +75,8 @@ static int pcireg_cfgread(int bus, int slot, int func, int reg, int bytes);
|
|||||||
static void pcireg_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
static void pcireg_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
||||||
static int pcireg_cfgopen(void);
|
static int pcireg_cfgopen(void);
|
||||||
|
|
||||||
static struct PIR_table *pci_route_table;
|
static struct PIR_table *pci_route_table;
|
||||||
static int pci_route_count;
|
static int pci_route_count;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some BIOS writers seem to want to ignore the spec and put
|
* Some BIOS writers seem to want to ignore the spec and put
|
||||||
@ -487,6 +489,56 @@ pci_cfgintr_virgin(struct PIR_entry *pe, int pin)
|
|||||||
return(PCI_INVALID_IRQ);
|
return(PCI_INVALID_IRQ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dump the contents of a PCI BIOS Interrupt Routing Table to the console.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
pci_print_route_table(struct PIR_table *prt, int size)
|
||||||
|
{
|
||||||
|
struct PIR_entry *entry;
|
||||||
|
struct PIR_intpin *intpin;
|
||||||
|
int i, pin;
|
||||||
|
|
||||||
|
printf("PCI-Only Interrupts: ");
|
||||||
|
pci_print_irqmask(prt->pt_header.ph_pci_irqs);
|
||||||
|
printf("\nLocation Bus Device Pin Link IRQs\n");
|
||||||
|
entry = &prt->pt_entry[0];
|
||||||
|
for (i = 0; i < size; i++, entry++) {
|
||||||
|
intpin = &entry->pe_intpin[0];
|
||||||
|
for (pin = 0; pin < 4; pin++, intpin++)
|
||||||
|
if (intpin->link != 0) {
|
||||||
|
if (entry->pe_slot == 0)
|
||||||
|
printf("embedded ");
|
||||||
|
else
|
||||||
|
printf("slot %-3d ", entry->pe_slot);
|
||||||
|
printf(" %3d %3d %c 0x%02x ",
|
||||||
|
entry->pe_bus, entry->pe_device,
|
||||||
|
'A' + pin, intpin->link);
|
||||||
|
pci_print_irqmask(intpin->irqs);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Config space access using BIOS functions
|
* Config space access using BIOS functions
|
||||||
|
@ -66,6 +66,8 @@ static int pci_cfgintr_linked(struct PIR_entry *pe, int pin);
|
|||||||
static int pci_cfgintr_search(struct PIR_entry *pe, int bus, int device, int matchpin, int pin);
|
static int pci_cfgintr_search(struct PIR_entry *pe, int bus, int device, int matchpin, int pin);
|
||||||
static int pci_cfgintr_virgin(struct PIR_entry *pe, int pin);
|
static int pci_cfgintr_virgin(struct PIR_entry *pe, int pin);
|
||||||
|
|
||||||
|
static void pci_print_irqmask(u_int16_t irqs);
|
||||||
|
static void pci_print_route_table(struct PIR_table *prt, int size);
|
||||||
static int pcibios_cfgread(int bus, int slot, int func, int reg, int bytes);
|
static int pcibios_cfgread(int bus, int slot, int func, int reg, int bytes);
|
||||||
static void pcibios_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
static void pcibios_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
||||||
static int pcibios_cfgopen(void);
|
static int pcibios_cfgopen(void);
|
||||||
@ -73,8 +75,8 @@ static int pcireg_cfgread(int bus, int slot, int func, int reg, int bytes);
|
|||||||
static void pcireg_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
static void pcireg_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
|
||||||
static int pcireg_cfgopen(void);
|
static int pcireg_cfgopen(void);
|
||||||
|
|
||||||
static struct PIR_table *pci_route_table;
|
static struct PIR_table *pci_route_table;
|
||||||
static int pci_route_count;
|
static int pci_route_count;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some BIOS writers seem to want to ignore the spec and put
|
* Some BIOS writers seem to want to ignore the spec and put
|
||||||
@ -487,6 +489,56 @@ pci_cfgintr_virgin(struct PIR_entry *pe, int pin)
|
|||||||
return(PCI_INVALID_IRQ);
|
return(PCI_INVALID_IRQ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dump the contents of a PCI BIOS Interrupt Routing Table to the console.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
pci_print_route_table(struct PIR_table *prt, int size)
|
||||||
|
{
|
||||||
|
struct PIR_entry *entry;
|
||||||
|
struct PIR_intpin *intpin;
|
||||||
|
int i, pin;
|
||||||
|
|
||||||
|
printf("PCI-Only Interrupts: ");
|
||||||
|
pci_print_irqmask(prt->pt_header.ph_pci_irqs);
|
||||||
|
printf("\nLocation Bus Device Pin Link IRQs\n");
|
||||||
|
entry = &prt->pt_entry[0];
|
||||||
|
for (i = 0; i < size; i++, entry++) {
|
||||||
|
intpin = &entry->pe_intpin[0];
|
||||||
|
for (pin = 0; pin < 4; pin++, intpin++)
|
||||||
|
if (intpin->link != 0) {
|
||||||
|
if (entry->pe_slot == 0)
|
||||||
|
printf("embedded ");
|
||||||
|
else
|
||||||
|
printf("slot %-3d ", entry->pe_slot);
|
||||||
|
printf(" %3d %3d %c 0x%02x ",
|
||||||
|
entry->pe_bus, entry->pe_device,
|
||||||
|
'A' + pin, intpin->link);
|
||||||
|
pci_print_irqmask(intpin->irqs);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Config space access using BIOS functions
|
* Config space access using BIOS functions
|
||||||
|
Loading…
x
Reference in New Issue
Block a user