Skip to content

Commit

Permalink
x86: untable __init references between IO data
Browse files Browse the repository at this point in the history
Earlier patch added IO APIC setup into local APIC setup. This caused
modpost warnings. Fix them by untangling setup_local_APIC() and splitting
it into smaller functions. The IO APIC initialization is only called
for the BP init.

Also removed some outdated debugging code and minor cleanup.

[ tglx: arch/x86 adaptation ]

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
Andi Kleen authored and Ingo Molnar committed Jan 30, 2008
1 parent 3f6e5a1 commit 739f33b
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 23 deletions.
46 changes: 23 additions & 23 deletions arch/x86/kernel/apic_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -677,7 +677,7 @@ void __init init_bsp_APIC(void)
*/
void __cpuinit setup_local_APIC(void)
{
unsigned int value, maxlvt;
unsigned int value;
int i, j;

value = apic_read(APIC_LVR);
Expand Down Expand Up @@ -773,32 +773,23 @@ void __cpuinit setup_local_APIC(void)
else
value = APIC_DM_NMI | APIC_LVT_MASKED;
apic_write(APIC_LVT1, value);
}

void __cpuinit lapic_setup_esr(void)
{
unsigned maxlvt = lapic_get_maxlvt();

apic_write(APIC_LVTERR, ERROR_APIC_VECTOR);
/*
* Now enable IO-APICs, actually call clear_IO_APIC
* We need clear_IO_APIC before enabling vector on BP
* spec says clear errors after enabling vector.
*/
if (!smp_processor_id() && !skip_ioapic_setup && nr_ioapics)
enable_IO_APIC();

{
unsigned oldvalue;
maxlvt = lapic_get_maxlvt();
oldvalue = apic_read(APIC_ESR);
value = ERROR_APIC_VECTOR; // enables sending errors
apic_write(APIC_LVTERR, value);
/*
* spec says clear errors after enabling vector.
*/
if (maxlvt > 3)
apic_write(APIC_ESR, 0);
value = apic_read(APIC_ESR);
if (value != oldvalue)
apic_printk(APIC_VERBOSE,
"ESR value after enabling vector: %08x, after %08x\n",
oldvalue, value);
}
if (maxlvt > 3)
apic_write(APIC_ESR, 0);
}

void __cpuinit end_local_APIC_setup(void)
{
lapic_setup_esr();
nmi_watchdog_default();
setup_apic_nmi_watchdog(NULL);
apic_pm_activate();
Expand Down Expand Up @@ -879,6 +870,15 @@ int __init APIC_init_uniprocessor(void)

setup_local_APIC();

/*
* Now enable IO-APICs, actually call clear_IO_APIC
* We need clear_IO_APIC before enabling vector on BP
*/
if (!skip_ioapic_setup && nr_ioapics)
enable_IO_APIC();

end_local_APIC_setup();

if (smp_found_config && !skip_ioapic_setup && nr_ioapics)
setup_IO_APIC();
else
Expand Down
8 changes: 8 additions & 0 deletions arch/x86/kernel/smpboot_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ void __cpuinit smp_callin(void)

Dprintk("CALLIN, before setup_local_APIC().\n");
setup_local_APIC();
end_local_APIC_setup();

/*
* Get our bogomips.
Expand Down Expand Up @@ -884,6 +885,13 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
*/
setup_local_APIC();

/*
* Enable IO APIC before setting up error vector
*/
if (!skip_ioapic_setup && nr_ioapics)
enable_IO_APIC();
end_local_APIC_setup();

if (GET_APIC_ID(apic_read(APIC_ID)) != boot_cpu_id) {
panic("Boot APIC ID in local APIC unexpected (%d vs %d)",
GET_APIC_ID(apic_read(APIC_ID)), boot_cpu_id);
Expand Down
1 change: 1 addition & 0 deletions include/asm-x86/apic.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ extern void cache_APIC_registers(void);
extern void sync_Arb_IDs(void);
extern void init_bsp_APIC(void);
extern void setup_local_APIC(void);
extern void end_local_APIC_setup(void);
extern void init_apic_mappings(void);
extern void setup_boot_APIC_clock(void);
extern void setup_secondary_APIC_clock(void);
Expand Down

0 comments on commit 739f33b

Please sign in to comment.