lkml.org 
[lkml]   [2019]   [Oct]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/6] EDAC/amd64: Gather hardware information early
    Date
    From: Yazen Ghannam <yazen.ghannam@amd.com>

    Split out gathering hardware information from init_one_instance() into a
    separate function get_hardware_info().

    This is necessary so that the information can be cached earlier and used
    to check if memory is populated and if ECC is enabled on a node.

    Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
    ---
    Link:
    https://lkml.kernel.org/r/20190821235938.118710-9-Yazen.Ghannam@amd.com

    rfc -> v1:
    * Fixup after making struct amd64_family_type fam_type global.

    drivers/edac/amd64_edac.c | 72 +++++++++++++++++++++++----------------
    1 file changed, 42 insertions(+), 30 deletions(-)

    diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
    index b9a712819c68..4410da7c3a25 100644
    --- a/drivers/edac/amd64_edac.c
    +++ b/drivers/edac/amd64_edac.c
    @@ -3416,33 +3416,16 @@ static void compute_num_umcs(void)
    edac_dbg(1, "Number of UMCs: %x", num_umcs);
    }

    -static int init_one_instance(unsigned int nid)
    +static int get_hardware_info(struct amd64_pvt *pvt)
    {
    - struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
    - struct mem_ctl_info *mci = NULL;
    - struct edac_mc_layer layers[2];
    - struct amd64_pvt *pvt = NULL;
    u16 pci_id1, pci_id2;
    - int err = 0, ret;
    -
    - ret = -ENOMEM;
    - pvt = kzalloc(sizeof(struct amd64_pvt), GFP_KERNEL);
    - if (!pvt)
    - goto err_ret;
    -
    - pvt->mc_node_id = nid;
    - pvt->F3 = F3;
    -
    - ret = -EINVAL;
    - fam_type = per_family_init(pvt);
    - if (!fam_type)
    - goto err_free;
    + int ret = -EINVAL;

    if (pvt->fam >= 0x17) {
    pvt->umc = kcalloc(num_umcs, sizeof(struct amd64_umc), GFP_KERNEL);
    if (!pvt->umc) {
    ret = -ENOMEM;
    - goto err_free;
    + goto err_ret;
    }

    pci_id1 = fam_type->f0_id;
    @@ -3452,18 +3435,33 @@ static int init_one_instance(unsigned int nid)
    pci_id2 = fam_type->f2_id;
    }

    - err = reserve_mc_sibling_devs(pvt, pci_id1, pci_id2);
    - if (err)
    + ret = reserve_mc_sibling_devs(pvt, pci_id1, pci_id2);
    + if (ret)
    goto err_post_init;

    read_mc_regs(pvt);

    + return 0;
    +
    +err_post_init:
    + if (pvt->fam >= 0x17)
    + kfree(pvt->umc);
    +
    +err_ret:
    + return ret;
    +}
    +
    +static int init_one_instance(struct amd64_pvt *pvt)
    +{
    + struct mem_ctl_info *mci = NULL;
    + struct edac_mc_layer layers[2];
    + int ret = -EINVAL;
    +
    /*
    * We need to determine how many memory channels there are. Then use
    * that information for calculating the size of the dynamic instance
    * tables in the 'mci' structure.
    */
    - ret = -EINVAL;
    pvt->channel_count = pvt->ops->early_channel_count(pvt);
    if (pvt->channel_count < 0)
    goto err_siblings;
    @@ -3488,7 +3486,7 @@ static int init_one_instance(unsigned int nid)
    layers[1].size = 2;
    layers[1].is_virt_csrow = false;

    - mci = edac_mc_alloc(nid, ARRAY_SIZE(layers), layers, 0);
    + mci = edac_mc_alloc(pvt->mc_node_id, ARRAY_SIZE(layers), layers, 0);
    if (!mci)
    goto err_siblings;

    @@ -3514,20 +3512,16 @@ static int init_one_instance(unsigned int nid)
    err_siblings:
    free_mc_sibling_devs(pvt);

    -err_post_init:
    if (pvt->fam >= 0x17)
    kfree(pvt->umc);

    -err_free:
    - kfree(pvt);
    -
    -err_ret:
    return ret;
    }

    static int probe_one_instance(unsigned int nid)
    {
    struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
    + struct amd64_pvt *pvt = NULL;
    struct ecc_settings *s;
    int ret;

    @@ -3538,6 +3532,21 @@ static int probe_one_instance(unsigned int nid)

    ecc_stngs[nid] = s;

    + pvt = kzalloc(sizeof(struct amd64_pvt), GFP_KERNEL);
    + if (!pvt)
    + goto err_settings;
    +
    + pvt->mc_node_id = nid;
    + pvt->F3 = F3;
    +
    + fam_type = per_family_init(pvt);
    + if (!fam_type)
    + goto err_enable;
    +
    + ret = get_hardware_info(pvt);
    + if (ret < 0)
    + goto err_enable;
    +
    if (!ecc_enabled(F3, nid)) {
    ret = 0;

    @@ -3554,7 +3563,7 @@ static int probe_one_instance(unsigned int nid)
    goto err_enable;
    }

    - ret = init_one_instance(nid);
    + ret = init_one_instance(pvt);
    if (ret < 0) {
    amd64_err("Error probing instance: %d\n", nid);

    @@ -3567,6 +3576,9 @@ static int probe_one_instance(unsigned int nid)
    return ret;

    err_enable:
    + kfree(pvt);
    +
    +err_settings:
    kfree(s);
    ecc_stngs[nid] = NULL;

    --
    2.17.1
    \
     
     \ /
      Last update: 2019-10-18 17:32    [W:3.153 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site