| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef __ASM_APIC_H | 
 | 2 | #define __ASM_APIC_H | 
 | 3 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 4 | #include <linux/pm.h> | 
| Fernando Luis VazquezCao | f2b218d | 2007-05-02 19:27:17 +0200 | [diff] [blame] | 5 | #include <linux/delay.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 6 | #include <asm/fixmap.h> | 
 | 7 | #include <asm/apicdef.h> | 
| Eric W. Biederman | 9635b47 | 2005-06-25 14:57:41 -0700 | [diff] [blame] | 8 | #include <asm/processor.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 9 | #include <asm/system.h> | 
 | 10 |  | 
 | 11 | #define Dprintk(x...) | 
 | 12 |  | 
 | 13 | /* | 
 | 14 |  * Debugging macros | 
 | 15 |  */ | 
 | 16 | #define APIC_QUIET   0 | 
 | 17 | #define APIC_VERBOSE 1 | 
 | 18 | #define APIC_DEBUG   2 | 
 | 19 |  | 
 | 20 | extern int apic_verbosity; | 
 | 21 |  | 
 | 22 | /* | 
 | 23 |  * Define the default level of output to be very little | 
 | 24 |  * This can be turned up by using apic=verbose for more | 
 | 25 |  * information and apic=debug for _lots_ of information. | 
 | 26 |  * apic_verbosity is defined in apic.c | 
 | 27 |  */ | 
 | 28 | #define apic_printk(v, s, a...) do {       \ | 
 | 29 | 		if ((v) <= apic_verbosity) \ | 
 | 30 | 			printk(s, ##a);    \ | 
 | 31 | 	} while (0) | 
 | 32 |  | 
 | 33 |  | 
| Rusty Russell | 1a3f239 | 2006-09-26 10:52:32 +0200 | [diff] [blame] | 34 | extern void generic_apic_probe(void); | 
 | 35 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 | #ifdef CONFIG_X86_LOCAL_APIC | 
 | 37 |  | 
 | 38 | /* | 
 | 39 |  * Basic functions accessing APICs. | 
 | 40 |  */ | 
| Rusty Russell | 13623d7 | 2006-12-07 02:14:08 +0100 | [diff] [blame] | 41 | #ifdef CONFIG_PARAVIRT | 
 | 42 | #include <asm/paravirt.h> | 
 | 43 | #else | 
 | 44 | #define apic_write native_apic_write | 
 | 45 | #define apic_write_atomic native_apic_write_atomic | 
 | 46 | #define apic_read native_apic_read | 
| Zachary Amsden | bbab4f3 | 2007-02-13 13:26:21 +0100 | [diff] [blame] | 47 | #define setup_boot_clock setup_boot_APIC_clock | 
 | 48 | #define setup_secondary_clock setup_secondary_APIC_clock | 
| Rusty Russell | 13623d7 | 2006-12-07 02:14:08 +0100 | [diff] [blame] | 49 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 50 |  | 
| Rusty Russell | 13623d7 | 2006-12-07 02:14:08 +0100 | [diff] [blame] | 51 | static __inline fastcall void native_apic_write(unsigned long reg, | 
 | 52 | 						unsigned long v) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 53 | { | 
 | 54 | 	*((volatile unsigned long *)(APIC_BASE+reg)) = v; | 
 | 55 | } | 
 | 56 |  | 
| Rusty Russell | 13623d7 | 2006-12-07 02:14:08 +0100 | [diff] [blame] | 57 | static __inline fastcall void native_apic_write_atomic(unsigned long reg, | 
 | 58 | 						       unsigned long v) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 59 | { | 
 | 60 | 	xchg((volatile unsigned long *)(APIC_BASE+reg), v); | 
 | 61 | } | 
 | 62 |  | 
| Rusty Russell | 13623d7 | 2006-12-07 02:14:08 +0100 | [diff] [blame] | 63 | static __inline fastcall unsigned long native_apic_read(unsigned long reg) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 64 | { | 
 | 65 | 	return *((volatile unsigned long *)(APIC_BASE+reg)); | 
 | 66 | } | 
 | 67 |  | 
| Fernando Luis VazquezCao | f2b218d | 2007-05-02 19:27:17 +0200 | [diff] [blame] | 68 | void apic_wait_icr_idle(void); | 
 | 69 | unsigned long safe_apic_wait_icr_idle(void); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 70 | int get_physical_broadcast(void); | 
 | 71 |  | 
 | 72 | #ifdef CONFIG_X86_GOOD_APIC | 
 | 73 | # define FORCE_READ_AROUND_WRITE 0 | 
 | 74 | # define apic_read_around(x) | 
 | 75 | # define apic_write_around(x,y) apic_write((x),(y)) | 
 | 76 | #else | 
 | 77 | # define FORCE_READ_AROUND_WRITE 1 | 
 | 78 | # define apic_read_around(x) apic_read(x) | 
 | 79 | # define apic_write_around(x,y) apic_write_atomic((x),(y)) | 
 | 80 | #endif | 
 | 81 |  | 
 | 82 | static inline void ack_APIC_irq(void) | 
 | 83 | { | 
 | 84 | 	/* | 
 | 85 | 	 * ack_APIC_irq() actually gets compiled as a single instruction: | 
 | 86 | 	 * - a single rmw on Pentium/82489DX | 
 | 87 | 	 * - a single write on P6+ cores (CONFIG_X86_GOOD_APIC) | 
 | 88 | 	 * ... yummie. | 
 | 89 | 	 */ | 
 | 90 |  | 
 | 91 | 	/* Docs say use 0 for future compatibility */ | 
 | 92 | 	apic_write_around(APIC_EOI, 0); | 
 | 93 | } | 
 | 94 |  | 
| Thomas Gleixner | e05d723 | 2007-02-16 01:27:58 -0800 | [diff] [blame] | 95 | extern int lapic_get_maxlvt(void); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 96 | extern void clear_local_APIC(void); | 
 | 97 | extern void connect_bsp_APIC (void); | 
| Eric W. Biederman | 650927e | 2005-06-25 14:57:44 -0700 | [diff] [blame] | 98 | extern void disconnect_bsp_APIC (int virt_wire_setup); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 99 | extern void disable_local_APIC (void); | 
 | 100 | extern void lapic_shutdown (void); | 
 | 101 | extern int verify_local_APIC (void); | 
 | 102 | extern void cache_APIC_registers (void); | 
 | 103 | extern void sync_Arb_IDs (void); | 
 | 104 | extern void init_bsp_APIC (void); | 
 | 105 | extern void setup_local_APIC (void); | 
 | 106 | extern void init_apic_mappings (void); | 
| David Howells | 7d12e78 | 2006-10-05 14:55:46 +0100 | [diff] [blame] | 107 | extern void smp_local_timer_interrupt (void); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 108 | extern void setup_boot_APIC_clock (void); | 
 | 109 | extern void setup_secondary_APIC_clock (void); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 110 | extern int APIC_init_uniprocessor (void); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 111 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 112 | extern void enable_NMI_through_LVT0 (void * dummy); | 
 | 113 |  | 
| Venkatesh Pallipadi | 6eb0a0f | 2006-01-11 22:44:21 +0100 | [diff] [blame] | 114 | #define ARCH_APICTIMER_STOPS_ON_C3	1 | 
 | 115 |  | 
| Andi Kleen | f9262c1 | 2006-03-08 17:57:25 -0800 | [diff] [blame] | 116 | extern int timer_over_8254; | 
| Thomas Gleixner | e585bef | 2007-03-23 16:08:01 +0100 | [diff] [blame] | 117 | extern int local_apic_timer_c2_ok; | 
| Andi Kleen | f9262c1 | 2006-03-08 17:57:25 -0800 | [diff] [blame] | 118 |  | 
| Andi Kleen | d3f7eae | 2007-08-10 22:31:07 +0200 | [diff] [blame] | 119 | extern int local_apic_timer_disabled; | 
 | 120 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 121 | #else /* !CONFIG_X86_LOCAL_APIC */ | 
 | 122 | static inline void lapic_shutdown(void) { } | 
 | 123 |  | 
 | 124 | #endif /* !CONFIG_X86_LOCAL_APIC */ | 
 | 125 |  | 
 | 126 | #endif /* __ASM_APIC_H */ |