[PATCH] x86_64: Some housekeeping in local APIC code

Remove support for obsolete hardware and cleanup.

- Remove checks for non integrated APICs
- Replace apic_write_around with apic_write.
- Remove apic_read_around
- Remove APIC version reads used by old workarounds
- Remove old workaround for Simics
- Fix indentation

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Andi Kleen and committed by Linus Torvalds 11a8e778 5f1d189f

+49 -69
+36 -47
arch/x86_64/kernel/apic.c
··· 53 53 54 54 void enable_NMI_through_LVT0 (void * dummy) 55 55 { 56 - unsigned int v, ver; 56 + unsigned int v; 57 57 58 - ver = apic_read(APIC_LVR); 59 - ver = GET_APIC_VERSION(ver); 60 58 v = APIC_DM_NMI; /* unmask and set to NMI */ 61 - apic_write_around(APIC_LVT0, v); 59 + apic_write(APIC_LVT0, v); 62 60 } 63 61 64 62 int get_maxlvt(void) 65 63 { 66 - unsigned int v, ver, maxlvt; 64 + unsigned int v, maxlvt; 67 65 68 66 v = apic_read(APIC_LVR); 69 - ver = GET_APIC_VERSION(v); 70 67 maxlvt = GET_APIC_MAXLVT(v); 71 68 return maxlvt; 72 69 } ··· 81 84 */ 82 85 if (maxlvt >= 3) { 83 86 v = ERROR_APIC_VECTOR; /* any non-zero vector will do */ 84 - apic_write_around(APIC_LVTERR, v | APIC_LVT_MASKED); 87 + apic_write(APIC_LVTERR, v | APIC_LVT_MASKED); 85 88 } 86 89 /* 87 90 * Careful: we have to set masks only first to deassert 88 91 * any level-triggered sources. 89 92 */ 90 93 v = apic_read(APIC_LVTT); 91 - apic_write_around(APIC_LVTT, v | APIC_LVT_MASKED); 94 + apic_write(APIC_LVTT, v | APIC_LVT_MASKED); 92 95 v = apic_read(APIC_LVT0); 93 - apic_write_around(APIC_LVT0, v | APIC_LVT_MASKED); 96 + apic_write(APIC_LVT0, v | APIC_LVT_MASKED); 94 97 v = apic_read(APIC_LVT1); 95 - apic_write_around(APIC_LVT1, v | APIC_LVT_MASKED); 98 + apic_write(APIC_LVT1, v | APIC_LVT_MASKED); 96 99 if (maxlvt >= 4) { 97 100 v = apic_read(APIC_LVTPC); 98 - apic_write_around(APIC_LVTPC, v | APIC_LVT_MASKED); 101 + apic_write(APIC_LVTPC, v | APIC_LVT_MASKED); 99 102 } 100 103 101 104 /* 102 105 * Clean APIC state for other OSs: 103 106 */ 104 - apic_write_around(APIC_LVTT, APIC_LVT_MASKED); 105 - apic_write_around(APIC_LVT0, APIC_LVT_MASKED); 106 - apic_write_around(APIC_LVT1, APIC_LVT_MASKED); 107 + apic_write(APIC_LVTT, APIC_LVT_MASKED); 108 + apic_write(APIC_LVT0, APIC_LVT_MASKED); 109 + apic_write(APIC_LVT1, APIC_LVT_MASKED); 107 110 if (maxlvt >= 3) 108 - apic_write_around(APIC_LVTERR, APIC_LVT_MASKED); 111 + apic_write(APIC_LVTERR, APIC_LVT_MASKED); 109 112 if (maxlvt >= 4) 110 - apic_write_around(APIC_LVTPC, APIC_LVT_MASKED); 113 + apic_write(APIC_LVTPC, APIC_LVT_MASKED); 111 114 v = GET_APIC_VERSION(apic_read(APIC_LVR)); 112 115 apic_write(APIC_ESR, 0); 113 116 apic_read(APIC_ESR); ··· 152 155 value &= ~APIC_VECTOR_MASK; 153 156 value |= APIC_SPIV_APIC_ENABLED; 154 157 value |= 0xf; 155 - apic_write_around(APIC_SPIV, value); 158 + apic_write(APIC_SPIV, value); 156 159 157 160 if (!virt_wire_setup) { 158 161 /* For LVT0 make it edge triggered, active high, external and enabled */ ··· 162 165 APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED ); 163 166 value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING; 164 167 value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXTINT); 165 - apic_write_around(APIC_LVT0, value); 168 + apic_write(APIC_LVT0, value); 166 169 } 167 170 else { 168 171 /* Disable LVT0 */ 169 - apic_write_around(APIC_LVT0, APIC_LVT_MASKED); 172 + apic_write(APIC_LVT0, APIC_LVT_MASKED); 170 173 } 171 174 172 175 /* For LVT1 make it edge triggered, active high, nmi and enabled */ ··· 177 180 APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED); 178 181 value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING; 179 182 value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI); 180 - apic_write_around(APIC_LVT1, value); 183 + apic_write(APIC_LVT1, value); 181 184 } 182 185 } 183 186 ··· 193 196 */ 194 197 value = apic_read(APIC_SPIV); 195 198 value &= ~APIC_SPIV_APIC_ENABLED; 196 - apic_write_around(APIC_SPIV, value); 199 + apic_write(APIC_SPIV, value); 197 200 } 198 201 199 202 /* ··· 270 273 apic_wait_icr_idle(); 271 274 272 275 apic_printk(APIC_DEBUG, "Synchronizing Arb IDs.\n"); 273 - apic_write_around(APIC_ICR, APIC_DEST_ALLINC | APIC_INT_LEVELTRIG 276 + apic_write(APIC_ICR, APIC_DEST_ALLINC | APIC_INT_LEVELTRIG 274 277 | APIC_DM_INIT); 275 278 } 276 279 ··· 281 284 */ 282 285 void __init init_bsp_APIC(void) 283 286 { 284 - unsigned int value, ver; 287 + unsigned int value; 285 288 286 289 /* 287 290 * Don't do the setup now if we have a SMP BIOS as the ··· 291 294 return; 292 295 293 296 value = apic_read(APIC_LVR); 294 - ver = GET_APIC_VERSION(value); 295 297 296 298 /* 297 299 * Do not trust the local APIC being empty at bootup. ··· 305 309 value |= APIC_SPIV_APIC_ENABLED; 306 310 value |= APIC_SPIV_FOCUS_DISABLED; 307 311 value |= SPURIOUS_APIC_VECTOR; 308 - apic_write_around(APIC_SPIV, value); 312 + apic_write(APIC_SPIV, value); 309 313 310 314 /* 311 315 * Set up the virtual wire mode. 312 316 */ 313 - apic_write_around(APIC_LVT0, APIC_DM_EXTINT); 317 + apic_write(APIC_LVT0, APIC_DM_EXTINT); 314 318 value = APIC_DM_NMI; 315 - apic_write_around(APIC_LVT1, value); 319 + apic_write(APIC_LVT1, value); 316 320 } 317 321 318 322 void __cpuinit setup_local_APIC (void) 319 323 { 320 - unsigned int value, ver, maxlvt; 324 + unsigned int value, maxlvt; 321 325 322 326 value = apic_read(APIC_LVR); 323 - ver = GET_APIC_VERSION(value); 324 327 325 328 if ((SPURIOUS_APIC_VECTOR & 0x0f) != 0x0f) 326 329 __error_in_apic_c(); ··· 344 349 */ 345 350 value = apic_read(APIC_TASKPRI); 346 351 value &= ~APIC_TPRI_MASK; 347 - apic_write_around(APIC_TASKPRI, value); 352 + apic_write(APIC_TASKPRI, value); 348 353 349 354 /* 350 355 * Now that we are all set up, enable the APIC ··· 386 391 * Set spurious IRQ vector 387 392 */ 388 393 value |= SPURIOUS_APIC_VECTOR; 389 - apic_write_around(APIC_SPIV, value); 394 + apic_write(APIC_SPIV, value); 390 395 391 396 /* 392 397 * Set up LVT0, LVT1: ··· 406 411 value = APIC_DM_EXTINT | APIC_LVT_MASKED; 407 412 apic_printk(APIC_VERBOSE, "masked ExtINT on CPU#%d\n", smp_processor_id()); 408 413 } 409 - apic_write_around(APIC_LVT0, value); 414 + apic_write(APIC_LVT0, value); 410 415 411 416 /* 412 417 * only the BP should see the LINT1 NMI signal, obviously. ··· 415 420 value = APIC_DM_NMI; 416 421 else 417 422 value = APIC_DM_NMI | APIC_LVT_MASKED; 418 - apic_write_around(APIC_LVT1, value); 423 + apic_write(APIC_LVT1, value); 419 424 420 425 { 421 426 unsigned oldvalue; 422 427 maxlvt = get_maxlvt(); 423 428 oldvalue = apic_read(APIC_ESR); 424 429 value = ERROR_APIC_VECTOR; // enables sending errors 425 - apic_write_around(APIC_LVTERR, value); 430 + apic_write(APIC_LVTERR, value); 426 431 /* 427 432 * spec says clear errors after enabling vector. 428 433 */ ··· 667 672 if (cpu_isset(cpu, timer_interrupt_broadcast_ipi_mask)) 668 673 lvtt_value |= APIC_LVT_MASKED; 669 674 670 - apic_write_around(APIC_LVTT, lvtt_value); 675 + apic_write(APIC_LVTT, lvtt_value); 671 676 672 677 /* 673 678 * Divide PICLK by 16 674 679 */ 675 680 tmp_value = apic_read(APIC_TDCR); 676 - apic_write_around(APIC_TDCR, (tmp_value 681 + apic_write(APIC_TDCR, (tmp_value 677 682 & ~(APIC_TDR_DIV_1 | APIC_TDR_DIV_TMBASE)) 678 683 | APIC_TDR_DIV_16); 679 684 680 - apic_write_around(APIC_TMICT, clocks/APIC_DIVISOR); 685 + apic_write(APIC_TMICT, clocks/APIC_DIVISOR); 681 686 } 682 687 683 688 static void setup_APIC_timer(unsigned int clocks) ··· 685 690 unsigned long flags; 686 691 687 692 local_irq_save(flags); 688 - 689 - /* For some reasons this doesn't work on Simics, so fake it for now */ 690 - if (!strstr(boot_cpu_data.x86_model_id, "Screwdriver")) { 691 - __setup_APIC_LVTT(clocks); 692 - return; 693 - } 694 693 695 694 /* wait for irq slice */ 696 695 if (vxtime.hpet_address) { ··· 698 709 outb_p(0x00, 0x43); 699 710 c2 = inb_p(0x40); 700 711 c2 |= inb_p(0x40) << 8; 701 - do { 712 + do { 702 713 c1 = c2; 703 714 outb_p(0x00, 0x43); 704 715 c2 = inb_p(0x40); ··· 789 800 unsigned long v; 790 801 791 802 v = apic_read(APIC_LVTT); 792 - apic_write_around(APIC_LVTT, v | APIC_LVT_MASKED); 803 + apic_write(APIC_LVTT, v | APIC_LVT_MASKED); 793 804 } 794 805 } 795 806 ··· 802 813 unsigned long v; 803 814 804 815 v = apic_read(APIC_LVTT); 805 - apic_write_around(APIC_LVTT, v & ~APIC_LVT_MASKED); 816 + apic_write(APIC_LVTT, v & ~APIC_LVT_MASKED); 806 817 } 807 818 } 808 819 ··· 1055 1066 connect_bsp_APIC(); 1056 1067 1057 1068 phys_cpu_present_map = physid_mask_of_physid(boot_cpu_id); 1058 - apic_write_around(APIC_ID, SET_APIC_ID(boot_cpu_id)); 1069 + apic_write(APIC_ID, SET_APIC_ID(boot_cpu_id)); 1059 1070 1060 1071 setup_local_APIC(); 1061 1072
+7 -7
arch/x86_64/kernel/io_apic.c
··· 910 910 disable_8259A_irq(0); 911 911 912 912 /* mask LVT0 */ 913 - apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); 913 + apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); 914 914 915 915 /* 916 916 * We use logical delivery to get the timer IRQ ··· 1635 1635 unsigned long v; 1636 1636 1637 1637 v = apic_read(APIC_LVT0); 1638 - apic_write_around(APIC_LVT0, v & ~APIC_LVT_MASKED); 1638 + apic_write(APIC_LVT0, v & ~APIC_LVT_MASKED); 1639 1639 } 1640 1640 1641 1641 static void disable_lapic_irq (unsigned int irq) ··· 1643 1643 unsigned long v; 1644 1644 1645 1645 v = apic_read(APIC_LVT0); 1646 - apic_write_around(APIC_LVT0, v | APIC_LVT_MASKED); 1646 + apic_write(APIC_LVT0, v | APIC_LVT_MASKED); 1647 1647 } 1648 1648 1649 1649 static void ack_lapic_irq (unsigned int irq) ··· 1769 1769 * the 8259A which implies the virtual wire has to be 1770 1770 * disabled in the local APIC. 1771 1771 */ 1772 - apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); 1772 + apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); 1773 1773 init_8259A(1); 1774 1774 enable_8259A_irq(0); 1775 1775 ··· 1835 1835 1836 1836 disable_8259A_irq(0); 1837 1837 irq_desc[0].handler = &lapic_irq_type; 1838 - apic_write_around(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */ 1838 + apic_write(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */ 1839 1839 enable_8259A_irq(0); 1840 1840 1841 1841 if (timer_irq_works()) { 1842 1842 apic_printk(APIC_QUIET, " works.\n"); 1843 1843 return; 1844 1844 } 1845 - apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector); 1845 + apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector); 1846 1846 apic_printk(APIC_VERBOSE," failed.\n"); 1847 1847 1848 1848 apic_printk(APIC_VERBOSE, KERN_INFO "...trying to set up timer as ExtINT IRQ..."); 1849 1849 1850 1850 init_8259A(0); 1851 1851 make_8259A_irq(0); 1852 - apic_write_around(APIC_LVT0, APIC_DM_EXTINT); 1852 + apic_write(APIC_LVT0, APIC_DM_EXTINT); 1853 1853 1854 1854 unlock_ExtINT_logic(); 1855 1855
+2 -2
arch/x86_64/kernel/mce_intel.c
··· 80 80 81 81 h = THERMAL_APIC_VECTOR; 82 82 h |= (APIC_DM_FIXED | APIC_LVT_MASKED); 83 - apic_write_around(APIC_LVTTHMR, h); 83 + apic_write(APIC_LVTTHMR, h); 84 84 85 85 rdmsr(MSR_IA32_THERM_INTERRUPT, l, h); 86 86 wrmsr(MSR_IA32_THERM_INTERRUPT, l | 0x03, h); ··· 89 89 wrmsr(MSR_IA32_MISC_ENABLE, l | (1 << 3), h); 90 90 91 91 l = apic_read(APIC_LVTTHMR); 92 - apic_write_around(APIC_LVTTHMR, l & ~APIC_LVT_MASKED); 92 + apic_write(APIC_LVTTHMR, l & ~APIC_LVT_MASKED); 93 93 printk(KERN_INFO "CPU%d: Thermal monitoring enabled (%s)\n", 94 94 cpu, tm2 ? "TM2" : "TM1"); 95 95 return;
+3 -8
arch/x86_64/kernel/smpboot.c
··· 666 666 667 667 for (j = 1; j <= num_starts; j++) { 668 668 Dprintk("Sending STARTUP #%d.\n",j); 669 - apic_read_around(APIC_SPIV); 670 669 apic_write(APIC_ESR, 0); 671 670 apic_read(APIC_ESR); 672 671 Dprintk("After apic_write.\n"); ··· 704 705 * Due to the Pentium erratum 3AP. 705 706 */ 706 707 if (maxlvt > 3) { 707 - apic_read_around(APIC_SPIV); 708 708 apic_write(APIC_ESR, 0); 709 709 } 710 710 accept_status = (apic_read(APIC_ESR) & 0xEF); ··· 840 842 /* 841 843 * Be paranoid about clearing APIC errors. 842 844 */ 843 - if (APIC_INTEGRATED(apic_version[apicid])) { 844 - apic_read_around(APIC_SPIV); 845 - apic_write(APIC_ESR, 0); 846 - apic_read(APIC_ESR); 847 - } 845 + apic_write(APIC_ESR, 0); 846 + apic_read(APIC_ESR); 848 847 849 848 /* 850 849 * Status is now clean ··· 1019 1024 /* 1020 1025 * If we couldn't find a local APIC, then get out of here now! 1021 1026 */ 1022 - if (APIC_INTEGRATED(apic_version[boot_cpu_id]) && !cpu_has_apic) { 1027 + if (!cpu_has_apic) { 1023 1028 printk(KERN_ERR "BIOS bug, local APIC #%d not detected!...\n", 1024 1029 boot_cpu_id); 1025 1030 printk(KERN_ERR "... forcing use of dummy APIC emulation. (tell your hw vendor)\n");
+1 -5
include/asm-x86_64/apic.h
··· 52 52 while ( apic_read( APIC_ICR ) & APIC_ICR_BUSY ); 53 53 } 54 54 55 - #define FORCE_READ_AROUND_WRITE 0 56 - #define apic_read_around(x) 57 - #define apic_write_around(x,y) apic_write((x),(y)) 58 - 59 55 static inline void ack_APIC_irq(void) 60 56 { 61 57 /* ··· 62 66 */ 63 67 64 68 /* Docs say use 0 for future compatibility */ 65 - apic_write_around(APIC_EOI, 0); 69 + apic_write(APIC_EOI, 0); 66 70 } 67 71 68 72 extern int get_maxlvt (void);