lkml.org 
[lkml]   [2011]   [May]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -v3 5/6] EDAC, MCE, AMD: Add attributes needed for HW injection
    Date
    From: Borislav Petkov <borislav.petkov@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 second 'cpu' attribute.

    Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
    ---
    drivers/edac/mce_amd_inj.c | 57 ++++++++++++++++++++++++++++++++++++++++++++
    1 files changed, 57 insertions(+), 0 deletions(-)

    diff --git a/drivers/edac/mce_amd_inj.c b/drivers/edac/mce_amd_inj.c
    index 421c3b5..592871f 100644
    --- a/drivers/edac/mce_amd_inj.c
    +++ b/drivers/edac/mce_amd_inj.c
    @@ -77,6 +77,61 @@ 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_HW_INJECT);
    +
    + 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_HW_INJECT;
    + break;
    +
    + case 1:
    + m->inject_flags |= MCJ_HW_INJECT;
    + break;
    +
    + default:
    + printk(KERN_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 >= num_online_cpus()) {
    + printk(KERN_ERR "%s: Non-existent 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.
    */
    @@ -116,6 +171,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 edac_init_mce_inject(void)
    --
    1.7.4.rc2


    \
     
     \ /
      Last update: 2011-05-09 20:39    [W:0.023 / U:0.908 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site