diff options
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/include/asm/uv/uv_hub.h | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index 8f1332bbfd72..811bfabc80b7 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h | |||
@@ -172,6 +172,8 @@ DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); | |||
172 | #define UV_LOCAL_MMR_SIZE (64UL * 1024 * 1024) | 172 | #define UV_LOCAL_MMR_SIZE (64UL * 1024 * 1024) |
173 | #define UV_GLOBAL_MMR32_SIZE (64UL * 1024 * 1024) | 173 | #define UV_GLOBAL_MMR32_SIZE (64UL * 1024 * 1024) |
174 | 174 | ||
175 | #define UV_GLOBAL_GRU_MMR_BASE 0x4000000 | ||
176 | |||
175 | #define UV_GLOBAL_MMR32_PNODE_SHIFT 15 | 177 | #define UV_GLOBAL_MMR32_PNODE_SHIFT 15 |
176 | #define UV_GLOBAL_MMR64_PNODE_SHIFT 26 | 178 | #define UV_GLOBAL_MMR64_PNODE_SHIFT 26 |
177 | 179 | ||
@@ -328,6 +330,15 @@ static inline unsigned long uv_read_global_mmr64(int pnode, | |||
328 | } | 330 | } |
329 | 331 | ||
330 | /* | 332 | /* |
333 | * Global MMR space addresses when referenced by the GRU. (GRU does | ||
334 | * NOT use socket addressing). | ||
335 | */ | ||
336 | static inline unsigned long uv_global_gru_mmr_address(int pnode, unsigned long offset) | ||
337 | { | ||
338 | return UV_GLOBAL_GRU_MMR_BASE | offset | (pnode << uv_hub_info->m_val); | ||
339 | } | ||
340 | |||
341 | /* | ||
331 | * Access hub local MMRs. Faster than using global space but only local MMRs | 342 | * Access hub local MMRs. Faster than using global space but only local MMRs |
332 | * are accessible. | 343 | * are accessible. |
333 | */ | 344 | */ |
@@ -454,6 +465,14 @@ static inline void uv_set_cpu_scir_bits(int cpu, unsigned char value) | |||
454 | } | 465 | } |
455 | } | 466 | } |
456 | 467 | ||
468 | static unsigned long uv_hub_ipi_value(int apicid, int vector, int mode) | ||
469 | { | ||
470 | return (1UL << UVH_IPI_INT_SEND_SHFT) | | ||
471 | ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | | ||
472 | (mode << UVH_IPI_INT_DELIVERY_MODE_SHFT) | | ||
473 | (vector << UVH_IPI_INT_VECTOR_SHFT); | ||
474 | } | ||
475 | |||
457 | static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) | 476 | static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) |
458 | { | 477 | { |
459 | unsigned long val; | 478 | unsigned long val; |
@@ -462,10 +481,7 @@ static inline void uv_hub_send_ipi(int pnode, int apicid, int vector) | |||
462 | if (vector == NMI_VECTOR) | 481 | if (vector == NMI_VECTOR) |
463 | dmode = dest_NMI; | 482 | dmode = dest_NMI; |
464 | 483 | ||
465 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | | 484 | val = uv_hub_ipi_value(apicid, vector, dmode); |
466 | ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) | | ||
467 | (dmode << UVH_IPI_INT_DELIVERY_MODE_SHFT) | | ||
468 | (vector << UVH_IPI_INT_VECTOR_SHFT); | ||
469 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); | 485 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); |
470 | } | 486 | } |
471 | 487 | ||