All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yazen Ghannam <yazen.ghannam@amd.com>
To: <bp@alien8.de>, <linux-edac@vger.kernel.org>
Cc: <linux-kernel@vger.kernel.org>, <muralidhara.mk@amd.com>,
	<naveenkrishna.chatradhi@amd.com>,
	Yazen Ghannam <yazen.ghannam@amd.com>
Subject: [PATCH v2 11/22] EDAC/amd64: Rework hw_info_{get,put}
Date: Fri, 27 Jan 2023 17:04:08 +0000	[thread overview]
Message-ID: <20230127170419.1824692-12-yazen.ghannam@amd.com> (raw)
In-Reply-To: <20230127170419.1824692-1-yazen.ghannam@amd.com>

The bulk of system-specific information is gathered at init time with
hw_info_get(). This function calls a number of helper functions, and
many of these helper functions are split between a modern UMC/DF path
and a legacy DCT path.

Split hw_info_get() into legacy and modern versions. This creates two
separate code paths early on, and legacy and modern helper functions can
be called directly in the appropriate code path.

Also, simplify hw_info_put() and share it between legacy and modern
systems. NULL pointer checks are done in pci_dev_put() and kfree(), so
they can be called unconditionally.

Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
---
Link:
https://lore.kernel.org/r/Yn0a9T9xqAkWnPWt@yaz-fattaah

v1->v2:
* New in v2.

 drivers/edac/amd64_edac.c | 78 +++++++++++++++++----------------------
 drivers/edac/amd64_edac.h |  1 +
 2 files changed, 34 insertions(+), 45 deletions(-)

diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
index a9b20bc413af..3830b0a4b5dc 100644
--- a/drivers/edac/amd64_edac.c
+++ b/drivers/edac/amd64_edac.c
@@ -3045,9 +3045,6 @@ static void decode_umc_error(int node_id, struct mce *m)
 static int
 reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 pci_id1, u16 pci_id2)
 {
-	if (pvt->umc)
-		return 0;
-
 	/* Reserve the ADDRESS MAP Device */
 	pvt->F1 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
 	if (!pvt->F1) {
@@ -3075,16 +3072,6 @@ reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 pci_id1, u16 pci_id2)
 	return 0;
 }
 
-static void free_mc_sibling_devs(struct amd64_pvt *pvt)
-{
-	if (pvt->umc) {
-		return;
-	} else {
-		pci_dev_put(pvt->F1);
-		pci_dev_put(pvt->F2);
-	}
-}
-
 static void determine_ecc_sym_sz(struct amd64_pvt *pvt)
 {
 	pvt->ecc_sym_sz = 4;
@@ -3671,13 +3658,45 @@ static void setup_mci_misc_attrs(struct mem_ctl_info *mci)
 	mci->get_sdram_scrub_rate = get_scrub_rate;
 }
 
+static int dct_hw_info_get(struct amd64_pvt *pvt)
+{
+	int ret = reserve_mc_sibling_devs(pvt, pvt->f1_id, pvt->f2_id);
+
+	if (ret)
+		return ret;
+
+	read_mc_regs(pvt);
+
+	return 0;
+}
+
+static int umc_hw_info_get(struct amd64_pvt *pvt)
+{
+	pvt->umc = kcalloc(pvt->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
+	if (!pvt->umc)
+		return -ENOMEM;
+
+	read_mc_regs(pvt);
+
+	return 0;
+}
+
+static void hw_info_put(struct amd64_pvt *pvt)
+{
+	pci_dev_put(pvt->F1);
+	pci_dev_put(pvt->F2);
+	kfree(pvt->umc);
+}
+
 static struct low_ops umc_ops = {
+	.hw_info_get			= umc_hw_info_get,
 };
 
 /* Use Family 16h versions for defaults and adjust as needed below. */
 static struct low_ops dct_ops = {
 	.map_sysaddr_to_csrow		= f1x_map_sysaddr_to_csrow,
 	.dbam_to_cs			= f16_dbam_to_chip_select,
+	.hw_info_get			= dct_hw_info_get,
 };
 
 static int per_family_init(struct amd64_pvt *pvt)
@@ -3820,37 +3839,6 @@ static const struct attribute_group *amd64_edac_attr_groups[] = {
 	NULL
 };
 
-static int hw_info_get(struct amd64_pvt *pvt)
-{
-	u16 pci_id1, pci_id2;
-	int ret;
-
-	if (pvt->fam >= 0x17) {
-		pvt->umc = kcalloc(pvt->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
-		if (!pvt->umc)
-			return -ENOMEM;
-	} else {
-		pci_id1 = pvt->f1_id;
-		pci_id2 = pvt->f2_id;
-	}
-
-	ret = reserve_mc_sibling_devs(pvt, pci_id1, pci_id2);
-	if (ret)
-		return ret;
-
-	read_mc_regs(pvt);
-
-	return 0;
-}
-
-static void hw_info_put(struct amd64_pvt *pvt)
-{
-	if (pvt->F1)
-		free_mc_sibling_devs(pvt);
-
-	kfree(pvt->umc);
-}
-
 static int init_one_instance(struct amd64_pvt *pvt)
 {
 	struct mem_ctl_info *mci = NULL;
@@ -3924,7 +3912,7 @@ static int probe_one_instance(unsigned int nid)
 	if (ret < 0)
 		goto err_enable;
 
-	ret = hw_info_get(pvt);
+	ret = pvt->ops->hw_info_get(pvt);
 	if (ret < 0)
 		goto err_enable;
 
diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h
index 8eea15546b9f..00b3f32e3cbb 100644
--- a/drivers/edac/amd64_edac.h
+++ b/drivers/edac/amd64_edac.h
@@ -466,6 +466,7 @@ struct low_ops {
 				     struct err_info *err);
 	int  (*dbam_to_cs)(struct amd64_pvt *pvt, u8 dct,
 			   unsigned int cs_mode, int cs_mask_nr);
+	int (*hw_info_get)(struct amd64_pvt *pvt);
 };
 
 int __amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset,
-- 
2.25.1


  parent reply	other threads:[~2023-01-27 17:05 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-27 17:03 [PATCH v2 00/22] AMD64 EDAC Cleanup and Refactor Yazen Ghannam
2023-01-27 17:03 ` [PATCH v2 01/22] EDAC/amd64: Don't set up EDAC PCI control on Family 17h+ Yazen Ghannam
2023-01-27 17:03 ` [PATCH v2 02/22] EDAC/amd64: Remove scrub rate control for Family 17h and later Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 03/22] EDAC/amd64: Remove PCI Function 6 Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 04/22] EDAC/amd64: Remove PCI Function 0 Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 05/22] EDAC/amd64: Remove early_channel_count() Yazen Ghannam
2023-02-10 12:16   ` Borislav Petkov
2023-02-13 16:54     ` Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 06/22] EDAC/amd64: Rename debug_display_dimm_sizes() Yazen Ghannam
2023-02-09 14:25   ` Borislav Petkov
2023-02-13 16:53     ` Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 07/22] EDAC/amd64: Split get_csrow_nr_pages() into dct/umc functions Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 08/22] EDAC/amd64: Drop dbam_to_cs() for Family 17h and later Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 09/22] EDAC/amd64: Don't find ECC symbol size " Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 10/22] EDAC/amd64: Merge struct amd64_family_type into struct amd64_pvt Yazen Ghannam
2023-03-18 15:39   ` Borislav Petkov
2023-01-27 17:04 ` Yazen Ghannam [this message]
2023-01-27 17:04 ` [PATCH v2 12/22] EDAC/amd64: Split prep_chip_selects() into dct/umc functions Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 13/22] EDAC/amd64: Split read_base_mask() " Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 14/22] EDAC/amd64: Split determine_memory_type() " Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 15/22] EDAC/amd64: Split read_mc_regs() " Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 16/22] EDAC/amd64: Split ecc_enabled() " Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 17/22] EDAC/amd64: Split setup_mci_misc_attrs() " Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 18/22] EDAC/amd64: Rename f17h_determine_edac_ctl_cap() Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 19/22] EDAC/amd64: Split determine_edac_cap() into dct/umc functions Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 20/22] EDAC/amd64: Split init_csrows() " Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 21/22] EDAC/amd64: Split dump_misc_regs() " Yazen Ghannam
2023-01-27 17:04 ` [PATCH v2 22/22] EDAC/amd64: Add get_err_info() to pvt->ops Yazen Ghannam
2023-03-23 11:01 ` [PATCH v2 00/22] AMD64 EDAC Cleanup and Refactor Borislav Petkov
2023-03-23 15:19   ` Yazen Ghannam

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230127170419.1824692-12-yazen.ghannam@amd.com \
    --to=yazen.ghannam@amd.com \
    --cc=bp@alien8.de \
    --cc=linux-edac@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=muralidhara.mk@amd.com \
    --cc=naveenkrishna.chatradhi@amd.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.