diff options
| -rw-r--r-- | arch/x86/include/asm/apic.h | 16 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/apic_flat_64.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/apic_noop.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/apic_numachip.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/bigsmp_32.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/es7000_32.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/numaq_32.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/probe_32.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/summit_32.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_cluster.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_phys.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 1 |
12 files changed, 28 insertions, 1 deletions
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index a09e9ab0bbdf..bf8d065dd977 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h | |||
| @@ -351,6 +351,14 @@ struct apic { | |||
| 351 | /* apic ops */ | 351 | /* apic ops */ |
| 352 | u32 (*read)(u32 reg); | 352 | u32 (*read)(u32 reg); |
| 353 | void (*write)(u32 reg, u32 v); | 353 | void (*write)(u32 reg, u32 v); |
| 354 | /* | ||
| 355 | * ->eoi_write() has the same signature as ->write(). | ||
| 356 | * | ||
| 357 | * Drivers can support both ->eoi_write() and ->write() by passing the same | ||
| 358 | * callback value. Kernel can override ->eoi_write() and fall back | ||
| 359 | * on write for EOI. | ||
| 360 | */ | ||
| 361 | void (*eoi_write)(u32 reg, u32 v); | ||
| 354 | u64 (*icr_read)(void); | 362 | u64 (*icr_read)(void); |
| 355 | void (*icr_write)(u32 low, u32 high); | 363 | void (*icr_write)(u32 low, u32 high); |
| 356 | void (*wait_icr_idle)(void); | 364 | void (*wait_icr_idle)(void); |
| @@ -426,6 +434,11 @@ static inline void apic_write(u32 reg, u32 val) | |||
| 426 | apic->write(reg, val); | 434 | apic->write(reg, val); |
| 427 | } | 435 | } |
| 428 | 436 | ||
| 437 | static inline void apic_eoi(void) | ||
| 438 | { | ||
| 439 | apic->eoi_write(APIC_EOI, APIC_EOI_ACK); | ||
| 440 | } | ||
| 441 | |||
| 429 | static inline u64 apic_icr_read(void) | 442 | static inline u64 apic_icr_read(void) |
| 430 | { | 443 | { |
| 431 | return apic->icr_read(); | 444 | return apic->icr_read(); |
| @@ -450,6 +463,7 @@ static inline u32 safe_apic_wait_icr_idle(void) | |||
| 450 | 463 | ||
| 451 | static inline u32 apic_read(u32 reg) { return 0; } | 464 | static inline u32 apic_read(u32 reg) { return 0; } |
| 452 | static inline void apic_write(u32 reg, u32 val) { } | 465 | static inline void apic_write(u32 reg, u32 val) { } |
| 466 | static inline void apic_eoi(void) { } | ||
| 453 | static inline u64 apic_icr_read(void) { return 0; } | 467 | static inline u64 apic_icr_read(void) { return 0; } |
| 454 | static inline void apic_icr_write(u32 low, u32 high) { } | 468 | static inline void apic_icr_write(u32 low, u32 high) { } |
| 455 | static inline void apic_wait_icr_idle(void) { } | 469 | static inline void apic_wait_icr_idle(void) { } |
| @@ -463,7 +477,7 @@ static inline void ack_APIC_irq(void) | |||
| 463 | * ack_APIC_irq() actually gets compiled as a single instruction | 477 | * ack_APIC_irq() actually gets compiled as a single instruction |
| 464 | * ... yummie. | 478 | * ... yummie. |
| 465 | */ | 479 | */ |
| 466 | apic_write(APIC_EOI, APIC_EOI_ACK); | 480 | apic_eoi(); |
| 467 | } | 481 | } |
| 468 | 482 | ||
| 469 | static inline unsigned default_get_apic_id(unsigned long x) | 483 | static inline unsigned default_get_apic_id(unsigned long x) |
diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c index 359b6899a36c..0e881c46e8c8 100644 --- a/arch/x86/kernel/apic/apic_flat_64.c +++ b/arch/x86/kernel/apic/apic_flat_64.c | |||
| @@ -227,6 +227,7 @@ static struct apic apic_flat = { | |||
| 227 | 227 | ||
| 228 | .read = native_apic_mem_read, | 228 | .read = native_apic_mem_read, |
| 229 | .write = native_apic_mem_write, | 229 | .write = native_apic_mem_write, |
| 230 | .eoi_write = native_apic_mem_write, | ||
| 230 | .icr_read = native_apic_icr_read, | 231 | .icr_read = native_apic_icr_read, |
| 231 | .icr_write = native_apic_icr_write, | 232 | .icr_write = native_apic_icr_write, |
| 232 | .wait_icr_idle = native_apic_wait_icr_idle, | 233 | .wait_icr_idle = native_apic_wait_icr_idle, |
| @@ -386,6 +387,7 @@ static struct apic apic_physflat = { | |||
| 386 | 387 | ||
| 387 | .read = native_apic_mem_read, | 388 | .read = native_apic_mem_read, |
| 388 | .write = native_apic_mem_write, | 389 | .write = native_apic_mem_write, |
| 390 | .eoi_write = native_apic_mem_write, | ||
| 389 | .icr_read = native_apic_icr_read, | 391 | .icr_read = native_apic_icr_read, |
| 390 | .icr_write = native_apic_icr_write, | 392 | .icr_write = native_apic_icr_write, |
| 391 | .wait_icr_idle = native_apic_wait_icr_idle, | 393 | .wait_icr_idle = native_apic_wait_icr_idle, |
diff --git a/arch/x86/kernel/apic/apic_noop.c b/arch/x86/kernel/apic/apic_noop.c index 634ae6cdd5c9..a6e4c6e06c08 100644 --- a/arch/x86/kernel/apic/apic_noop.c +++ b/arch/x86/kernel/apic/apic_noop.c | |||
| @@ -181,6 +181,7 @@ struct apic apic_noop = { | |||
| 181 | 181 | ||
| 182 | .read = noop_apic_read, | 182 | .read = noop_apic_read, |
| 183 | .write = noop_apic_write, | 183 | .write = noop_apic_write, |
| 184 | .eoi_write = noop_apic_write, | ||
| 184 | .icr_read = noop_apic_icr_read, | 185 | .icr_read = noop_apic_icr_read, |
| 185 | .icr_write = noop_apic_icr_write, | 186 | .icr_write = noop_apic_icr_write, |
| 186 | .wait_icr_idle = noop_apic_wait_icr_idle, | 187 | .wait_icr_idle = noop_apic_wait_icr_idle, |
diff --git a/arch/x86/kernel/apic/apic_numachip.c b/arch/x86/kernel/apic/apic_numachip.c index 23e75422e013..6ec6d5d297c3 100644 --- a/arch/x86/kernel/apic/apic_numachip.c +++ b/arch/x86/kernel/apic/apic_numachip.c | |||
| @@ -295,6 +295,7 @@ static struct apic apic_numachip __refconst = { | |||
| 295 | 295 | ||
| 296 | .read = native_apic_mem_read, | 296 | .read = native_apic_mem_read, |
| 297 | .write = native_apic_mem_write, | 297 | .write = native_apic_mem_write, |
| 298 | .eoi_write = native_apic_mem_write, | ||
| 298 | .icr_read = native_apic_icr_read, | 299 | .icr_read = native_apic_icr_read, |
| 299 | .icr_write = native_apic_icr_write, | 300 | .icr_write = native_apic_icr_write, |
| 300 | .wait_icr_idle = native_apic_wait_icr_idle, | 301 | .wait_icr_idle = native_apic_wait_icr_idle, |
diff --git a/arch/x86/kernel/apic/bigsmp_32.c b/arch/x86/kernel/apic/bigsmp_32.c index 0cdec7065aff..31fbdbfbf960 100644 --- a/arch/x86/kernel/apic/bigsmp_32.c +++ b/arch/x86/kernel/apic/bigsmp_32.c | |||
| @@ -248,6 +248,7 @@ static struct apic apic_bigsmp = { | |||
| 248 | 248 | ||
| 249 | .read = native_apic_mem_read, | 249 | .read = native_apic_mem_read, |
| 250 | .write = native_apic_mem_write, | 250 | .write = native_apic_mem_write, |
| 251 | .eoi_write = native_apic_mem_write, | ||
| 251 | .icr_read = native_apic_icr_read, | 252 | .icr_read = native_apic_icr_read, |
| 252 | .icr_write = native_apic_icr_write, | 253 | .icr_write = native_apic_icr_write, |
| 253 | .wait_icr_idle = native_apic_wait_icr_idle, | 254 | .wait_icr_idle = native_apic_wait_icr_idle, |
diff --git a/arch/x86/kernel/apic/es7000_32.c b/arch/x86/kernel/apic/es7000_32.c index e42d1d3b9134..db4ab1be3c79 100644 --- a/arch/x86/kernel/apic/es7000_32.c +++ b/arch/x86/kernel/apic/es7000_32.c | |||
| @@ -678,6 +678,7 @@ static struct apic __refdata apic_es7000_cluster = { | |||
| 678 | 678 | ||
| 679 | .read = native_apic_mem_read, | 679 | .read = native_apic_mem_read, |
| 680 | .write = native_apic_mem_write, | 680 | .write = native_apic_mem_write, |
| 681 | .eoi_write = native_apic_mem_write, | ||
| 681 | .icr_read = native_apic_icr_read, | 682 | .icr_read = native_apic_icr_read, |
| 682 | .icr_write = native_apic_icr_write, | 683 | .icr_write = native_apic_icr_write, |
| 683 | .wait_icr_idle = native_apic_wait_icr_idle, | 684 | .wait_icr_idle = native_apic_wait_icr_idle, |
| @@ -742,6 +743,7 @@ static struct apic __refdata apic_es7000 = { | |||
| 742 | 743 | ||
| 743 | .read = native_apic_mem_read, | 744 | .read = native_apic_mem_read, |
| 744 | .write = native_apic_mem_write, | 745 | .write = native_apic_mem_write, |
| 746 | .eoi_write = native_apic_mem_write, | ||
| 745 | .icr_read = native_apic_icr_read, | 747 | .icr_read = native_apic_icr_read, |
| 746 | .icr_write = native_apic_icr_write, | 748 | .icr_write = native_apic_icr_write, |
| 747 | .wait_icr_idle = native_apic_wait_icr_idle, | 749 | .wait_icr_idle = native_apic_wait_icr_idle, |
diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c index 00d2422ca7c9..f00a68cca37a 100644 --- a/arch/x86/kernel/apic/numaq_32.c +++ b/arch/x86/kernel/apic/numaq_32.c | |||
| @@ -530,6 +530,7 @@ static struct apic __refdata apic_numaq = { | |||
| 530 | 530 | ||
| 531 | .read = native_apic_mem_read, | 531 | .read = native_apic_mem_read, |
| 532 | .write = native_apic_mem_write, | 532 | .write = native_apic_mem_write, |
| 533 | .eoi_write = native_apic_mem_write, | ||
| 533 | .icr_read = native_apic_icr_read, | 534 | .icr_read = native_apic_icr_read, |
| 534 | .icr_write = native_apic_icr_write, | 535 | .icr_write = native_apic_icr_write, |
| 535 | .wait_icr_idle = native_apic_wait_icr_idle, | 536 | .wait_icr_idle = native_apic_wait_icr_idle, |
diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c index ff2c1b9aac4d..1b291da09e60 100644 --- a/arch/x86/kernel/apic/probe_32.c +++ b/arch/x86/kernel/apic/probe_32.c | |||
| @@ -142,6 +142,7 @@ static struct apic apic_default = { | |||
| 142 | 142 | ||
| 143 | .read = native_apic_mem_read, | 143 | .read = native_apic_mem_read, |
| 144 | .write = native_apic_mem_write, | 144 | .write = native_apic_mem_write, |
| 145 | .eoi_write = native_apic_mem_write, | ||
| 145 | .icr_read = native_apic_icr_read, | 146 | .icr_read = native_apic_icr_read, |
| 146 | .icr_write = native_apic_icr_write, | 147 | .icr_write = native_apic_icr_write, |
| 147 | .wait_icr_idle = native_apic_wait_icr_idle, | 148 | .wait_icr_idle = native_apic_wait_icr_idle, |
diff --git a/arch/x86/kernel/apic/summit_32.c b/arch/x86/kernel/apic/summit_32.c index fea000b27f07..659897c00755 100644 --- a/arch/x86/kernel/apic/summit_32.c +++ b/arch/x86/kernel/apic/summit_32.c | |||
| @@ -546,6 +546,7 @@ static struct apic apic_summit = { | |||
| 546 | 546 | ||
| 547 | .read = native_apic_mem_read, | 547 | .read = native_apic_mem_read, |
| 548 | .write = native_apic_mem_write, | 548 | .write = native_apic_mem_write, |
| 549 | .eoi_write = native_apic_mem_write, | ||
| 549 | .icr_read = native_apic_icr_read, | 550 | .icr_read = native_apic_icr_read, |
| 550 | .icr_write = native_apic_icr_write, | 551 | .icr_write = native_apic_icr_write, |
| 551 | .wait_icr_idle = native_apic_wait_icr_idle, | 552 | .wait_icr_idle = native_apic_wait_icr_idle, |
diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c index 48f3103b3c93..a5baa785a251 100644 --- a/arch/x86/kernel/apic/x2apic_cluster.c +++ b/arch/x86/kernel/apic/x2apic_cluster.c | |||
| @@ -260,6 +260,7 @@ static struct apic apic_x2apic_cluster = { | |||
| 260 | 260 | ||
| 261 | .read = native_apic_msr_read, | 261 | .read = native_apic_msr_read, |
| 262 | .write = native_apic_msr_write, | 262 | .write = native_apic_msr_write, |
| 263 | .eoi_write = native_apic_msr_write, | ||
| 263 | .icr_read = native_x2apic_icr_read, | 264 | .icr_read = native_x2apic_icr_read, |
| 264 | .icr_write = native_x2apic_icr_write, | 265 | .icr_write = native_x2apic_icr_write, |
| 265 | .wait_icr_idle = native_x2apic_wait_icr_idle, | 266 | .wait_icr_idle = native_x2apic_wait_icr_idle, |
diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c index 991e315f4227..834035666b8d 100644 --- a/arch/x86/kernel/apic/x2apic_phys.c +++ b/arch/x86/kernel/apic/x2apic_phys.c | |||
| @@ -172,6 +172,7 @@ static struct apic apic_x2apic_phys = { | |||
| 172 | 172 | ||
| 173 | .read = native_apic_msr_read, | 173 | .read = native_apic_msr_read, |
| 174 | .write = native_apic_msr_write, | 174 | .write = native_apic_msr_write, |
| 175 | .eoi_write = native_apic_msr_write, | ||
| 175 | .icr_read = native_x2apic_icr_read, | 176 | .icr_read = native_x2apic_icr_read, |
| 176 | .icr_write = native_x2apic_icr_write, | 177 | .icr_write = native_x2apic_icr_write, |
| 177 | .wait_icr_idle = native_x2apic_wait_icr_idle, | 178 | .wait_icr_idle = native_x2apic_wait_icr_idle, |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 87bfa69e216e..5b0e3d0a3d2d 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
| @@ -404,6 +404,7 @@ static struct apic __refdata apic_x2apic_uv_x = { | |||
| 404 | 404 | ||
| 405 | .read = native_apic_msr_read, | 405 | .read = native_apic_msr_read, |
| 406 | .write = native_apic_msr_write, | 406 | .write = native_apic_msr_write, |
| 407 | .eoi_write = native_apic_msr_write, | ||
| 407 | .icr_read = native_x2apic_icr_read, | 408 | .icr_read = native_x2apic_icr_read, |
| 408 | .icr_write = native_x2apic_icr_write, | 409 | .icr_write = native_x2apic_icr_write, |
| 409 | .wait_icr_idle = native_x2apic_wait_icr_idle, | 410 | .wait_icr_idle = native_x2apic_wait_icr_idle, |
