|
@@ -84,7 +84,7 @@ EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid);
|
|
|
*
|
|
|
* +1=force-enable
|
|
|
*/
|
|
|
-static int force_enable_local_apic;
|
|
|
+static int force_enable_local_apic __initdata;
|
|
|
/*
|
|
|
* APIC command line parameters
|
|
|
*/
|
|
@@ -154,7 +154,7 @@ early_param("nox2apic", setup_nox2apic);
|
|
|
unsigned long mp_lapic_addr;
|
|
|
int disable_apic;
|
|
|
/* Disable local APIC timer from the kernel commandline or via dmi quirk */
|
|
|
-static int disable_apic_timer __cpuinitdata;
|
|
|
+static int disable_apic_timer __initdata;
|
|
|
/* Local APIC timer works in C2 */
|
|
|
int local_apic_timer_c2_ok;
|
|
|
EXPORT_SYMBOL_GPL(local_apic_timer_c2_ok);
|
|
@@ -178,29 +178,8 @@ static struct resource lapic_resource = {
|
|
|
|
|
|
static unsigned int calibration_result;
|
|
|
|
|
|
-static int lapic_next_event(unsigned long delta,
|
|
|
- struct clock_event_device *evt);
|
|
|
-static void lapic_timer_setup(enum clock_event_mode mode,
|
|
|
- struct clock_event_device *evt);
|
|
|
-static void lapic_timer_broadcast(const struct cpumask *mask);
|
|
|
static void apic_pm_activate(void);
|
|
|
|
|
|
-/*
|
|
|
- * The local apic timer can be used for any function which is CPU local.
|
|
|
- */
|
|
|
-static struct clock_event_device lapic_clockevent = {
|
|
|
- .name = "lapic",
|
|
|
- .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT
|
|
|
- | CLOCK_EVT_FEAT_C3STOP | CLOCK_EVT_FEAT_DUMMY,
|
|
|
- .shift = 32,
|
|
|
- .set_mode = lapic_timer_setup,
|
|
|
- .set_next_event = lapic_next_event,
|
|
|
- .broadcast = lapic_timer_broadcast,
|
|
|
- .rating = 100,
|
|
|
- .irq = -1,
|
|
|
-};
|
|
|
-static DEFINE_PER_CPU(struct clock_event_device, lapic_events);
|
|
|
-
|
|
|
static unsigned long apic_phys;
|
|
|
|
|
|
/*
|
|
@@ -239,7 +218,7 @@ static int modern_apic(void)
|
|
|
* right after this call apic become NOOP driven
|
|
|
* so apic->write/read doesn't do anything
|
|
|
*/
|
|
|
-void apic_disable(void)
|
|
|
+static void __init apic_disable(void)
|
|
|
{
|
|
|
pr_info("APIC: switched to apic NOOP\n");
|
|
|
apic = &apic_noop;
|
|
@@ -283,23 +262,6 @@ u64 native_apic_icr_read(void)
|
|
|
return icr1 | ((u64)icr2 << 32);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * enable_NMI_through_LVT0 - enable NMI through local vector table 0
|
|
|
- */
|
|
|
-void __cpuinit enable_NMI_through_LVT0(void)
|
|
|
-{
|
|
|
- unsigned int v;
|
|
|
-
|
|
|
- /* unmask and set to NMI */
|
|
|
- v = APIC_DM_NMI;
|
|
|
-
|
|
|
- /* Level triggered for 82489DX (32bit mode) */
|
|
|
- if (!lapic_is_integrated())
|
|
|
- v |= APIC_LVT_LEVEL_TRIGGER;
|
|
|
-
|
|
|
- apic_write(APIC_LVT0, v);
|
|
|
-}
|
|
|
-
|
|
|
#ifdef CONFIG_X86_32
|
|
|
/**
|
|
|
* get_physical_broadcast - Get number of physical broadcast IDs
|
|
@@ -509,6 +471,23 @@ static void lapic_timer_broadcast(const struct cpumask *mask)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/*
|
|
|
+ * The local apic timer can be used for any function which is CPU local.
|
|
|
+ */
|
|
|
+static struct clock_event_device lapic_clockevent = {
|
|
|
+ .name = "lapic",
|
|
|
+ .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT
|
|
|
+ | CLOCK_EVT_FEAT_C3STOP | CLOCK_EVT_FEAT_DUMMY,
|
|
|
+ .shift = 32,
|
|
|
+ .set_mode = lapic_timer_setup,
|
|
|
+ .set_next_event = lapic_next_event,
|
|
|
+ .broadcast = lapic_timer_broadcast,
|
|
|
+ .rating = 100,
|
|
|
+ .irq = -1,
|
|
|
+};
|
|
|
+static DEFINE_PER_CPU(struct clock_event_device, lapic_events);
|
|
|
+
|
|
|
/*
|
|
|
* Setup the local APIC timer for this CPU. Copy the initialized values
|
|
|
* of the boot CPU and register the clock event in the framework.
|
|
@@ -1538,7 +1517,7 @@ static int __init detect_init_APIC(void)
|
|
|
}
|
|
|
#else
|
|
|
|
|
|
-static int apic_verify(void)
|
|
|
+static int __init apic_verify(void)
|
|
|
{
|
|
|
u32 features, h, l;
|
|
|
|
|
@@ -1563,7 +1542,7 @@ static int apic_verify(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int apic_force_enable(unsigned long addr)
|
|
|
+int __init apic_force_enable(unsigned long addr)
|
|
|
{
|
|
|
u32 h, l;
|
|
|
|