Commit 6da2e9ba authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds

[PATCH] x86-64: add apic={verbose,quiet,debug}

Ported from i386

Allow to quieten apic boot output on the command line using
apic={verbose,debug,quiet}

Make it quiet by default

Add extra #define for making apic print functions __init or not
__init (for easier debugging)
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 66c6d67d
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
#include <asm/mpspec.h> #include <asm/mpspec.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
int apic_verbosity;
int disable_apic_timer __initdata; int disable_apic_timer __initdata;
/* Using APIC to generate smp_local_timer_interrupt? */ /* Using APIC to generate smp_local_timer_interrupt? */
...@@ -123,7 +125,7 @@ void __init connect_bsp_APIC(void) ...@@ -123,7 +125,7 @@ void __init connect_bsp_APIC(void)
* PIC mode, enable APIC mode in the IMCR, i.e. * PIC mode, enable APIC mode in the IMCR, i.e.
* connect BSP's local APIC to INT and NMI lines. * connect BSP's local APIC to INT and NMI lines.
*/ */
printk(KERN_INFO "leaving PIC mode, enabling APIC mode.\n"); apic_printk(APIC_VERBOSE, "leaving PIC mode, enabling APIC mode.\n");
outb(0x70, 0x22); outb(0x70, 0x22);
outb(0x01, 0x23); outb(0x01, 0x23);
} }
...@@ -138,7 +140,7 @@ void disconnect_bsp_APIC(void) ...@@ -138,7 +140,7 @@ void disconnect_bsp_APIC(void)
* interrupts, including IPIs, won't work beyond * interrupts, including IPIs, won't work beyond
* this point! The only exception are INIT IPIs. * this point! The only exception are INIT IPIs.
*/ */
printk(KERN_INFO "disabling APIC mode, entering PIC mode.\n"); apic_printk(APIC_QUIET, "disabling APIC mode, entering PIC mode.\n");
outb(0x70, 0x22); outb(0x70, 0x22);
outb(0x00, 0x23); outb(0x00, 0x23);
} }
...@@ -172,10 +174,10 @@ int __init verify_local_APIC(void) ...@@ -172,10 +174,10 @@ int __init verify_local_APIC(void)
* The version register is read-only in a real APIC. * The version register is read-only in a real APIC.
*/ */
reg0 = apic_read(APIC_LVR); reg0 = apic_read(APIC_LVR);
Dprintk("Getting VERSION: %x\n", reg0); apic_printk(APIC_DEBUG, "Getting VERSION: %x\n", reg0);
apic_write(APIC_LVR, reg0 ^ APIC_LVR_MASK); apic_write(APIC_LVR, reg0 ^ APIC_LVR_MASK);
reg1 = apic_read(APIC_LVR); reg1 = apic_read(APIC_LVR);
Dprintk("Getting VERSION: %x\n", reg1); apic_printk(APIC_DEBUG, "Getting VERSION: %x\n", reg1);
/* /*
* The two version reads above should print the same * The two version reads above should print the same
...@@ -199,10 +201,10 @@ int __init verify_local_APIC(void) ...@@ -199,10 +201,10 @@ int __init verify_local_APIC(void)
* The ID register is read/write in a real APIC. * The ID register is read/write in a real APIC.
*/ */
reg0 = apic_read(APIC_ID); reg0 = apic_read(APIC_ID);
Dprintk("Getting ID: %x\n", reg0); apic_printk(APIC_DEBUG, "Getting ID: %x\n", reg0);
apic_write(APIC_ID, reg0 ^ APIC_ID_MASK); apic_write(APIC_ID, reg0 ^ APIC_ID_MASK);
reg1 = apic_read(APIC_ID); reg1 = apic_read(APIC_ID);
Dprintk("Getting ID: %x\n", reg1); apic_printk(APIC_DEBUG, "Getting ID: %x\n", reg1);
apic_write(APIC_ID, reg0); apic_write(APIC_ID, reg0);
if (reg1 != (reg0 ^ APIC_ID_MASK)) if (reg1 != (reg0 ^ APIC_ID_MASK))
return 0; return 0;
...@@ -213,9 +215,9 @@ int __init verify_local_APIC(void) ...@@ -213,9 +215,9 @@ int __init verify_local_APIC(void)
* compatibility mode, but most boxes are anymore. * compatibility mode, but most boxes are anymore.
*/ */
reg0 = apic_read(APIC_LVT0); reg0 = apic_read(APIC_LVT0);
Dprintk("Getting LVT0: %x\n", reg0); apic_printk(APIC_DEBUG,"Getting LVT0: %x\n", reg0);
reg1 = apic_read(APIC_LVT1); reg1 = apic_read(APIC_LVT1);
Dprintk("Getting LVT1: %x\n", reg1); apic_printk(APIC_DEBUG, "Getting LVT1: %x\n", reg1);
return 1; return 1;
} }
...@@ -227,7 +229,7 @@ void __init sync_Arb_IDs(void) ...@@ -227,7 +229,7 @@ void __init sync_Arb_IDs(void)
*/ */
apic_wait_icr_idle(); apic_wait_icr_idle();
Dprintk("Synchronizing Arb IDs.\n"); apic_printk(APIC_DEBUG, "Synchronizing Arb IDs.\n");
apic_write_around(APIC_ICR, APIC_DEST_ALLINC | APIC_INT_LEVELTRIG apic_write_around(APIC_ICR, APIC_DEST_ALLINC | APIC_INT_LEVELTRIG
| APIC_DM_INIT); | APIC_DM_INIT);
} }
...@@ -388,10 +390,10 @@ void __init setup_local_APIC (void) ...@@ -388,10 +390,10 @@ void __init setup_local_APIC (void)
value = apic_read(APIC_LVT0) & APIC_LVT_MASKED; value = apic_read(APIC_LVT0) & APIC_LVT_MASKED;
if (!smp_processor_id() && (pic_mode || !value)) { if (!smp_processor_id() && (pic_mode || !value)) {
value = APIC_DM_EXTINT; value = APIC_DM_EXTINT;
Dprintk(KERN_INFO "enabled ExtINT on CPU#%d\n", smp_processor_id()); apic_printk(APIC_VERBOSE, "enabled ExtINT on CPU#%d\n", smp_processor_id());
} else { } else {
value = APIC_DM_EXTINT | APIC_LVT_MASKED; value = APIC_DM_EXTINT | APIC_LVT_MASKED;
Dprintk(KERN_INFO "masked ExtINT on CPU#%d\n", smp_processor_id()); apic_printk(APIC_VERBOSE, "masked ExtINT on CPU#%d\n", smp_processor_id());
} }
apic_write_around(APIC_LVT0, value); apic_write_around(APIC_LVT0, value);
...@@ -407,12 +409,11 @@ void __init setup_local_APIC (void) ...@@ -407,12 +409,11 @@ void __init setup_local_APIC (void)
apic_write_around(APIC_LVT1, value); apic_write_around(APIC_LVT1, value);
if (APIC_INTEGRATED(ver) && !esr_disable) { /* !82489DX */ if (APIC_INTEGRATED(ver) && !esr_disable) { /* !82489DX */
unsigned oldvalue;
maxlvt = get_maxlvt(); maxlvt = get_maxlvt();
if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */ if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */
apic_write(APIC_ESR, 0); apic_write(APIC_ESR, 0);
value = apic_read(APIC_ESR); oldvalue = apic_read(APIC_ESR);
Dprintk("ESR value before enabling vector: %08x\n", value);
value = ERROR_APIC_VECTOR; // enables sending errors value = ERROR_APIC_VECTOR; // enables sending errors
apic_write_around(APIC_LVTERR, value); apic_write_around(APIC_LVTERR, value);
/* /*
...@@ -421,7 +422,10 @@ void __init setup_local_APIC (void) ...@@ -421,7 +422,10 @@ void __init setup_local_APIC (void)
if (maxlvt > 3) if (maxlvt > 3)
apic_write(APIC_ESR, 0); apic_write(APIC_ESR, 0);
value = apic_read(APIC_ESR); value = apic_read(APIC_ESR);
Dprintk("ESR value after enabling vector: %08x\n", value); if (value != oldvalue)
apic_printk(APIC_VERBOSE,
"ESR value after enabling vector: %08x, after %08x\n",
oldvalue, value);
} else { } else {
if (esr_disable) if (esr_disable)
/* /*
...@@ -430,9 +434,9 @@ void __init setup_local_APIC (void) ...@@ -430,9 +434,9 @@ void __init setup_local_APIC (void)
* ESR disabled - we can't do anything useful with the * ESR disabled - we can't do anything useful with the
* errors anyway - mbligh * errors anyway - mbligh
*/ */
printk("Leaving ESR disabled.\n"); apic_printk(APIC_DEBUG, "Leaving ESR disabled.\n");
else else
printk("No ESR for 82489DX.\n"); apic_printk(APIC_DEBUG, "No ESR for 82489DX.\n");
} }
nmi_watchdog_default(); nmi_watchdog_default();
...@@ -564,6 +568,21 @@ static void apic_pm_activate(void) { } ...@@ -564,6 +568,21 @@ static void apic_pm_activate(void) { }
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
static int __init apic_set_verbosity(char *str)
{
if (strcmp("debug", str) == 0)
apic_verbosity = APIC_DEBUG;
else if (strcmp("verbose", str) == 0)
apic_verbosity = APIC_VERBOSE;
else
printk(KERN_WARNING "APIC Verbosity level %s not recognised"
" use apic=verbose or apic=debug", str);
return 0;
}
__setup("apic=", apic_set_verbosity);
/* /*
* Detect and enable local APICs on non-SMP boards. * Detect and enable local APICs on non-SMP boards.
* Original code written by Keir Fraser. * Original code written by Keir Fraser.
...@@ -599,7 +618,7 @@ void __init init_apic_mappings(void) ...@@ -599,7 +618,7 @@ void __init init_apic_mappings(void)
apic_phys = mp_lapic_addr; apic_phys = mp_lapic_addr;
set_fixmap_nocache(FIX_APIC_BASE, apic_phys); set_fixmap_nocache(FIX_APIC_BASE, apic_phys);
Dprintk("mapped APIC to %16lx (%16lx)\n", APIC_BASE, apic_phys); apic_printk(APIC_VERBOSE,"mapped APIC to %16lx (%16lx)\n", APIC_BASE, apic_phys);
/* /*
* Fetch the APIC ID of the BSP in case we have a * Fetch the APIC ID of the BSP in case we have a
...@@ -621,7 +640,7 @@ void __init init_apic_mappings(void) ...@@ -621,7 +640,7 @@ void __init init_apic_mappings(void)
ioapic_phys = __pa(ioapic_phys); ioapic_phys = __pa(ioapic_phys);
} }
set_fixmap_nocache(idx, ioapic_phys); set_fixmap_nocache(idx, ioapic_phys);
Dprintk("mapped IOAPIC to %016lx (%016lx)\n", apic_printk(APIC_VERBOSE,"mapped IOAPIC to %016lx (%016lx)\n",
__fix_to_virt(idx), ioapic_phys); __fix_to_virt(idx), ioapic_phys);
idx++; idx++;
} }
......
...@@ -36,6 +36,8 @@ ...@@ -36,6 +36,8 @@
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/proto.h> #include <asm/proto.h>
#define __apicdebuginit __init
int sis_apic_bug; /* not actually supported, dummy for compile */ int sis_apic_bug; /* not actually supported, dummy for compile */
#undef APIC_LOCKUP_DEBUG #undef APIC_LOCKUP_DEBUG
...@@ -292,13 +294,13 @@ static int __init ioapic_pirq_setup(char *str) ...@@ -292,13 +294,13 @@ static int __init ioapic_pirq_setup(char *str)
pirq_entries[i] = -1; pirq_entries[i] = -1;
pirqs_enabled = 1; pirqs_enabled = 1;
printk(KERN_INFO "PIRQ redirection, working around broken MP-BIOS.\n"); apic_printk(APIC_VERBOSE, "PIRQ redirection, working around broken MP-BIOS.\n");
max = MAX_PIRQS; max = MAX_PIRQS;
if (ints[0] < MAX_PIRQS) if (ints[0] < MAX_PIRQS)
max = ints[0]; max = ints[0];
for (i = 0; i < max; i++) { for (i = 0; i < max; i++) {
printk(KERN_DEBUG "... PIRQ%d -> IRQ %d\n", i, ints[i+1]); apic_printk(APIC_VERBOSE, "... PIRQ%d -> IRQ %d\n", i, ints[i+1]);
/* /*
* PIRQs are mapped upside down, usually. * PIRQs are mapped upside down, usually.
*/ */
...@@ -357,10 +359,10 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin) ...@@ -357,10 +359,10 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
{ {
int apic, i, best_guess = -1; int apic, i, best_guess = -1;
Dprintk("querying PCI -> IRQ mapping bus:%d, slot:%d, pin:%d.\n", apic_printk(APIC_DEBUG, "querying PCI -> IRQ mapping bus:%d, slot:%d, pin:%d.\n",
bus, slot, pin); bus, slot, pin);
if (mp_bus_id_to_pci_bus[bus] == -1) { if (mp_bus_id_to_pci_bus[bus] == -1) {
printk(KERN_WARNING "PCI BIOS passed nonexistent PCI bus %d!\n", bus); apic_printk(APIC_VERBOSE, "PCI BIOS passed nonexistent PCI bus %d!\n", bus);
return -1; return -1;
} }
for (i = 0; i < mp_irq_entries; i++) { for (i = 0; i < mp_irq_entries; i++) {
...@@ -402,7 +404,7 @@ static int __init EISA_ELCR(unsigned int irq) ...@@ -402,7 +404,7 @@ static int __init EISA_ELCR(unsigned int irq)
unsigned int port = 0x4d0 + (irq >> 3); unsigned int port = 0x4d0 + (irq >> 3);
return (inb(port) >> (irq & 7)) & 1; return (inb(port) >> (irq & 7)) & 1;
} }
printk(KERN_INFO "Broken MPtable reports ISA irq %d\n", irq); apic_printk(APIC_VERBOSE, "Broken MPtable reports ISA irq %d\n", irq);
return 0; return 0;
} }
...@@ -625,10 +627,10 @@ static int pin_2_irq(int idx, int apic, int pin) ...@@ -625,10 +627,10 @@ static int pin_2_irq(int idx, int apic, int pin)
if ((pin >= 16) && (pin <= 23)) { if ((pin >= 16) && (pin <= 23)) {
if (pirq_entries[pin-16] != -1) { if (pirq_entries[pin-16] != -1) {
if (!pirq_entries[pin-16]) { if (!pirq_entries[pin-16]) {
printk(KERN_DEBUG "disabling PIRQ%d\n", pin-16); apic_printk(APIC_VERBOSE, "disabling PIRQ%d\n", pin-16);
} else { } else {
irq = pirq_entries[pin-16]; irq = pirq_entries[pin-16];
printk(KERN_DEBUG "using PIRQ%d -> IRQ %d\n", apic_printk(APIC_VERBOSE, "using PIRQ%d -> IRQ %d\n",
pin-16, irq); pin-16, irq);
} }
} }
...@@ -719,7 +721,7 @@ void __init setup_IO_APIC_irqs(void) ...@@ -719,7 +721,7 @@ void __init setup_IO_APIC_irqs(void)
int apic, pin, idx, irq, first_notcon = 1, vector; int apic, pin, idx, irq, first_notcon = 1, vector;
unsigned long flags; unsigned long flags;
printk(KERN_DEBUG "init IO_APIC IRQs\n"); apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
for (apic = 0; apic < nr_ioapics; apic++) { for (apic = 0; apic < nr_ioapics; apic++) {
for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) { for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
...@@ -737,10 +739,10 @@ void __init setup_IO_APIC_irqs(void) ...@@ -737,10 +739,10 @@ void __init setup_IO_APIC_irqs(void)
idx = find_irq_entry(apic,pin,mp_INT); idx = find_irq_entry(apic,pin,mp_INT);
if (idx == -1) { if (idx == -1) {
if (first_notcon) { if (first_notcon) {
printk(KERN_DEBUG " IO-APIC (apicid-pin) %d-%d", mp_ioapics[apic].mpc_apicid, pin); apic_printk(APIC_VERBOSE, KERN_DEBUG " IO-APIC (apicid-pin) %d-%d", mp_ioapics[apic].mpc_apicid, pin);
first_notcon = 0; first_notcon = 0;
} else } else
printk(", %d-%d", mp_ioapics[apic].mpc_apicid, pin); apic_printk(APIC_VERBOSE, ", %d-%d", mp_ioapics[apic].mpc_apicid, pin);
continue; continue;
} }
...@@ -775,7 +777,7 @@ void __init setup_IO_APIC_irqs(void) ...@@ -775,7 +777,7 @@ void __init setup_IO_APIC_irqs(void)
} }
if (!first_notcon) if (!first_notcon)
printk(" not connected.\n"); apic_printk(APIC_VERBOSE," not connected.\n");
} }
/* /*
...@@ -825,13 +827,9 @@ void __init setup_ExtINT_IRQ0_pin(unsigned int pin, int vector) ...@@ -825,13 +827,9 @@ void __init setup_ExtINT_IRQ0_pin(unsigned int pin, int vector)
void __init UNEXPECTED_IO_APIC(void) void __init UNEXPECTED_IO_APIC(void)
{ {
#if 0
printk(KERN_WARNING " WARNING: unexpected IO-APIC, please mail\n");
printk(KERN_WARNING " to linux-smp@vger.kernel.org\n");
#endif
} }
void __init print_IO_APIC(void) void __apicdebuginit print_IO_APIC(void)
{ {
int apic, i; int apic, i;
union IO_APIC_reg_00 reg_00; union IO_APIC_reg_00 reg_00;
...@@ -839,6 +837,9 @@ void __init print_IO_APIC(void) ...@@ -839,6 +837,9 @@ void __init print_IO_APIC(void)
union IO_APIC_reg_02 reg_02; union IO_APIC_reg_02 reg_02;
unsigned long flags; unsigned long flags;
if (apic_verbosity == APIC_QUIET)
return;
printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries); printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries);
for (i = 0; i < nr_ioapics; i++) for (i = 0; i < nr_ioapics; i++)
printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n", printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n",
...@@ -955,11 +956,14 @@ void __init print_IO_APIC(void) ...@@ -955,11 +956,14 @@ void __init print_IO_APIC(void)
return; return;
} }
static void print_APIC_bitfield (int base) static __apicdebuginit void print_APIC_bitfield (int base)
{ {
unsigned int v; unsigned int v;
int i, j; int i, j;
if (apic_verbosity == APIC_QUIET)
return;
printk(KERN_DEBUG "0123456789abcdef0123456789abcdef\n" KERN_DEBUG); printk(KERN_DEBUG "0123456789abcdef0123456789abcdef\n" KERN_DEBUG);
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
v = apic_read(base + i*0x10); v = apic_read(base + i*0x10);
...@@ -973,10 +977,13 @@ static void print_APIC_bitfield (int base) ...@@ -973,10 +977,13 @@ static void print_APIC_bitfield (int base)
} }
} }
void /*__init*/ print_local_APIC(void * dummy) void __apicdebuginit print_local_APIC(void * dummy)
{ {
unsigned int v, ver, maxlvt; unsigned int v, ver, maxlvt;
if (apic_verbosity == APIC_QUIET)
return;
printk("\n" KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n", printk("\n" KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n",
smp_processor_id(), hard_smp_processor_id()); smp_processor_id(), hard_smp_processor_id());
v = apic_read(APIC_ID); v = apic_read(APIC_ID);
...@@ -1058,12 +1065,15 @@ void print_all_local_APICs (void) ...@@ -1058,12 +1065,15 @@ void print_all_local_APICs (void)
on_each_cpu(print_local_APIC, NULL, 1, 1); on_each_cpu(print_local_APIC, NULL, 1, 1);
} }
void /*__init*/ print_PIC(void) void __apicdebuginit print_PIC(void)
{ {
extern spinlock_t i8259A_lock; extern spinlock_t i8259A_lock;
unsigned int v; unsigned int v;
unsigned long flags; unsigned long flags;
if (apic_verbosity == APIC_QUIET)
return;
printk(KERN_DEBUG "\nprinting PIC contents\n"); printk(KERN_DEBUG "\nprinting PIC contents\n");
spin_lock_irqsave(&i8259A_lock, flags); spin_lock_irqsave(&i8259A_lock, flags);
...@@ -1160,9 +1170,9 @@ static void __init setup_ioapic_ids_from_mpc (void) ...@@ -1160,9 +1170,9 @@ static void __init setup_ioapic_ids_from_mpc (void)
old_id = mp_ioapics[apic].mpc_apicid; old_id = mp_ioapics[apic].mpc_apicid;
if (mp_ioapics[apic].mpc_apicid >= 0xf) { if (mp_ioapics[apic].mpc_apicid >= 0xf) {
printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n", apic_printk(APIC_QUIET,KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n",
apic, mp_ioapics[apic].mpc_apicid); apic, mp_ioapics[apic].mpc_apicid);
printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", apic_printk(APIC_QUIET,KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
reg_00.bits.ID); reg_00.bits.ID);
mp_ioapics[apic].mpc_apicid = reg_00.bits.ID; mp_ioapics[apic].mpc_apicid = reg_00.bits.ID;
} }
...@@ -1205,7 +1215,7 @@ static void __init setup_ioapic_ids_from_mpc (void) ...@@ -1205,7 +1215,7 @@ static void __init setup_ioapic_ids_from_mpc (void)
* Read the right value from the MPC table and * Read the right value from the MPC table and
* write it into the ID register. * write it into the ID register.
*/ */
printk(KERN_INFO "...changing IO-APIC physical APIC ID to %d ...", apic_printk(APIC_VERBOSE,KERN_INFO "...changing IO-APIC physical APIC ID to %d ...",
mp_ioapics[apic].mpc_apicid); mp_ioapics[apic].mpc_apicid);
reg_00.bits.ID = mp_ioapics[apic].mpc_apicid; reg_00.bits.ID = mp_ioapics[apic].mpc_apicid;
...@@ -1222,7 +1232,7 @@ static void __init setup_ioapic_ids_from_mpc (void) ...@@ -1222,7 +1232,7 @@ static void __init setup_ioapic_ids_from_mpc (void)
if (reg_00.bits.ID != mp_ioapics[apic].mpc_apicid) if (reg_00.bits.ID != mp_ioapics[apic].mpc_apicid)
panic("could not set ID!\n"); panic("could not set ID!\n");
else else
printk(" ok.\n"); apic_printk(APIC_VERBOSE," ok.\n");
} }
} }
...@@ -1671,7 +1681,7 @@ static inline void check_timer(void) ...@@ -1671,7 +1681,7 @@ static inline void check_timer(void)
pin1 = find_isa_irq_pin(0, mp_INT); pin1 = find_isa_irq_pin(0, mp_INT);
pin2 = find_isa_irq_pin(0, mp_ExtINT); pin2 = find_isa_irq_pin(0, mp_ExtINT);
printk(KERN_INFO "..TIMER: vector=0x%02X pin1=%d pin2=%d\n", vector, pin1, pin2); apic_printk(APIC_VERBOSE,KERN_INFO "..TIMER: vector=0x%02X pin1=%d pin2=%d\n", vector, pin1, pin2);
if (pin1 != -1) { if (pin1 != -1) {
/* /*
...@@ -1689,12 +1699,12 @@ static inline void check_timer(void) ...@@ -1689,12 +1699,12 @@ static inline void check_timer(void)
return; return;
} }
clear_IO_APIC_pin(0, pin1); clear_IO_APIC_pin(0, pin1);
printk(KERN_ERR "..MP-BIOS bug: 8254 timer not connected to IO-APIC\n"); apic_printk(APIC_QUIET,KERN_ERR "..MP-BIOS bug: 8254 timer not connected to IO-APIC\n");
} }
printk(KERN_INFO "...trying to set up timer (IRQ0) through the 8259A ... "); apic_printk(APIC_VERBOSE,KERN_INFO "...trying to set up timer (IRQ0) through the 8259A ... ");
if (pin2 != -1) { if (pin2 != -1) {
printk("\n..... (found pin %d) ...", pin2); apic_printk(APIC_VERBOSE,"\n..... (found pin %d) ...", pin2);
/* /*
* legacy devices should be connected to IO APIC #0 * legacy devices should be connected to IO APIC #0
*/ */
...@@ -1720,7 +1730,7 @@ static inline void check_timer(void) ...@@ -1720,7 +1730,7 @@ static inline void check_timer(void)
nmi_watchdog = 0; nmi_watchdog = 0;
} }
printk(KERN_INFO "...trying to set up timer as Virtual Wire IRQ..."); apic_printk(APIC_VERBOSE, KERN_INFO "...trying to set up timer as Virtual Wire IRQ...");
disable_8259A_irq(0); disable_8259A_irq(0);
irq_desc[0].handler = &lapic_irq_type; irq_desc[0].handler = &lapic_irq_type;
...@@ -1728,13 +1738,13 @@ static inline void check_timer(void) ...@@ -1728,13 +1738,13 @@ static inline void check_timer(void)
enable_8259A_irq(0); enable_8259A_irq(0);
if (timer_irq_works()) { if (timer_irq_works()) {
printk(" works.\n"); apic_printk(APIC_QUIET, " works.\n");
return; return;
} }
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector); apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector);
printk(" failed.\n"); apic_printk(APIC_VERBOSE," failed.\n");
printk(KERN_INFO "...trying to set up timer as ExtINT IRQ..."); apic_printk(APIC_VERBOSE, KERN_INFO "...trying to set up timer as ExtINT IRQ...");
init_8259A(0); init_8259A(0);
make_8259A_irq(0); make_8259A_irq(0);
...@@ -1743,10 +1753,10 @@ static inline void check_timer(void) ...@@ -1743,10 +1753,10 @@ static inline void check_timer(void)
unlock_ExtINT_logic(); unlock_ExtINT_logic();
if (timer_irq_works()) { if (timer_irq_works()) {
printk(" works.\n"); apic_printk(APIC_VERBOSE," works.\n");
return; return;
} }
printk(" failed :(.\n"); apic_printk(APIC_VERBOSE," failed :(.\n");
panic("IO-APIC + timer doesn't work! Try using the 'noapic' kernel parameter\n"); panic("IO-APIC + timer doesn't work! Try using the 'noapic' kernel parameter\n");
} }
...@@ -1768,7 +1778,7 @@ void __init setup_IO_APIC(void) ...@@ -1768,7 +1778,7 @@ void __init setup_IO_APIC(void)
else else
io_apic_irqs = ~PIC_IRQS; io_apic_irqs = ~PIC_IRQS;
printk("ENABLING IO-APIC IRQs\n"); apic_printk(APIC_VERBOSE, "ENABLING IO-APIC IRQs\n");
/* /*
* Set up the IO-APIC IRQ routing table. * Set up the IO-APIC IRQ routing table.
...@@ -1815,7 +1825,7 @@ int __init io_apic_get_unique_id (int ioapic, int apic_id) ...@@ -1815,7 +1825,7 @@ int __init io_apic_get_unique_id (int ioapic, int apic_id)
spin_unlock_irqrestore(&ioapic_lock, flags); spin_unlock_irqrestore(&ioapic_lock, flags);
if (apic_id >= IO_APIC_MAX_ID) { if (apic_id >= IO_APIC_MAX_ID) {
printk(KERN_WARNING "IOAPIC[%d]: Invalid apic_id %d, trying " apic_printk(APIC_QUIET, KERN_WARNING "IOAPIC[%d]: Invalid apic_id %d, trying "
"%d\n", ioapic, apic_id, reg_00.bits.ID); "%d\n", ioapic, apic_id, reg_00.bits.ID);
apic_id = reg_00.bits.ID; apic_id = reg_00.bits.ID;
} }
...@@ -1834,7 +1844,7 @@ int __init io_apic_get_unique_id (int ioapic, int apic_id) ...@@ -1834,7 +1844,7 @@ int __init io_apic_get_unique_id (int ioapic, int apic_id)
if (i == IO_APIC_MAX_ID) if (i == IO_APIC_MAX_ID)
panic("Max apic_id exceeded!\n"); panic("Max apic_id exceeded!\n");
printk(KERN_WARNING "IOAPIC[%d]: apic_id %d already used, " apic_printk(APIC_VERBOSE, KERN_WARNING "IOAPIC[%d]: apic_id %d already used, "
"trying %d\n", ioapic, apic_id, i); "trying %d\n", ioapic, apic_id, i);
apic_id = i; apic_id = i;
...@@ -1855,7 +1865,7 @@ int __init io_apic_get_unique_id (int ioapic, int apic_id) ...@@ -1855,7 +1865,7 @@ int __init io_apic_get_unique_id (int ioapic, int apic_id)
panic("IOAPIC[%d]: Unable change apic_id!\n", ioapic); panic("IOAPIC[%d]: Unable change apic_id!\n", ioapic);
} }
printk(KERN_INFO "IOAPIC[%d]: Assigned apic_id %d\n", ioapic, apic_id); apic_printk(APIC_VERBOSE,KERN_INFO "IOAPIC[%d]: Assigned apic_id %d\n", ioapic, apic_id);
return apic_id; return apic_id;
} }
...@@ -1893,7 +1903,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a ...@@ -1893,7 +1903,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a
unsigned long flags; unsigned long flags;
if (!IO_APIC_IRQ(irq)) { if (!IO_APIC_IRQ(irq)) {
printk(KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n", apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
ioapic); ioapic);
return -EINVAL; return -EINVAL;
} }
...@@ -1921,7 +1931,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a ...@@ -1921,7 +1931,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a
entry.vector = assign_irq_vector(irq); entry.vector = assign_irq_vector(irq);
printk(KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> " apic_printk(APIC_VERBOSE,KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> "
"IRQ %d Mode:%i Active:%i)\n", ioapic, "IRQ %d Mode:%i Active:%i)\n", ioapic,
mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq, mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq,
edge_level, active_high_low); edge_level, active_high_low);
......
...@@ -7,15 +7,29 @@ ...@@ -7,15 +7,29 @@
#include <asm/apicdef.h> #include <asm/apicdef.h>
#include <asm/system.h> #include <asm/system.h>
#ifdef CONFIG_X86_LOCAL_APIC #define Dprintk(x...)
#define APIC_DEBUG 0 /*
* Debugging macros
*/
#define APIC_QUIET 0
#define APIC_VERBOSE 1
#define APIC_DEBUG 2
#if APIC_DEBUG extern int apic_verbosity;
#define Dprintk(x...) printk(x)
#else /*
#define Dprintk(x...) * Define the default level of output to be very little
#endif * This can be turned up by using apic=verbose for more
* information and apic=debug for _lots_ of information.
* apic_verbosity is defined in apic.c
*/
#define apic_printk(v, s, a...) do { \
if ((v) <= apic_verbosity) \
printk(s, ##a); \
} while (0)
#ifdef CONFIG_X86_LOCAL_APIC
struct pt_regs; struct pt_regs;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment