Skip to content

Commit ae5f8ce

Browse files
mike-travissuryasaimadhu
authored andcommitted
x86/platform/uv: Update for UV5 NMI MMR changes
The UV NMI MMR addresses and fields moved between UV4 and UV5 necessitating a rewrite of the UV NMI handler. Adjust references to accommodate those changes. Signed-off-by: Mike Travis <mike.travis@hpe.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Dimitri Sivanich <dimitri.sivanich@hpe.com> Reviewed-by: Steve Wahl <steve.wahl@hpe.com> Link: https://lkml.kernel.org/r/20201005203929.148656-13-mike.travis@hpe.com
1 parent 6a7cf55 commit ae5f8ce

2 files changed

Lines changed: 54 additions & 23 deletions

File tree

arch/x86/include/asm/uv/uv_hub.h

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -734,19 +734,6 @@ extern void uv_nmi_setup_hubless(void);
734734
#define UVH_NMI_MMR_SHIFT 63
735735
#define UVH_NMI_MMR_TYPE "SCRATCH5"
736736

737-
/* Newer SMM NMI handler, not present in all systems */
738-
#define UVH_NMI_MMRX UVH_EVENT_OCCURRED0
739-
#define UVH_NMI_MMRX_CLEAR UVH_EVENT_OCCURRED0_ALIAS
740-
#define UVH_NMI_MMRX_SHIFT UVH_EVENT_OCCURRED0_EXTIO_INT0_SHFT
741-
#define UVH_NMI_MMRX_TYPE "EXTIO_INT0"
742-
743-
/* Non-zero indicates newer SMM NMI handler present */
744-
#define UVH_NMI_MMRX_SUPPORTED UVH_EXTIO_INT0_BROADCAST
745-
746-
/* Indicates to BIOS that we want to use the newer SMM NMI handler */
747-
#define UVH_NMI_MMRX_REQ UVH_BIOS_KERNEL_MMR_ALIAS_2
748-
#define UVH_NMI_MMRX_REQ_SHIFT 62
749-
750737
struct uv_hub_nmi_s {
751738
raw_spinlock_t nmi_lock;
752739
atomic_t in_nmi; /* flag this node in UV NMI IRQ */

arch/x86/platform/uv/uv_nmi.c

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
/*
33
* SGI NMI support routines
44
*
5-
* Copyright (c) 2009-2013 Silicon Graphics, Inc. All Rights Reserved.
6-
* Copyright (c) Mike Travis
5+
* Copyright (C) 2007-2017 Silicon Graphics, Inc. All rights reserved.
6+
* Copyright (c) Mike Travis
77
*/
88

99
#include <linux/cpu.h>
@@ -54,6 +54,20 @@ static struct uv_hub_nmi_s **uv_hub_nmi_list;
5454

5555
DEFINE_PER_CPU(struct uv_cpu_nmi_s, uv_cpu_nmi);
5656

57+
/* Newer SMM NMI handler, not present in all systems */
58+
static unsigned long uvh_nmi_mmrx; /* UVH_EVENT_OCCURRED0/1 */
59+
static unsigned long uvh_nmi_mmrx_clear; /* UVH_EVENT_OCCURRED0/1_ALIAS */
60+
static int uvh_nmi_mmrx_shift; /* UVH_EVENT_OCCURRED0/1_EXTIO_INT0_SHFT */
61+
static int uvh_nmi_mmrx_mask; /* UVH_EVENT_OCCURRED0/1_EXTIO_INT0_MASK */
62+
static char *uvh_nmi_mmrx_type; /* "EXTIO_INT0" */
63+
64+
/* Non-zero indicates newer SMM NMI handler present */
65+
static unsigned long uvh_nmi_mmrx_supported; /* UVH_EXTIO_INT0_BROADCAST */
66+
67+
/* Indicates to BIOS that we want to use the newer SMM NMI handler */
68+
static unsigned long uvh_nmi_mmrx_req; /* UVH_BIOS_KERNEL_MMR_ALIAS_2 */
69+
static int uvh_nmi_mmrx_req_shift; /* 62 */
70+
5771
/* UV hubless values */
5872
#define NMI_CONTROL_PORT 0x70
5973
#define NMI_DUMMY_PORT 0x71
@@ -227,13 +241,43 @@ static inline bool uv_nmi_action_is(const char *action)
227241
/* Setup which NMI support is present in system */
228242
static void uv_nmi_setup_mmrs(void)
229243
{
230-
if (uv_read_local_mmr(UVH_NMI_MMRX_SUPPORTED)) {
231-
uv_write_local_mmr(UVH_NMI_MMRX_REQ,
232-
1UL << UVH_NMI_MMRX_REQ_SHIFT);
233-
nmi_mmr = UVH_NMI_MMRX;
234-
nmi_mmr_clear = UVH_NMI_MMRX_CLEAR;
235-
nmi_mmr_pending = 1UL << UVH_NMI_MMRX_SHIFT;
236-
pr_info("UV: SMI NMI support: %s\n", UVH_NMI_MMRX_TYPE);
244+
/* First determine arch specific MMRs to handshake with BIOS */
245+
if (UVH_EVENT_OCCURRED0_EXTIO_INT0_MASK) {
246+
uvh_nmi_mmrx = UVH_EVENT_OCCURRED0;
247+
uvh_nmi_mmrx_clear = UVH_EVENT_OCCURRED0_ALIAS;
248+
uvh_nmi_mmrx_shift = UVH_EVENT_OCCURRED0_EXTIO_INT0_SHFT;
249+
uvh_nmi_mmrx_mask = UVH_EVENT_OCCURRED0_EXTIO_INT0_MASK;
250+
uvh_nmi_mmrx_type = "OCRD0-EXTIO_INT0";
251+
252+
uvh_nmi_mmrx_supported = UVH_EXTIO_INT0_BROADCAST;
253+
uvh_nmi_mmrx_req = UVH_BIOS_KERNEL_MMR_ALIAS_2;
254+
uvh_nmi_mmrx_req_shift = 62;
255+
256+
} else if (UVH_EVENT_OCCURRED1_EXTIO_INT0_MASK) {
257+
uvh_nmi_mmrx = UVH_EVENT_OCCURRED1;
258+
uvh_nmi_mmrx_clear = UVH_EVENT_OCCURRED1_ALIAS;
259+
uvh_nmi_mmrx_shift = UVH_EVENT_OCCURRED1_EXTIO_INT0_SHFT;
260+
uvh_nmi_mmrx_mask = UVH_EVENT_OCCURRED1_EXTIO_INT0_MASK;
261+
uvh_nmi_mmrx_type = "OCRD1-EXTIO_INT0";
262+
263+
uvh_nmi_mmrx_supported = UVH_EXTIO_INT0_BROADCAST;
264+
uvh_nmi_mmrx_req = UVH_BIOS_KERNEL_MMR_ALIAS_2;
265+
uvh_nmi_mmrx_req_shift = 62;
266+
267+
} else {
268+
pr_err("UV:%s:cannot find EVENT_OCCURRED*_EXTIO_INT0\n",
269+
__func__);
270+
return;
271+
}
272+
273+
/* Then find out if new NMI is supported */
274+
if (likely(uv_read_local_mmr(uvh_nmi_mmrx_supported))) {
275+
uv_write_local_mmr(uvh_nmi_mmrx_req,
276+
1UL << uvh_nmi_mmrx_req_shift);
277+
nmi_mmr = uvh_nmi_mmrx;
278+
nmi_mmr_clear = uvh_nmi_mmrx_clear;
279+
nmi_mmr_pending = 1UL << uvh_nmi_mmrx_shift;
280+
pr_info("UV: SMI NMI support: %s\n", uvh_nmi_mmrx_type);
237281
} else {
238282
nmi_mmr = UVH_NMI_MMR;
239283
nmi_mmr_clear = UVH_NMI_MMR_CLEAR;
@@ -1049,5 +1093,5 @@ void __init uv_nmi_setup_hubless(void)
10491093
/* Ensure NMI enabled in Processor Interface Reg: */
10501094
uv_reassert_nmi();
10511095
uv_register_nmi_notifier();
1052-
pr_info("UV: Hubless NMI enabled\n");
1096+
pr_info("UV: PCH NMI enabled\n");
10531097
}

0 commit comments

Comments
 (0)