~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/kernel/apic/apic.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/x86/kernel/apic/apic.c (Architecture mips) and /arch/sparc64/kernel/apic/apic.c (Architecture sparc64)


  1 // SPDX-License-Identifier: GPL-2.0-only            1 
  2 /*                                                
  3  *      Local APIC handling, local APIC timers    
  4  *                                                
  5  *      (c) 1999, 2000, 2009 Ingo Molnar <ming    
  6  *                                                
  7  *      Fixes                                     
  8  *      Maciej W. Rozycki       :       Bits f    
  9  *                                      thanks    
 10  *                                      and Ro    
 11  *                                      for te    
 12  *      Maciej W. Rozycki       :       Variou    
 13  *      Mikael Pettersson       :       Power     
 14  *      Pavel Machek and                          
 15  *      Mikael Pettersson       :       PM con    
 16  */                                               
 17                                                   
 18 #include <linux/perf_event.h>                     
 19 #include <linux/kernel_stat.h>                    
 20 #include <linux/mc146818rtc.h>                    
 21 #include <linux/acpi_pmtmr.h>                     
 22 #include <linux/bitmap.h>                         
 23 #include <linux/clockchips.h>                     
 24 #include <linux/interrupt.h>                      
 25 #include <linux/memblock.h>                       
 26 #include <linux/ftrace.h>                         
 27 #include <linux/ioport.h>                         
 28 #include <linux/export.h>                         
 29 #include <linux/syscore_ops.h>                    
 30 #include <linux/delay.h>                          
 31 #include <linux/timex.h>                          
 32 #include <linux/i8253.h>                          
 33 #include <linux/dmar.h>                           
 34 #include <linux/init.h>                           
 35 #include <linux/cpu.h>                            
 36 #include <linux/dmi.h>                            
 37 #include <linux/smp.h>                            
 38 #include <linux/mm.h>                             
 39                                                   
 40 #include <xen/xen.h>                              
 41                                                   
 42 #include <asm/trace/irq_vectors.h>                
 43 #include <asm/irq_remapping.h>                    
 44 #include <asm/pc-conf-reg.h>                      
 45 #include <asm/perf_event.h>                       
 46 #include <asm/x86_init.h>                         
 47 #include <linux/atomic.h>                         
 48 #include <asm/barrier.h>                          
 49 #include <asm/mpspec.h>                           
 50 #include <asm/i8259.h>                            
 51 #include <asm/proto.h>                            
 52 #include <asm/traps.h>                            
 53 #include <asm/apic.h>                             
 54 #include <asm/acpi.h>                             
 55 #include <asm/io_apic.h>                          
 56 #include <asm/desc.h>                             
 57 #include <asm/hpet.h>                             
 58 #include <asm/mtrr.h>                             
 59 #include <asm/time.h>                             
 60 #include <asm/smp.h>                              
 61 #include <asm/mce.h>                              
 62 #include <asm/tsc.h>                              
 63 #include <asm/hypervisor.h>                       
 64 #include <asm/cpu_device_id.h>                    
 65 #include <asm/intel-family.h>                     
 66 #include <asm/irq_regs.h>                         
 67 #include <asm/cpu.h>                              
 68                                                   
 69 #include "local.h"                                
 70                                                   
 71 /* Processor that is doing the boot up */         
 72 u32 boot_cpu_physical_apicid __ro_after_init =    
 73 EXPORT_SYMBOL_GPL(boot_cpu_physical_apicid);      
 74                                                   
 75 u8 boot_cpu_apic_version __ro_after_init;         
 76                                                   
 77 /*                                                
 78  * This variable controls which CPUs receive e    
 79  * external NMIs are delivered only to the BSP    
 80  */                                               
 81 static int apic_extnmi __ro_after_init = APIC_    
 82                                                   
 83 /*                                                
 84  * Hypervisor supports 15 bits of APIC ID in M    
 85  */                                               
 86 static bool virt_ext_dest_id __ro_after_init;     
 87                                                   
 88 /* For parallel bootup. */                        
 89 unsigned long apic_mmio_base __ro_after_init;     
 90                                                   
 91 static inline bool apic_accessible(void)          
 92 {                                                 
 93         return x2apic_mode || apic_mmio_base;     
 94 }                                                 
 95                                                   
 96 #ifdef CONFIG_X86_32                              
 97 /* Local APIC was disabled by the BIOS and ena    
 98 static int enabled_via_apicbase __ro_after_ini    
 99                                                   
100 /*                                                
101  * Handle interrupt mode configuration registe    
102  * This register controls whether the interrup    
103  * that reach the BSP come from the master PIC    
104  * local APIC. Before entering Symmetric I/O M    
105  * the BIOS or the operating system must switc    
106  * PIC Mode by changing the IMCR.                 
107  */                                               
108 static inline void imcr_pic_to_apic(void)         
109 {                                                 
110         /* NMI and 8259 INTR go through APIC *    
111         pc_conf_set(PC_CONF_MPS_IMCR, 0x01);      
112 }                                                 
113                                                   
114 static inline void imcr_apic_to_pic(void)         
115 {                                                 
116         /* NMI and 8259 INTR go directly to BS    
117         pc_conf_set(PC_CONF_MPS_IMCR, 0x00);      
118 }                                                 
119 #endif                                            
120                                                   
121 /*                                                
122  * Knob to control our willingness to enable t    
123  *                                                
124  * +1=force-enable                                
125  */                                               
126 static int force_enable_local_apic __initdata;    
127                                                   
128 /*                                                
129  * APIC command line parameters                   
130  */                                               
131 static int __init parse_lapic(char *arg)          
132 {                                                 
133         if (IS_ENABLED(CONFIG_X86_32) && !arg)    
134                 force_enable_local_apic = 1;      
135         else if (arg && !strncmp(arg, "notscde    
136                 setup_clear_cpu_cap(X86_FEATUR    
137         return 0;                                 
138 }                                                 
139 early_param("lapic", parse_lapic);                
140                                                   
141 #ifdef CONFIG_X86_64                              
142 static int apic_calibrate_pmtmr __initdata;       
143 static __init int setup_apicpmtimer(char *s)      
144 {                                                 
145         apic_calibrate_pmtmr = 1;                 
146         notsc_setup(NULL);                        
147         return 1;                                 
148 }                                                 
149 __setup("apicpmtimer", setup_apicpmtimer);        
150 #endif                                            
151                                                   
152 static unsigned long mp_lapic_addr __ro_after_    
153 bool apic_is_disabled __ro_after_init;            
154 /* Disable local APIC timer from the kernel co    
155 static int disable_apic_timer __initdata;         
156 /* Local APIC timer works in C2 */                
157 int local_apic_timer_c2_ok __ro_after_init;       
158 EXPORT_SYMBOL_GPL(local_apic_timer_c2_ok);        
159                                                   
160 /*                                                
161  * Debug level, exported for io_apic.c            
162  */                                               
163 int apic_verbosity __ro_after_init;               
164                                                   
165 int pic_mode __ro_after_init;                     
166                                                   
167 /* Have we found an MP table */                   
168 int smp_found_config __ro_after_init;             
169                                                   
170 static struct resource lapic_resource = {         
171         .name = "Local APIC",                     
172         .flags = IORESOURCE_MEM | IORESOURCE_B    
173 };                                                
174                                                   
175 unsigned int lapic_timer_period = 0;              
176                                                   
177 static void apic_pm_activate(void);               
178                                                   
179 /*                                                
180  * Get the LAPIC version                          
181  */                                               
182 static inline int lapic_get_version(void)         
183 {                                                 
184         return GET_APIC_VERSION(apic_read(APIC    
185 }                                                 
186                                                   
187 /*                                                
188  * Check, if the APIC is integrated or a separ    
189  */                                               
190 static inline int lapic_is_integrated(void)       
191 {                                                 
192         return APIC_INTEGRATED(lapic_get_versi    
193 }                                                 
194                                                   
195 /*                                                
196  * Check, whether this is a modern or a first     
197  */                                               
198 static int modern_apic(void)                      
199 {                                                 
200         /* AMD systems use old APIC versions,     
201         if (boot_cpu_data.x86_vendor == X86_VE    
202             boot_cpu_data.x86 >= 0xf)             
203                 return 1;                         
204                                                   
205         /* Hygon systems use modern APIC */       
206         if (boot_cpu_data.x86_vendor == X86_VE    
207                 return 1;                         
208                                                   
209         return lapic_get_version() >= 0x14;       
210 }                                                 
211                                                   
212 /*                                                
213  * right after this call apic become NOOP driv    
214  * so apic->write/read doesn't do anything        
215  */                                               
216 static void __init apic_disable(void)             
217 {                                                 
218         apic_install_driver(&apic_noop);          
219 }                                                 
220                                                   
221 void native_apic_icr_write(u32 low, u32 id)       
222 {                                                 
223         unsigned long flags;                      
224                                                   
225         local_irq_save(flags);                    
226         apic_write(APIC_ICR2, SET_XAPIC_DEST_F    
227         apic_write(APIC_ICR, low);                
228         local_irq_restore(flags);                 
229 }                                                 
230                                                   
231 u64 native_apic_icr_read(void)                    
232 {                                                 
233         u32 icr1, icr2;                           
234                                                   
235         icr2 = apic_read(APIC_ICR2);              
236         icr1 = apic_read(APIC_ICR);               
237                                                   
238         return icr1 | ((u64)icr2 << 32);          
239 }                                                 
240                                                   
241 /**                                               
242  * lapic_get_maxlvt - get the maximum number o    
243  */                                               
244 int lapic_get_maxlvt(void)                        
245 {                                                 
246         /*                                        
247          * - we always have APIC integrated on    
248          * - 82489DXs do not report # of LVT e    
249          */                                       
250         return lapic_is_integrated() ? GET_API    
251 }                                                 
252                                                   
253 /*                                                
254  * Local APIC timer                               
255  */                                               
256                                                   
257 /* Clock divisor */                               
258 #define APIC_DIVISOR 16                           
259 #define TSC_DIVISOR  8                            
260                                                   
261 /* i82489DX specific */                           
262 #define         I82489DX_BASE_DIVIDER             
263                                                   
264 /*                                                
265  * This function sets up the local APIC timer,    
266  * 'clocks' APIC bus clock. During calibration    
267  * this function twice on the boot CPU, once w    
268  * value, second time for real. The other (non    
269  * call this function only once, with the real    
270  *                                                
271  * We do reads before writes even if unnecessa    
272  * P5 APIC double write bug.                      
273  */                                               
274 static void __setup_APIC_LVTT(unsigned int clo    
275 {                                                 
276         unsigned int lvtt_value, tmp_value;       
277                                                   
278         lvtt_value = LOCAL_TIMER_VECTOR;          
279         if (!oneshot)                             
280                 lvtt_value |= APIC_LVT_TIMER_P    
281         else if (boot_cpu_has(X86_FEATURE_TSC_    
282                 lvtt_value |= APIC_LVT_TIMER_T    
283                                                   
284         /*                                        
285          * The i82489DX APIC uses bit 18 and 1    
286          * overlaps with bit 18 on integrated     
287          * in the SDM. No problem though. i824    
288          * have TSC deadline timer.               
289          */                                       
290         if (!lapic_is_integrated())               
291                 lvtt_value |= I82489DX_BASE_DI    
292                                                   
293         if (!irqen)                               
294                 lvtt_value |= APIC_LVT_MASKED;    
295                                                   
296         apic_write(APIC_LVTT, lvtt_value);        
297                                                   
298         if (lvtt_value & APIC_LVT_TIMER_TSCDEA    
299                 /*                                
300                  * See Intel SDM: TSC-Deadline    
301                  * writing to the APIC LVTT an    
302                  * According to Intel, MFENCE     
303                  */                               
304                 asm volatile("mfence" : : : "m    
305                 return;                           
306         }                                         
307                                                   
308         /*                                        
309          * Divide PICLK by 16                     
310          */                                       
311         tmp_value = apic_read(APIC_TDCR);         
312         apic_write(APIC_TDCR,                     
313                 (tmp_value & ~(APIC_TDR_DIV_1     
314                 APIC_TDR_DIV_16);                 
315                                                   
316         if (!oneshot)                             
317                 apic_write(APIC_TMICT, clocks     
318 }                                                 
319                                                   
320 /*                                                
321  * Setup extended LVT, AMD specific               
322  *                                                
323  * Software should use the LVT offsets the BIO    
324  * are determined by the subsystems using it l    
325  * threshold or IBS.  On K8 only offset 0 (API    
326  * are supported. Beginning with family 10h at    
327  * available.                                     
328  *                                                
329  * Since the offsets must be consistent for al    
330  * of the LVT offsets in software and reserve     
331  * vector also to be used on other cores. An o    
332  * setting the entry to APIC_EILVT_MASKED.        
333  *                                                
334  * If the BIOS is right, there should be no co    
335  * "[Firmware Bug]: ..." error message is gene    
336  * software does not properly determines the o    
337  * necessarily a BIOS bug.                        
338  */                                               
339                                                   
340 static atomic_t eilvt_offsets[APIC_EILVT_NR_MA    
341                                                   
342 static inline int eilvt_entry_is_changeable(un    
343 {                                                 
344         return (old & APIC_EILVT_MASKED)          
345                 || (new == APIC_EILVT_MASKED)     
346                 || ((new & ~APIC_EILVT_MASKED)    
347 }                                                 
348                                                   
349 static unsigned int reserve_eilvt_offset(int o    
350 {                                                 
351         unsigned int rsvd, vector;                
352                                                   
353         if (offset >= APIC_EILVT_NR_MAX)          
354                 return ~0;                        
355                                                   
356         rsvd = atomic_read(&eilvt_offsets[offs    
357         do {                                      
358                 vector = rsvd & ~APIC_EILVT_MA    
359                 if (vector && !eilvt_entry_is_    
360                         /* may not change if v    
361                         return rsvd;              
362         } while (!atomic_try_cmpxchg(&eilvt_of    
363                                                   
364         rsvd = new & ~APIC_EILVT_MASKED;          
365         if (rsvd && rsvd != vector)               
366                 pr_info("LVT offset %d assigne    
367                         offset, rsvd);            
368                                                   
369         return new;                               
370 }                                                 
371                                                   
372 /*                                                
373  * If mask=1, the LVT entry does not generate     
374  * enables the vector. See also the BKDGs. Mus    
375  * preemption disabled.                           
376  */                                               
377                                                   
378 int setup_APIC_eilvt(u8 offset, u8 vector, u8     
379 {                                                 
380         unsigned long reg = APIC_EILVTn(offset    
381         unsigned int new, old, reserved;          
382                                                   
383         new = (mask << 16) | (msg_type << 8) |    
384         old = apic_read(reg);                     
385         reserved = reserve_eilvt_offset(offset    
386                                                   
387         if (reserved != new) {                    
388                 pr_err(FW_BUG "cpu %d, try to     
389                        "vector 0x%x, but the r    
390                        "vector 0x%x on another    
391                        smp_processor_id(), reg    
392                 return -EINVAL;                   
393         }                                         
394                                                   
395         if (!eilvt_entry_is_changeable(old, ne    
396                 pr_err(FW_BUG "cpu %d, try to     
397                        "vector 0x%x, but the r    
398                        "vector 0x%x on this cp    
399                        smp_processor_id(), reg    
400                 return -EBUSY;                    
401         }                                         
402                                                   
403         apic_write(reg, new);                     
404                                                   
405         return 0;                                 
406 }                                                 
407 EXPORT_SYMBOL_GPL(setup_APIC_eilvt);              
408                                                   
409 /*                                                
410  * Program the next event, relative to now        
411  */                                               
412 static int lapic_next_event(unsigned long delt    
413                             struct clock_event    
414 {                                                 
415         apic_write(APIC_TMICT, delta);            
416         return 0;                                 
417 }                                                 
418                                                   
419 static int lapic_next_deadline(unsigned long d    
420                                struct clock_ev    
421 {                                                 
422         u64 tsc;                                  
423                                                   
424         /* This MSR is special and need a spec    
425         weak_wrmsr_fence();                       
426                                                   
427         tsc = rdtsc();                            
428         wrmsrl(MSR_IA32_TSC_DEADLINE, tsc + ((    
429         return 0;                                 
430 }                                                 
431                                                   
432 static int lapic_timer_shutdown(struct clock_e    
433 {                                                 
434         unsigned int v;                           
435                                                   
436         /* Lapic used as dummy for broadcast ?    
437         if (evt->features & CLOCK_EVT_FEAT_DUM    
438                 return 0;                         
439                                                   
440         v = apic_read(APIC_LVTT);                 
441         v |= (APIC_LVT_MASKED | LOCAL_TIMER_VE    
442         apic_write(APIC_LVTT, v);                 
443                                                   
444         /*                                        
445          * Setting APIC_LVT_MASKED (above) sho    
446          * the hardware that this timer will n    
447          * erratum 411 and some Intel CPU beha    
448          * otherwise.  Time for belt and suspe    
449          * the timer _and_ zero the counter re    
450          */                                       
451         if (v & APIC_LVT_TIMER_TSCDEADLINE)       
452                 wrmsrl(MSR_IA32_TSC_DEADLINE,     
453         else                                      
454                 apic_write(APIC_TMICT, 0);        
455                                                   
456         return 0;                                 
457 }                                                 
458                                                   
459 static inline int                                 
460 lapic_timer_set_periodic_oneshot(struct clock_    
461 {                                                 
462         /* Lapic used as dummy for broadcast ?    
463         if (evt->features & CLOCK_EVT_FEAT_DUM    
464                 return 0;                         
465                                                   
466         __setup_APIC_LVTT(lapic_timer_period,     
467         return 0;                                 
468 }                                                 
469                                                   
470 static int lapic_timer_set_periodic(struct clo    
471 {                                                 
472         return lapic_timer_set_periodic_onesho    
473 }                                                 
474                                                   
475 static int lapic_timer_set_oneshot(struct cloc    
476 {                                                 
477         return lapic_timer_set_periodic_onesho    
478 }                                                 
479                                                   
480 /*                                                
481  * Local APIC timer broadcast function            
482  */                                               
483 static void lapic_timer_broadcast(const struct    
484 {                                                 
485 #ifdef CONFIG_SMP                                 
486         __apic_send_IPI_mask(mask, LOCAL_TIMER    
487 #endif                                            
488 }                                                 
489                                                   
490                                                   
491 /*                                                
492  * The local apic timer can be used for any fu    
493  */                                               
494 static struct clock_event_device lapic_clockev    
495         .name                           = "lap    
496         .features                       = CLOC    
497                                           CLOC    
498                                           | CL    
499         .shift                          = 32,     
500         .set_state_shutdown             = lapi    
501         .set_state_periodic             = lapi    
502         .set_state_oneshot              = lapi    
503         .set_state_oneshot_stopped      = lapi    
504         .set_next_event                 = lapi    
505         .broadcast                      = lapi    
506         .rating                         = 100,    
507         .irq                            = -1,     
508 };                                                
509 static DEFINE_PER_CPU(struct clock_event_devic    
510                                                   
511 static const struct x86_cpu_id deadline_match[    
512         X86_MATCH_VFM_STEPPINGS(INTEL_HASWELL_    
513         X86_MATCH_VFM_STEPPINGS(INTEL_HASWELL_    
514                                                   
515         X86_MATCH_VFM(INTEL_BROADWELL_X,          
516                                                   
517         X86_MATCH_VFM_STEPPINGS(INTEL_BROADWEL    
518         X86_MATCH_VFM_STEPPINGS(INTEL_BROADWEL    
519         X86_MATCH_VFM_STEPPINGS(INTEL_BROADWEL    
520         X86_MATCH_VFM_STEPPINGS(INTEL_BROADWEL    
521                                                   
522         X86_MATCH_VFM_STEPPINGS(INTEL_SKYLAKE_    
523         X86_MATCH_VFM_STEPPINGS(INTEL_SKYLAKE_    
524         X86_MATCH_VFM_STEPPINGS(INTEL_SKYLAKE_    
525                                                   
526         X86_MATCH_VFM(INTEL_HASWELL,              
527         X86_MATCH_VFM(INTEL_HASWELL_L,            
528         X86_MATCH_VFM(INTEL_HASWELL_G,            
529                                                   
530         X86_MATCH_VFM(INTEL_BROADWELL,            
531         X86_MATCH_VFM(INTEL_BROADWELL_G,          
532                                                   
533         X86_MATCH_VFM(INTEL_SKYLAKE_L,            
534         X86_MATCH_VFM(INTEL_SKYLAKE,              
535                                                   
536         X86_MATCH_VFM(INTEL_KABYLAKE_L,           
537         X86_MATCH_VFM(INTEL_KABYLAKE,             
538                                                   
539         {},                                       
540 };                                                
541                                                   
542 static __init bool apic_validate_deadline_time    
543 {                                                 
544         const struct x86_cpu_id *m;               
545         u32 rev;                                  
546                                                   
547         if (!boot_cpu_has(X86_FEATURE_TSC_DEAD    
548                 return false;                     
549         if (boot_cpu_has(X86_FEATURE_HYPERVISO    
550                 return true;                      
551                                                   
552         m = x86_match_cpu(deadline_match);        
553         if (!m)                                   
554                 return true;                      
555                                                   
556         rev = (u32)m->driver_data;                
557                                                   
558         if (boot_cpu_data.microcode >= rev)       
559                 return true;                      
560                                                   
561         setup_clear_cpu_cap(X86_FEATURE_TSC_DE    
562         pr_err(FW_BUG "TSC_DEADLINE disabled d    
563                "please update microcode to ver    
564         return false;                             
565 }                                                 
566                                                   
567 /*                                                
568  * Setup the local APIC timer for this CPU. Co    
569  * of the boot CPU and register the clock even    
570  */                                               
571 static void setup_APIC_timer(void)                
572 {                                                 
573         struct clock_event_device *levt = this    
574                                                   
575         if (this_cpu_has(X86_FEATURE_ARAT)) {     
576                 lapic_clockevent.features &= ~    
577                 /* Make LAPIC timer preferable    
578                 lapic_clockevent.rating = 150;    
579         }                                         
580                                                   
581         memcpy(levt, &lapic_clockevent, sizeof    
582         levt->cpumask = cpumask_of(smp_process    
583                                                   
584         if (this_cpu_has(X86_FEATURE_TSC_DEADL    
585                 levt->name = "lapic-deadline";    
586                 levt->features &= ~(CLOCK_EVT_    
587                                     CLOCK_EVT_    
588                 levt->set_next_event = lapic_n    
589                 clockevents_config_and_registe    
590                                                   
591                                                   
592         } else                                    
593                 clockevents_register_device(le    
594 }                                                 
595                                                   
596 /*                                                
597  * Install the updated TSC frequency from reca    
598  * deadline clockevent devices.                   
599  */                                               
600 static void __lapic_update_tsc_freq(void *info    
601 {                                                 
602         struct clock_event_device *levt = this    
603                                                   
604         if (!this_cpu_has(X86_FEATURE_TSC_DEAD    
605                 return;                           
606                                                   
607         clockevents_update_freq(levt, tsc_khz     
608 }                                                 
609                                                   
610 void lapic_update_tsc_freq(void)                  
611 {                                                 
612         /*                                        
613          * The clockevent device's ->mult and     
614          * changed. In order to avoid races, s    
615          * update code on each CPU.               
616          */                                       
617         on_each_cpu(__lapic_update_tsc_freq, N    
618 }                                                 
619                                                   
620 /*                                                
621  * In this functions we calibrate APIC bus clo    
622  *                                                
623  * We want to do the calibration only once sin    
624  * irqs synchronous. CPUs connected by the sam    
625  * frequency.                                     
626  *                                                
627  * This was previously done by reading the PIT    
628  * around to find out, that a tick has elapsed    
629  * readout is broken, so it never gets out of     
630  * also reported by others.                       
631  *                                                
632  * Monitoring the jiffies value is inaccurate     
633  * infrastructure allows us to do a simple sub    
634  * handler.                                       
635  *                                                
636  * The calibration routine also uses the pm_ti    
637  * happens to run way too slow (factor 2.3 on     
638  * back to normal later in the boot process).     
639  */                                               
640                                                   
641 #define LAPIC_CAL_LOOPS         (HZ/10)           
642                                                   
643 static __initdata int lapic_cal_loops = -1;       
644 static __initdata long lapic_cal_t1, lapic_cal    
645 static __initdata unsigned long long lapic_cal    
646 static __initdata u32 lapic_cal_pm1, lapic_cal    
647 static __initdata unsigned long lapic_cal_j1,     
648                                                   
649 /*                                                
650  * Temporary interrupt handler and polled cali    
651  */                                               
652 static void __init lapic_cal_handler(struct cl    
653 {                                                 
654         unsigned long long tsc = 0;               
655         long tapic = apic_read(APIC_TMCCT);       
656         u32 pm = acpi_pm_read_early();            
657                                                   
658         if (boot_cpu_has(X86_FEATURE_TSC))        
659                 tsc = rdtsc();                    
660                                                   
661         switch (lapic_cal_loops++) {              
662         case 0:                                   
663                 lapic_cal_t1 = tapic;             
664                 lapic_cal_tsc1 = tsc;             
665                 lapic_cal_pm1 = pm;               
666                 lapic_cal_j1 = jiffies;           
667                 break;                            
668                                                   
669         case LAPIC_CAL_LOOPS:                     
670                 lapic_cal_t2 = tapic;             
671                 lapic_cal_tsc2 = tsc;             
672                 if (pm < lapic_cal_pm1)           
673                         pm += ACPI_PM_OVRRUN;     
674                 lapic_cal_pm2 = pm;               
675                 lapic_cal_j2 = jiffies;           
676                 break;                            
677         }                                         
678 }                                                 
679                                                   
680 static int __init                                 
681 calibrate_by_pmtimer(u32 deltapm, long *delta,    
682 {                                                 
683         const long pm_100ms = PMTMR_TICKS_PER_    
684         const long pm_thresh = pm_100ms / 100;    
685         unsigned long mult;                       
686         u64 res;                                  
687                                                   
688 #ifndef CONFIG_X86_PM_TIMER                       
689         return -1;                                
690 #endif                                            
691                                                   
692         apic_printk(APIC_VERBOSE, "... PM-Time    
693                                                   
694         /* Check, if the PM timer is available    
695         if (!deltapm)                             
696                 return -1;                        
697                                                   
698         mult = clocksource_hz2mult(PMTMR_TICKS    
699                                                   
700         if (deltapm > (pm_100ms - pm_thresh) &    
701             deltapm < (pm_100ms + pm_thresh))     
702                 apic_printk(APIC_VERBOSE, "...    
703                 return 0;                         
704         }                                         
705                                                   
706         res = (((u64)deltapm) *  mult) >> 22;     
707         do_div(res, 1000000);                     
708         pr_warn("APIC calibration not consiste    
709                 "with PM-Timer: %ldms instead     
710                                                   
711         /* Correct the lapic counter value */     
712         res = (((u64)(*delta)) * pm_100ms);       
713         do_div(res, deltapm);                     
714         pr_info("APIC delta adjusted to PM-Tim    
715                 "%lu (%ld)\n", (unsigned long)    
716         *delta = (long)res;                       
717                                                   
718         /* Correct the tsc counter value */       
719         if (boot_cpu_has(X86_FEATURE_TSC)) {      
720                 res = (((u64)(*deltatsc)) * pm    
721                 do_div(res, deltapm);             
722                 apic_printk(APIC_VERBOSE, "TSC    
723                                           "PM-    
724                                         (unsig    
725                 *deltatsc = (long)res;            
726         }                                         
727                                                   
728         return 0;                                 
729 }                                                 
730                                                   
731 static int __init lapic_init_clockevent(void)     
732 {                                                 
733         if (!lapic_timer_period)                  
734                 return -1;                        
735                                                   
736         /* Calculate the scaled math multiplic    
737         lapic_clockevent.mult = div_sc(lapic_t    
738                                         TICK_N    
739         lapic_clockevent.max_delta_ns =           
740                 clockevent_delta2ns(0x7FFFFFFF    
741         lapic_clockevent.max_delta_ticks = 0x7    
742         lapic_clockevent.min_delta_ns =           
743                 clockevent_delta2ns(0xF, &lapi    
744         lapic_clockevent.min_delta_ticks = 0xF    
745                                                   
746         return 0;                                 
747 }                                                 
748                                                   
749 bool __init apic_needs_pit(void)                  
750 {                                                 
751         /*                                        
752          * If the frequencies are not known, P    
753          * and apic timer calibration.            
754          */                                       
755         if (!tsc_khz || !cpu_khz)                 
756                 return true;                      
757                                                   
758         /* Is there an APIC at all or is it di    
759         if (!boot_cpu_has(X86_FEATURE_APIC) ||    
760                 return true;                      
761                                                   
762         /*                                        
763          * If interrupt delivery mode is legac    
764          * configuration, the local APIC timer    
765          * that the PIT is initialized.           
766          */                                       
767         if (apic_intr_mode == APIC_PIC ||         
768             apic_intr_mode == APIC_VIRTUAL_WIR    
769                 return true;                      
770                                                   
771         /* Virt guests may lack ARAT, but stil    
772         if (!boot_cpu_has(X86_FEATURE_ARAT))      
773                 return true;                      
774                                                   
775         /* Deadline timer is based on TSC so n    
776         if (boot_cpu_has(X86_FEATURE_TSC_DEADL    
777                 return false;                     
778                                                   
779         /* APIC timer disabled? */                
780         if (disable_apic_timer)                   
781                 return true;                      
782         /*                                        
783          * The APIC timer frequency is known a    
784          * required. If unknown, let the PIT b    
785          */                                       
786         return lapic_timer_period == 0;           
787 }                                                 
788                                                   
789 static int __init calibrate_APIC_clock(void)      
790 {                                                 
791         struct clock_event_device *levt = this    
792         u64 tsc_perj = 0, tsc_start = 0;          
793         unsigned long jif_start;                  
794         unsigned long deltaj;                     
795         long delta, deltatsc;                     
796         int pm_referenced = 0;                    
797                                                   
798         if (boot_cpu_has(X86_FEATURE_TSC_DEADL    
799                 return 0;                         
800                                                   
801         /*                                        
802          * Check if lapic timer has already be    
803          * specific routine, such as tsc calib    
804          * in the clockevent structure and ret    
805          */                                       
806         if (!lapic_init_clockevent()) {           
807                 apic_printk(APIC_VERBOSE, "lap    
808                             lapic_timer_period    
809                 /*                                
810                  * Direct calibration methods     
811                  * local APIC timer, no need f    
812                  */                               
813                 lapic_clockevent.features &= ~    
814                 return 0;                         
815         }                                         
816                                                   
817         apic_printk(APIC_VERBOSE, "Using local    
818                     "calibrating APIC timer ..    
819                                                   
820         /*                                        
821          * There are platforms w/o global cloc    
822          * making the calibration conditional     
823          * approach everywhere.                   
824          */                                       
825         local_irq_disable();                      
826                                                   
827         /*                                        
828          * Setup the APIC counter to maximum.     
829          * can underflow in the 100ms detectio    
830          */                                       
831         __setup_APIC_LVTT(0xffffffff, 0, 0);      
832                                                   
833         /*                                        
834          * Methods to terminate the calibratio    
835          *  1) Global clockevent if available     
836          *  2) TSC if available and frequency     
837          */                                       
838         jif_start = READ_ONCE(jiffies);           
839                                                   
840         if (tsc_khz) {                            
841                 tsc_start = rdtsc();              
842                 tsc_perj = div_u64((u64)tsc_kh    
843         }                                         
844                                                   
845         /*                                        
846          * Enable interrupts so the tick can f    
847          * clockevent device is available         
848          */                                       
849         local_irq_enable();                       
850                                                   
851         while (lapic_cal_loops <= LAPIC_CAL_LO    
852                 /* Wait for a tick to elapse *    
853                 while (1) {                       
854                         if (tsc_khz) {            
855                                 u64 tsc_now =     
856                                 if ((tsc_now -    
857                                         tsc_st    
858                                         break;    
859                                 }                 
860                         } else {                  
861                                 unsigned long     
862                                                   
863                                 if (time_after    
864                                         jif_st    
865                                         break;    
866                                 }                 
867                         }                         
868                         cpu_relax();              
869                 }                                 
870                                                   
871                 /* Invoke the calibration rout    
872                 local_irq_disable();              
873                 lapic_cal_handler(NULL);          
874                 local_irq_enable();               
875         }                                         
876                                                   
877         local_irq_disable();                      
878                                                   
879         /* Build delta t1-t2 as apic timer cou    
880         delta = lapic_cal_t1 - lapic_cal_t2;      
881         apic_printk(APIC_VERBOSE, "... lapic d    
882                                                   
883         deltatsc = (long)(lapic_cal_tsc2 - lap    
884                                                   
885         /* we trust the PM based calibration i    
886         pm_referenced = !calibrate_by_pmtimer(    
887                                         &delta    
888                                                   
889         lapic_timer_period = (delta * APIC_DIV    
890         lapic_init_clockevent();                  
891                                                   
892         apic_printk(APIC_VERBOSE, "..... delta    
893         apic_printk(APIC_VERBOSE, "..... mult:    
894         apic_printk(APIC_VERBOSE, "..... calib    
895                     lapic_timer_period);          
896                                                   
897         if (boot_cpu_has(X86_FEATURE_TSC)) {      
898                 apic_printk(APIC_VERBOSE, "...    
899                             "%ld.%04ld MHz.\n"    
900                             (deltatsc / LAPIC_    
901                             (deltatsc / LAPIC_    
902         }                                         
903                                                   
904         apic_printk(APIC_VERBOSE, "..... host     
905                     "%u.%04u MHz.\n",             
906                     lapic_timer_period / (1000    
907                     lapic_timer_period % (1000    
908                                                   
909         /*                                        
910          * Do a sanity check on the APIC calib    
911          */                                       
912         if (lapic_timer_period < (1000000 / HZ    
913                 local_irq_enable();               
914                 pr_warn("APIC frequency too sl    
915                 return -1;                        
916         }                                         
917                                                   
918         levt->features &= ~CLOCK_EVT_FEAT_DUMM    
919                                                   
920         /*                                        
921          * PM timer calibration failed or not     
922          * timer based calibration, if a globa    
923          * available.                             
924          */                                       
925         if (!pm_referenced && global_clock_eve    
926                 apic_printk(APIC_VERBOSE, "...    
927                                                   
928                 /*                                
929                  * Setup the apic timer manual    
930                  */                               
931                 levt->event_handler = lapic_ca    
932                 lapic_timer_set_periodic(levt)    
933                 lapic_cal_loops = -1;             
934                                                   
935                 /* Let the interrupts run */      
936                 local_irq_enable();               
937                                                   
938                 while (lapic_cal_loops <= LAPI    
939                         cpu_relax();              
940                                                   
941                 /* Stop the lapic timer */        
942                 local_irq_disable();              
943                 lapic_timer_shutdown(levt);       
944                                                   
945                 /* Jiffies delta */               
946                 deltaj = lapic_cal_j2 - lapic_    
947                 apic_printk(APIC_VERBOSE, "...    
948                                                   
949                 /* Check, if the jiffies resul    
950                 if (deltaj >= LAPIC_CAL_LOOPS-    
951                         apic_printk(APIC_VERBO    
952                 else                              
953                         levt->features |= CLOC    
954         }                                         
955         local_irq_enable();                       
956                                                   
957         if (levt->features & CLOCK_EVT_FEAT_DU    
958                 pr_warn("APIC timer disabled d    
959                 return -1;                        
960         }                                         
961                                                   
962         return 0;                                 
963 }                                                 
964                                                   
965 /*                                                
966  * Setup the boot APIC                            
967  *                                                
968  * Calibrate and verify the result.               
969  */                                               
970 void __init setup_boot_APIC_clock(void)           
971 {                                                 
972         /*                                        
973          * The local apic timer can be disable    
974          * commandline or from the CPU detecti    
975          * timer as a dummy clock event source    
976          * broadcast mechanism is used. On UP     
977          */                                       
978         if (disable_apic_timer) {                 
979                 pr_info("Disabling APIC timer\    
980                 /* No broadcast on UP ! */        
981                 if (num_possible_cpus() > 1) {    
982                         lapic_clockevent.mult     
983                         setup_APIC_timer();       
984                 }                                 
985                 return;                           
986         }                                         
987                                                   
988         if (calibrate_APIC_clock()) {             
989                 /* No broadcast on UP ! */        
990                 if (num_possible_cpus() > 1)      
991                         setup_APIC_timer();       
992                 return;                           
993         }                                         
994                                                   
995         /*                                        
996          * If nmi_watchdog is set to IO_APIC,     
997          * PIT/HPET going.  Otherwise register    
998          * device.                                
999          */                                       
1000         lapic_clockevent.features &= ~CLOCK_E    
1001                                                  
1002         /* Setup the lapic or request the bro    
1003         setup_APIC_timer();                      
1004         amd_e400_c1e_apic_setup();               
1005 }                                                
1006                                                  
1007 void setup_secondary_APIC_clock(void)            
1008 {                                                
1009         setup_APIC_timer();                      
1010         amd_e400_c1e_apic_setup();               
1011 }                                                
1012                                                  
1013 /*                                               
1014  * The guts of the apic timer interrupt          
1015  */                                              
1016 static void local_apic_timer_interrupt(void)     
1017 {                                                
1018         struct clock_event_device *evt = this    
1019                                                  
1020         /*                                       
1021          * Normally we should not be here til    
1022          * in some cases like kdump, its poss    
1023          * timer interrupt from previous kern    
1024          * new kernel the moment interrupts a    
1025          *                                       
1026          * Interrupts are enabled early and L    
1027          * its possible that when we get here    
1028          * Check for event_handler being NULL    
1029          * spurious.                             
1030          */                                      
1031         if (!evt->event_handler) {               
1032                 pr_warn("Spurious LAPIC timer    
1033                         smp_processor_id());     
1034                 /* Switch it off */              
1035                 lapic_timer_shutdown(evt);       
1036                 return;                          
1037         }                                        
1038                                                  
1039         /*                                       
1040          * the NMI deadlock-detector uses thi    
1041          */                                      
1042         inc_irq_stat(apic_timer_irqs);           
1043                                                  
1044         evt->event_handler(evt);                 
1045 }                                                
1046                                                  
1047 /*                                               
1048  * Local APIC timer interrupt. This is the mo    
1049  * local interrupts, but local timer interrup    
1050  * broadcast interrupts too. [in case the hw     
1051  *                                               
1052  * [ if a single-CPU system runs an SMP kerne    
1053  *   interrupt as well. Thus we cannot inline    
1054  */                                              
1055 DEFINE_IDTENTRY_SYSVEC(sysvec_apic_timer_inte    
1056 {                                                
1057         struct pt_regs *old_regs = set_irq_re    
1058                                                  
1059         apic_eoi();                              
1060         trace_local_timer_entry(LOCAL_TIMER_V    
1061         local_apic_timer_interrupt();            
1062         trace_local_timer_exit(LOCAL_TIMER_VE    
1063                                                  
1064         set_irq_regs(old_regs);                  
1065 }                                                
1066                                                  
1067 /*                                               
1068  * Local APIC start and shutdown                 
1069  */                                              
1070                                                  
1071 /**                                              
1072  * clear_local_APIC - shutdown the local APIC    
1073  *                                               
1074  * This is called, when a CPU is disabled and    
1075  * the local APIC has no dangling leftovers.     
1076  * leftovers during boot.                        
1077  */                                              
1078 void clear_local_APIC(void)                      
1079 {                                                
1080         int maxlvt;                              
1081         u32 v;                                   
1082                                                  
1083         if (!apic_accessible())                  
1084                 return;                          
1085                                                  
1086         maxlvt = lapic_get_maxlvt();             
1087         /*                                       
1088          * Masking an LVT entry can trigger a    
1089          * if the vector is zero. Mask LVTERR    
1090          */                                      
1091         if (maxlvt >= 3) {                       
1092                 v = ERROR_APIC_VECTOR; /* any    
1093                 apic_write(APIC_LVTERR, v | A    
1094         }                                        
1095         /*                                       
1096          * Careful: we have to set masks only    
1097          * any level-triggered sources.          
1098          */                                      
1099         v = apic_read(APIC_LVTT);                
1100         apic_write(APIC_LVTT, v | APIC_LVT_MA    
1101         v = apic_read(APIC_LVT0);                
1102         apic_write(APIC_LVT0, v | APIC_LVT_MA    
1103         v = apic_read(APIC_LVT1);                
1104         apic_write(APIC_LVT1, v | APIC_LVT_MA    
1105         if (maxlvt >= 4) {                       
1106                 v = apic_read(APIC_LVTPC);       
1107                 apic_write(APIC_LVTPC, v | AP    
1108         }                                        
1109                                                  
1110         /* lets not touch this if we didn't f    
1111 #ifdef CONFIG_X86_THERMAL_VECTOR                 
1112         if (maxlvt >= 5) {                       
1113                 v = apic_read(APIC_LVTTHMR);     
1114                 apic_write(APIC_LVTTHMR, v |     
1115         }                                        
1116 #endif                                           
1117 #ifdef CONFIG_X86_MCE_INTEL                      
1118         if (maxlvt >= 6) {                       
1119                 v = apic_read(APIC_LVTCMCI);     
1120                 if (!(v & APIC_LVT_MASKED))      
1121                         apic_write(APIC_LVTCM    
1122         }                                        
1123 #endif                                           
1124                                                  
1125         /*                                       
1126          * Clean APIC state for other OSs:       
1127          */                                      
1128         apic_write(APIC_LVTT, APIC_LVT_MASKED    
1129         apic_write(APIC_LVT0, APIC_LVT_MASKED    
1130         apic_write(APIC_LVT1, APIC_LVT_MASKED    
1131         if (maxlvt >= 3)                         
1132                 apic_write(APIC_LVTERR, APIC_    
1133         if (maxlvt >= 4)                         
1134                 apic_write(APIC_LVTPC, APIC_L    
1135                                                  
1136         /* Integrated APIC (!82489DX) ? */       
1137         if (lapic_is_integrated()) {             
1138                 if (maxlvt > 3)                  
1139                         /* Clear ESR due to P    
1140                         apic_write(APIC_ESR,     
1141                 apic_read(APIC_ESR);             
1142         }                                        
1143 }                                                
1144                                                  
1145 /**                                              
1146  * apic_soft_disable - Clears and software di    
1147  *                                               
1148  * Contrary to disable_local_APIC() this does    
1149  * MSR_IA32_APICBASE. Clearing that bit on sy    
1150  * bus would require a hardware reset as the     
1151  * arbitration. On systems with FSB delivery     
1152  * but it has to be guaranteed that no interr    
1153  * in that state and it's not clear from the     
1154  * to INIT/SIPI messages. Stay on the safe si    
1155  */                                              
1156 void apic_soft_disable(void)                     
1157 {                                                
1158         u32 value;                               
1159                                                  
1160         clear_local_APIC();                      
1161                                                  
1162         /* Soft disable APIC (implies clearin    
1163         value = apic_read(APIC_SPIV);            
1164         value &= ~APIC_SPIV_APIC_ENABLED;        
1165         apic_write(APIC_SPIV, value);            
1166 }                                                
1167                                                  
1168 /**                                              
1169  * disable_local_APIC - clear and disable the    
1170  */                                              
1171 void disable_local_APIC(void)                    
1172 {                                                
1173         if (!apic_accessible())                  
1174                 return;                          
1175                                                  
1176         apic_soft_disable();                     
1177                                                  
1178 #ifdef CONFIG_X86_32                             
1179         /*                                       
1180          * When LAPIC was disabled by the BIO    
1181          * restore the disabled state.           
1182          */                                      
1183         if (enabled_via_apicbase) {              
1184                 unsigned int l, h;               
1185                                                  
1186                 rdmsr(MSR_IA32_APICBASE, l, h    
1187                 l &= ~MSR_IA32_APICBASE_ENABL    
1188                 wrmsr(MSR_IA32_APICBASE, l, h    
1189         }                                        
1190 #endif                                           
1191 }                                                
1192                                                  
1193 /*                                               
1194  * If Linux enabled the LAPIC against the BIO    
1195  * re-entering the BIOS on shutdown.  Otherwi    
1196  * not power-off.  Additionally clear all LVT    
1197  * for the case where Linux didn't enable the    
1198  */                                              
1199 void lapic_shutdown(void)                        
1200 {                                                
1201         unsigned long flags;                     
1202                                                  
1203         if (!boot_cpu_has(X86_FEATURE_APIC) &    
1204                 return;                          
1205                                                  
1206         local_irq_save(flags);                   
1207                                                  
1208 #ifdef CONFIG_X86_32                             
1209         if (!enabled_via_apicbase)               
1210                 clear_local_APIC();              
1211         else                                     
1212 #endif                                           
1213                 disable_local_APIC();            
1214                                                  
1215                                                  
1216         local_irq_restore(flags);                
1217 }                                                
1218                                                  
1219 /**                                              
1220  * sync_Arb_IDs - synchronize APIC bus arbitr    
1221  */                                              
1222 void __init sync_Arb_IDs(void)                   
1223 {                                                
1224         /*                                       
1225          * Unsupported on P4 - see Intel Dev.    
1226          * needed on AMD.                        
1227          */                                      
1228         if (modern_apic() || boot_cpu_data.x8    
1229                 return;                          
1230                                                  
1231         /*                                       
1232          * Wait for idle.                        
1233          */                                      
1234         apic_wait_icr_idle();                    
1235                                                  
1236         apic_printk(APIC_DEBUG, "Synchronizin    
1237         apic_write(APIC_ICR, APIC_DEST_ALLINC    
1238                         APIC_INT_LEVELTRIG |     
1239 }                                                
1240                                                  
1241 enum apic_intr_mode_id apic_intr_mode __ro_af    
1242                                                  
1243 static int __init __apic_intr_mode_select(voi    
1244 {                                                
1245         /* Check kernel option */                
1246         if (apic_is_disabled) {                  
1247                 pr_info("APIC disabled via ke    
1248                 return APIC_PIC;                 
1249         }                                        
1250                                                  
1251         /* Check BIOS */                         
1252 #ifdef CONFIG_X86_64                             
1253         /* On 64-bit, the APIC must be integr    
1254         if (!boot_cpu_has(X86_FEATURE_APIC))     
1255                 apic_is_disabled = true;         
1256                 pr_info("APIC disabled by BIO    
1257                 return APIC_PIC;                 
1258         }                                        
1259 #else                                            
1260         /* On 32-bit, the APIC may be integra    
1261                                                  
1262         /* Neither 82489DX nor integrated API    
1263         if (!boot_cpu_has(X86_FEATURE_APIC) &    
1264                 apic_is_disabled = true;         
1265                 return APIC_PIC;                 
1266         }                                        
1267                                                  
1268         /* If the BIOS pretends there is an i    
1269         if (!boot_cpu_has(X86_FEATURE_APIC) &    
1270                 APIC_INTEGRATED(boot_cpu_apic    
1271                 apic_is_disabled = true;         
1272                 pr_err(FW_BUG "Local APIC not    
1273                 return APIC_PIC;                 
1274         }                                        
1275 #endif                                           
1276                                                  
1277         /* Check MP table or ACPI MADT config    
1278         if (!smp_found_config) {                 
1279                 disable_ioapic_support();        
1280                 if (!acpi_lapic) {               
1281                         pr_info("APIC: ACPI M    
1282                         return APIC_VIRTUAL_W    
1283                 }                                
1284                 return APIC_VIRTUAL_WIRE;        
1285         }                                        
1286                                                  
1287 #ifdef CONFIG_SMP                                
1288         /* If SMP should be disabled, then re    
1289         if (!setup_max_cpus) {                   
1290                 pr_info("APIC: SMP mode deact    
1291                 return APIC_SYMMETRIC_IO_NO_R    
1292         }                                        
1293 #endif                                           
1294                                                  
1295         return APIC_SYMMETRIC_IO;                
1296 }                                                
1297                                                  
1298 /* Select the interrupt delivery mode for the    
1299 void __init apic_intr_mode_select(void)          
1300 {                                                
1301         apic_intr_mode = __apic_intr_mode_sel    
1302 }                                                
1303                                                  
1304 /*                                               
1305  * An initial setup of the virtual wire mode.    
1306  */                                              
1307 void __init init_bsp_APIC(void)                  
1308 {                                                
1309         unsigned int value;                      
1310                                                  
1311         /*                                       
1312          * Don't do the setup now if we have     
1313          * through-I/O-APIC virtual wire mode    
1314          */                                      
1315         if (smp_found_config || !boot_cpu_has    
1316                 return;                          
1317                                                  
1318         /*                                       
1319          * Do not trust the local APIC being     
1320          */                                      
1321         clear_local_APIC();                      
1322                                                  
1323         /*                                       
1324          * Enable APIC.                          
1325          */                                      
1326         value = apic_read(APIC_SPIV);            
1327         value &= ~APIC_VECTOR_MASK;              
1328         value |= APIC_SPIV_APIC_ENABLED;         
1329                                                  
1330 #ifdef CONFIG_X86_32                             
1331         /* This bit is reserved on P4/Xeon an    
1332         if ((boot_cpu_data.x86_vendor == X86_    
1333             (boot_cpu_data.x86 == 15))           
1334                 value &= ~APIC_SPIV_FOCUS_DIS    
1335         else                                     
1336 #endif                                           
1337                 value |= APIC_SPIV_FOCUS_DISA    
1338         value |= SPURIOUS_APIC_VECTOR;           
1339         apic_write(APIC_SPIV, value);            
1340                                                  
1341         /*                                       
1342          * Set up the virtual wire mode.         
1343          */                                      
1344         apic_write(APIC_LVT0, APIC_DM_EXTINT)    
1345         value = APIC_DM_NMI;                     
1346         if (!lapic_is_integrated())              
1347                 value |= APIC_LVT_LEVEL_TRIGG    
1348         if (apic_extnmi == APIC_EXTNMI_NONE)     
1349                 value |= APIC_LVT_MASKED;        
1350         apic_write(APIC_LVT1, value);            
1351 }                                                
1352                                                  
1353 static void __init apic_bsp_setup(bool upmode    
1354                                                  
1355 /* Init the interrupt delivery mode for the B    
1356 void __init apic_intr_mode_init(void)            
1357 {                                                
1358         bool upmode = IS_ENABLED(CONFIG_UP_LA    
1359                                                  
1360         switch (apic_intr_mode) {                
1361         case APIC_PIC:                           
1362                 pr_info("APIC: Keep in PIC mo    
1363                 return;                          
1364         case APIC_VIRTUAL_WIRE:                  
1365                 pr_info("APIC: Switch to virt    
1366                 break;                           
1367         case APIC_VIRTUAL_WIRE_NO_CONFIG:        
1368                 pr_info("APIC: Switch to virt    
1369                 upmode = true;                   
1370                 break;                           
1371         case APIC_SYMMETRIC_IO:                  
1372                 pr_info("APIC: Switch to symm    
1373                 break;                           
1374         case APIC_SYMMETRIC_IO_NO_ROUTING:       
1375                 pr_info("APIC: Switch to symm    
1376                 break;                           
1377         }                                        
1378                                                  
1379         x86_64_probe_apic();                     
1380                                                  
1381         x86_32_install_bigsmp();                 
1382                                                  
1383         if (x86_platform.apic_post_init)         
1384                 x86_platform.apic_post_init()    
1385                                                  
1386         apic_bsp_setup(upmode);                  
1387 }                                                
1388                                                  
1389 static void lapic_setup_esr(void)                
1390 {                                                
1391         unsigned int oldvalue, value, maxlvt;    
1392                                                  
1393         if (!lapic_is_integrated()) {            
1394                 pr_info("No ESR for 82489DX.\    
1395                 return;                          
1396         }                                        
1397                                                  
1398         if (apic->disable_esr) {                 
1399                 /*                               
1400                  * Something untraceable is c    
1401                  * secondary quads ... for th    
1402                  * ESR disabled - we can't do    
1403                  * errors anyway - mbligh        
1404                  */                              
1405                 pr_info("Leaving ESR disabled    
1406                 return;                          
1407         }                                        
1408                                                  
1409         maxlvt = lapic_get_maxlvt();             
1410         if (maxlvt > 3)         /* Due to the    
1411                 apic_write(APIC_ESR, 0);         
1412         oldvalue = apic_read(APIC_ESR);          
1413                                                  
1414         /* enables sending errors */             
1415         value = ERROR_APIC_VECTOR;               
1416         apic_write(APIC_LVTERR, value);          
1417                                                  
1418         /*                                       
1419          * spec says clear errors after enabl    
1420          */                                      
1421         if (maxlvt > 3)                          
1422                 apic_write(APIC_ESR, 0);         
1423         value = apic_read(APIC_ESR);             
1424         if (value != oldvalue)                   
1425                 apic_printk(APIC_VERBOSE, "ES    
1426                         "vector: 0x%08x  afte    
1427                         oldvalue, value);        
1428 }                                                
1429                                                  
1430 #define APIC_IR_REGS            APIC_ISR_NR      
1431 #define APIC_IR_BITS            (APIC_IR_REGS    
1432 #define APIC_IR_MAPSIZE         (APIC_IR_BITS    
1433                                                  
1434 union apic_ir {                                  
1435         unsigned long   map[APIC_IR_MAPSIZE];    
1436         u32             regs[APIC_IR_REGS];      
1437 };                                               
1438                                                  
1439 static bool apic_check_and_ack(union apic_ir     
1440 {                                                
1441         int i, bit;                              
1442                                                  
1443         /* Read the IRRs */                      
1444         for (i = 0; i < APIC_IR_REGS; i++)       
1445                 irr->regs[i] = apic_read(APIC    
1446                                                  
1447         /* Read the ISRs */                      
1448         for (i = 0; i < APIC_IR_REGS; i++)       
1449                 isr->regs[i] = apic_read(APIC    
1450                                                  
1451         /*                                       
1452          * If the ISR map is not empty. ACK t    
1453          * to verify whether a pending IRR ha    
1454          * into a ISR.                           
1455          */                                      
1456         if (!bitmap_empty(isr->map, APIC_IR_B    
1457                 /*                               
1458                  * There can be multiple ISR     
1459                  * interrupt preempted a lowe    
1460                  * per set bit.                  
1461                  */                              
1462                 for_each_set_bit(bit, isr->ma    
1463                         apic_eoi();              
1464                 return true;                     
1465         }                                        
1466                                                  
1467         return !bitmap_empty(irr->map, APIC_I    
1468 }                                                
1469                                                  
1470 /*                                               
1471  * After a crash, we no longer service the in    
1472  * interrupt from previous kernel might still    
1473  *                                               
1474  * Most probably by now the CPU has serviced     
1475  * might not have done the apic_eoi() because    
1476  * came from i8259 as ExtInt. LAPIC did not g    
1477  * the ISR bit and cpu thinks it has already     
1478  * a vector might get locked. It was noticed     
1479  * 0x31). Issue an extra EOI to clear ISR.       
1480  *                                               
1481  * If there are pending IRR bits they turn in    
1482  * priority ISR bit has been acked.              
1483  */                                              
1484 static void apic_pending_intr_clear(void)        
1485 {                                                
1486         union apic_ir irr, isr;                  
1487         unsigned int i;                          
1488                                                  
1489         /* 512 loops are way oversized and gi    
1490         for (i = 0; i < 512; i++) {              
1491                 if (!apic_check_and_ack(&irr,    
1492                         return;                  
1493         }                                        
1494         /* Dump the IRR/ISR content if that f    
1495         pr_warn("APIC: Stale IRR: %256pb ISR:    
1496 }                                                
1497                                                  
1498 /**                                              
1499  * setup_local_APIC - setup the local APIC       
1500  *                                               
1501  * Used to setup local APIC while initializin    
1502  * Always called with preemption disabled.       
1503  */                                              
1504 static void setup_local_APIC(void)               
1505 {                                                
1506         int cpu = smp_processor_id();            
1507         unsigned int value;                      
1508                                                  
1509         if (apic_is_disabled) {                  
1510                 disable_ioapic_support();        
1511                 return;                          
1512         }                                        
1513                                                  
1514         /*                                       
1515          * If this comes from kexec/kcrash th    
1516          * SPIV. Soft disable it before doing    
1517          */                                      
1518         value = apic_read(APIC_SPIV);            
1519         value &= ~APIC_SPIV_APIC_ENABLED;        
1520         apic_write(APIC_SPIV, value);            
1521                                                  
1522 #ifdef CONFIG_X86_32                             
1523         /* Pound the ESR really hard over the    
1524         if (lapic_is_integrated() && apic->di    
1525                 apic_write(APIC_ESR, 0);         
1526                 apic_write(APIC_ESR, 0);         
1527                 apic_write(APIC_ESR, 0);         
1528                 apic_write(APIC_ESR, 0);         
1529         }                                        
1530 #endif                                           
1531         /*                                       
1532          * Intel recommends to set DFR, LDR a    
1533          * an APIC.  See e.g. "AP-388 82489DX    
1534          * document number 292116).              
1535          *                                       
1536          * Except for APICs which operate in     
1537          */                                      
1538         if (apic->init_apic_ldr)                 
1539                 apic->init_apic_ldr();           
1540                                                  
1541         /*                                       
1542          * Set Task Priority to 'accept all e    
1543          * vector in the 16-31 range could be    
1544          * would think it's an exception and     
1545          * never change this later on.           
1546          */                                      
1547         value = apic_read(APIC_TASKPRI);         
1548         value &= ~APIC_TPRI_MASK;                
1549         value |= 0x10;                           
1550         apic_write(APIC_TASKPRI, value);         
1551                                                  
1552         /* Clear eventually stale ISR/IRR bit    
1553         apic_pending_intr_clear();               
1554                                                  
1555         /*                                       
1556          * Now that we are all set up, enable    
1557          */                                      
1558         value = apic_read(APIC_SPIV);            
1559         value &= ~APIC_VECTOR_MASK;              
1560         /*                                       
1561          * Enable APIC                           
1562          */                                      
1563         value |= APIC_SPIV_APIC_ENABLED;         
1564                                                  
1565 #ifdef CONFIG_X86_32                             
1566         /*                                       
1567          * Some unknown Intel IO/APIC (or API    
1568          * certain networking cards. If high     
1569          * happening on a particular IOAPIC p    
1570          * entry is masked/unmasked at a high    
1571          * later IOAPIC line gets 'stuck', no    
1572          * from the device. If focus CPU is d    
1573          * away, oh well :-(                     
1574          *                                       
1575          * [ This bug can be reproduced easil    
1576          *   PCI Ne2000 networking cards and     
1577          *   BX chipset. ]                       
1578          */                                      
1579         /*                                       
1580          * Actually disabling the focus CPU c    
1581          * frequent as it makes the interrupt    
1582          * like LRU than MRU (the short-term     
1583          */                                      
1584                                                  
1585         /*                                       
1586          * - enable focus processor (bit==0)     
1587          * - 64bit mode always use processor     
1588          *   so no need to set it                
1589          */                                      
1590         value &= ~APIC_SPIV_FOCUS_DISABLED;      
1591 #endif                                           
1592                                                  
1593         /*                                       
1594          * Set spurious IRQ vector               
1595          */                                      
1596         value |= SPURIOUS_APIC_VECTOR;           
1597         apic_write(APIC_SPIV, value);            
1598                                                  
1599         perf_events_lapic_init();                
1600                                                  
1601         /*                                       
1602          * Set up LVT0, LVT1:                    
1603          *                                       
1604          * set up through-local-APIC on the b    
1605          * strictly necessary in pure symmetr    
1606          * we delegate interrupts to the 8259    
1607          */                                      
1608         /*                                       
1609          * TODO: set up through-local-APIC fr    
1610          */                                      
1611         value = apic_read(APIC_LVT0) & APIC_L    
1612         if (!cpu && (pic_mode || !value || io    
1613                 value = APIC_DM_EXTINT;          
1614                 apic_printk(APIC_VERBOSE, "en    
1615         } else {                                 
1616                 value = APIC_DM_EXTINT | APIC    
1617                 apic_printk(APIC_VERBOSE, "ma    
1618         }                                        
1619         apic_write(APIC_LVT0, value);            
1620                                                  
1621         /*                                       
1622          * Only the BSP sees the LINT1 NMI si    
1623          * modified by apic_extnmi= boot opti    
1624          */                                      
1625         if ((!cpu && apic_extnmi != APIC_EXTN    
1626             apic_extnmi == APIC_EXTNMI_ALL)      
1627                 value = APIC_DM_NMI;             
1628         else                                     
1629                 value = APIC_DM_NMI | APIC_LV    
1630                                                  
1631         /* Is 82489DX ? */                       
1632         if (!lapic_is_integrated())              
1633                 value |= APIC_LVT_LEVEL_TRIGG    
1634         apic_write(APIC_LVT1, value);            
1635                                                  
1636 #ifdef CONFIG_X86_MCE_INTEL                      
1637         /* Recheck CMCI information after loc    
1638         if (!cpu)                                
1639                 cmci_recheck();                  
1640 #endif                                           
1641 }                                                
1642                                                  
1643 static void end_local_APIC_setup(void)           
1644 {                                                
1645         lapic_setup_esr();                       
1646                                                  
1647 #ifdef CONFIG_X86_32                             
1648         {                                        
1649                 unsigned int value;              
1650                 /* Disable the local apic tim    
1651                 value = apic_read(APIC_LVTT);    
1652                 value |= (APIC_LVT_MASKED | L    
1653                 apic_write(APIC_LVTT, value);    
1654         }                                        
1655 #endif                                           
1656                                                  
1657         apic_pm_activate();                      
1658 }                                                
1659                                                  
1660 /*                                               
1661  * APIC setup function for application proces    
1662  */                                              
1663 void apic_ap_setup(void)                         
1664 {                                                
1665         setup_local_APIC();                      
1666         end_local_APIC_setup();                  
1667 }                                                
1668                                                  
1669 static __init void apic_read_boot_cpu_id(bool    
1670 {                                                
1671         /*                                       
1672          * This can be invoked from check_x2a    
1673          * selected. But that code knows for     
1674          * X2APIC.                               
1675          */                                      
1676         if (x2apic) {                            
1677                 boot_cpu_physical_apicid = na    
1678                 boot_cpu_apic_version = GET_A    
1679         } else {                                 
1680                 boot_cpu_physical_apicid = re    
1681                 boot_cpu_apic_version = GET_A    
1682         }                                        
1683         topology_register_boot_apic(boot_cpu_    
1684         x86_32_probe_bigsmp_early();             
1685 }                                                
1686                                                  
1687 #ifdef CONFIG_X86_X2APIC                         
1688 int x2apic_mode;                                 
1689 EXPORT_SYMBOL_GPL(x2apic_mode);                  
1690                                                  
1691 enum {                                           
1692         X2APIC_OFF,                              
1693         X2APIC_DISABLED,                         
1694         /* All states below here have X2APIC     
1695         X2APIC_ON,                               
1696         X2APIC_ON_LOCKED                         
1697 };                                               
1698 static int x2apic_state;                         
1699                                                  
1700 static bool x2apic_hw_locked(void)               
1701 {                                                
1702         u64 x86_arch_cap_msr;                    
1703         u64 msr;                                 
1704                                                  
1705         x86_arch_cap_msr = x86_read_arch_cap_    
1706         if (x86_arch_cap_msr & ARCH_CAP_XAPIC    
1707                 rdmsrl(MSR_IA32_XAPIC_DISABLE    
1708                 return (msr & LEGACY_XAPIC_DI    
1709         }                                        
1710         return false;                            
1711 }                                                
1712                                                  
1713 static void __x2apic_disable(void)               
1714 {                                                
1715         u64 msr;                                 
1716                                                  
1717         if (!boot_cpu_has(X86_FEATURE_APIC))     
1718                 return;                          
1719                                                  
1720         rdmsrl(MSR_IA32_APICBASE, msr);          
1721         if (!(msr & X2APIC_ENABLE))              
1722                 return;                          
1723         /* Disable xapic and x2apic first and    
1724         wrmsrl(MSR_IA32_APICBASE, msr & ~(X2A    
1725         wrmsrl(MSR_IA32_APICBASE, msr & ~X2AP    
1726         printk_once(KERN_INFO "x2apic disable    
1727 }                                                
1728                                                  
1729 static void __x2apic_enable(void)                
1730 {                                                
1731         u64 msr;                                 
1732                                                  
1733         rdmsrl(MSR_IA32_APICBASE, msr);          
1734         if (msr & X2APIC_ENABLE)                 
1735                 return;                          
1736         wrmsrl(MSR_IA32_APICBASE, msr | X2API    
1737         printk_once(KERN_INFO "x2apic enabled    
1738 }                                                
1739                                                  
1740 static int __init setup_nox2apic(char *str)      
1741 {                                                
1742         if (x2apic_enabled()) {                  
1743                 u32 apicid = native_apic_msr_    
1744                                                  
1745                 if (apicid >= 255) {             
1746                         pr_warn("Apicid: %08x    
1747                                 apicid);         
1748                         return 0;                
1749                 }                                
1750                 if (x2apic_hw_locked()) {        
1751                         pr_warn("APIC locked     
1752                         return 0;                
1753                 }                                
1754                 pr_warn("x2apic already enabl    
1755                 __x2apic_disable();              
1756         }                                        
1757         setup_clear_cpu_cap(X86_FEATURE_X2API    
1758         x2apic_state = X2APIC_DISABLED;          
1759         x2apic_mode = 0;                         
1760         return 0;                                
1761 }                                                
1762 early_param("nox2apic", setup_nox2apic);         
1763                                                  
1764 /* Called from cpu_init() to enable x2apic on    
1765 void x2apic_setup(void)                          
1766 {                                                
1767         /*                                       
1768          * Try to make the AP's APIC state ma    
1769          * BSP is unlocked and the AP is lock    
1770          * Warn about the mismatch in case a     
1771          * trying to be turned off.              
1772          */                                      
1773         if (x2apic_state != X2APIC_ON_LOCKED     
1774                 pr_warn("x2apic lock mismatch    
1775         /*                                       
1776          * If x2apic is not in ON or LOCKED s    
1777          * from BIOS.                            
1778          */                                      
1779         if (x2apic_state < X2APIC_ON) {          
1780                 __x2apic_disable();              
1781                 return;                          
1782         }                                        
1783         __x2apic_enable();                       
1784 }                                                
1785                                                  
1786 static __init void apic_set_fixmap(bool read_    
1787                                                  
1788 static __init void x2apic_disable(void)          
1789 {                                                
1790         u32 x2apic_id;                           
1791                                                  
1792         if (x2apic_state < X2APIC_ON)            
1793                 return;                          
1794                                                  
1795         x2apic_id = read_apic_id();              
1796         if (x2apic_id >= 255)                    
1797                 panic("Cannot disable x2apic,    
1798                                                  
1799         if (x2apic_hw_locked()) {                
1800                 pr_warn("Cannot disable locke    
1801                 return;                          
1802         }                                        
1803                                                  
1804         __x2apic_disable();                      
1805                                                  
1806         x2apic_mode = 0;                         
1807         x2apic_state = X2APIC_DISABLED;          
1808                                                  
1809         /*                                       
1810          * Don't reread the APIC ID as it was    
1811          * check_x2apic() and the APIC driver    
1812          * which fails to do the read after x    
1813          */                                      
1814         apic_set_fixmap(false);                  
1815 }                                                
1816                                                  
1817 static __init void x2apic_enable(void)           
1818 {                                                
1819         if (x2apic_state != X2APIC_OFF)          
1820                 return;                          
1821                                                  
1822         x2apic_mode = 1;                         
1823         x2apic_state = X2APIC_ON;                
1824         __x2apic_enable();                       
1825 }                                                
1826                                                  
1827 static __init void try_to_enable_x2apic(int r    
1828 {                                                
1829         if (x2apic_state == X2APIC_DISABLED)     
1830                 return;                          
1831                                                  
1832         if (remap_mode != IRQ_REMAP_X2APIC_MO    
1833                 u32 apic_limit = 255;            
1834                                                  
1835                 /*                               
1836                  * Using X2APIC without IR is    
1837                  * on bare metal but may be s    
1838                  */                              
1839                 if (!x86_init.hyper.x2apic_av    
1840                         pr_info("x2apic: IRQ     
1841                         x2apic_disable();        
1842                         return;                  
1843                 }                                
1844                                                  
1845                 /*                               
1846                  * If the hypervisor supports    
1847                  * MSI, that increases the ma    
1848                  * used for non-remapped IRQ     
1849                  */                              
1850                 if (x86_init.hyper.msi_ext_de    
1851                         virt_ext_dest_id = 1;    
1852                         apic_limit = 32767;      
1853                 }                                
1854                                                  
1855                 /*                               
1856                  * Without IR, all CPUs can b    
1857                  * in physical mode, and CPUs    
1858                  * be addressed must not be b    
1859                  */                              
1860                 x2apic_set_max_apicid(apic_li    
1861                 x2apic_phys = 1;                 
1862         }                                        
1863         x2apic_enable();                         
1864 }                                                
1865                                                  
1866 void __init check_x2apic(void)                   
1867 {                                                
1868         if (x2apic_enabled()) {                  
1869                 pr_info("x2apic: enabled by B    
1870                 x2apic_mode = 1;                 
1871                 if (x2apic_hw_locked())          
1872                         x2apic_state = X2APIC    
1873                 else                             
1874                         x2apic_state = X2APIC    
1875                 apic_read_boot_cpu_id(true);     
1876         } else if (!boot_cpu_has(X86_FEATURE_    
1877                 x2apic_state = X2APIC_DISABLE    
1878         }                                        
1879 }                                                
1880 #else /* CONFIG_X86_X2APIC */                    
1881 void __init check_x2apic(void)                   
1882 {                                                
1883         if (!apic_is_x2apic_enabled())           
1884                 return;                          
1885         /*                                       
1886          * Checkme: Can we simply turn off x2    
1887          */                                      
1888         pr_err("Kernel does not support x2API    
1889         pr_err("Disabling APIC, expect reduce    
1890                                                  
1891         apic_is_disabled = true;                 
1892         setup_clear_cpu_cap(X86_FEATURE_APIC)    
1893 }                                                
1894                                                  
1895 static inline void try_to_enable_x2apic(int r    
1896 static inline void __x2apic_enable(void) { }     
1897 #endif /* !CONFIG_X86_X2APIC */                  
1898                                                  
1899 void __init enable_IR_x2apic(void)               
1900 {                                                
1901         unsigned long flags;                     
1902         int ret, ir_stat;                        
1903                                                  
1904         if (ioapic_is_disabled) {                
1905                 pr_info("Not enabling interru    
1906                 return;                          
1907         }                                        
1908                                                  
1909         ir_stat = irq_remapping_prepare();       
1910         if (ir_stat < 0 && !x2apic_supported(    
1911                 return;                          
1912                                                  
1913         ret = save_ioapic_entries();             
1914         if (ret) {                               
1915                 pr_info("Saving IO-APIC state    
1916                 return;                          
1917         }                                        
1918                                                  
1919         local_irq_save(flags);                   
1920         legacy_pic->mask_all();                  
1921         mask_ioapic_entries();                   
1922                                                  
1923         /* If irq_remapping_prepare() succeed    
1924         if (ir_stat >= 0)                        
1925                 ir_stat = irq_remapping_enabl    
1926         /* ir_stat contains the remap mode or    
1927         try_to_enable_x2apic(ir_stat);           
1928                                                  
1929         if (ir_stat < 0)                         
1930                 restore_ioapic_entries();        
1931         legacy_pic->restore_mask();              
1932         local_irq_restore(flags);                
1933 }                                                
1934                                                  
1935 #ifdef CONFIG_X86_64                             
1936 /*                                               
1937  * Detect and enable local APICs on non-SMP b    
1938  * Original code written by Keir Fraser.         
1939  * On AMD64 we trust the BIOS - if it says no    
1940  * not correctly set up (usually the APIC tim    
1941  */                                              
1942 static bool __init detect_init_APIC(void)        
1943 {                                                
1944         if (!boot_cpu_has(X86_FEATURE_APIC))     
1945                 pr_info("No local APIC presen    
1946                 return false;                    
1947         }                                        
1948                                                  
1949         register_lapic_address(APIC_DEFAULT_P    
1950         return true;                             
1951 }                                                
1952 #else                                            
1953                                                  
1954 static bool __init apic_verify(unsigned long     
1955 {                                                
1956         u32 features, h, l;                      
1957                                                  
1958         /*                                       
1959          * The APIC feature bit should now be    
1960          * in `cpuid'                            
1961          */                                      
1962         features = cpuid_edx(1);                 
1963         if (!(features & (1 << X86_FEATURE_AP    
1964                 pr_warn("Could not enable API    
1965                 return false;                    
1966         }                                        
1967         set_cpu_cap(&boot_cpu_data, X86_FEATU    
1968                                                  
1969         /* The BIOS may have set up the APIC     
1970         if (boot_cpu_data.x86 >= 6) {            
1971                 rdmsr(MSR_IA32_APICBASE, l, h    
1972                 if (l & MSR_IA32_APICBASE_ENA    
1973                         addr = l & MSR_IA32_A    
1974         }                                        
1975                                                  
1976         register_lapic_address(addr);            
1977         pr_info("Found and enabled local APIC    
1978         return true;                             
1979 }                                                
1980                                                  
1981 bool __init apic_force_enable(unsigned long a    
1982 {                                                
1983         u32 h, l;                                
1984                                                  
1985         if (apic_is_disabled)                    
1986                 return false;                    
1987                                                  
1988         /*                                       
1989          * Some BIOSes disable the local APIC    
1990          * MSR. This can only be done in soft    
1991          * and AMD K7 (Model > 1) or later.      
1992          */                                      
1993         if (boot_cpu_data.x86 >= 6) {            
1994                 rdmsr(MSR_IA32_APICBASE, l, h    
1995                 if (!(l & MSR_IA32_APICBASE_E    
1996                         pr_info("Local APIC d    
1997                         l &= ~MSR_IA32_APICBA    
1998                         l |= MSR_IA32_APICBAS    
1999                         wrmsr(MSR_IA32_APICBA    
2000                         enabled_via_apicbase     
2001                 }                                
2002         }                                        
2003         return apic_verify(addr);                
2004 }                                                
2005                                                  
2006 /*                                               
2007  * Detect and initialize APIC                    
2008  */                                              
2009 static bool __init detect_init_APIC(void)        
2010 {                                                
2011         /* Disabled by kernel option? */         
2012         if (apic_is_disabled)                    
2013                 return false;                    
2014                                                  
2015         switch (boot_cpu_data.x86_vendor) {      
2016         case X86_VENDOR_AMD:                     
2017                 if ((boot_cpu_data.x86 == 6 &    
2018                     (boot_cpu_data.x86 >= 15)    
2019                         break;                   
2020                 goto no_apic;                    
2021         case X86_VENDOR_HYGON:                   
2022                 break;                           
2023         case X86_VENDOR_INTEL:                   
2024                 if (boot_cpu_data.x86 == 6 ||    
2025                     (boot_cpu_data.x86 == 5 &    
2026                         break;                   
2027                 goto no_apic;                    
2028         default:                                 
2029                 goto no_apic;                    
2030         }                                        
2031                                                  
2032         if (!boot_cpu_has(X86_FEATURE_APIC))     
2033                 /*                               
2034                  * Over-ride BIOS and try to     
2035                  * "lapic" specified.            
2036                  */                              
2037                 if (!force_enable_local_apic)    
2038                         pr_info("Local APIC d    
2039                                 "you can enab    
2040                         return false;            
2041                 }                                
2042                 if (!apic_force_enable(APIC_D    
2043                         return false;            
2044         } else {                                 
2045                 if (!apic_verify(APIC_DEFAULT    
2046                         return false;            
2047         }                                        
2048                                                  
2049         apic_pm_activate();                      
2050                                                  
2051         return true;                             
2052                                                  
2053 no_apic:                                         
2054         pr_info("No local APIC present or har    
2055         return false;                            
2056 }                                                
2057 #endif                                           
2058                                                  
2059 /**                                              
2060  * init_apic_mappings - initialize APIC mappi    
2061  */                                              
2062 void __init init_apic_mappings(void)             
2063 {                                                
2064         if (apic_validate_deadline_timer())      
2065                 pr_info("TSC deadline timer a    
2066                                                  
2067         if (x2apic_mode)                         
2068                 return;                          
2069                                                  
2070         if (!smp_found_config) {                 
2071                 if (!detect_init_APIC()) {       
2072                         pr_info("APIC: disabl    
2073                         apic_disable();          
2074                 }                                
2075         }                                        
2076 }                                                
2077                                                  
2078 static __init void apic_set_fixmap(bool read_    
2079 {                                                
2080         set_fixmap_nocache(FIX_APIC_BASE, mp_    
2081         apic_mmio_base = APIC_BASE;              
2082         apic_printk(APIC_VERBOSE, "mapped API    
2083                     apic_mmio_base, mp_lapic_    
2084         if (read_apic)                           
2085                 apic_read_boot_cpu_id(false);    
2086 }                                                
2087                                                  
2088 void __init register_lapic_address(unsigned l    
2089 {                                                
2090         /* This should only happen once */       
2091         WARN_ON_ONCE(mp_lapic_addr);             
2092         mp_lapic_addr = address;                 
2093                                                  
2094         if (!x2apic_mode)                        
2095                 apic_set_fixmap(true);           
2096 }                                                
2097                                                  
2098 /*                                               
2099  * Local APIC interrupts                         
2100  */                                              
2101                                                  
2102 /*                                               
2103  * Common handling code for spurious_interrup    
2104  * points below. No point in allowing the com    
2105  */                                              
2106 static noinline void handle_spurious_interrup    
2107 {                                                
2108         u32 v;                                   
2109                                                  
2110         trace_spurious_apic_entry(vector);       
2111                                                  
2112         inc_irq_stat(irq_spurious_count);        
2113                                                  
2114         /*                                       
2115          * If this is a spurious interrupt th    
2116          */                                      
2117         if (vector == SPURIOUS_APIC_VECTOR) {    
2118                 /* See SDM vol 3 */              
2119                 pr_info("Spurious APIC interr    
2120                         smp_processor_id());     
2121                 goto out;                        
2122         }                                        
2123                                                  
2124         /*                                       
2125          * If it is a vectored one, verify it    
2126          * acknowledge it.                       
2127          */                                      
2128         v = apic_read(APIC_ISR + ((vector & ~    
2129         if (v & (1 << (vector & 0x1f))) {        
2130                 pr_info("Spurious interrupt (    
2131                         vector, smp_processor    
2132                 apic_eoi();                      
2133         } else {                                 
2134                 pr_info("Spurious interrupt (    
2135                         vector, smp_processor    
2136         }                                        
2137 out:                                             
2138         trace_spurious_apic_exit(vector);        
2139 }                                                
2140                                                  
2141 /**                                              
2142  * spurious_interrupt - Catch all for interru    
2143  * @regs:       Pointer to pt_regs on stack      
2144  * @vector:     The vector number                
2145  *                                               
2146  * This is invoked from ASM entry code to cat    
2147  * trigger on an entry which is routed to the    
2148  * point.                                        
2149  */                                              
2150 DEFINE_IDTENTRY_IRQ(spurious_interrupt)          
2151 {                                                
2152         handle_spurious_interrupt(vector);       
2153 }                                                
2154                                                  
2155 DEFINE_IDTENTRY_SYSVEC(sysvec_spurious_apic_i    
2156 {                                                
2157         handle_spurious_interrupt(SPURIOUS_AP    
2158 }                                                
2159                                                  
2160 /*                                               
2161  * This interrupt should never happen with ou    
2162  */                                              
2163 DEFINE_IDTENTRY_SYSVEC(sysvec_error_interrupt    
2164 {                                                
2165         static const char * const error_inter    
2166                 "Send CS error",                 
2167                 "Receive CS error",              
2168                 "Send accept error",             
2169                 "Receive accept error",          
2170                 "Redirectable IPI",              
2171                 "Send illegal vector",           
2172                 "Received illegal vector",       
2173                 "Illegal register address",      
2174         };                                       
2175         u32 v, i = 0;                            
2176                                                  
2177         trace_error_apic_entry(ERROR_APIC_VEC    
2178                                                  
2179         /* First tickle the hardware, only th    
2180         if (lapic_get_maxlvt() > 3)     /* Du    
2181                 apic_write(APIC_ESR, 0);         
2182         v = apic_read(APIC_ESR);                 
2183         apic_eoi();                              
2184         atomic_inc(&irq_err_count);              
2185                                                  
2186         apic_printk(APIC_DEBUG, KERN_DEBUG "A    
2187                     smp_processor_id(), v);      
2188                                                  
2189         v &= 0xff;                               
2190         while (v) {                              
2191                 if (v & 0x1)                     
2192                         apic_printk(APIC_DEBU    
2193                 i++;                             
2194                 v >>= 1;                         
2195         }                                        
2196                                                  
2197         apic_printk(APIC_DEBUG, KERN_CONT "\n    
2198                                                  
2199         trace_error_apic_exit(ERROR_APIC_VECT    
2200 }                                                
2201                                                  
2202 /**                                              
2203  * connect_bsp_APIC - attach the APIC to the     
2204  */                                              
2205 static void __init connect_bsp_APIC(void)        
2206 {                                                
2207 #ifdef CONFIG_X86_32                             
2208         if (pic_mode) {                          
2209                 /*                               
2210                  * Do not trust the local API    
2211                  */                              
2212                 clear_local_APIC();              
2213                 /*                               
2214                  * PIC mode, enable APIC mode    
2215                  * local APIC to INT and NMI     
2216                  */                              
2217                 apic_printk(APIC_VERBOSE, "le    
2218                                 "enabling API    
2219                 imcr_pic_to_apic();              
2220         }                                        
2221 #endif                                           
2222 }                                                
2223                                                  
2224 /**                                              
2225  * disconnect_bsp_APIC - detach the APIC from    
2226  * @virt_wire_setup:    indicates, whether vi    
2227  *                                               
2228  * Virtual wire mode is necessary to deliver     
2229  * APIC is disabled.                             
2230  */                                              
2231 void disconnect_bsp_APIC(int virt_wire_setup)    
2232 {                                                
2233         unsigned int value;                      
2234                                                  
2235 #ifdef CONFIG_X86_32                             
2236         if (pic_mode) {                          
2237                 /*                               
2238                  * Put the board back into PI    
2239                  * certain older boards).  No    
2240                  * IPIs, won't work beyond th    
2241                  * INIT IPIs.                    
2242                  */                              
2243                 apic_printk(APIC_VERBOSE, "di    
2244                                 "entering PIC    
2245                 imcr_apic_to_pic();              
2246                 return;                          
2247         }                                        
2248 #endif                                           
2249                                                  
2250         /* Go back to Virtual Wire compatibil    
2251                                                  
2252         /* For the spurious interrupt use vec    
2253         value = apic_read(APIC_SPIV);            
2254         value &= ~APIC_VECTOR_MASK;              
2255         value |= APIC_SPIV_APIC_ENABLED;         
2256         value |= 0xf;                            
2257         apic_write(APIC_SPIV, value);            
2258                                                  
2259         if (!virt_wire_setup) {                  
2260                 /*                               
2261                  * For LVT0 make it edge trig    
2262                  * external and enabled          
2263                  */                              
2264                 value = apic_read(APIC_LVT0);    
2265                 value &= ~(APIC_MODE_MASK | A    
2266                         APIC_INPUT_POLARITY |    
2267                         APIC_LVT_LEVEL_TRIGGE    
2268                 value |= APIC_LVT_REMOTE_IRR     
2269                 value = SET_APIC_DELIVERY_MOD    
2270                 apic_write(APIC_LVT0, value);    
2271         } else {                                 
2272                 /* Disable LVT0 */               
2273                 apic_write(APIC_LVT0, APIC_LV    
2274         }                                        
2275                                                  
2276         /*                                       
2277          * For LVT1 make it edge triggered, a    
2278          * nmi and enabled                       
2279          */                                      
2280         value = apic_read(APIC_LVT1);            
2281         value &= ~(APIC_MODE_MASK | APIC_SEND    
2282                         APIC_INPUT_POLARITY |    
2283                         APIC_LVT_LEVEL_TRIGGE    
2284         value |= APIC_LVT_REMOTE_IRR | APIC_S    
2285         value = SET_APIC_DELIVERY_MODE(value,    
2286         apic_write(APIC_LVT1, value);            
2287 }                                                
2288                                                  
2289 void __irq_msi_compose_msg(struct irq_cfg *cf    
2290                            bool dmar)            
2291 {                                                
2292         memset(msg, 0, sizeof(*msg));            
2293                                                  
2294         msg->arch_addr_lo.base_address = X86_    
2295         msg->arch_addr_lo.dest_mode_logical =    
2296         msg->arch_addr_lo.destid_0_7 = cfg->d    
2297                                                  
2298         msg->arch_data.delivery_mode = APIC_D    
2299         msg->arch_data.vector = cfg->vector;     
2300                                                  
2301         msg->address_hi = X86_MSI_BASE_ADDRES    
2302         /*                                       
2303          * Only the IOMMU itself can use the     
2304          * APIC ID into the high bits of the     
2305          * just be writing to memory if it tr    
2306          * address APICs which can't be addre    
2307          * address range at 0xFFExxxxx. That     
2308          * some hypervisors allow the extende    
2309          * 5-11 to be used, giving support fo    
2310          */                                      
2311         if (dmar)                                
2312                 msg->arch_addr_hi.destid_8_31    
2313         else if (virt_ext_dest_id && cfg->des    
2314                 msg->arch_addr_lo.virt_destid    
2315         else                                     
2316                 WARN_ON_ONCE(cfg->dest_apicid    
2317 }                                                
2318                                                  
2319 u32 x86_msi_msg_get_destid(struct msi_msg *ms    
2320 {                                                
2321         u32 dest = msg->arch_addr_lo.destid_0    
2322                                                  
2323         if (extid)                               
2324                 dest |= msg->arch_addr_hi.des    
2325         return dest;                             
2326 }                                                
2327 EXPORT_SYMBOL_GPL(x86_msi_msg_get_destid);       
2328                                                  
2329 static void __init apic_bsp_up_setup(void)       
2330 {                                                
2331         reset_phys_cpu_present_map(boot_cpu_p    
2332 }                                                
2333                                                  
2334 /**                                              
2335  * apic_bsp_setup - Setup function for local     
2336  * @upmode:             Force UP mode (for AP    
2337  */                                              
2338 static void __init apic_bsp_setup(bool upmode    
2339 {                                                
2340         connect_bsp_APIC();                      
2341         if (upmode)                              
2342                 apic_bsp_up_setup();             
2343         setup_local_APIC();                      
2344                                                  
2345         enable_IO_APIC();                        
2346         end_local_APIC_setup();                  
2347         irq_remap_enable_fault_handling();       
2348         setup_IO_APIC();                         
2349         lapic_update_legacy_vectors();           
2350 }                                                
2351                                                  
2352 #ifdef CONFIG_UP_LATE_INIT                       
2353 void __init up_late_init(void)                   
2354 {                                                
2355         if (apic_intr_mode == APIC_PIC)          
2356                 return;                          
2357                                                  
2358         /* Setup local timer */                  
2359         x86_init.timers.setup_percpu_clockev(    
2360 }                                                
2361 #endif                                           
2362                                                  
2363 /*                                               
2364  * Power management                              
2365  */                                              
2366 #ifdef CONFIG_PM                                 
2367                                                  
2368 static struct {                                  
2369         /*                                       
2370          * 'active' is true if the local APIC    
2371          * not the BIOS; this signifies that     
2372          * for disabling it before entering a    
2373          */                                      
2374         int active;                              
2375         /* r/w apic fields */                    
2376         u32 apic_id;                             
2377         unsigned int apic_taskpri;               
2378         unsigned int apic_ldr;                   
2379         unsigned int apic_dfr;                   
2380         unsigned int apic_spiv;                  
2381         unsigned int apic_lvtt;                  
2382         unsigned int apic_lvtpc;                 
2383         unsigned int apic_lvt0;                  
2384         unsigned int apic_lvt1;                  
2385         unsigned int apic_lvterr;                
2386         unsigned int apic_tmict;                 
2387         unsigned int apic_tdcr;                  
2388         unsigned int apic_thmr;                  
2389         unsigned int apic_cmci;                  
2390 } apic_pm_state;                                 
2391                                                  
2392 static int lapic_suspend(void)                   
2393 {                                                
2394         unsigned long flags;                     
2395         int maxlvt;                              
2396                                                  
2397         if (!apic_pm_state.active)               
2398                 return 0;                        
2399                                                  
2400         maxlvt = lapic_get_maxlvt();             
2401                                                  
2402         apic_pm_state.apic_id = apic_read(API    
2403         apic_pm_state.apic_taskpri = apic_rea    
2404         apic_pm_state.apic_ldr = apic_read(AP    
2405         apic_pm_state.apic_dfr = apic_read(AP    
2406         apic_pm_state.apic_spiv = apic_read(A    
2407         apic_pm_state.apic_lvtt = apic_read(A    
2408         if (maxlvt >= 4)                         
2409                 apic_pm_state.apic_lvtpc = ap    
2410         apic_pm_state.apic_lvt0 = apic_read(A    
2411         apic_pm_state.apic_lvt1 = apic_read(A    
2412         apic_pm_state.apic_lvterr = apic_read    
2413         apic_pm_state.apic_tmict = apic_read(    
2414         apic_pm_state.apic_tdcr = apic_read(A    
2415 #ifdef CONFIG_X86_THERMAL_VECTOR                 
2416         if (maxlvt >= 5)                         
2417                 apic_pm_state.apic_thmr = api    
2418 #endif                                           
2419 #ifdef CONFIG_X86_MCE_INTEL                      
2420         if (maxlvt >= 6)                         
2421                 apic_pm_state.apic_cmci = api    
2422 #endif                                           
2423                                                  
2424         local_irq_save(flags);                   
2425                                                  
2426         /*                                       
2427          * Mask IOAPIC before disabling the l    
2428          * entries on some implementations.      
2429          */                                      
2430         mask_ioapic_entries();                   
2431                                                  
2432         disable_local_APIC();                    
2433                                                  
2434         irq_remapping_disable();                 
2435                                                  
2436         local_irq_restore(flags);                
2437         return 0;                                
2438 }                                                
2439                                                  
2440 static void lapic_resume(void)                   
2441 {                                                
2442         unsigned int l, h;                       
2443         unsigned long flags;                     
2444         int maxlvt;                              
2445                                                  
2446         if (!apic_pm_state.active)               
2447                 return;                          
2448                                                  
2449         local_irq_save(flags);                   
2450                                                  
2451         /*                                       
2452          * IO-APIC and PIC have their own res    
2453          * We just mask them here to make sur    
2454          * subsystem is completely quiet whil    
2455          * and interrupt-remapping.              
2456          */                                      
2457         mask_ioapic_entries();                   
2458         legacy_pic->mask_all();                  
2459                                                  
2460         if (x2apic_mode) {                       
2461                 __x2apic_enable();               
2462         } else {                                 
2463                 /*                               
2464                  * Make sure the APICBASE poi    
2465                  *                               
2466                  * FIXME! This will be wrong     
2467                  * SMP! We'll need to do this    
2468                  */                              
2469                 if (boot_cpu_data.x86 >= 6) {    
2470                         rdmsr(MSR_IA32_APICBA    
2471                         l &= ~MSR_IA32_APICBA    
2472                         l |= MSR_IA32_APICBAS    
2473                         wrmsr(MSR_IA32_APICBA    
2474                 }                                
2475         }                                        
2476                                                  
2477         maxlvt = lapic_get_maxlvt();             
2478         apic_write(APIC_LVTERR, ERROR_APIC_VE    
2479         apic_write(APIC_ID, apic_pm_state.api    
2480         apic_write(APIC_DFR, apic_pm_state.ap    
2481         apic_write(APIC_LDR, apic_pm_state.ap    
2482         apic_write(APIC_TASKPRI, apic_pm_stat    
2483         apic_write(APIC_SPIV, apic_pm_state.a    
2484         apic_write(APIC_LVT0, apic_pm_state.a    
2485         apic_write(APIC_LVT1, apic_pm_state.a    
2486 #ifdef CONFIG_X86_THERMAL_VECTOR                 
2487         if (maxlvt >= 5)                         
2488                 apic_write(APIC_LVTTHMR, apic    
2489 #endif                                           
2490 #ifdef CONFIG_X86_MCE_INTEL                      
2491         if (maxlvt >= 6)                         
2492                 apic_write(APIC_LVTCMCI, apic    
2493 #endif                                           
2494         if (maxlvt >= 4)                         
2495                 apic_write(APIC_LVTPC, apic_p    
2496         apic_write(APIC_LVTT, apic_pm_state.a    
2497         apic_write(APIC_TDCR, apic_pm_state.a    
2498         apic_write(APIC_TMICT, apic_pm_state.    
2499         apic_write(APIC_ESR, 0);                 
2500         apic_read(APIC_ESR);                     
2501         apic_write(APIC_LVTERR, apic_pm_state    
2502         apic_write(APIC_ESR, 0);                 
2503         apic_read(APIC_ESR);                     
2504                                                  
2505         irq_remapping_reenable(x2apic_mode);     
2506                                                  
2507         local_irq_restore(flags);                
2508 }                                                
2509                                                  
2510 /*                                               
2511  * This device has no shutdown method - fully    
2512  * are needed on every CPU up until machine_h    
2513  */                                              
2514                                                  
2515 static struct syscore_ops lapic_syscore_ops =    
2516         .resume         = lapic_resume,          
2517         .suspend        = lapic_suspend,         
2518 };                                               
2519                                                  
2520 static void apic_pm_activate(void)               
2521 {                                                
2522         apic_pm_state.active = 1;                
2523 }                                                
2524                                                  
2525 static int __init init_lapic_sysfs(void)         
2526 {                                                
2527         /* XXX: remove suspend/resume procs i    
2528         if (boot_cpu_has(X86_FEATURE_APIC))      
2529                 register_syscore_ops(&lapic_s    
2530                                                  
2531         return 0;                                
2532 }                                                
2533                                                  
2534 /* local apic needs to resume before other de    
2535 core_initcall(init_lapic_sysfs);                 
2536                                                  
2537 #else   /* CONFIG_PM */                          
2538                                                  
2539 static void apic_pm_activate(void) { }           
2540                                                  
2541 #endif  /* CONFIG_PM */                          
2542                                                  
2543 #ifdef CONFIG_X86_64                             
2544                                                  
2545 static int multi_checked;                        
2546 static int multi;                                
2547                                                  
2548 static int set_multi(const struct dmi_system_    
2549 {                                                
2550         if (multi)                               
2551                 return 0;                        
2552         pr_info("APIC: %s detected, Multi Cha    
2553         multi = 1;                               
2554         return 0;                                
2555 }                                                
2556                                                  
2557 static const struct dmi_system_id multi_dmi_t    
2558         {                                        
2559                 .callback = set_multi,           
2560                 .ident = "IBM System Summit2"    
2561                 .matches = {                     
2562                         DMI_MATCH(DMI_SYS_VEN    
2563                         DMI_MATCH(DMI_PRODUCT    
2564                 },                               
2565         },                                       
2566         {}                                       
2567 };                                               
2568                                                  
2569 static void dmi_check_multi(void)                
2570 {                                                
2571         if (multi_checked)                       
2572                 return;                          
2573                                                  
2574         dmi_check_system(multi_dmi_table);       
2575         multi_checked = 1;                       
2576 }                                                
2577                                                  
2578 /*                                               
2579  * apic_is_clustered_box() -- Check if we can    
2580  *                                               
2581  * Thus far, the major user of this is IBM's     
2582  * Clustered boxes may have unsynced TSC prob    
2583  * multi-chassis.                                
2584  * Use DMI to check them                         
2585  */                                              
2586 int apic_is_clustered_box(void)                  
2587 {                                                
2588         dmi_check_multi();                       
2589         return multi;                            
2590 }                                                
2591 #endif                                           
2592                                                  
2593 /*                                               
2594  * APIC command line parameters                  
2595  */                                              
2596 static int __init setup_disableapic(char *arg    
2597 {                                                
2598         apic_is_disabled = true;                 
2599         setup_clear_cpu_cap(X86_FEATURE_APIC)    
2600         return 0;                                
2601 }                                                
2602 early_param("disableapic", setup_disableapic)    
2603                                                  
2604 /* same as disableapic, for compatibility */     
2605 static int __init setup_nolapic(char *arg)       
2606 {                                                
2607         return setup_disableapic(arg);           
2608 }                                                
2609 early_param("nolapic", setup_nolapic);           
2610                                                  
2611 static int __init parse_lapic_timer_c2_ok(cha    
2612 {                                                
2613         local_apic_timer_c2_ok = 1;              
2614         return 0;                                
2615 }                                                
2616 early_param("lapic_timer_c2_ok", parse_lapic_    
2617                                                  
2618 static int __init parse_disable_apic_timer(ch    
2619 {                                                
2620         disable_apic_timer = 1;                  
2621         return 0;                                
2622 }                                                
2623 early_param("noapictimer", parse_disable_apic    
2624                                                  
2625 static int __init parse_nolapic_timer(char *a    
2626 {                                                
2627         disable_apic_timer = 1;                  
2628         return 0;                                
2629 }                                                
2630 early_param("nolapic_timer", parse_nolapic_ti    
2631                                                  
2632 static int __init apic_set_verbosity(char *ar    
2633 {                                                
2634         if (!arg)  {                             
2635                 if (IS_ENABLED(CONFIG_X86_32)    
2636                         return -EINVAL;          
2637                                                  
2638                 ioapic_is_disabled = false;      
2639                 return 0;                        
2640         }                                        
2641                                                  
2642         if (strcmp("debug", arg) == 0)           
2643                 apic_verbosity = APIC_DEBUG;     
2644         else if (strcmp("verbose", arg) == 0)    
2645                 apic_verbosity = APIC_VERBOSE    
2646 #ifdef CONFIG_X86_64                             
2647         else {                                   
2648                 pr_warn("APIC Verbosity level    
2649                         " use apic=verbose or    
2650                 return -EINVAL;                  
2651         }                                        
2652 #endif                                           
2653                                                  
2654         return 0;                                
2655 }                                                
2656 early_param("apic", apic_set_verbosity);         
2657                                                  
2658 static int __init lapic_insert_resource(void)    
2659 {                                                
2660         if (!apic_mmio_base)                     
2661                 return -1;                       
2662                                                  
2663         /* Put local APIC into the resource m    
2664         lapic_resource.start = apic_mmio_base    
2665         lapic_resource.end = lapic_resource.s    
2666         insert_resource(&iomem_resource, &lap    
2667                                                  
2668         return 0;                                
2669 }                                                
2670                                                  
2671 /*                                               
2672  * need call insert after e820__reserve_resou    
2673  * that is using request_resource                
2674  */                                              
2675 late_initcall(lapic_insert_resource);            
2676                                                  
2677 static int __init apic_set_extnmi(char *arg)     
2678 {                                                
2679         if (!arg)                                
2680                 return -EINVAL;                  
2681                                                  
2682         if (!strncmp("all", arg, 3))             
2683                 apic_extnmi = APIC_EXTNMI_ALL    
2684         else if (!strncmp("none", arg, 4))       
2685                 apic_extnmi = APIC_EXTNMI_NON    
2686         else if (!strncmp("bsp", arg, 3))        
2687                 apic_extnmi = APIC_EXTNMI_BSP    
2688         else {                                   
2689                 pr_warn("Unknown external NMI    
2690                 return -EINVAL;                  
2691         }                                        
2692                                                  
2693         return 0;                                
2694 }                                                
2695 early_param("apic_extnmi", apic_set_extnmi);     
2696                                                  

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php