Commit 56abcf24ff993291b20efd6e3402cd3d12f5cee2

Authored by Jack Steiner
Committed by Linus Torvalds
1 parent e5ae6e82bf

gru: function to generate chipset IPI values

Create a function to generate the value that is written to the UV hub MMR
to cause an IPI interrupt to be sent.  The function will be used in the
GRU message queue error recovery code that sends IPIs to nodes in remote
partitions.

Signed-off-by: Jack Steiner <steiner@sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 20 additions and 4 deletions Side-by-side Diff

arch/x86/include/asm/uv/uv_hub.h
... ... @@ -172,6 +172,8 @@
172 172 #define UV_LOCAL_MMR_SIZE (64UL * 1024 * 1024)
173 173 #define UV_GLOBAL_MMR32_SIZE (64UL * 1024 * 1024)
174 174  
  175 +#define UV_GLOBAL_GRU_MMR_BASE 0x4000000
  176 +
175 177 #define UV_GLOBAL_MMR32_PNODE_SHIFT 15
176 178 #define UV_GLOBAL_MMR64_PNODE_SHIFT 26
177 179  
... ... @@ -328,6 +330,15 @@
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 342 * Access hub local MMRs. Faster than using global space but only local MMRs
332 343 * are accessible.
333 344 */
... ... @@ -454,6 +465,14 @@
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 476 static inline void uv_hub_send_ipi(int pnode, int apicid, int vector)
458 477 {
459 478 unsigned long val;
... ... @@ -462,10 +481,7 @@
462 481 if (vector == NMI_VECTOR)
463 482 dmode = dest_NMI;
464 483  
465   - val = (1UL << UVH_IPI_INT_SEND_SHFT) |
466   - ((apicid) << UVH_IPI_INT_APIC_ID_SHFT) |
467   - (dmode << UVH_IPI_INT_DELIVERY_MODE_SHFT) |
468   - (vector << UVH_IPI_INT_VECTOR_SHFT);
  484 + val = uv_hub_ipi_value(apicid, vector, dmode);
469 485 uv_write_global_mmr64(pnode, UVH_IPI_INT, val);
470 486 }
471 487