anitazha / rpms / ndctl

Forked from rpms/ndctl 2 years ago
Clone

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

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