From: "Alastair D'Silva" <alastair@au1.ibm.com>
To: alastair@d-silva.org
Cc: "Madhavan Srinivasan" <maddy@linux.vnet.ibm.com>,
"Alexey Kardashevskiy" <aik@ozlabs.ru>,
"Keith Busch" <keith.busch@intel.com>,
"Masahiro Yamada" <yamada.masahiro@socionext.com>,
"Paul Mackerras" <paulus@samba.org>,
"Mauro Carvalho Chehab" <mchehab+samsung@kernel.org>,
"Ira Weiny" <ira.weiny@intel.com>,
"Thomas Gleixner" <tglx@linutronix.de>,
"Rob Herring" <robh@kernel.org>,
"Dave Jiang" <dave.jiang@intel.com>,
linux-nvdimm@lists.01.org,
"Vishal Verma" <vishal.l.verma@intel.com>,
"Krzysztof Kozlowski" <krzk@kernel.org>,
"Anju T Sudhakar" <anju@linux.vnet.ibm.com>,
"Mahesh Salgaonkar" <mahesh@linux.vnet.ibm.com>,
"Andrew Donnellan" <ajd@linux.ibm.com>,
"Arnd Bergmann" <arnd@arndb.de>, "Greg Kurz" <groug@kaod.org>,
"Nicholas Piggin" <npiggin@gmail.com>,
"Cédric Le Goater" <clg@kaod.org>,
"Dan Williams" <dan.j.williams@intel.com>,
"Hari Bathini" <hbathini@linux.ibm.com>,
linux-mm@kvack.org,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
linux-kernel@vger.kernel.org,
"Frederic Barrat" <fbarrat@linux.ibm.com>,
"Andrew Morton" <akpm@linux-foundation.org>,
linuxppc-dev@lists.ozlabs.org,
"David S. Miller" <davem@davemloft.net>
Subject: [PATCH v2 15/27] nvdimm/ocxl: Register a character device for userspace to interact with
Date: Tue, 3 Dec 2019 14:46:43 +1100 [thread overview]
Message-ID: <20191203034655.51561-16-alastair@au1.ibm.com> (raw)
In-Reply-To: <20191203034655.51561-1-alastair@au1.ibm.com>
From: Alastair D'Silva <alastair@d-silva.org>
This patch introduces a character device (/dev/ocxl-scmX) which further
patches will use to interact with userspace.
Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
---
drivers/nvdimm/ocxl/scm.c | 114 ++++++++++++++++++++++++++++-
drivers/nvdimm/ocxl/scm_internal.h | 2 +
2 files changed, 115 insertions(+), 1 deletion(-)
diff --git a/drivers/nvdimm/ocxl/scm.c b/drivers/nvdimm/ocxl/scm.c
index 6c16ca7fabfa..c313a473a28e 100644
--- a/drivers/nvdimm/ocxl/scm.c
+++ b/drivers/nvdimm/ocxl/scm.c
@@ -9,6 +9,7 @@
#include <misc/ocxl.h>
#include <linux/delay.h>
#include <linux/ndctl.h>
+#include <linux/fs.h>
#include <linux/mm_types.h>
#include <linux/memory_hotplug.h>
#include "scm_internal.h"
@@ -386,6 +387,9 @@ static void free_scm(struct scm_data *scm_data)
free_scm_minor(scm_data);
+ if (scm_data->cdev.owner)
+ cdev_del(&scm_data->cdev);
+
if (scm_data->metadata_addr)
devm_memunmap(&scm_data->dev, scm_data->metadata_addr);
@@ -444,6 +448,70 @@ static int scm_register(struct scm_data *scm_data)
return rc;
}
+static void scm_put(struct scm_data *scm_data)
+{
+ put_device(&scm_data->dev);
+}
+
+static struct scm_data *scm_get(struct scm_data *scm_data)
+{
+ return (get_device(&scm_data->dev) == NULL) ? NULL : scm_data;
+}
+
+static struct scm_data *find_and_get_scm(dev_t devno)
+{
+ struct scm_data *scm_data;
+ int minor = MINOR(devno);
+ /*
+ * We don't declare an RCU critical section here, as our AFU
+ * is protected by a reference counter on the device. By the time the
+ * minor number of a device is removed from the idr, the ref count of
+ * the device is already at 0, so no user API will access that AFU and
+ * this function can't return it.
+ */
+ scm_data = idr_find(&minors_idr, minor);
+ if (scm_data)
+ scm_get(scm_data);
+ return scm_data;
+}
+
+static int scm_file_open(struct inode *inode, struct file *file)
+{
+ struct scm_data *scm_data;
+
+ scm_data = find_and_get_scm(inode->i_rdev);
+ if (!scm_data)
+ return -ENODEV;
+
+ file->private_data = scm_data;
+ return 0;
+}
+
+static int scm_file_release(struct inode *inode, struct file *file)
+{
+ struct scm_data *scm_data = file->private_data;
+
+ scm_put(scm_data);
+ return 0;
+}
+
+static const struct file_operations scm_fops = {
+ .owner = THIS_MODULE,
+ .open = scm_file_open,
+ .release = scm_file_release,
+};
+
+/**
+ * scm_create_cdev() - Create the chardev in /dev for this scm device
+ * @scm_data: the SCM metadata
+ * Return: 0 on success, negative on failure
+ */
+static int scm_create_cdev(struct scm_data *scm_data)
+{
+ cdev_init(&scm_data->cdev, &scm_fops);
+ return cdev_add(&scm_data->cdev, scm_data->dev.devt, 1);
+}
+
/**
* scm_remove() - Free an OpenCAPI Storage Class Memory device
* @pdev: the PCI device information struct
@@ -616,6 +684,11 @@ static int scm_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
goto err;
}
+ if (scm_create_cdev(scm_data)) {
+ dev_err(&pdev->dev, "Could not create SCM character device\n");
+ goto err;
+ }
+
elapsed = 0;
timeout = scm_data->readiness_timeout + scm_data->memory_available_timeout;
while (!scm_is_usable(scm_data)) {
@@ -653,20 +726,59 @@ static struct pci_driver scm_pci_driver = {
.shutdown = scm_remove,
};
+static int scm_file_init(void)
+{
+ int rc;
+
+ mutex_init(&minors_idr_lock);
+ idr_init(&minors_idr);
+
+ rc = alloc_chrdev_region(&scm_dev, 0, SCM_NUM_MINORS, "ocxl-scm");
+ if (rc) {
+ idr_destroy(&minors_idr);
+ pr_err("Unable to allocate scm major number: %d\n", rc);
+ return rc;
+ }
+
+ scm_class = class_create(THIS_MODULE, "ocxl-scm");
+ if (IS_ERR(scm_class)) {
+ idr_destroy(&minors_idr);
+ pr_err("Unable to create ocxl-scm class\n");
+ unregister_chrdev_region(scm_dev, SCM_NUM_MINORS);
+ return PTR_ERR(scm_class);
+ }
+
+ return 0;
+}
+
+static void scm_file_exit(void)
+{
+ class_destroy(scm_class);
+ unregister_chrdev_region(scm_dev, SCM_NUM_MINORS);
+ idr_destroy(&minors_idr);
+}
+
static int __init scm_init(void)
{
int rc = 0;
- rc = pci_register_driver(&scm_pci_driver);
+ rc = scm_file_init();
if (rc)
return rc;
+ rc = pci_register_driver(&scm_pci_driver);
+ if (rc) {
+ scm_file_exit();
+ return rc;
+ }
+
return 0;
}
static void scm_exit(void)
{
pci_unregister_driver(&scm_pci_driver);
+ scm_file_exit();
}
module_init(scm_init);
diff --git a/drivers/nvdimm/ocxl/scm_internal.h b/drivers/nvdimm/ocxl/scm_internal.h
index 9575996a89e7..57491dbee1a4 100644
--- a/drivers/nvdimm/ocxl/scm_internal.h
+++ b/drivers/nvdimm/ocxl/scm_internal.h
@@ -2,6 +2,7 @@
// Copyright 2019 IBM Corp.
#include <linux/pci.h>
+#include <linux/cdev.h>
#include <misc/ocxl.h>
#include <linux/libnvdimm.h>
#include <linux/mm.h>
@@ -100,6 +101,7 @@ struct scm_function_0 {
struct scm_data {
struct device dev;
struct pci_dev *pdev;
+ struct cdev cdev;
struct ocxl_fn *ocxl_fn;
struct nd_interleave_set nd_set;
struct nvdimm_bus_descriptor bus_desc;
--
2.23.0
next prev parent reply other threads:[~2019-12-03 4:37 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-03 3:46 [PATCH v2 00/27] Add support for OpenCAPI SCM devices Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 01/27] memory_hotplug: Add a bounds check to __add_pages Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 02/27] nvdimm: remove prototypes for nonexistent functions Alastair D'Silva
2019-12-03 4:47 ` Andrew Donnellan
2019-12-04 0:10 ` Dan Williams
2020-01-23 21:49 ` Dan Williams
2019-12-03 3:46 ` [PATCH v2 03/27] powerpc: Add OPAL calls for LPC memory alloc/release Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 04/27] mm/memory_hotplug: Allow check_hotplug_memory_addressable to be called from drivers Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 05/27] powerpc: Map & release OpenCAPI LPC memory Alastair D'Silva
2020-01-09 14:41 ` Frederic Barrat
2020-01-21 6:46 ` Andrew Donnellan
2020-01-21 7:11 ` Greg Kurz
2020-02-14 11:09 ` Frederic Barrat
2020-02-18 23:44 ` Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 06/27] ocxl: Tally up the LPC memory on a link & allow it to be mapped Alastair D'Silva
2020-01-09 14:48 ` Frederic Barrat
2020-02-03 12:37 ` Jonathan Cameron
2020-02-19 0:01 ` Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 07/27] ocxl: Add functions to map/unmap LPC memory Alastair D'Silva
2020-01-09 14:49 ` Frederic Barrat
2020-02-03 12:49 ` Jonathan Cameron
2020-02-19 2:39 ` Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 08/27] ocxl: Save the device serial number in ocxl_fn Alastair D'Silva
2020-02-03 12:53 ` Jonathan Cameron
2020-02-19 4:03 ` Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 09/27] ocxl: Free detached contexts in ocxl_context_detach_all() Alastair D'Silva
2020-01-09 14:54 ` Frederic Barrat
2019-12-03 3:46 ` [PATCH v2 10/27] nvdimm: Add driver for OpenCAPI Storage Class Memory Alastair D'Silva
2019-12-03 5:05 ` Alastair D'Silva
2020-02-03 13:20 ` Jonathan Cameron
2020-02-19 4:40 ` Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 11/27] nvdimm/ocxl: Add register addresses & status values to header Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 12/27] nvdimm/ocxl: Read the capability registers & wait for device ready Alastair D'Silva
2020-02-03 13:23 ` Jonathan Cameron
2020-02-19 4:46 ` Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 13/27] nvdimm/ocxl: Add support for Admin commands Alastair D'Silva
2020-02-03 14:18 ` Jonathan Cameron
2020-02-19 5:00 ` Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 14/27] nvdimm/ocxl: Add support for near storage commands Alastair D'Silva
2020-02-03 14:22 ` Jonathan Cameron
2020-02-19 4:54 ` Alastair D'Silva
2019-12-03 3:46 ` Alastair D'Silva [this message]
2019-12-03 3:46 ` [PATCH v2 16/27] nvdimm/ocxl: Implement the Read Error Log command Alastair D'Silva
2019-12-05 3:42 ` Alastair D'Silva
2019-12-05 19:34 ` kbuild test robot
2019-12-03 3:46 ` [PATCH v2 17/27] nvdimm/ocxl: Add controller dump IOCTLs Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 18/27] nvdimm/ocxl: Add an IOCTL to report controller statistics Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 19/27] nvdimm/ocxl: Forward events to userspace Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 20/27] nvdimm/ocxl: Add an IOCTL to request controller health & perf data Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 21/27] nvdimm/ocxl: Support firmware update via sysfs Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 22/27] nvdimm/ocxl: Implement the heartbeat command Alastair D'Silva
2020-02-03 15:11 ` Jonathan Cameron
2020-02-19 5:02 ` Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 23/27] nvdimm/ocxl: Add debug IOCTLs Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 24/27] nvdimm/ocxl: Implement Overwrite Alastair D'Silva
2020-02-03 15:10 ` Jonathan Cameron
2020-02-19 5:13 ` Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 25/27] nvdimm/ocxl: Expose SMART data via ndctl Alastair D'Silva
2019-12-16 0:15 ` Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 26/27] powerpc: Enable OpenCAPI Storage Class Memory driver on bare metal Alastair D'Silva
2019-12-03 4:54 ` Andrew Donnellan
2019-12-03 4:57 ` Alastair D'Silva
2019-12-03 3:46 ` [PATCH v2 27/27] MAINTAINERS: Add myself & nvdimm/ocxl to ocxl Alastair D'Silva
2019-12-03 3:50 ` [PATCH v2 00/27] Add support for OpenCAPI SCM devices Matthew Wilcox
2019-12-03 4:01 ` Alastair D'Silva
2019-12-03 12:42 ` Matthew Wilcox
2019-12-04 0:15 ` Dan Williams
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=20191203034655.51561-16-alastair@au1.ibm.com \
--to=alastair@au1.ibm.com \
--cc=aik@ozlabs.ru \
--cc=ajd@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=alastair@d-silva.org \
--cc=anju@linux.vnet.ibm.com \
--cc=arnd@arndb.de \
--cc=clg@kaod.org \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=davem@davemloft.net \
--cc=fbarrat@linux.ibm.com \
--cc=gregkh@linuxfoundation.org \
--cc=groug@kaod.org \
--cc=hbathini@linux.ibm.com \
--cc=ira.weiny@intel.com \
--cc=keith.busch@intel.com \
--cc=krzk@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-nvdimm@lists.01.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=maddy@linux.vnet.ibm.com \
--cc=mahesh@linux.vnet.ibm.com \
--cc=mchehab+samsung@kernel.org \
--cc=npiggin@gmail.com \
--cc=paulus@samba.org \
--cc=robh@kernel.org \
--cc=tglx@linutronix.de \
--cc=vishal.l.verma@intel.com \
--cc=yamada.masahiro@socionext.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).