diff options
Diffstat (limited to 'arch/x86/kernel/apic_64.c')
| -rw-r--r-- | arch/x86/kernel/apic_64.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c index 3963f590c3d4..9bb040689b31 100644 --- a/arch/x86/kernel/apic_64.c +++ b/arch/x86/kernel/apic_64.c | |||
| @@ -119,13 +119,13 @@ static int modern_apic(void) | |||
| 119 | return lapic_get_version() >= 0x14; | 119 | return lapic_get_version() >= 0x14; |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | void apic_wait_icr_idle(void) | 122 | void xapic_wait_icr_idle(void) |
| 123 | { | 123 | { |
| 124 | while (apic_read(APIC_ICR) & APIC_ICR_BUSY) | 124 | while (apic_read(APIC_ICR) & APIC_ICR_BUSY) |
| 125 | cpu_relax(); | 125 | cpu_relax(); |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | u32 safe_apic_wait_icr_idle(void) | 128 | u32 safe_xapic_wait_icr_idle(void) |
| 129 | { | 129 | { |
| 130 | u32 send_status; | 130 | u32 send_status; |
| 131 | int timeout; | 131 | int timeout; |
| @@ -141,6 +141,36 @@ u32 safe_apic_wait_icr_idle(void) | |||
| 141 | return send_status; | 141 | return send_status; |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | void xapic_icr_write(u32 low, u32 id) | ||
| 145 | { | ||
| 146 | apic_write(APIC_ICR2, id << 24); | ||
| 147 | apic_write(APIC_ICR, low); | ||
| 148 | } | ||
| 149 | |||
| 150 | u64 xapic_icr_read(void) | ||
| 151 | { | ||
| 152 | u32 icr1, icr2; | ||
| 153 | |||
| 154 | icr2 = apic_read(APIC_ICR2); | ||
| 155 | icr1 = apic_read(APIC_ICR); | ||
| 156 | |||
| 157 | return (icr1 | ((u64)icr2 << 32)); | ||
| 158 | } | ||
| 159 | |||
| 160 | static struct apic_ops xapic_ops = { | ||
| 161 | .read = native_apic_mem_read, | ||
| 162 | .write = native_apic_mem_write, | ||
| 163 | .write_atomic = native_apic_mem_write_atomic, | ||
| 164 | .icr_read = xapic_icr_read, | ||
| 165 | .icr_write = xapic_icr_write, | ||
| 166 | .wait_icr_idle = xapic_wait_icr_idle, | ||
| 167 | .safe_wait_icr_idle = safe_xapic_wait_icr_idle, | ||
| 168 | }; | ||
| 169 | |||
| 170 | struct apic_ops __read_mostly *apic_ops = &xapic_ops; | ||
| 171 | |||
| 172 | EXPORT_SYMBOL_GPL(apic_ops); | ||
| 173 | |||
| 144 | /** | 174 | /** |
| 145 | * enable_NMI_through_LVT0 - enable NMI through local vector table 0 | 175 | * enable_NMI_through_LVT0 - enable NMI through local vector table 0 |
| 146 | */ | 176 | */ |
