diff options
Diffstat (limited to 'include/asm-x86')
-rw-r--r-- | include/asm-x86/apic.h | 43 | ||||
-rw-r--r-- | include/asm-x86/ipi.h | 16 | ||||
-rw-r--r-- | include/asm-x86/paravirt.h | 2 | ||||
-rw-r--r-- | include/asm-x86/smp.h | 2 |
4 files changed, 51 insertions, 12 deletions
diff --git a/include/asm-x86/apic.h b/include/asm-x86/apic.h index 4e2c1e517f06..6fda195337c5 100644 --- a/include/asm-x86/apic.h +++ b/include/asm-x86/apic.h | |||
@@ -47,32 +47,59 @@ extern int disable_apic; | |||
47 | #ifdef CONFIG_PARAVIRT | 47 | #ifdef CONFIG_PARAVIRT |
48 | #include <asm/paravirt.h> | 48 | #include <asm/paravirt.h> |
49 | #else | 49 | #else |
50 | #define apic_write native_apic_write | 50 | #ifndef CONFIG_X86_64 |
51 | #define apic_write_atomic native_apic_write_atomic | 51 | #define apic_write native_apic_mem_write |
52 | #define apic_read native_apic_read | 52 | #define apic_write_atomic native_apic_mem_write_atomic |
53 | #define apic_read native_apic_mem_read | ||
54 | #endif | ||
53 | #define setup_boot_clock setup_boot_APIC_clock | 55 | #define setup_boot_clock setup_boot_APIC_clock |
54 | #define setup_secondary_clock setup_secondary_APIC_clock | 56 | #define setup_secondary_clock setup_secondary_APIC_clock |
55 | #endif | 57 | #endif |
56 | 58 | ||
57 | extern int is_vsmp_box(void); | 59 | extern int is_vsmp_box(void); |
58 | 60 | ||
59 | static inline void native_apic_write(unsigned long reg, u32 v) | 61 | static inline void native_apic_mem_write(u32 reg, u32 v) |
60 | { | 62 | { |
61 | *((volatile u32 *)(APIC_BASE + reg)) = v; | 63 | *((volatile u32 *)(APIC_BASE + reg)) = v; |
62 | } | 64 | } |
63 | 65 | ||
64 | static inline void native_apic_write_atomic(unsigned long reg, u32 v) | 66 | static inline void native_apic_mem_write_atomic(u32 reg, u32 v) |
65 | { | 67 | { |
66 | (void)xchg((u32 *)(APIC_BASE + reg), v); | 68 | (void)xchg((u32 *)(APIC_BASE + reg), v); |
67 | } | 69 | } |
68 | 70 | ||
69 | static inline u32 native_apic_read(unsigned long reg) | 71 | static inline u32 native_apic_mem_read(u32 reg) |
70 | { | 72 | { |
71 | return *((volatile u32 *)(APIC_BASE + reg)); | 73 | return *((volatile u32 *)(APIC_BASE + reg)); |
72 | } | 74 | } |
73 | 75 | ||
76 | #ifdef CONFIG_X86_32 | ||
74 | extern void apic_wait_icr_idle(void); | 77 | extern void apic_wait_icr_idle(void); |
75 | extern u32 safe_apic_wait_icr_idle(void); | 78 | extern u32 safe_apic_wait_icr_idle(void); |
79 | extern void apic_icr_write(u32 low, u32 id); | ||
80 | #else | ||
81 | |||
82 | struct apic_ops { | ||
83 | u32 (*read)(u32 reg); | ||
84 | void (*write)(u32 reg, u32 v); | ||
85 | void (*write_atomic)(u32 reg, u32 v); | ||
86 | u64 (*icr_read)(void); | ||
87 | void (*icr_write)(u32 low, u32 high); | ||
88 | void (*wait_icr_idle)(void); | ||
89 | u32 (*safe_wait_icr_idle)(void); | ||
90 | }; | ||
91 | |||
92 | extern struct apic_ops *apic_ops; | ||
93 | |||
94 | #define apic_read (apic_ops->read) | ||
95 | #define apic_write (apic_ops->write) | ||
96 | #define apic_write_atomic (apic_ops->write_atomic) | ||
97 | #define apic_icr_read (apic_ops->icr_read) | ||
98 | #define apic_icr_write (apic_ops->icr_write) | ||
99 | #define apic_wait_icr_idle (apic_ops->wait_icr_idle) | ||
100 | #define safe_apic_wait_icr_idle (apic_ops->safe_wait_icr_idle) | ||
101 | #endif | ||
102 | |||
76 | extern int get_physical_broadcast(void); | 103 | extern int get_physical_broadcast(void); |
77 | 104 | ||
78 | #ifdef CONFIG_X86_GOOD_APIC | 105 | #ifdef CONFIG_X86_GOOD_APIC |
@@ -95,7 +122,11 @@ static inline void ack_APIC_irq(void) | |||
95 | */ | 122 | */ |
96 | 123 | ||
97 | /* Docs say use 0 for future compatibility */ | 124 | /* Docs say use 0 for future compatibility */ |
125 | #ifdef CONFIG_X86_32 | ||
98 | apic_write_around(APIC_EOI, 0); | 126 | apic_write_around(APIC_EOI, 0); |
127 | #else | ||
128 | native_apic_mem_write(APIC_EOI, 0); | ||
129 | #endif | ||
99 | } | 130 | } |
100 | 131 | ||
101 | extern int lapic_get_maxlvt(void); | 132 | extern int lapic_get_maxlvt(void); |
diff --git a/include/asm-x86/ipi.h b/include/asm-x86/ipi.h index 196d63c28aa4..3d8d6a6c1f8e 100644 --- a/include/asm-x86/ipi.h +++ b/include/asm-x86/ipi.h | |||
@@ -49,6 +49,12 @@ static inline int __prepare_ICR2(unsigned int mask) | |||
49 | return SET_APIC_DEST_FIELD(mask); | 49 | return SET_APIC_DEST_FIELD(mask); |
50 | } | 50 | } |
51 | 51 | ||
52 | static inline void __xapic_wait_icr_idle(void) | ||
53 | { | ||
54 | while (native_apic_mem_read(APIC_ICR) & APIC_ICR_BUSY) | ||
55 | cpu_relax(); | ||
56 | } | ||
57 | |||
52 | static inline void __send_IPI_shortcut(unsigned int shortcut, int vector, | 58 | static inline void __send_IPI_shortcut(unsigned int shortcut, int vector, |
53 | unsigned int dest) | 59 | unsigned int dest) |
54 | { | 60 | { |
@@ -64,7 +70,7 @@ static inline void __send_IPI_shortcut(unsigned int shortcut, int vector, | |||
64 | /* | 70 | /* |
65 | * Wait for idle. | 71 | * Wait for idle. |
66 | */ | 72 | */ |
67 | apic_wait_icr_idle(); | 73 | __xapic_wait_icr_idle(); |
68 | 74 | ||
69 | /* | 75 | /* |
70 | * No need to touch the target chip field | 76 | * No need to touch the target chip field |
@@ -74,7 +80,7 @@ static inline void __send_IPI_shortcut(unsigned int shortcut, int vector, | |||
74 | /* | 80 | /* |
75 | * Send the IPI. The write to APIC_ICR fires this off. | 81 | * Send the IPI. The write to APIC_ICR fires this off. |
76 | */ | 82 | */ |
77 | apic_write(APIC_ICR, cfg); | 83 | native_apic_mem_write(APIC_ICR, cfg); |
78 | } | 84 | } |
79 | 85 | ||
80 | /* | 86 | /* |
@@ -92,13 +98,13 @@ static inline void __send_IPI_dest_field(unsigned int mask, int vector, | |||
92 | if (unlikely(vector == NMI_VECTOR)) | 98 | if (unlikely(vector == NMI_VECTOR)) |
93 | safe_apic_wait_icr_idle(); | 99 | safe_apic_wait_icr_idle(); |
94 | else | 100 | else |
95 | apic_wait_icr_idle(); | 101 | __xapic_wait_icr_idle(); |
96 | 102 | ||
97 | /* | 103 | /* |
98 | * prepare target chip field | 104 | * prepare target chip field |
99 | */ | 105 | */ |
100 | cfg = __prepare_ICR2(mask); | 106 | cfg = __prepare_ICR2(mask); |
101 | apic_write(APIC_ICR2, cfg); | 107 | native_apic_mem_write(APIC_ICR2, cfg); |
102 | 108 | ||
103 | /* | 109 | /* |
104 | * program the ICR | 110 | * program the ICR |
@@ -108,7 +114,7 @@ static inline void __send_IPI_dest_field(unsigned int mask, int vector, | |||
108 | /* | 114 | /* |
109 | * Send the IPI. The write to APIC_ICR fires this off. | 115 | * Send the IPI. The write to APIC_ICR fires this off. |
110 | */ | 116 | */ |
111 | apic_write(APIC_ICR, cfg); | 117 | native_apic_mem_write(APIC_ICR, cfg); |
112 | } | 118 | } |
113 | 119 | ||
114 | static inline void send_IPI_mask_sequence(cpumask_t mask, int vector) | 120 | static inline void send_IPI_mask_sequence(cpumask_t mask, int vector) |
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h index ef5e8ec6a6ab..10adac02e6db 100644 --- a/include/asm-x86/paravirt.h +++ b/include/asm-x86/paravirt.h | |||
@@ -891,6 +891,7 @@ static inline void slow_down_io(void) | |||
891 | /* | 891 | /* |
892 | * Basic functions accessing APICs. | 892 | * Basic functions accessing APICs. |
893 | */ | 893 | */ |
894 | #ifndef CONFIG_X86_64 | ||
894 | static inline void apic_write(unsigned long reg, u32 v) | 895 | static inline void apic_write(unsigned long reg, u32 v) |
895 | { | 896 | { |
896 | PVOP_VCALL2(pv_apic_ops.apic_write, reg, v); | 897 | PVOP_VCALL2(pv_apic_ops.apic_write, reg, v); |
@@ -905,6 +906,7 @@ static inline u32 apic_read(unsigned long reg) | |||
905 | { | 906 | { |
906 | return PVOP_CALL1(unsigned long, pv_apic_ops.apic_read, reg); | 907 | return PVOP_CALL1(unsigned long, pv_apic_ops.apic_read, reg); |
907 | } | 908 | } |
909 | #endif | ||
908 | 910 | ||
909 | static inline void setup_boot_clock(void) | 911 | static inline void setup_boot_clock(void) |
910 | { | 912 | { |
diff --git a/include/asm-x86/smp.h b/include/asm-x86/smp.h index 9848715fbd9e..d9d007d22785 100644 --- a/include/asm-x86/smp.h +++ b/include/asm-x86/smp.h | |||
@@ -158,13 +158,13 @@ extern int safe_smp_processor_id(void); | |||
158 | 158 | ||
159 | #ifdef CONFIG_X86_LOCAL_APIC | 159 | #ifdef CONFIG_X86_LOCAL_APIC |
160 | 160 | ||
161 | #ifndef CONFIG_X86_64 | ||
161 | static inline int logical_smp_processor_id(void) | 162 | static inline int logical_smp_processor_id(void) |
162 | { | 163 | { |
163 | /* we don't want to mark this access volatile - bad code generation */ | 164 | /* we don't want to mark this access volatile - bad code generation */ |
164 | return GET_APIC_LOGICAL_ID(*(u32 *)(APIC_BASE + APIC_LDR)); | 165 | return GET_APIC_LOGICAL_ID(*(u32 *)(APIC_BASE + APIC_LDR)); |
165 | } | 166 | } |
166 | 167 | ||
167 | #ifndef CONFIG_X86_64 | ||
168 | static inline unsigned int read_apic_id(void) | 168 | static inline unsigned int read_apic_id(void) |
169 | { | 169 | { |
170 | return *(u32 *)(APIC_BASE + APIC_ID); | 170 | return *(u32 *)(APIC_BASE + APIC_ID); |