x86: fold apic_ops into genapic
Impact: cleanup make it simpler, don't need have one extra struct. v2: fix the sgi_uv build Signed-off-by: Yinghai Lu <yinghai@kernel.org> Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Родитель
06cd9a7dc8
Коммит
c1eeb2de41
|
@ -92,6 +92,12 @@ static inline u32 native_apic_mem_read(u32 reg)
|
||||||
return *((volatile u32 *)(APIC_BASE + reg));
|
return *((volatile u32 *)(APIC_BASE + reg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void native_apic_wait_icr_idle(void);
|
||||||
|
extern u32 native_safe_apic_wait_icr_idle(void);
|
||||||
|
extern void native_apic_icr_write(u32 low, u32 id);
|
||||||
|
extern u64 native_apic_icr_read(void);
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_X2APIC
|
||||||
static inline void native_apic_msr_write(u32 reg, u32 v)
|
static inline void native_apic_msr_write(u32 reg, u32 v)
|
||||||
{
|
{
|
||||||
if (reg == APIC_DFR || reg == APIC_ID || reg == APIC_LDR ||
|
if (reg == APIC_DFR || reg == APIC_ID || reg == APIC_LDR ||
|
||||||
|
@ -112,7 +118,31 @@ static inline u32 native_apic_msr_read(u32 reg)
|
||||||
return low;
|
return low;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86_X2APIC
|
static inline void native_x2apic_wait_icr_idle(void)
|
||||||
|
{
|
||||||
|
/* no need to wait for icr idle in x2apic */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 native_safe_x2apic_wait_icr_idle(void)
|
||||||
|
{
|
||||||
|
/* no need to wait for icr idle in x2apic */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void native_x2apic_icr_write(u32 low, u32 id)
|
||||||
|
{
|
||||||
|
wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u64 native_x2apic_icr_read(void)
|
||||||
|
{
|
||||||
|
unsigned long val;
|
||||||
|
|
||||||
|
rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
extern int x2apic;
|
extern int x2apic;
|
||||||
extern void check_x2apic(void);
|
extern void check_x2apic(void);
|
||||||
extern void enable_x2apic(void);
|
extern void enable_x2apic(void);
|
||||||
|
@ -146,47 +176,6 @@ static inline int x2apic_enabled(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct apic_ops {
|
|
||||||
u32 (*read)(u32 reg);
|
|
||||||
void (*write)(u32 reg, u32 v);
|
|
||||||
u64 (*icr_read)(void);
|
|
||||||
void (*icr_write)(u32 low, u32 high);
|
|
||||||
void (*wait_icr_idle)(void);
|
|
||||||
u32 (*safe_wait_icr_idle)(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct apic_ops *apic_ops;
|
|
||||||
|
|
||||||
static inline u32 apic_read(u32 reg)
|
|
||||||
{
|
|
||||||
return apic_ops->read(reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void apic_write(u32 reg, u32 val)
|
|
||||||
{
|
|
||||||
apic_ops->write(reg, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline u64 apic_icr_read(void)
|
|
||||||
{
|
|
||||||
return apic_ops->icr_read();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void apic_icr_write(u32 low, u32 high)
|
|
||||||
{
|
|
||||||
apic_ops->icr_write(low, high);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void apic_wait_icr_idle(void)
|
|
||||||
{
|
|
||||||
apic_ops->wait_icr_idle();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline u32 safe_apic_wait_icr_idle(void)
|
|
||||||
{
|
|
||||||
return apic_ops->safe_wait_icr_idle();
|
|
||||||
}
|
|
||||||
|
|
||||||
extern int get_physical_broadcast(void);
|
extern int get_physical_broadcast(void);
|
||||||
|
|
||||||
#ifdef CONFIG_X86_X2APIC
|
#ifdef CONFIG_X86_X2APIC
|
||||||
|
@ -197,18 +186,6 @@ static inline void ack_x2APIC_irq(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static inline void ack_APIC_irq(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* ack_APIC_irq() actually gets compiled as a single instruction
|
|
||||||
* ... yummie.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Docs say use 0 for future compatibility */
|
|
||||||
apic_write(APIC_EOI, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern int lapic_get_maxlvt(void);
|
extern int lapic_get_maxlvt(void);
|
||||||
extern void clear_local_APIC(void);
|
extern void clear_local_APIC(void);
|
||||||
extern void connect_bsp_APIC(void);
|
extern void connect_bsp_APIC(void);
|
||||||
|
@ -256,18 +233,6 @@ static inline void disable_local_APIC(void) { }
|
||||||
#define SET_APIC_ID(x) (apic->set_apic_id(x))
|
#define SET_APIC_ID(x) (apic->set_apic_id(x))
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
|
||||||
static inline unsigned default_get_apic_id(unsigned long x)
|
|
||||||
{
|
|
||||||
unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR));
|
|
||||||
|
|
||||||
if (APIC_XAPIC(ver))
|
|
||||||
return (x >> 24) & 0xFF;
|
|
||||||
else
|
|
||||||
return (x >> 24) & 0x0F;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _ASM_X86_APIC_H */
|
#endif /* _ASM_X86_APIC_H */
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include <asm/mpspec.h>
|
#include <asm/mpspec.h>
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
|
#include <asm/apic.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2004 James Cleverdon, IBM.
|
* Copyright 2004 James Cleverdon, IBM.
|
||||||
|
@ -83,10 +84,70 @@ struct genapic {
|
||||||
void (*smp_callin_clear_local_apic)(void);
|
void (*smp_callin_clear_local_apic)(void);
|
||||||
void (*store_NMI_vector)(unsigned short *high, unsigned short *low);
|
void (*store_NMI_vector)(unsigned short *high, unsigned short *low);
|
||||||
void (*inquire_remote_apic)(int apicid);
|
void (*inquire_remote_apic)(int apicid);
|
||||||
|
|
||||||
|
/* apic ops */
|
||||||
|
u32 (*read)(u32 reg);
|
||||||
|
void (*write)(u32 reg, u32 v);
|
||||||
|
u64 (*icr_read)(void);
|
||||||
|
void (*icr_write)(u32 low, u32 high);
|
||||||
|
void (*wait_icr_idle)(void);
|
||||||
|
u32 (*safe_wait_icr_idle)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct genapic *apic;
|
extern struct genapic *apic;
|
||||||
|
|
||||||
|
static inline u32 apic_read(u32 reg)
|
||||||
|
{
|
||||||
|
return apic->read(reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void apic_write(u32 reg, u32 val)
|
||||||
|
{
|
||||||
|
apic->write(reg, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u64 apic_icr_read(void)
|
||||||
|
{
|
||||||
|
return apic->icr_read();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void apic_icr_write(u32 low, u32 high)
|
||||||
|
{
|
||||||
|
apic->icr_write(low, high);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void apic_wait_icr_idle(void)
|
||||||
|
{
|
||||||
|
apic->wait_icr_idle();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 safe_apic_wait_icr_idle(void)
|
||||||
|
{
|
||||||
|
return apic->safe_wait_icr_idle();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void ack_APIC_irq(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* ack_APIC_irq() actually gets compiled as a single instruction
|
||||||
|
* ... yummie.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Docs say use 0 for future compatibility */
|
||||||
|
apic_write(APIC_EOI, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned default_get_apic_id(unsigned long x)
|
||||||
|
{
|
||||||
|
unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR));
|
||||||
|
|
||||||
|
if (APIC_XAPIC(ver))
|
||||||
|
return (x >> 24) & 0xFF;
|
||||||
|
else
|
||||||
|
return (x >> 24) & 0x0F;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Warm reset vector default position:
|
* Warm reset vector default position:
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -210,18 +210,13 @@ static int modern_apic(void)
|
||||||
return lapic_get_version() >= 0x14;
|
return lapic_get_version() >= 0x14;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void native_apic_wait_icr_idle(void)
|
||||||
* Paravirt kernels also might be using these below ops. So we still
|
|
||||||
* use generic apic_read()/apic_write(), which might be pointing to different
|
|
||||||
* ops in PARAVIRT case.
|
|
||||||
*/
|
|
||||||
void xapic_wait_icr_idle(void)
|
|
||||||
{
|
{
|
||||||
while (apic_read(APIC_ICR) & APIC_ICR_BUSY)
|
while (apic_read(APIC_ICR) & APIC_ICR_BUSY)
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 safe_xapic_wait_icr_idle(void)
|
u32 native_safe_apic_wait_icr_idle(void)
|
||||||
{
|
{
|
||||||
u32 send_status;
|
u32 send_status;
|
||||||
int timeout;
|
int timeout;
|
||||||
|
@ -237,13 +232,13 @@ u32 safe_xapic_wait_icr_idle(void)
|
||||||
return send_status;
|
return send_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void xapic_icr_write(u32 low, u32 id)
|
void native_apic_icr_write(u32 low, u32 id)
|
||||||
{
|
{
|
||||||
apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(id));
|
apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(id));
|
||||||
apic_write(APIC_ICR, low);
|
apic_write(APIC_ICR, low);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 xapic_icr_read(void)
|
u64 native_apic_icr_read(void)
|
||||||
{
|
{
|
||||||
u32 icr1, icr2;
|
u32 icr1, icr2;
|
||||||
|
|
||||||
|
@ -253,54 +248,6 @@ static u64 xapic_icr_read(void)
|
||||||
return icr1 | ((u64)icr2 << 32);
|
return icr1 | ((u64)icr2 << 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct apic_ops xapic_ops = {
|
|
||||||
.read = native_apic_mem_read,
|
|
||||||
.write = native_apic_mem_write,
|
|
||||||
.icr_read = xapic_icr_read,
|
|
||||||
.icr_write = xapic_icr_write,
|
|
||||||
.wait_icr_idle = xapic_wait_icr_idle,
|
|
||||||
.safe_wait_icr_idle = safe_xapic_wait_icr_idle,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apic_ops __read_mostly *apic_ops = &xapic_ops;
|
|
||||||
EXPORT_SYMBOL_GPL(apic_ops);
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_X2APIC
|
|
||||||
static void x2apic_wait_icr_idle(void)
|
|
||||||
{
|
|
||||||
/* no need to wait for icr idle in x2apic */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static u32 safe_x2apic_wait_icr_idle(void)
|
|
||||||
{
|
|
||||||
/* no need to wait for icr idle in x2apic */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void x2apic_icr_write(u32 low, u32 id)
|
|
||||||
{
|
|
||||||
wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low);
|
|
||||||
}
|
|
||||||
|
|
||||||
static u64 x2apic_icr_read(void)
|
|
||||||
{
|
|
||||||
unsigned long val;
|
|
||||||
|
|
||||||
rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val);
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct apic_ops x2apic_ops = {
|
|
||||||
.read = native_apic_msr_read,
|
|
||||||
.write = native_apic_msr_write,
|
|
||||||
.icr_read = x2apic_icr_read,
|
|
||||||
.icr_write = x2apic_icr_write,
|
|
||||||
.wait_icr_idle = x2apic_wait_icr_idle,
|
|
||||||
.safe_wait_icr_idle = safe_x2apic_wait_icr_idle,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enable_NMI_through_LVT0 - enable NMI through local vector table 0
|
* enable_NMI_through_LVT0 - enable NMI through local vector table 0
|
||||||
*/
|
*/
|
||||||
|
@ -1329,7 +1276,6 @@ void check_x2apic(void)
|
||||||
if (msr & X2APIC_ENABLE) {
|
if (msr & X2APIC_ENABLE) {
|
||||||
pr_info("x2apic enabled by BIOS, switching to x2apic ops\n");
|
pr_info("x2apic enabled by BIOS, switching to x2apic ops\n");
|
||||||
x2apic_preenabled = x2apic = 1;
|
x2apic_preenabled = x2apic = 1;
|
||||||
apic_ops = &x2apic_ops;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1403,7 +1349,6 @@ void __init enable_IR_x2apic(void)
|
||||||
|
|
||||||
if (!x2apic) {
|
if (!x2apic) {
|
||||||
x2apic = 1;
|
x2apic = 1;
|
||||||
apic_ops = &x2apic_ops;
|
|
||||||
enable_x2apic();
|
enable_x2apic();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -263,4 +263,11 @@ struct genapic apic_bigsmp = {
|
||||||
.smp_callin_clear_local_apic = NULL,
|
.smp_callin_clear_local_apic = NULL,
|
||||||
.store_NMI_vector = NULL,
|
.store_NMI_vector = NULL,
|
||||||
.inquire_remote_apic = default_inquire_remote_apic,
|
.inquire_remote_apic = default_inquire_remote_apic,
|
||||||
|
|
||||||
|
.read = native_apic_mem_read,
|
||||||
|
.write = native_apic_mem_write,
|
||||||
|
.icr_read = native_apic_icr_read,
|
||||||
|
.icr_write = native_apic_icr_write,
|
||||||
|
.wait_icr_idle = native_apic_wait_icr_idle,
|
||||||
|
.safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
#include <linux/sysfs.h>
|
#include <linux/sysfs.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/genapic.h>
|
||||||
#include <asm/mce.h>
|
#include <asm/mce.h>
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
#include <asm/percpu.h>
|
#include <asm/percpu.h>
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/percpu.h>
|
#include <linux/percpu.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/genapic.h>
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
#include <asm/mce.h>
|
#include <asm/mce.h>
|
||||||
#include <asm/hw_irq.h>
|
#include <asm/hw_irq.h>
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include <linux/nmi.h>
|
#include <linux/nmi.h>
|
||||||
#include <linux/kprobes.h>
|
#include <linux/kprobes.h>
|
||||||
|
|
||||||
#include <asm/apic.h>
|
#include <asm/genapic.h>
|
||||||
#include <asm/intel_arch_perfmon.h>
|
#include <asm/intel_arch_perfmon.h>
|
||||||
|
|
||||||
struct nmi_watchdog_ctlblk {
|
struct nmi_watchdog_ctlblk {
|
||||||
|
|
|
@ -806,4 +806,11 @@ struct genapic apic_es7000 = {
|
||||||
.smp_callin_clear_local_apic = NULL,
|
.smp_callin_clear_local_apic = NULL,
|
||||||
.store_NMI_vector = NULL,
|
.store_NMI_vector = NULL,
|
||||||
.inquire_remote_apic = default_inquire_remote_apic,
|
.inquire_remote_apic = default_inquire_remote_apic,
|
||||||
|
|
||||||
|
.read = native_apic_mem_read,
|
||||||
|
.write = native_apic_mem_write,
|
||||||
|
.icr_read = native_apic_icr_read,
|
||||||
|
.icr_write = native_apic_icr_write,
|
||||||
|
.wait_icr_idle = native_apic_wait_icr_idle,
|
||||||
|
.safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
|
||||||
};
|
};
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
#include <linux/dmar.h>
|
#include <linux/dmar.h>
|
||||||
|
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/ipi.h>
|
|
||||||
#include <asm/genapic.h>
|
#include <asm/genapic.h>
|
||||||
|
#include <asm/ipi.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
|
||||||
extern struct genapic apic_flat;
|
extern struct genapic apic_flat;
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/ipi.h>
|
|
||||||
#include <asm/genapic.h>
|
#include <asm/genapic.h>
|
||||||
|
#include <asm/ipi.h>
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
#include <acpi/acpi_bus.h>
|
#include <acpi/acpi_bus.h>
|
||||||
|
@ -229,6 +229,13 @@ struct genapic apic_flat = {
|
||||||
.smp_callin_clear_local_apic = NULL,
|
.smp_callin_clear_local_apic = NULL,
|
||||||
.store_NMI_vector = NULL,
|
.store_NMI_vector = NULL,
|
||||||
.inquire_remote_apic = NULL,
|
.inquire_remote_apic = NULL,
|
||||||
|
|
||||||
|
.read = native_apic_mem_read,
|
||||||
|
.write = native_apic_mem_write,
|
||||||
|
.icr_read = native_apic_icr_read,
|
||||||
|
.icr_write = native_apic_icr_write,
|
||||||
|
.wait_icr_idle = native_apic_wait_icr_idle,
|
||||||
|
.safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -374,4 +381,11 @@ struct genapic apic_physflat = {
|
||||||
.smp_callin_clear_local_apic = NULL,
|
.smp_callin_clear_local_apic = NULL,
|
||||||
.store_NMI_vector = NULL,
|
.store_NMI_vector = NULL,
|
||||||
.inquire_remote_apic = NULL,
|
.inquire_remote_apic = NULL,
|
||||||
|
|
||||||
|
.read = native_apic_mem_read,
|
||||||
|
.write = native_apic_mem_write,
|
||||||
|
.icr_read = native_apic_icr_read,
|
||||||
|
.icr_write = native_apic_icr_write,
|
||||||
|
.wait_icr_idle = native_apic_wait_icr_idle,
|
||||||
|
.safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
|
||||||
};
|
};
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
#include <linux/dmar.h>
|
#include <linux/dmar.h>
|
||||||
|
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/ipi.h>
|
|
||||||
#include <asm/genapic.h>
|
#include <asm/genapic.h>
|
||||||
|
#include <asm/ipi.h>
|
||||||
|
|
||||||
DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid);
|
DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid);
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ static void
|
||||||
/*
|
/*
|
||||||
* send the IPI.
|
* send the IPI.
|
||||||
*/
|
*/
|
||||||
x2apic_icr_write(cfg, apicid);
|
native_x2apic_icr_write(cfg, apicid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -234,4 +234,11 @@ struct genapic apic_x2apic_cluster = {
|
||||||
.smp_callin_clear_local_apic = NULL,
|
.smp_callin_clear_local_apic = NULL,
|
||||||
.store_NMI_vector = NULL,
|
.store_NMI_vector = NULL,
|
||||||
.inquire_remote_apic = NULL,
|
.inquire_remote_apic = NULL,
|
||||||
|
|
||||||
|
.read = native_apic_msr_read,
|
||||||
|
.write = native_apic_msr_write,
|
||||||
|
.icr_read = native_x2apic_icr_read,
|
||||||
|
.icr_write = native_x2apic_icr_write,
|
||||||
|
.wait_icr_idle = native_x2apic_wait_icr_idle,
|
||||||
|
.safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle,
|
||||||
};
|
};
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
#include <linux/dmar.h>
|
#include <linux/dmar.h>
|
||||||
|
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/ipi.h>
|
|
||||||
#include <asm/genapic.h>
|
#include <asm/genapic.h>
|
||||||
|
#include <asm/ipi.h>
|
||||||
|
|
||||||
static int x2apic_phys;
|
static int x2apic_phys;
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ static void __x2apic_send_IPI_dest(unsigned int apicid, int vector,
|
||||||
/*
|
/*
|
||||||
* send the IPI.
|
* send the IPI.
|
||||||
*/
|
*/
|
||||||
x2apic_icr_write(cfg, apicid);
|
native_x2apic_icr_write(cfg, apicid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector)
|
static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector)
|
||||||
|
@ -220,4 +220,11 @@ struct genapic apic_x2apic_phys = {
|
||||||
.smp_callin_clear_local_apic = NULL,
|
.smp_callin_clear_local_apic = NULL,
|
||||||
.store_NMI_vector = NULL,
|
.store_NMI_vector = NULL,
|
||||||
.inquire_remote_apic = NULL,
|
.inquire_remote_apic = NULL,
|
||||||
|
|
||||||
|
.read = native_apic_msr_read,
|
||||||
|
.write = native_apic_msr_write,
|
||||||
|
.icr_read = native_x2apic_icr_read,
|
||||||
|
.icr_write = native_x2apic_icr_write,
|
||||||
|
.wait_icr_idle = native_x2apic_wait_icr_idle,
|
||||||
|
.safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle,
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,8 +22,8 @@
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <asm/current.h>
|
#include <asm/current.h>
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/ipi.h>
|
|
||||||
#include <asm/genapic.h>
|
#include <asm/genapic.h>
|
||||||
|
#include <asm/ipi.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/uv/uv.h>
|
#include <asm/uv/uv.h>
|
||||||
#include <asm/uv/uv_mmrs.h>
|
#include <asm/uv/uv_mmrs.h>
|
||||||
|
@ -292,6 +292,13 @@ struct genapic apic_x2apic_uv_x = {
|
||||||
.smp_callin_clear_local_apic = NULL,
|
.smp_callin_clear_local_apic = NULL,
|
||||||
.store_NMI_vector = NULL,
|
.store_NMI_vector = NULL,
|
||||||
.inquire_remote_apic = NULL,
|
.inquire_remote_apic = NULL,
|
||||||
|
|
||||||
|
.read = native_apic_msr_read,
|
||||||
|
.write = native_apic_msr_write,
|
||||||
|
.icr_read = native_x2apic_icr_read,
|
||||||
|
.icr_write = native_x2apic_icr_write,
|
||||||
|
.wait_icr_idle = native_x2apic_wait_icr_idle,
|
||||||
|
.safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle,
|
||||||
};
|
};
|
||||||
|
|
||||||
static __cpuinit void set_x2apic_extra_bits(int pnode)
|
static __cpuinit void set_x2apic_extra_bits(int pnode)
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include <asm/mtrr.h>
|
#include <asm/mtrr.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/genapic.h>
|
||||||
#include <asm/proto.h>
|
#include <asm/proto.h>
|
||||||
#include <asm/ipi.h>
|
#include <asm/ipi.h>
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/ftrace.h>
|
#include <linux/ftrace.h>
|
||||||
|
|
||||||
#include <asm/apic.h>
|
#include <asm/genapic.h>
|
||||||
#include <asm/io_apic.h>
|
#include <asm/io_apic.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/idle.h>
|
#include <asm/idle.h>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
* Mikael Pettersson : PM converted to driver model. Disable/enable API.
|
* Mikael Pettersson : PM converted to driver model. Disable/enable API.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <asm/apic.h>
|
#include <asm/genapic.h>
|
||||||
|
|
||||||
#include <linux/nmi.h>
|
#include <linux/nmi.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
|
|
@ -569,4 +569,11 @@ struct genapic apic_numaq = {
|
||||||
.smp_callin_clear_local_apic = numaq_smp_callin_clear_local_apic,
|
.smp_callin_clear_local_apic = numaq_smp_callin_clear_local_apic,
|
||||||
.store_NMI_vector = numaq_store_NMI_vector,
|
.store_NMI_vector = numaq_store_NMI_vector,
|
||||||
.inquire_remote_apic = NULL,
|
.inquire_remote_apic = NULL,
|
||||||
|
|
||||||
|
.read = native_apic_mem_read,
|
||||||
|
.write = native_apic_mem_write,
|
||||||
|
.icr_read = native_apic_icr_read,
|
||||||
|
.icr_write = native_apic_icr_write,
|
||||||
|
.wait_icr_idle = native_apic_wait_icr_idle,
|
||||||
|
.safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
|
||||||
};
|
};
|
||||||
|
|
|
@ -127,6 +127,13 @@ struct genapic apic_default = {
|
||||||
.smp_callin_clear_local_apic = NULL,
|
.smp_callin_clear_local_apic = NULL,
|
||||||
.store_NMI_vector = NULL,
|
.store_NMI_vector = NULL,
|
||||||
.inquire_remote_apic = default_inquire_remote_apic,
|
.inquire_remote_apic = default_inquire_remote_apic,
|
||||||
|
|
||||||
|
.read = native_apic_mem_read,
|
||||||
|
.write = native_apic_mem_write,
|
||||||
|
.icr_read = native_apic_icr_read,
|
||||||
|
.icr_write = native_apic_icr_write,
|
||||||
|
.wait_icr_idle = native_apic_wait_icr_idle,
|
||||||
|
.safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct genapic apic_numaq;
|
extern struct genapic apic_numaq;
|
||||||
|
|
|
@ -599,4 +599,11 @@ struct genapic apic_summit = {
|
||||||
.smp_callin_clear_local_apic = NULL,
|
.smp_callin_clear_local_apic = NULL,
|
||||||
.store_NMI_vector = NULL,
|
.store_NMI_vector = NULL,
|
||||||
.inquire_remote_apic = default_inquire_remote_apic,
|
.inquire_remote_apic = default_inquire_remote_apic,
|
||||||
|
|
||||||
|
.read = native_apic_mem_read,
|
||||||
|
.write = native_apic_mem_write,
|
||||||
|
.icr_read = native_apic_icr_read,
|
||||||
|
.icr_write = native_apic_icr_write,
|
||||||
|
.wait_icr_idle = native_apic_wait_icr_idle,
|
||||||
|
.safe_wait_icr_idle = native_safe_apic_wait_icr_idle,
|
||||||
};
|
};
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
#include <asm/apic.h>
|
#include <asm/genapic.h>
|
||||||
#include <asm/uv/uv_irq.h>
|
#include <asm/uv/uv_irq.h>
|
||||||
|
|
||||||
static void uv_noop(unsigned int irq)
|
static void uv_noop(unsigned int irq)
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/fixmap.h>
|
#include <asm/fixmap.h>
|
||||||
#include <asm/apicdef.h>
|
#include <asm/apicdef.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/genapic.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/timer.h>
|
#include <asm/timer.h>
|
||||||
#include <asm/vmi_time.h>
|
#include <asm/vmi_time.h>
|
||||||
|
@ -798,8 +798,8 @@ static inline int __init activate_vmi(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
para_fill(apic_ops->read, APICRead);
|
para_fill(apic->read, APICRead);
|
||||||
para_fill(apic_ops->write, APICWrite);
|
para_fill(apic->write, APICWrite);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include <asm/vmi_time.h>
|
#include <asm/vmi_time.h>
|
||||||
#include <asm/arch_hooks.h>
|
#include <asm/arch_hooks.h>
|
||||||
#include <asm/apicdef.h>
|
#include <asm/apicdef.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/genapic.h>
|
||||||
#include <asm/timer.h>
|
#include <asm/timer.h>
|
||||||
#include <asm/i8253.h>
|
#include <asm/i8253.h>
|
||||||
#include <asm/irq_vectors.h>
|
#include <asm/irq_vectors.h>
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
#include <linux/lguest_launcher.h>
|
#include <linux/lguest_launcher.h>
|
||||||
#include <linux/virtio_console.h>
|
#include <linux/virtio_console.h>
|
||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/genapic.h>
|
||||||
#include <asm/lguest.h>
|
#include <asm/lguest.h>
|
||||||
#include <asm/paravirt.h>
|
#include <asm/paravirt.h>
|
||||||
#include <asm/param.h>
|
#include <asm/param.h>
|
||||||
|
@ -828,13 +828,14 @@ static u32 lguest_apic_safe_wait_icr_idle(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct apic_ops lguest_basic_apic_ops = {
|
static void set_lguest_basic_apic_ops(void)
|
||||||
.read = lguest_apic_read,
|
{
|
||||||
.write = lguest_apic_write,
|
apic->read = lguest_apic_read;
|
||||||
.icr_read = lguest_apic_icr_read,
|
apic->write = lguest_apic_write;
|
||||||
.icr_write = lguest_apic_icr_write,
|
apic->icr_read = lguest_apic_icr_read;
|
||||||
.wait_icr_idle = lguest_apic_wait_icr_idle,
|
apic->icr_write = lguest_apic_icr_write;
|
||||||
.safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle,
|
apic->wait_icr_idle = lguest_apic_wait_icr_idle;
|
||||||
|
apic->safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1035,7 +1036,7 @@ __init void lguest_init(void)
|
||||||
|
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
/* apic read/write intercepts */
|
/* apic read/write intercepts */
|
||||||
apic_ops = &lguest_basic_apic_ops;
|
set_lguest_basic_apic_ops();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* time operations */
|
/* time operations */
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#include <xen/hvc-console.h>
|
#include <xen/hvc-console.h>
|
||||||
|
|
||||||
#include <asm/paravirt.h>
|
#include <asm/paravirt.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/genapic.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/xen/hypercall.h>
|
#include <asm/xen/hypercall.h>
|
||||||
#include <asm/xen/hypervisor.h>
|
#include <asm/xen/hypervisor.h>
|
||||||
|
@ -554,14 +554,15 @@ static u32 xen_safe_apic_wait_icr_idle(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct apic_ops xen_basic_apic_ops = {
|
static void set_xen_basic_apic_ops(void)
|
||||||
.read = xen_apic_read,
|
{
|
||||||
.write = xen_apic_write,
|
apic->read = xen_apic_read;
|
||||||
.icr_read = xen_apic_icr_read,
|
apic->write = xen_apic_write;
|
||||||
.icr_write = xen_apic_icr_write,
|
apic->icr_read = xen_apic_icr_read;
|
||||||
.wait_icr_idle = xen_apic_wait_icr_idle,
|
apic->icr_write = xen_apic_icr_write;
|
||||||
.safe_wait_icr_idle = xen_safe_apic_wait_icr_idle,
|
apic->wait_icr_idle = xen_apic_wait_icr_idle;
|
||||||
};
|
apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -898,7 +899,7 @@ asmlinkage void __init xen_start_kernel(void)
|
||||||
/*
|
/*
|
||||||
* set up the basic apic ops.
|
* set up the basic apic ops.
|
||||||
*/
|
*/
|
||||||
apic_ops = &xen_basic_apic_ops;
|
set_xen_basic_apic_ops();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) {
|
if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче