diff options
author | Dimitri Sivanich <sivanich@sgi.com> | 2010-11-16 16:23:52 -0600 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-11-18 10:41:25 +0100 |
commit | 8191c9f69202d4dbc66063cb92059b8a58640d34 (patch) | |
tree | 97efeba3b3224390bfac251ecb9e4a037c544453 /arch/x86/platform/uv/tlb_uv.c | |
parent | 9223081f54e3dc5045fe41a475165d9003c9a779 (diff) | |
download | linux-8191c9f69202d4dbc66063cb92059b8a58640d34.tar.gz linux-8191c9f69202d4dbc66063cb92059b8a58640d34.tar.bz2 linux-8191c9f69202d4dbc66063cb92059b8a58640d34.zip |
x86: UV: Address interrupt/IO port operation conflict
This patch for SGI UV systems addresses a problem whereby
interrupt transactions being looped back from a local IOH,
through the hub to a local CPU can (erroneously) conflict with
IO port operations and other transactions.
To workaound this we set a high bit in the APIC IDs used for
interrupts. This bit appears to be ignored by the sockets, but
it avoids the conflict in the hub.
Signed-off-by: Dimitri Sivanich <sivanich@sgi.com>
LKML-Reference: <20101116222352.GA8155@sgi.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
___
arch/x86/include/asm/uv/uv_hub.h | 4 ++++
arch/x86/include/asm/uv/uv_mmrs.h | 19 ++++++++++++++++++-
arch/x86/kernel/apic/x2apic_uv_x.c | 25 +++++++++++++++++++++++--
arch/x86/platform/uv/tlb_uv.c | 2 +-
arch/x86/platform/uv/uv_time.c | 4 +++-
5 files changed, 49 insertions(+), 5 deletions(-)
Diffstat (limited to 'arch/x86/platform/uv/tlb_uv.c')
-rw-r--r-- | arch/x86/platform/uv/tlb_uv.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c index a318194002b5..ba9caa808a9c 100644 --- a/arch/x86/platform/uv/tlb_uv.c +++ b/arch/x86/platform/uv/tlb_uv.c @@ -1455,7 +1455,7 @@ static void __init uv_init_uvhub(int uvhub, int vector) * the below initialization can't be in firmware because the * messaging IRQ will be determined by the OS */ - apicid = uvhub_to_first_apicid(uvhub); + apicid = uvhub_to_first_apicid(uvhub) | uv_apicid_hibits; uv_write_global_mmr64(pnode, UVH_BAU_DATA_CONFIG, ((apicid << 32) | vector)); } |