x86: make config_irqsrc not MPspec specific
Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
ec2cd0a22e
commit
2fddb6e28e
|
@ -969,14 +969,14 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
|
||||||
if ((bus_irq == 0) && (trigger == 3))
|
if ((bus_irq == 0) && (trigger == 3))
|
||||||
trigger = 1;
|
trigger = 1;
|
||||||
|
|
||||||
mp_irqs[mp_irq_entries].mpc_type = MP_INTSRC;
|
mp_irqs[mp_irq_entries].mp_type = MP_INTSRC;
|
||||||
mp_irqs[mp_irq_entries].mpc_irqtype = mp_INT;
|
mp_irqs[mp_irq_entries].mp_irqtype = mp_INT;
|
||||||
mp_irqs[mp_irq_entries].mpc_irqflag = (trigger << 2) | polarity;
|
mp_irqs[mp_irq_entries].mp_irqflag = (trigger << 2) | polarity;
|
||||||
mp_irqs[mp_irq_entries].mpc_srcbus = MP_ISA_BUS;
|
mp_irqs[mp_irq_entries].mp_srcbus = MP_ISA_BUS;
|
||||||
mp_irqs[mp_irq_entries].mpc_srcbusirq = bus_irq; /* IRQ */
|
mp_irqs[mp_irq_entries].mp_srcbusirq = bus_irq; /* IRQ */
|
||||||
mp_irqs[mp_irq_entries].mpc_dstapic =
|
mp_irqs[mp_irq_entries].mp_dstapic =
|
||||||
mp_ioapics[ioapic].mp_apicid; /* APIC ID */
|
mp_ioapics[ioapic].mp_apicid; /* APIC ID */
|
||||||
mp_irqs[mp_irq_entries].mpc_dstirq = pin; /* INTIN# */
|
mp_irqs[mp_irq_entries].mp_dstirq = pin; /* INTIN# */
|
||||||
|
|
||||||
if (++mp_irq_entries == MAX_IRQ_SOURCES)
|
if (++mp_irq_entries == MAX_IRQ_SOURCES)
|
||||||
panic("Max # of irq sources exceeded!!\n");
|
panic("Max # of irq sources exceeded!!\n");
|
||||||
|
@ -1012,12 +1012,11 @@ void __init mp_config_acpi_legacy_irqs(void)
|
||||||
if (ioapic < 0)
|
if (ioapic < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mp_irqs[mp_irq_entries].mpc_type = MP_INTSRC;
|
mp_irqs[mp_irq_entries].mp_type = MP_INTSRC;
|
||||||
mp_irqs[mp_irq_entries].mpc_irqflag = 0; /* Conforming */
|
mp_irqs[mp_irq_entries].mp_irqflag = 0; /* Conforming */
|
||||||
mp_irqs[mp_irq_entries].mpc_srcbus = MP_ISA_BUS;
|
mp_irqs[mp_irq_entries].mp_srcbus = MP_ISA_BUS;
|
||||||
#ifdef CONFIG_X86_IO_APIC
|
mp_irqs[mp_irq_entries].mp_dstapic = mp_ioapics[ioapic].mp_apicid;
|
||||||
mp_irqs[mp_irq_entries].mpc_dstapic = mp_ioapics[ioapic].mp_apicid;
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Use the default configuration for the IRQs 0-15. Unless
|
* Use the default configuration for the IRQs 0-15. Unless
|
||||||
* overridden by (MADT) interrupt source override entries.
|
* overridden by (MADT) interrupt source override entries.
|
||||||
|
@ -1026,17 +1025,17 @@ void __init mp_config_acpi_legacy_irqs(void)
|
||||||
int idx;
|
int idx;
|
||||||
|
|
||||||
for (idx = 0; idx < mp_irq_entries; idx++) {
|
for (idx = 0; idx < mp_irq_entries; idx++) {
|
||||||
struct mpc_config_intsrc *irq = mp_irqs + idx;
|
struct mp_config_intsrc *irq = mp_irqs + idx;
|
||||||
|
|
||||||
/* Do we already have a mapping for this ISA IRQ? */
|
/* Do we already have a mapping for this ISA IRQ? */
|
||||||
if (irq->mpc_srcbus == MP_ISA_BUS
|
if (irq->mp_srcbus == MP_ISA_BUS
|
||||||
&& irq->mpc_srcbusirq == i)
|
&& irq->mp_srcbusirq == i)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Do we already have a mapping for this IOAPIC pin */
|
/* Do we already have a mapping for this IOAPIC pin */
|
||||||
if ((irq->mpc_dstapic ==
|
if ((irq->mp_dstapic ==
|
||||||
mp_irqs[mp_irq_entries].mpc_dstapic) &&
|
mp_irqs[mp_irq_entries].mp_dstapic) &&
|
||||||
(irq->mpc_dstirq == i))
|
(irq->mp_dstirq == i))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1045,9 +1044,9 @@ void __init mp_config_acpi_legacy_irqs(void)
|
||||||
continue; /* IRQ already used */
|
continue; /* IRQ already used */
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_irqs[mp_irq_entries].mpc_irqtype = mp_INT;
|
mp_irqs[mp_irq_entries].mp_irqtype = mp_INT;
|
||||||
mp_irqs[mp_irq_entries].mpc_srcbusirq = i; /* Identity mapped */
|
mp_irqs[mp_irq_entries].mp_srcbusirq = i; /* Identity mapped */
|
||||||
mp_irqs[mp_irq_entries].mpc_dstirq = i;
|
mp_irqs[mp_irq_entries].mp_dstirq = i;
|
||||||
|
|
||||||
if (++mp_irq_entries == MAX_IRQ_SOURCES)
|
if (++mp_irq_entries == MAX_IRQ_SOURCES)
|
||||||
panic("Max # of irq sources exceeded!!\n");
|
panic("Max # of irq sources exceeded!!\n");
|
||||||
|
|
|
@ -76,7 +76,7 @@ struct mp_config_ioapic mp_ioapics[MAX_IO_APICS];
|
||||||
int nr_ioapics;
|
int nr_ioapics;
|
||||||
|
|
||||||
/* MP IRQ source entries */
|
/* MP IRQ source entries */
|
||||||
struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
|
struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
|
||||||
|
|
||||||
/* # of MP IRQ source entries */
|
/* # of MP IRQ source entries */
|
||||||
int mp_irq_entries;
|
int mp_irq_entries;
|
||||||
|
@ -801,10 +801,10 @@ static int find_irq_entry(int apic, int pin, int type)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < mp_irq_entries; i++)
|
for (i = 0; i < mp_irq_entries; i++)
|
||||||
if (mp_irqs[i].mpc_irqtype == type &&
|
if (mp_irqs[i].mp_irqtype == type &&
|
||||||
(mp_irqs[i].mpc_dstapic == mp_ioapics[apic].mp_apicid ||
|
(mp_irqs[i].mp_dstapic == mp_ioapics[apic].mp_apicid ||
|
||||||
mp_irqs[i].mpc_dstapic == MP_APIC_ALL) &&
|
mp_irqs[i].mp_dstapic == MP_APIC_ALL) &&
|
||||||
mp_irqs[i].mpc_dstirq == pin)
|
mp_irqs[i].mp_dstirq == pin)
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -818,13 +818,13 @@ static int __init find_isa_irq_pin(int irq, int type)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < mp_irq_entries; i++) {
|
for (i = 0; i < mp_irq_entries; i++) {
|
||||||
int lbus = mp_irqs[i].mpc_srcbus;
|
int lbus = mp_irqs[i].mp_srcbus;
|
||||||
|
|
||||||
if (test_bit(lbus, mp_bus_not_pci) &&
|
if (test_bit(lbus, mp_bus_not_pci) &&
|
||||||
(mp_irqs[i].mpc_irqtype == type) &&
|
(mp_irqs[i].mp_irqtype == type) &&
|
||||||
(mp_irqs[i].mpc_srcbusirq == irq))
|
(mp_irqs[i].mp_srcbusirq == irq))
|
||||||
|
|
||||||
return mp_irqs[i].mpc_dstirq;
|
return mp_irqs[i].mp_dstirq;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -834,17 +834,17 @@ static int __init find_isa_irq_apic(int irq, int type)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < mp_irq_entries; i++) {
|
for (i = 0; i < mp_irq_entries; i++) {
|
||||||
int lbus = mp_irqs[i].mpc_srcbus;
|
int lbus = mp_irqs[i].mp_srcbus;
|
||||||
|
|
||||||
if (test_bit(lbus, mp_bus_not_pci) &&
|
if (test_bit(lbus, mp_bus_not_pci) &&
|
||||||
(mp_irqs[i].mpc_irqtype == type) &&
|
(mp_irqs[i].mp_irqtype == type) &&
|
||||||
(mp_irqs[i].mpc_srcbusirq == irq))
|
(mp_irqs[i].mp_srcbusirq == irq))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i < mp_irq_entries) {
|
if (i < mp_irq_entries) {
|
||||||
int apic;
|
int apic;
|
||||||
for(apic = 0; apic < nr_ioapics; apic++) {
|
for(apic = 0; apic < nr_ioapics; apic++) {
|
||||||
if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mpc_dstapic)
|
if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mp_dstapic)
|
||||||
return apic;
|
return apic;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -869,23 +869,23 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for (i = 0; i < mp_irq_entries; i++) {
|
for (i = 0; i < mp_irq_entries; i++) {
|
||||||
int lbus = mp_irqs[i].mpc_srcbus;
|
int lbus = mp_irqs[i].mp_srcbus;
|
||||||
|
|
||||||
for (apic = 0; apic < nr_ioapics; apic++)
|
for (apic = 0; apic < nr_ioapics; apic++)
|
||||||
if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mpc_dstapic ||
|
if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mp_dstapic ||
|
||||||
mp_irqs[i].mpc_dstapic == MP_APIC_ALL)
|
mp_irqs[i].mp_dstapic == MP_APIC_ALL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!test_bit(lbus, mp_bus_not_pci) &&
|
if (!test_bit(lbus, mp_bus_not_pci) &&
|
||||||
!mp_irqs[i].mpc_irqtype &&
|
!mp_irqs[i].mp_irqtype &&
|
||||||
(bus == lbus) &&
|
(bus == lbus) &&
|
||||||
(slot == ((mp_irqs[i].mpc_srcbusirq >> 2) & 0x1f))) {
|
(slot == ((mp_irqs[i].mp_srcbusirq >> 2) & 0x1f))) {
|
||||||
int irq = pin_2_irq(i,apic,mp_irqs[i].mpc_dstirq);
|
int irq = pin_2_irq(i,apic,mp_irqs[i].mp_dstirq);
|
||||||
|
|
||||||
if (!(apic || IO_APIC_IRQ(irq)))
|
if (!(apic || IO_APIC_IRQ(irq)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (pin == (mp_irqs[i].mpc_srcbusirq & 3))
|
if (pin == (mp_irqs[i].mp_srcbusirq & 3))
|
||||||
return irq;
|
return irq;
|
||||||
/*
|
/*
|
||||||
* Use the first all-but-pin matching entry as a
|
* Use the first all-but-pin matching entry as a
|
||||||
|
@ -952,7 +952,7 @@ static int EISA_ELCR(unsigned int irq)
|
||||||
* EISA conforming in the MP table, that means its trigger type must
|
* EISA conforming in the MP table, that means its trigger type must
|
||||||
* be read in from the ELCR */
|
* be read in from the ELCR */
|
||||||
|
|
||||||
#define default_EISA_trigger(idx) (EISA_ELCR(mp_irqs[idx].mpc_srcbusirq))
|
#define default_EISA_trigger(idx) (EISA_ELCR(mp_irqs[idx].mp_srcbusirq))
|
||||||
#define default_EISA_polarity(idx) default_ISA_polarity(idx)
|
#define default_EISA_polarity(idx) default_ISA_polarity(idx)
|
||||||
|
|
||||||
/* PCI interrupts are always polarity one level triggered,
|
/* PCI interrupts are always polarity one level triggered,
|
||||||
|
@ -969,13 +969,13 @@ static int EISA_ELCR(unsigned int irq)
|
||||||
|
|
||||||
static int MPBIOS_polarity(int idx)
|
static int MPBIOS_polarity(int idx)
|
||||||
{
|
{
|
||||||
int bus = mp_irqs[idx].mpc_srcbus;
|
int bus = mp_irqs[idx].mp_srcbus;
|
||||||
int polarity;
|
int polarity;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine IRQ line polarity (high active or low active):
|
* Determine IRQ line polarity (high active or low active):
|
||||||
*/
|
*/
|
||||||
switch (mp_irqs[idx].mpc_irqflag & 3)
|
switch (mp_irqs[idx].mp_irqflag & 3)
|
||||||
{
|
{
|
||||||
case 0: /* conforms, ie. bus-type dependent polarity */
|
case 0: /* conforms, ie. bus-type dependent polarity */
|
||||||
{
|
{
|
||||||
|
@ -1012,13 +1012,13 @@ static int MPBIOS_polarity(int idx)
|
||||||
|
|
||||||
static int MPBIOS_trigger(int idx)
|
static int MPBIOS_trigger(int idx)
|
||||||
{
|
{
|
||||||
int bus = mp_irqs[idx].mpc_srcbus;
|
int bus = mp_irqs[idx].mp_srcbus;
|
||||||
int trigger;
|
int trigger;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine IRQ trigger mode (edge or level sensitive):
|
* Determine IRQ trigger mode (edge or level sensitive):
|
||||||
*/
|
*/
|
||||||
switch ((mp_irqs[idx].mpc_irqflag>>2) & 3)
|
switch ((mp_irqs[idx].mp_irqflag>>2) & 3)
|
||||||
{
|
{
|
||||||
case 0: /* conforms, ie. bus-type dependent */
|
case 0: /* conforms, ie. bus-type dependent */
|
||||||
{
|
{
|
||||||
|
@ -1097,16 +1097,16 @@ static inline int irq_trigger(int idx)
|
||||||
static int pin_2_irq(int idx, int apic, int pin)
|
static int pin_2_irq(int idx, int apic, int pin)
|
||||||
{
|
{
|
||||||
int irq, i;
|
int irq, i;
|
||||||
int bus = mp_irqs[idx].mpc_srcbus;
|
int bus = mp_irqs[idx].mp_srcbus;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Debugging check, we are in big trouble if this message pops up!
|
* Debugging check, we are in big trouble if this message pops up!
|
||||||
*/
|
*/
|
||||||
if (mp_irqs[idx].mpc_dstirq != pin)
|
if (mp_irqs[idx].mp_dstirq != pin)
|
||||||
printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n");
|
printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n");
|
||||||
|
|
||||||
if (test_bit(bus, mp_bus_not_pci))
|
if (test_bit(bus, mp_bus_not_pci))
|
||||||
irq = mp_irqs[idx].mpc_srcbusirq;
|
irq = mp_irqs[idx].mp_srcbusirq;
|
||||||
else {
|
else {
|
||||||
/*
|
/*
|
||||||
* PCI IRQs are mapped in order
|
* PCI IRQs are mapped in order
|
||||||
|
@ -1793,8 +1793,8 @@ static void __init setup_ioapic_ids_from_mpc(void)
|
||||||
*/
|
*/
|
||||||
if (old_id != mp_ioapics[apic].mp_apicid)
|
if (old_id != mp_ioapics[apic].mp_apicid)
|
||||||
for (i = 0; i < mp_irq_entries; i++)
|
for (i = 0; i < mp_irq_entries; i++)
|
||||||
if (mp_irqs[i].mpc_dstapic == old_id)
|
if (mp_irqs[i].mp_dstapic == old_id)
|
||||||
mp_irqs[i].mpc_dstapic
|
mp_irqs[i].mp_dstapic
|
||||||
= mp_ioapics[apic].mp_apicid;
|
= mp_ioapics[apic].mp_apicid;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2810,8 +2810,8 @@ int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i = 0; i < mp_irq_entries; i++)
|
for (i = 0; i < mp_irq_entries; i++)
|
||||||
if (mp_irqs[i].mpc_irqtype == mp_INT &&
|
if (mp_irqs[i].mp_irqtype == mp_INT &&
|
||||||
mp_irqs[i].mpc_srcbusirq == bus_irq)
|
mp_irqs[i].mp_srcbusirq == bus_irq)
|
||||||
break;
|
break;
|
||||||
if (i >= mp_irq_entries)
|
if (i >= mp_irq_entries)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -108,7 +108,7 @@ struct mp_config_ioapic mp_ioapics[MAX_IO_APICS];
|
||||||
int nr_ioapics;
|
int nr_ioapics;
|
||||||
|
|
||||||
/* MP IRQ source entries */
|
/* MP IRQ source entries */
|
||||||
struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
|
struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
|
||||||
|
|
||||||
/* # of MP IRQ source entries */
|
/* # of MP IRQ source entries */
|
||||||
int mp_irq_entries;
|
int mp_irq_entries;
|
||||||
|
@ -453,10 +453,10 @@ static int find_irq_entry(int apic, int pin, int type)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < mp_irq_entries; i++)
|
for (i = 0; i < mp_irq_entries; i++)
|
||||||
if (mp_irqs[i].mpc_irqtype == type &&
|
if (mp_irqs[i].mp_irqtype == type &&
|
||||||
(mp_irqs[i].mpc_dstapic == mp_ioapics[apic].mp_apicid ||
|
(mp_irqs[i].mp_dstapic == mp_ioapics[apic].mp_apicid ||
|
||||||
mp_irqs[i].mpc_dstapic == MP_APIC_ALL) &&
|
mp_irqs[i].mp_dstapic == MP_APIC_ALL) &&
|
||||||
mp_irqs[i].mpc_dstirq == pin)
|
mp_irqs[i].mp_dstirq == pin)
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -470,13 +470,13 @@ static int __init find_isa_irq_pin(int irq, int type)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < mp_irq_entries; i++) {
|
for (i = 0; i < mp_irq_entries; i++) {
|
||||||
int lbus = mp_irqs[i].mpc_srcbus;
|
int lbus = mp_irqs[i].mp_srcbus;
|
||||||
|
|
||||||
if (test_bit(lbus, mp_bus_not_pci) &&
|
if (test_bit(lbus, mp_bus_not_pci) &&
|
||||||
(mp_irqs[i].mpc_irqtype == type) &&
|
(mp_irqs[i].mp_irqtype == type) &&
|
||||||
(mp_irqs[i].mpc_srcbusirq == irq))
|
(mp_irqs[i].mp_srcbusirq == irq))
|
||||||
|
|
||||||
return mp_irqs[i].mpc_dstirq;
|
return mp_irqs[i].mp_dstirq;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -486,17 +486,17 @@ static int __init find_isa_irq_apic(int irq, int type)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < mp_irq_entries; i++) {
|
for (i = 0; i < mp_irq_entries; i++) {
|
||||||
int lbus = mp_irqs[i].mpc_srcbus;
|
int lbus = mp_irqs[i].mp_srcbus;
|
||||||
|
|
||||||
if (test_bit(lbus, mp_bus_not_pci) &&
|
if (test_bit(lbus, mp_bus_not_pci) &&
|
||||||
(mp_irqs[i].mpc_irqtype == type) &&
|
(mp_irqs[i].mp_irqtype == type) &&
|
||||||
(mp_irqs[i].mpc_srcbusirq == irq))
|
(mp_irqs[i].mp_srcbusirq == irq))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i < mp_irq_entries) {
|
if (i < mp_irq_entries) {
|
||||||
int apic;
|
int apic;
|
||||||
for(apic = 0; apic < nr_ioapics; apic++) {
|
for(apic = 0; apic < nr_ioapics; apic++) {
|
||||||
if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mpc_dstapic)
|
if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mp_dstapic)
|
||||||
return apic;
|
return apic;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -521,23 +521,23 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for (i = 0; i < mp_irq_entries; i++) {
|
for (i = 0; i < mp_irq_entries; i++) {
|
||||||
int lbus = mp_irqs[i].mpc_srcbus;
|
int lbus = mp_irqs[i].mp_srcbus;
|
||||||
|
|
||||||
for (apic = 0; apic < nr_ioapics; apic++)
|
for (apic = 0; apic < nr_ioapics; apic++)
|
||||||
if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mpc_dstapic ||
|
if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mp_dstapic ||
|
||||||
mp_irqs[i].mpc_dstapic == MP_APIC_ALL)
|
mp_irqs[i].mp_dstapic == MP_APIC_ALL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!test_bit(lbus, mp_bus_not_pci) &&
|
if (!test_bit(lbus, mp_bus_not_pci) &&
|
||||||
!mp_irqs[i].mpc_irqtype &&
|
!mp_irqs[i].mp_irqtype &&
|
||||||
(bus == lbus) &&
|
(bus == lbus) &&
|
||||||
(slot == ((mp_irqs[i].mpc_srcbusirq >> 2) & 0x1f))) {
|
(slot == ((mp_irqs[i].mp_srcbusirq >> 2) & 0x1f))) {
|
||||||
int irq = pin_2_irq(i,apic,mp_irqs[i].mpc_dstirq);
|
int irq = pin_2_irq(i,apic,mp_irqs[i].mp_dstirq);
|
||||||
|
|
||||||
if (!(apic || IO_APIC_IRQ(irq)))
|
if (!(apic || IO_APIC_IRQ(irq)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (pin == (mp_irqs[i].mpc_srcbusirq & 3))
|
if (pin == (mp_irqs[i].mp_srcbusirq & 3))
|
||||||
return irq;
|
return irq;
|
||||||
/*
|
/*
|
||||||
* Use the first all-but-pin matching entry as a
|
* Use the first all-but-pin matching entry as a
|
||||||
|
@ -565,13 +565,13 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
|
||||||
|
|
||||||
static int MPBIOS_polarity(int idx)
|
static int MPBIOS_polarity(int idx)
|
||||||
{
|
{
|
||||||
int bus = mp_irqs[idx].mpc_srcbus;
|
int bus = mp_irqs[idx].mp_srcbus;
|
||||||
int polarity;
|
int polarity;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine IRQ line polarity (high active or low active):
|
* Determine IRQ line polarity (high active or low active):
|
||||||
*/
|
*/
|
||||||
switch (mp_irqs[idx].mpc_irqflag & 3)
|
switch (mp_irqs[idx].mp_irqflag & 3)
|
||||||
{
|
{
|
||||||
case 0: /* conforms, ie. bus-type dependent polarity */
|
case 0: /* conforms, ie. bus-type dependent polarity */
|
||||||
if (test_bit(bus, mp_bus_not_pci))
|
if (test_bit(bus, mp_bus_not_pci))
|
||||||
|
@ -607,13 +607,13 @@ static int MPBIOS_polarity(int idx)
|
||||||
|
|
||||||
static int MPBIOS_trigger(int idx)
|
static int MPBIOS_trigger(int idx)
|
||||||
{
|
{
|
||||||
int bus = mp_irqs[idx].mpc_srcbus;
|
int bus = mp_irqs[idx].mp_srcbus;
|
||||||
int trigger;
|
int trigger;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine IRQ trigger mode (edge or level sensitive):
|
* Determine IRQ trigger mode (edge or level sensitive):
|
||||||
*/
|
*/
|
||||||
switch ((mp_irqs[idx].mpc_irqflag>>2) & 3)
|
switch ((mp_irqs[idx].mp_irqflag>>2) & 3)
|
||||||
{
|
{
|
||||||
case 0: /* conforms, ie. bus-type dependent */
|
case 0: /* conforms, ie. bus-type dependent */
|
||||||
if (test_bit(bus, mp_bus_not_pci))
|
if (test_bit(bus, mp_bus_not_pci))
|
||||||
|
@ -660,16 +660,16 @@ static inline int irq_trigger(int idx)
|
||||||
static int pin_2_irq(int idx, int apic, int pin)
|
static int pin_2_irq(int idx, int apic, int pin)
|
||||||
{
|
{
|
||||||
int irq, i;
|
int irq, i;
|
||||||
int bus = mp_irqs[idx].mpc_srcbus;
|
int bus = mp_irqs[idx].mp_srcbus;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Debugging check, we are in big trouble if this message pops up!
|
* Debugging check, we are in big trouble if this message pops up!
|
||||||
*/
|
*/
|
||||||
if (mp_irqs[idx].mpc_dstirq != pin)
|
if (mp_irqs[idx].mp_dstirq != pin)
|
||||||
printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n");
|
printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n");
|
||||||
|
|
||||||
if (test_bit(bus, mp_bus_not_pci)) {
|
if (test_bit(bus, mp_bus_not_pci)) {
|
||||||
irq = mp_irqs[idx].mpc_srcbusirq;
|
irq = mp_irqs[idx].mp_srcbusirq;
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* PCI IRQs are mapped in order
|
* PCI IRQs are mapped in order
|
||||||
|
@ -2242,8 +2242,8 @@ int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i = 0; i < mp_irq_entries; i++)
|
for (i = 0; i < mp_irq_entries; i++)
|
||||||
if (mp_irqs[i].mpc_irqtype == mp_INT &&
|
if (mp_irqs[i].mp_irqtype == mp_INT &&
|
||||||
mp_irqs[i].mpc_srcbusirq == bus_irq)
|
mp_irqs[i].mp_srcbusirq == bus_irq)
|
||||||
break;
|
break;
|
||||||
if (i >= mp_irq_entries)
|
if (i >= mp_irq_entries)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -186,12 +186,18 @@ static void __init MP_ioapic_info(struct mpc_config_ioapic *m)
|
||||||
|
|
||||||
static void __init MP_intsrc_info(struct mpc_config_intsrc *m)
|
static void __init MP_intsrc_info(struct mpc_config_intsrc *m)
|
||||||
{
|
{
|
||||||
mp_irqs[mp_irq_entries] = *m;
|
|
||||||
printk(KERN_INFO "Int: type %d, pol %d, trig %d, bus %02x,"
|
printk(KERN_INFO "Int: type %d, pol %d, trig %d, bus %02x,"
|
||||||
" IRQ %02x, APIC ID %x, APIC INT %02x\n",
|
" IRQ %02x, APIC ID %x, APIC INT %02x\n",
|
||||||
m->mpc_irqtype, m->mpc_irqflag & 3,
|
m->mpc_irqtype, m->mpc_irqflag & 3,
|
||||||
(m->mpc_irqflag >> 2) & 3, m->mpc_srcbus,
|
(m->mpc_irqflag >> 2) & 3, m->mpc_srcbus,
|
||||||
m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq);
|
m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq);
|
||||||
|
mp_irqs[mp_irq_entries].mp_dstapic = m->mpc_dstapic;
|
||||||
|
mp_irqs[mp_irq_entries].mp_type = m->mpc_type;
|
||||||
|
mp_irqs[mp_irq_entries].mp_irqtype = m->mpc_irqtype;
|
||||||
|
mp_irqs[mp_irq_entries].mp_irqflag = m->mpc_irqflag;
|
||||||
|
mp_irqs[mp_irq_entries].mp_srcbus = m->mpc_srcbus;
|
||||||
|
mp_irqs[mp_irq_entries].mp_srcbusirq = m->mpc_srcbusirq;
|
||||||
|
mp_irqs[mp_irq_entries].mp_dstirq = m->mpc_dstirq;
|
||||||
if (++mp_irq_entries == MAX_IRQ_SOURCES)
|
if (++mp_irq_entries == MAX_IRQ_SOURCES)
|
||||||
panic("Max # of irq sources exceeded!!\n");
|
panic("Max # of irq sources exceeded!!\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,6 +120,16 @@ struct mp_config_ioapic {
|
||||||
unsigned char mp_flags;
|
unsigned char mp_flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct mp_config_intsrc {
|
||||||
|
unsigned int mp_dstapic;
|
||||||
|
unsigned char mp_type;
|
||||||
|
unsigned char mp_irqtype;
|
||||||
|
unsigned short mp_irqflag;
|
||||||
|
unsigned char mp_srcbus;
|
||||||
|
unsigned char mp_srcbusirq;
|
||||||
|
unsigned char mp_dstirq;
|
||||||
|
};
|
||||||
|
|
||||||
/* I/O APIC entries */
|
/* I/O APIC entries */
|
||||||
extern struct mp_config_ioapic mp_ioapics[MAX_IO_APICS];
|
extern struct mp_config_ioapic mp_ioapics[MAX_IO_APICS];
|
||||||
|
|
||||||
|
@ -127,7 +137,7 @@ extern struct mp_config_ioapic mp_ioapics[MAX_IO_APICS];
|
||||||
extern int mp_irq_entries;
|
extern int mp_irq_entries;
|
||||||
|
|
||||||
/* MP IRQ source entries */
|
/* MP IRQ source entries */
|
||||||
extern struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
|
extern struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
|
||||||
|
|
||||||
/* non-0 if default (table-less) MP configuration */
|
/* non-0 if default (table-less) MP configuration */
|
||||||
extern int mpc_default_type;
|
extern int mpc_default_type;
|
||||||
|
|
Loading…
Reference in New Issue