]> git.karo-electronics.de Git - linux-beck.git/commitdiff
x86/apic: Add apic->eoi_write() callback
authorMichael S. Tsirkin <mst@redhat.com>
Wed, 16 May 2012 16:03:52 +0000 (19:03 +0300)
committerIngo Molnar <mingo@kernel.org>
Fri, 18 May 2012 07:46:08 +0000 (09:46 +0200)
Add eoi_write callback so that kvm can override
eoi accesses without touching the rest of the apic.
As a side-effect, this will enable a micro-optimization
for apics using msr.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Cc: Avi Kivity <avi@redhat.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: gleb@redhat.com
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/0df425d746c49ac2ecc405174df87752869629d2.1337184153.git.mst@redhat.com
[ tidied it up a bit ]
Signed-off-by: Ingo Molnar <mingo@kernel.org>
12 files changed:
arch/x86/include/asm/apic.h
arch/x86/kernel/apic/apic_flat_64.c
arch/x86/kernel/apic/apic_noop.c
arch/x86/kernel/apic/apic_numachip.c
arch/x86/kernel/apic/bigsmp_32.c
arch/x86/kernel/apic/es7000_32.c
arch/x86/kernel/apic/numaq_32.c
arch/x86/kernel/apic/probe_32.c
arch/x86/kernel/apic/summit_32.c
arch/x86/kernel/apic/x2apic_cluster.c
arch/x86/kernel/apic/x2apic_phys.c
arch/x86/kernel/apic/x2apic_uv_x.c

index a09e9ab0bbdfb19fe465bcdf736c10631ed4a08f..bf8d065dd9776f41d897d3672bd2bb2b1473b941 100644 (file)
@@ -351,6 +351,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 +434,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 +463,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,7 +477,7 @@ static inline void ack_APIC_irq(void)
         * ack_APIC_irq() actually gets compiled as a single instruction
         * ... yummie.
         */
-       apic_write(APIC_EOI, APIC_EOI_ACK);
+       apic_eoi();
 }
 
 static inline unsigned default_get_apic_id(unsigned long x)
index 359b6899a36cb3653fc2f6b263000caa3d6df9af..0e881c46e8c856ed41f6fc095e0381853b7e781b 100644 (file)
@@ -227,6 +227,7 @@ static struct apic apic_flat =  {
 
        .read                           = native_apic_mem_read,
        .write                          = native_apic_mem_write,
+       .eoi_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,
@@ -386,6 +387,7 @@ static struct apic apic_physflat =  {
 
        .read                           = native_apic_mem_read,
        .write                          = native_apic_mem_write,
+       .eoi_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,
index 634ae6cdd5c909a39f13fa8417710f0a29a7e125..a6e4c6e06c08feaca0752c76619ec8c482a5a77d 100644 (file)
@@ -181,6 +181,7 @@ struct apic apic_noop = {
 
        .read                           = noop_apic_read,
        .write                          = noop_apic_write,
+       .eoi_write                      = noop_apic_write,
        .icr_read                       = noop_apic_icr_read,
        .icr_write                      = noop_apic_icr_write,
        .wait_icr_idle                  = noop_apic_wait_icr_idle,
index 23e75422e0138aa42e58ff64a5a37322bd9f46bb..6ec6d5d297c3a7f01dca9e6c64cd11f44e1a295e 100644 (file)
@@ -295,6 +295,7 @@ static struct apic apic_numachip __refconst = {
 
        .read                           = native_apic_mem_read,
        .write                          = native_apic_mem_write,
+       .eoi_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,
index 0cdec7065aff7d226923f74bfc5e2819db7f750a..31fbdbfbf9607982c8769b58804b32b2c6ac29f5 100644 (file)
@@ -248,6 +248,7 @@ static struct apic apic_bigsmp = {
 
        .read                           = native_apic_mem_read,
        .write                          = native_apic_mem_write,
+       .eoi_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,
index e42d1d3b9134b3fa51c037108ae1411253a58a2f..db4ab1be3c79470045fc9ebe44a11315b2416309 100644 (file)
@@ -678,6 +678,7 @@ static struct apic __refdata apic_es7000_cluster = {
 
        .read                           = native_apic_mem_read,
        .write                          = native_apic_mem_write,
+       .eoi_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,
@@ -742,6 +743,7 @@ static struct apic __refdata apic_es7000 = {
 
        .read                           = native_apic_mem_read,
        .write                          = native_apic_mem_write,
+       .eoi_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,
index 00d2422ca7c9d9193432493c08e10f80fd7e470f..f00a68cca37a9bbd9ebc613b78fd4519e632cb4b 100644 (file)
@@ -530,6 +530,7 @@ static struct apic __refdata apic_numaq = {
 
        .read                           = native_apic_mem_read,
        .write                          = native_apic_mem_write,
+       .eoi_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,
index ff2c1b9aac4d3257fff390b7ce40cd80f7390a2a..1b291da09e6029750e0613c9b6b873d1bce2a6a6 100644 (file)
@@ -142,6 +142,7 @@ static struct apic apic_default = {
 
        .read                           = native_apic_mem_read,
        .write                          = native_apic_mem_write,
+       .eoi_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,
index fea000b27f07afd4cc90b533b5388d01161b5234..659897c007553916d129a5da1462b9e733cd6eff 100644 (file)
@@ -546,6 +546,7 @@ static struct apic apic_summit = {
 
        .read                           = native_apic_mem_read,
        .write                          = native_apic_mem_write,
+       .eoi_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,
index 48f3103b3c93f42cf885127ee682d4fbbae563b6..a5baa785a25136075509347bc2bc9983b668eac8 100644 (file)
@@ -260,6 +260,7 @@ static struct apic apic_x2apic_cluster = {
 
        .read                           = native_apic_msr_read,
        .write                          = native_apic_msr_write,
+       .eoi_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,
index 991e315f4227c8e69b5bac35372c15a86ab28b60..834035666b8dbb02eb079b49521f400a2f2c8b14 100644 (file)
@@ -172,6 +172,7 @@ static struct apic apic_x2apic_phys = {
 
        .read                           = native_apic_msr_read,
        .write                          = native_apic_msr_write,
+       .eoi_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,
index 87bfa69e216e60612d929527c0358b9b91432f52..5b0e3d0a3d2d3d826755ec4654f296914bdd7b58 100644 (file)
@@ -404,6 +404,7 @@ static struct apic __refdata apic_x2apic_uv_x = {
 
        .read                           = native_apic_msr_read,
        .write                          = native_apic_msr_write,
+       .eoi_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,