Blame SOURCES/0018-libndctl-Unify-adding-dimms-for-papr-and-nfit-famili.patch

26ccd9
From daef3a386a9c45105a2c045ddee46600e265939f Mon Sep 17 00:00:00 2001
26ccd9
From: Santosh Sivaraj <santosh@fossix.org>
26ccd9
Date: Thu, 13 May 2021 11:42:15 +0530
26ccd9
Subject: [PATCH 018/217] libndctl: Unify adding dimms for papr and nfit
26ccd9
 families
0670da
26ccd9
In preparation for enabling tests on non-nfit devices, unify both, already very
26ccd9
similar, functions into one. This will help in adding all attributes needed for
26ccd9
the unit tests. Since the function doesn't fail if some of the dimm attributes
26ccd9
are missing, this will work fine on PAPR platforms though only part of the DIMM
26ccd9
attributes are provided (This doesn't mean that all of the DIMM attributes can
26ccd9
be missing).
0670da
26ccd9
Link: https://lore.kernel.org/r/20210513061218.760322-1-santosh@fossix.org
26ccd9
Signed-off-by: Santosh Sivaraj <santosh@fossix.org>
26ccd9
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
26ccd9
---
26ccd9
 ndctl/lib/libndctl.c | 103 ++++++++++++++++---------------------------
26ccd9
 1 file changed, 38 insertions(+), 65 deletions(-)
0670da
0670da
diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c
0670da
index 2f6d806..e45353f 100644
0670da
--- a/ndctl/lib/libndctl.c
0670da
+++ b/ndctl/lib/libndctl.c
0670da
@@ -1646,41 +1646,9 @@ static int ndctl_bind(struct ndctl_ctx *ctx, struct kmod_module *module,
0670da
 static int ndctl_unbind(struct ndctl_ctx *ctx, const char *devpath);
0670da
 static struct kmod_module *to_module(struct ndctl_ctx *ctx, const char *alias);
0670da
 
0670da
-static int add_papr_dimm(struct ndctl_dimm *dimm, const char *dimm_base)
0670da
-{
0670da
-	int rc = -ENODEV;
0670da
-	char buf[SYSFS_ATTR_SIZE];
0670da
-	struct ndctl_ctx *ctx = dimm->bus->ctx;
0670da
-	char *path = calloc(1, strlen(dimm_base) + 100);
0670da
-	const char * const devname = ndctl_dimm_get_devname(dimm);
0670da
-
0670da
-	dbg(ctx, "%s: Probing of_pmem dimm at %s\n", devname, dimm_base);
0670da
-
0670da
-	if (!path)
0670da
-		return -ENOMEM;
0670da
-
0670da
-	/* construct path to the papr compatible dimm flags file */
0670da
-	sprintf(path, "%s/papr/flags", dimm_base);
0670da
-
0670da
-	if (ndctl_bus_is_papr_scm(dimm->bus) &&
0670da
-	    sysfs_read_attr(ctx, path, buf) == 0) {
0670da
-
0670da
-		dbg(ctx, "%s: Adding papr-scm dimm flags:\"%s\"\n", devname, buf);
0670da
-		dimm->cmd_family = NVDIMM_FAMILY_PAPR;
0670da
-
0670da
-		/* Parse dimm flags */
0670da
-		parse_papr_flags(dimm, buf);
0670da
-
0670da
-		/* Allocate monitor mode fd */
0670da
-		dimm->health_eventfd = open(path, O_RDONLY|O_CLOEXEC);
0670da
-		rc = 0;
0670da
-	}
0670da
-
0670da
-	free(path);
0670da
-	return rc;
0670da
-}
0670da
-
0670da
-static int add_nfit_dimm(struct ndctl_dimm *dimm, const char *dimm_base)
0670da
+static int populate_dimm_attributes(struct ndctl_dimm *dimm,
0670da
+				    const char *dimm_base,
0670da
+				    const char *bus_prefix)
0670da
 {
0670da
 	int i, rc = -1;
0670da
 	char buf[SYSFS_ATTR_SIZE];
0670da
@@ -1694,7 +1662,7 @@ static int add_nfit_dimm(struct ndctl_dimm *dimm, const char *dimm_base)
0670da
 	 * 'unique_id' may not be available on older kernels, so don't
0670da
 	 * fail if the read fails.
0670da
 	 */
0670da
-	sprintf(path, "%s/nfit/id", dimm_base);
0670da
+	sprintf(path, "%s/%s/id", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0) {
0670da
 		unsigned int b[9];
0670da
 
0670da
@@ -1709,68 +1677,74 @@ static int add_nfit_dimm(struct ndctl_dimm *dimm, const char *dimm_base)
0670da
 		}
0670da
 	}
0670da
 
0670da
-	sprintf(path, "%s/nfit/handle", dimm_base);
0670da
+	sprintf(path, "%s/%s/handle", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) < 0)
0670da
 		goto err_read;
0670da
 	dimm->handle = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/phys_id", dimm_base);
0670da
+	sprintf(path, "%s/%s/phys_id", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) < 0)
0670da
 		goto err_read;
0670da
 	dimm->phys_id = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/serial", dimm_base);
0670da
+	sprintf(path, "%s/%s/serial", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 		dimm->serial = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/vendor", dimm_base);
0670da
+	sprintf(path, "%s/%s/vendor", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 		dimm->vendor_id = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/device", dimm_base);
0670da
+	sprintf(path, "%s/%s/device", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 		dimm->device_id = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/rev_id", dimm_base);
0670da
+	sprintf(path, "%s/%s/rev_id", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 		dimm->revision_id = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/dirty_shutdown", dimm_base);
0670da
+	sprintf(path, "%s/%s/dirty_shutdown", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 		dimm->dirty_shutdown = strtoll(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/subsystem_vendor", dimm_base);
0670da
+	sprintf(path, "%s/%s/subsystem_vendor", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 		dimm->subsystem_vendor_id = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/subsystem_device", dimm_base);
0670da
+	sprintf(path, "%s/%s/subsystem_device", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 		dimm->subsystem_device_id = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/subsystem_rev_id", dimm_base);
0670da
+	sprintf(path, "%s/%s/subsystem_rev_id", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 		dimm->subsystem_revision_id = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/family", dimm_base);
0670da
+	sprintf(path, "%s/%s/family", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 		dimm->cmd_family = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/dsm_mask", dimm_base);
0670da
+	sprintf(path, "%s/%s/dsm_mask", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 		dimm->nfit_dsm_mask = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/format", dimm_base);
0670da
+	sprintf(path, "%s/%s/format", dimm_base, bus_prefix);
0670da
 	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 		dimm->format[0] = strtoul(buf, NULL, 0);
0670da
 	for (i = 1; i < dimm->formats; i++) {
0670da
-		sprintf(path, "%s/nfit/format%d", dimm_base, i);
0670da
+		sprintf(path, "%s/%s/format%d", dimm_base, bus_prefix, i);
0670da
 		if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
 			dimm->format[i] = strtoul(buf, NULL, 0);
0670da
 	}
0670da
 
0670da
-	sprintf(path, "%s/nfit/flags", dimm_base);
0670da
-	if (sysfs_read_attr(ctx, path, buf) == 0)
0670da
-		parse_nfit_mem_flags(dimm, buf);
0670da
+	sprintf(path, "%s/%s/flags", dimm_base, bus_prefix);
0670da
+	if (sysfs_read_attr(ctx, path, buf) == 0) {
0670da
+		if (ndctl_bus_has_nfit(dimm->bus))
0670da
+			parse_nfit_mem_flags(dimm, buf);
0670da
+		else if (ndctl_bus_is_papr_scm(dimm->bus)) {
0670da
+			dimm->cmd_family = NVDIMM_FAMILY_PAPR;
0670da
+			parse_papr_flags(dimm, buf);
0670da
+		}
0670da
+	}
0670da
 
0670da
 	dimm->health_eventfd = open(path, O_RDONLY|O_CLOEXEC);
0670da
 	rc = 0;
0670da
@@ -1792,7 +1766,8 @@ static void *add_dimm(void *parent, int id, const char *dimm_base)
0670da
 	if (!path)
0670da
 		return NULL;
0670da
 
0670da
-	sprintf(path, "%s/nfit/formats", dimm_base);
0670da
+	sprintf(path, "%s/%s/formats", dimm_base,
0670da
+		ndctl_bus_has_nfit(bus) ? "nfit" : "papr");
0670da
 	if (sysfs_read_attr(ctx, path, buf) < 0)
0670da
 		formats = 1;
0670da
 	else
0670da
@@ -1866,13 +1841,12 @@ static void *add_dimm(void *parent, int id, const char *dimm_base)
0670da
 	else
0670da
 		dimm->fwa_result = fwa_result_to_result(buf);
0670da
 
0670da
+	dimm->formats = formats;
0670da
 	/* Check if the given dimm supports nfit */
0670da
 	if (ndctl_bus_has_nfit(bus)) {
0670da
-		dimm->formats = formats;
0670da
-		rc = add_nfit_dimm(dimm, dimm_base);
0670da
-	} else if (ndctl_bus_has_of_node(bus)) {
0670da
-		rc = add_papr_dimm(dimm, dimm_base);
0670da
-	}
0670da
+		rc = populate_dimm_attributes(dimm, dimm_base, "nfit");
0670da
+	} else if (ndctl_bus_has_of_node(bus))
0670da
+		rc = populate_dimm_attributes(dimm, dimm_base, "papr");
0670da
 
0670da
 	if (rc == -ENODEV) {
0670da
 		/* Unprobed dimm with no family */
0670da
@@ -2531,13 +2505,12 @@ static void *add_region(void *parent, int id, const char *region_base)
0670da
 		goto err_read;
0670da
 	region->num_mappings = strtoul(buf, NULL, 0);
0670da
 
0670da
-	sprintf(path, "%s/nfit/range_index", region_base);
0670da
-	if (ndctl_bus_has_nfit(bus)) {
0670da
-		if (sysfs_read_attr(ctx, path, buf) < 0)
0670da
-			goto err_read;
0670da
-		region->range_index = strtoul(buf, NULL, 0);
0670da
-	} else
0670da
+	sprintf(path, "%s/%s/range_index", region_base,
0670da
+		ndctl_bus_has_nfit(bus) ? "nfit": "papr");
0670da
+	if (sysfs_read_attr(ctx, path, buf) < 0)
0670da
 		region->range_index = -1;
0670da
+	else
0670da
+		region->range_index = strtoul(buf, NULL, 0);
0670da
 
0670da
 	sprintf(path, "%s/read_only", region_base);
0670da
 	if (sysfs_read_attr(ctx, path, buf) < 0)
26ccd9
-- 
26ccd9
2.27.0
26ccd9