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