diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 20:02:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 20:02:07 -0400 |
commit | 2c9e88a1085b3183e5f92170a74980e5654f817b (patch) | |
tree | 43d38618012ecc8f7aba5df2c0fd1ba5e62b2a82 /arch/x86/kernel/apic | |
parent | 52de84f3f3f407013a7f7872601e7a43a505abd3 (diff) | |
parent | 42f0efc5aae2bd7e3bc420c0902c7024ef77391f (diff) |
Merge branch 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
x86, ioapic: Print IR_IO_APIC_route_entry when IR is enabled
x86, ioapic: Print IRTE when IR is enabled
x86, x2apic: Preserve high 32-bits of IA32_APIC_BASE MSR
x86, ioapic: Also print Dest field
x86, ioapic: Format clean up for IOAPIC output
x86: print APIC data a little later during boot
Diffstat (limited to 'arch/x86/kernel/apic')
-rw-r--r-- | arch/x86/kernel/apic/apic.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 91 |
2 files changed, 67 insertions, 26 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index a7aed48356ef..9498b8445186 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
@@ -1430,7 +1430,7 @@ void enable_x2apic(void) | |||
1430 | rdmsr(MSR_IA32_APICBASE, msr, msr2); | 1430 | rdmsr(MSR_IA32_APICBASE, msr, msr2); |
1431 | if (!(msr & X2APIC_ENABLE)) { | 1431 | if (!(msr & X2APIC_ENABLE)) { |
1432 | printk_once(KERN_INFO "Enabling x2apic\n"); | 1432 | printk_once(KERN_INFO "Enabling x2apic\n"); |
1433 | wrmsr(MSR_IA32_APICBASE, msr | X2APIC_ENABLE, 0); | 1433 | wrmsr(MSR_IA32_APICBASE, msr | X2APIC_ENABLE, msr2); |
1434 | } | 1434 | } |
1435 | } | 1435 | } |
1436 | #endif /* CONFIG_X86_X2APIC */ | 1436 | #endif /* CONFIG_X86_X2APIC */ |
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index e5293394b548..8eb863e27ea6 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -1295,6 +1295,16 @@ static int setup_ioapic_entry(int apic_id, int irq, | |||
1295 | * irq handler will do the explicit EOI to the io-apic. | 1295 | * irq handler will do the explicit EOI to the io-apic. |
1296 | */ | 1296 | */ |
1297 | ir_entry->vector = pin; | 1297 | ir_entry->vector = pin; |
1298 | |||
1299 | apic_printk(APIC_VERBOSE, KERN_DEBUG "IOAPIC[%d]: " | ||
1300 | "Set IRTE entry (P:%d FPD:%d Dst_Mode:%d " | ||
1301 | "Redir_hint:%d Trig_Mode:%d Dlvry_Mode:%X " | ||
1302 | "Avail:%X Vector:%02X Dest:%08X " | ||
1303 | "SID:%04X SQ:%X SVT:%X)\n", | ||
1304 | apic_id, irte.present, irte.fpd, irte.dst_mode, | ||
1305 | irte.redir_hint, irte.trigger_mode, irte.dlvry_mode, | ||
1306 | irte.avail, irte.vector, irte.dest_id, | ||
1307 | irte.sid, irte.sq, irte.svt); | ||
1298 | } else { | 1308 | } else { |
1299 | entry->delivery_mode = apic->irq_delivery_mode; | 1309 | entry->delivery_mode = apic->irq_delivery_mode; |
1300 | entry->dest_mode = apic->irq_dest_mode; | 1310 | entry->dest_mode = apic->irq_dest_mode; |
@@ -1337,9 +1347,9 @@ static void setup_ioapic_irq(int apic_id, int pin, unsigned int irq, | |||
1337 | 1347 | ||
1338 | apic_printk(APIC_VERBOSE,KERN_DEBUG | 1348 | apic_printk(APIC_VERBOSE,KERN_DEBUG |
1339 | "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> " | 1349 | "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> " |
1340 | "IRQ %d Mode:%i Active:%i)\n", | 1350 | "IRQ %d Mode:%i Active:%i Dest:%d)\n", |
1341 | apic_id, mpc_ioapic_id(apic_id), pin, cfg->vector, | 1351 | apic_id, mpc_ioapic_id(apic_id), pin, cfg->vector, |
1342 | irq, trigger, polarity); | 1352 | irq, trigger, polarity, dest); |
1343 | 1353 | ||
1344 | 1354 | ||
1345 | if (setup_ioapic_entry(mpc_ioapic_id(apic_id), irq, &entry, | 1355 | if (setup_ioapic_entry(mpc_ioapic_id(apic_id), irq, &entry, |
@@ -1522,10 +1532,12 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
1522 | printk(KERN_DEBUG "....... : LTS : %X\n", reg_00.bits.LTS); | 1532 | printk(KERN_DEBUG "....... : LTS : %X\n", reg_00.bits.LTS); |
1523 | 1533 | ||
1524 | printk(KERN_DEBUG ".... register #01: %08X\n", *(int *)®_01); | 1534 | printk(KERN_DEBUG ".... register #01: %08X\n", *(int *)®_01); |
1525 | printk(KERN_DEBUG "....... : max redirection entries: %04X\n", reg_01.bits.entries); | 1535 | printk(KERN_DEBUG "....... : max redirection entries: %02X\n", |
1536 | reg_01.bits.entries); | ||
1526 | 1537 | ||
1527 | printk(KERN_DEBUG "....... : PRQ implemented: %X\n", reg_01.bits.PRQ); | 1538 | printk(KERN_DEBUG "....... : PRQ implemented: %X\n", reg_01.bits.PRQ); |
1528 | printk(KERN_DEBUG "....... : IO APIC version: %04X\n", reg_01.bits.version); | 1539 | printk(KERN_DEBUG "....... : IO APIC version: %02X\n", |
1540 | reg_01.bits.version); | ||
1529 | 1541 | ||
1530 | /* | 1542 | /* |
1531 | * Some Intel chipsets with IO APIC VERSION of 0x1? don't have reg_02, | 1543 | * Some Intel chipsets with IO APIC VERSION of 0x1? don't have reg_02, |
@@ -1550,31 +1562,60 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
1550 | 1562 | ||
1551 | printk(KERN_DEBUG ".... IRQ redirection table:\n"); | 1563 | printk(KERN_DEBUG ".... IRQ redirection table:\n"); |
1552 | 1564 | ||
1553 | printk(KERN_DEBUG " NR Dst Mask Trig IRR Pol" | 1565 | if (intr_remapping_enabled) { |
1554 | " Stat Dmod Deli Vect:\n"); | 1566 | printk(KERN_DEBUG " NR Indx Fmt Mask Trig IRR" |
1567 | " Pol Stat Indx2 Zero Vect:\n"); | ||
1568 | } else { | ||
1569 | printk(KERN_DEBUG " NR Dst Mask Trig IRR Pol" | ||
1570 | " Stat Dmod Deli Vect:\n"); | ||
1571 | } | ||
1555 | 1572 | ||
1556 | for (i = 0; i <= reg_01.bits.entries; i++) { | 1573 | for (i = 0; i <= reg_01.bits.entries; i++) { |
1557 | struct IO_APIC_route_entry entry; | 1574 | if (intr_remapping_enabled) { |
1558 | 1575 | struct IO_APIC_route_entry entry; | |
1559 | entry = ioapic_read_entry(apic, i); | 1576 | struct IR_IO_APIC_route_entry *ir_entry; |
1560 | 1577 | ||
1561 | printk(KERN_DEBUG " %02x %03X ", | 1578 | entry = ioapic_read_entry(apic, i); |
1562 | i, | 1579 | ir_entry = (struct IR_IO_APIC_route_entry *) &entry; |
1563 | entry.dest | 1580 | printk(KERN_DEBUG " %02x %04X ", |
1564 | ); | 1581 | i, |
1582 | ir_entry->index | ||
1583 | ); | ||
1584 | printk("%1d %1d %1d %1d %1d " | ||
1585 | "%1d %1d %X %02X\n", | ||
1586 | ir_entry->format, | ||
1587 | ir_entry->mask, | ||
1588 | ir_entry->trigger, | ||
1589 | ir_entry->irr, | ||
1590 | ir_entry->polarity, | ||
1591 | ir_entry->delivery_status, | ||
1592 | ir_entry->index2, | ||
1593 | ir_entry->zero, | ||
1594 | ir_entry->vector | ||
1595 | ); | ||
1596 | } else { | ||
1597 | struct IO_APIC_route_entry entry; | ||
1565 | 1598 | ||
1566 | printk("%1d %1d %1d %1d %1d %1d %1d %02X\n", | 1599 | entry = ioapic_read_entry(apic, i); |
1567 | entry.mask, | 1600 | printk(KERN_DEBUG " %02x %02X ", |
1568 | entry.trigger, | 1601 | i, |
1569 | entry.irr, | 1602 | entry.dest |
1570 | entry.polarity, | 1603 | ); |
1571 | entry.delivery_status, | 1604 | printk("%1d %1d %1d %1d %1d " |
1572 | entry.dest_mode, | 1605 | "%1d %1d %02X\n", |
1573 | entry.delivery_mode, | 1606 | entry.mask, |
1574 | entry.vector | 1607 | entry.trigger, |
1575 | ); | 1608 | entry.irr, |
1609 | entry.polarity, | ||
1610 | entry.delivery_status, | ||
1611 | entry.dest_mode, | ||
1612 | entry.delivery_mode, | ||
1613 | entry.vector | ||
1614 | ); | ||
1615 | } | ||
1576 | } | 1616 | } |
1577 | } | 1617 | } |
1618 | |||
1578 | printk(KERN_DEBUG "IRQ to pin mappings:\n"); | 1619 | printk(KERN_DEBUG "IRQ to pin mappings:\n"); |
1579 | for_each_active_irq(irq) { | 1620 | for_each_active_irq(irq) { |
1580 | struct irq_pin_list *entry; | 1621 | struct irq_pin_list *entry; |
@@ -1792,7 +1833,7 @@ __apicdebuginit(int) print_ICs(void) | |||
1792 | return 0; | 1833 | return 0; |
1793 | } | 1834 | } |
1794 | 1835 | ||
1795 | fs_initcall(print_ICs); | 1836 | late_initcall(print_ICs); |
1796 | 1837 | ||
1797 | 1838 | ||
1798 | /* Where if anywhere is the i8259 connect in external int mode */ | 1839 | /* Where if anywhere is the i8259 connect in external int mode */ |