From: Borislav Petkov <borislav.pet...@amd.com>

hw_inject denotes whether we want to do a hardware or a software
injection and, in the case of hardware injection, we want to do that on
a particular cpu, thus the 'cpu' attribute.

Signed-off-by: Borislav Petkov <borislav.pet...@amd.com>
---
 arch/x86/ras/amd/mce-inject.c | 55 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/arch/x86/ras/amd/mce-inject.c b/arch/x86/ras/amd/mce-inject.c
index c0c811579ce9..b55d69fbd6e3 100644
--- a/arch/x86/ras/amd/mce-inject.c
+++ b/arch/x86/ras/amd/mce-inject.c
@@ -79,6 +79,59 @@ static int toggle_hw_mce_inject(unsigned int cpu, bool 
enable)
 }
 
 /*
+ * HW or SW injection
+ */
+static int hw_inj_get(void *data, u64 *val)
+{
+       struct mce *m = (struct mce *)data;
+
+       *val = !!(m->inject_flags & MCJ_EXCEPTION);
+
+       return 0;
+}
+
+static int hw_inj_set(void *data, u64 val)
+{
+       struct mce *m = (struct mce *)data;
+
+       switch (val) {
+       case 0:
+               m->inject_flags &= (u8)~MCJ_EXCEPTION;
+               break;
+
+       case 1:
+               m->inject_flags |= MCJ_EXCEPTION;
+               break;
+
+       default:
+               pr_err("%s: Only 0 or 1 allowed!\n", __func__);
+               return -EINVAL;
+       }
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(hw_inj_fops, hw_inj_get, hw_inj_set, "%llu\n");
+
+/*
+ * On which CPU to inject?
+ */
+MCE_INJECT_GET(extcpu);
+
+static int inj_extcpu_set(void *data, u64 val)
+{
+       struct mce *m = (struct mce *)data;
+
+       if (val >= nr_cpu_ids || !cpu_online(val)) {
+               pr_err("%s: Invalid CPU: %llu\n", __func__, val);
+               return -EINVAL;
+       }
+       m->extcpu = val;
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(extcpu_fops, inj_extcpu_get, inj_extcpu_set, "%llu\n");
+
+/*
  * This denotes into which bank we're injecting and triggers
  * the injection, at the same time.
  */
@@ -119,6 +172,8 @@ struct dfs_node {
        { .name = "misc",       .fops = &misc_fops },
        { .name = "addr",       .fops = &addr_fops },
        { .name = "bank",       .fops = &bank_fops },
+       { .name = "hw_inject",  .fops = &hw_inj_fops },
+       { .name = "cpu",        .fops = &extcpu_fops },
 };
 
 static int __init init_mce_inject(void)
-- 
1.8.0.rc0.18.gf84667d

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to