diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-22 18:38:11 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-22 18:38:11 -0700 | 
| commit | f08b9c2f8af0d61faa1170aeae4fbca1eff6a504 (patch) | |
| tree | 367b04b7750b66c8412bd377e549aa0fb5b3df02 /arch/x86/include/asm/apic.h | |
| parent | d79ee93de909dfb252279b9a95978bbda9a814a9 (diff) | |
| parent | 0ab711ae6ab0db7696b43c74f9ba9de4d7fc1deb (diff) | |
| download | olio-linux-3.10-f08b9c2f8af0d61faa1170aeae4fbca1eff6a504.tar.xz olio-linux-3.10-f08b9c2f8af0d61faa1170aeae4fbca1eff6a504.zip  | |
Merge branch 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86/apic changes from Ingo Molnar:
 "Most of the changes are about helping virtualized guest kernels
  achieve better performance."
Fix up trivial conflicts with the iommu updates to arch/x86/kernel/apic/io_apic.c
* 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/apic: Implement EIO micro-optimization
  x86/apic: Add apic->eoi_write() callback
  x86/apic: Use symbolic APIC_EOI_ACK
  x86/apic: Fix typo EIO_ACK -> EOI_ACK and document it
  x86/xen/apic: Add missing #include <xen/xen.h>
  x86/apic: Only compile local function if used with !CONFIG_GENERIC_PENDING_IRQ
  x86/apic: Fix UP boot crash
  x86: Conditionally update time when ack-ing pending irqs
  xen/apic: implement io apic read with hypercall
  Revert "xen/x86: Workaround 'x86/ioapic: Add register level checks to detect bogus io-apic entries'"
  xen/x86: Implement x86_apic_ops
  x86/apic: Replace io_apic_ops with x86_io_apic_ops.
Diffstat (limited to 'arch/x86/include/asm/apic.h')
| -rw-r--r-- | arch/x86/include/asm/apic.h | 23 | 
1 files changed, 20 insertions, 3 deletions
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index d8541017126..eaff4790ed9 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h @@ -138,6 +138,11 @@ static inline void native_apic_msr_write(u32 reg, u32 v)  	wrmsr(APIC_BASE_MSR + (reg >> 4), v, 0);  } +static inline void native_apic_msr_eoi_write(u32 reg, u32 v) +{ +	wrmsr(APIC_BASE_MSR + (APIC_EOI >> 4), APIC_EOI_ACK, 0); +} +  static inline u32 native_apic_msr_read(u32 reg)  {  	u64 msr; @@ -351,6 +356,14 @@ struct apic {  	/* apic ops */  	u32 (*read)(u32 reg);  	void (*write)(u32 reg, u32 v); +	/* +	 * ->eoi_write() has the same signature as ->write(). +	 * +	 * Drivers can support both ->eoi_write() and ->write() by passing the same +	 * callback value. Kernel can override ->eoi_write() and fall back +	 * on write for EOI. +	 */ +	void (*eoi_write)(u32 reg, u32 v);  	u64 (*icr_read)(void);  	void (*icr_write)(u32 low, u32 high);  	void (*wait_icr_idle)(void); @@ -426,6 +439,11 @@ static inline void apic_write(u32 reg, u32 val)  	apic->write(reg, val);  } +static inline void apic_eoi(void) +{ +	apic->eoi_write(APIC_EOI, APIC_EOI_ACK); +} +  static inline u64 apic_icr_read(void)  {  	return apic->icr_read(); @@ -450,6 +468,7 @@ static inline u32 safe_apic_wait_icr_idle(void)  static inline u32 apic_read(u32 reg) { return 0; }  static inline void apic_write(u32 reg, u32 val) { } +static inline void apic_eoi(void) { }  static inline u64 apic_icr_read(void) { return 0; }  static inline void apic_icr_write(u32 low, u32 high) { }  static inline void apic_wait_icr_idle(void) { } @@ -463,9 +482,7 @@ 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); +	apic_eoi();  }  static inline unsigned default_get_apic_id(unsigned long x)  |