linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Vaibhav Jain <vaibhav@linux.vnet.ibm.com>
To: linuxppc-dev@lists.ozlabs.org
Cc: Vaibhav Jain <vaibhav@linux.vnet.ibm.com>,
	Frederic Barrat <fbarrat@linux.vnet.ibm.com>,
	Andrew Donnellan <andrew.donnellan@au1.ibm.com>,
	Ian Munsie <imunsie@au1.ibm.com>,
	Christophe Lombard <christophe_lombard@fr.ibm.com>,
	Philippe Bergheaud <philippe.bergheaud@fr.ibm.com>,
	Greg Kurz <gkurz@linux.vnet.ibm.com>
Subject: [PATCH 2/3] cxl: Introduce afu_desc sysfs attribute
Date: Tue, 14 Mar 2017 09:36:05 +0530	[thread overview]
Message-ID: <20170314040606.16894-3-vaibhav@linux.vnet.ibm.com> (raw)
In-Reply-To: <20170314040606.16894-1-vaibhav@linux.vnet.ibm.com>

This patch introduces a new afu sysfs attribute named afu_desc. This
binary attribute provides access to raw contents of the afu descriptor
to user-space. Direct access to afu descriptor is useful for libcxl
that can use it to determine if the CXL card has been fenced or
provide application access to afu attributes beyond one defined in
CAIA.

We introduce three new backend-ops:

* afu_desc_size(): Return the size in bytes of the afu descriptor.

* afu_desc_read(): Copy into a provided buffer contents of afu
  descriptor starting at specific offset.

* afu_desc_mmap(): Memory map the afu descriptor to the given
  vm_area_struct.

If afu_desc_size() > 0 the afu_desc attribute gets created for the AFU.
The bin_attribute callbacks route the calls to corresponding cxl backend
implementation.

Signed-off-by: Vaibhav Jain <vaibhav@linux.vnet.ibm.com>
---
 Documentation/ABI/testing/sysfs-class-cxl |  9 +++++++
 drivers/misc/cxl/cxl.h                    |  9 +++++++
 drivers/misc/cxl/sysfs.c                  | 45 +++++++++++++++++++++++++++++++
 3 files changed, 63 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-class-cxl b/Documentation/ABI/testing/sysfs-class-cxl
index 640f65e..9ac84c4 100644
--- a/Documentation/ABI/testing/sysfs-class-cxl
+++ b/Documentation/ABI/testing/sysfs-class-cxl
@@ -6,6 +6,15 @@ Example: The real path of the attribute /sys/class/cxl/afu0.0s/irqs_max is
 
 Slave contexts (eg. /sys/class/cxl/afu0.0s):
 
+What:           /sys/class/cxl/<afu>/afu_desc
+Date:           March 2016
+Contact:        linuxppc-dev@lists.ozlabs.org
+Description:    read only
+                AFU Descriptor contents. The contents of this file are
+		binary contents of the AFU descriptor. LIBCXL library can
+		use this file to read afu descriptor and in some special cases
+		determine if the cxl card has been fenced.
+
 What:           /sys/class/cxl/<afu>/afu_err_buf
 Date:           September 2014
 Contact:        linuxppc-dev@lists.ozlabs.org
diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h
index ef683b7..1c43d06 100644
--- a/drivers/misc/cxl/cxl.h
+++ b/drivers/misc/cxl/cxl.h
@@ -426,6 +426,9 @@ struct cxl_afu {
 	u64 eb_len, eb_offset;
 	struct bin_attribute attr_eb;
 
+	/* Afu descriptor */
+	struct bin_attribute attr_afud;
+
 	/* pointer to the vphb */
 	struct pci_controller *phb;
 
@@ -995,6 +998,12 @@ struct cxl_backend_ops {
 	int (*afu_cr_write16)(struct cxl_afu *afu, int cr_idx, u64 offset, u16 val);
 	int (*afu_cr_write32)(struct cxl_afu *afu, int cr_idx, u64 offset, u32 val);
 	ssize_t (*read_adapter_vpd)(struct cxl *adapter, void *buf, size_t count);
+	/* Access to AFU descriptor */
+	ssize_t (*afu_desc_size)(struct cxl_afu *afu);
+	ssize_t (*afu_desc_read)(struct cxl_afu *afu, char *buf, loff_t off,
+				 size_t count);
+	int (*afu_desc_mmap)(struct cxl_afu *afu, struct file *filp,
+			     struct vm_area_struct *vma);
 };
 extern const struct cxl_backend_ops cxl_native_ops;
 extern const struct cxl_backend_ops cxl_guest_ops;
diff --git a/drivers/misc/cxl/sysfs.c b/drivers/misc/cxl/sysfs.c
index a8b6d6a..fff3468 100644
--- a/drivers/misc/cxl/sysfs.c
+++ b/drivers/misc/cxl/sysfs.c
@@ -426,6 +426,26 @@ static ssize_t afu_eb_read(struct file *filp, struct kobject *kobj,
 	return cxl_ops->afu_read_err_buffer(afu, buf, off, count);
 }
 
+static ssize_t afu_desc_read(struct file *filp, struct kobject *kobj,
+			     struct bin_attribute *bin_attr, char *buf,
+			     loff_t off, size_t count)
+{
+	struct cxl_afu *afu = to_cxl_afu(kobj_to_dev(kobj));
+
+	return cxl_ops->afu_desc_read ?
+		cxl_ops->afu_desc_read(afu, buf, off, count) : -EIO;
+}
+
+static int afu_desc_mmap(struct file *filp, struct kobject *kobj,
+			 struct bin_attribute *attr, struct vm_area_struct *vma)
+{
+	struct cxl_afu *afu = to_cxl_afu(kobj_to_dev(kobj));
+
+	return cxl_ops->afu_desc_mmap ?
+		cxl_ops->afu_desc_mmap(afu, filp, vma) : -EINVAL;
+}
+
+
 static struct device_attribute afu_attrs[] = {
 	__ATTR_RO(mmio_size),
 	__ATTR_RO(irqs_min),
@@ -625,6 +645,9 @@ void cxl_sysfs_afu_remove(struct cxl_afu *afu)
 	struct afu_config_record *cr, *tmp;
 	int i;
 
+	if (afu->attr_afud.size > 0)
+		device_remove_bin_file(&afu->dev, &afu->attr_afud);
+
 	/* remove the err buffer bin attribute */
 	if (afu->eb_len)
 		device_remove_bin_file(&afu->dev, &afu->attr_eb);
@@ -686,6 +709,28 @@ int cxl_sysfs_afu_add(struct cxl_afu *afu)
 		list_add(&cr->list, &afu->crs);
 	}
 
+	/* Create the sysfs binattr for afu-descriptor */
+	afu->attr_afud.size = cxl_ops->afu_desc_size ?
+		cxl_ops->afu_desc_size(afu) : 0;
+
+	if (afu->attr_afud.size > 0) {
+		sysfs_attr_init(&afu->attr_afud.attr);
+		afu->attr_afud.attr.name = "afu_desc";
+		afu->attr_afud.attr.mode = 0444;
+		afu->attr_afud.read = afu_desc_read;
+		afu->attr_afud.mmap = afu_desc_mmap;
+
+		rc = device_create_bin_file(&afu->dev, &afu->attr_afud);
+		if (rc) {
+			/* indicate that we did'nt create the sysfs attr */
+			afu->attr_afud.size = 0;
+			dev_err(&afu->dev,
+				"Unable to create afu_desc attr for the afu. Err(%d)\n",
+				rc);
+			goto err1;
+		}
+	}
+
 	return 0;
 
 err1:
-- 
2.9.3

  parent reply	other threads:[~2017-03-14  4:07 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-14  4:06 [PATCH 0/3] cxl: Provide user-space r/o access to the AFU descriptor Vaibhav Jain
2017-03-14  4:06 ` [PATCH 1/3] cxl: Re-factor cxl_pci_afu_read_err_buffer() Vaibhav Jain
2017-03-17  4:34   ` Andrew Donnellan
2017-03-21  4:38     ` Vaibhav Jain
2017-03-17 10:51   ` Frederic Barrat
2017-03-14  4:06 ` Vaibhav Jain [this message]
2017-03-17 11:19   ` [PATCH 2/3] cxl: Introduce afu_desc sysfs attribute Frederic Barrat
2017-03-21  5:07     ` Vaibhav Jain
2017-03-20  7:42   ` Andrew Donnellan
2017-03-14  4:06 ` [PATCH 3/3] cxl: Provide user-space access to afu descriptor on bare metal Vaibhav Jain

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=20170314040606.16894-3-vaibhav@linux.vnet.ibm.com \
    --to=vaibhav@linux.vnet.ibm.com \
    --cc=andrew.donnellan@au1.ibm.com \
    --cc=christophe_lombard@fr.ibm.com \
    --cc=fbarrat@linux.vnet.ibm.com \
    --cc=gkurz@linux.vnet.ibm.com \
    --cc=imunsie@au1.ibm.com \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=philippe.bergheaud@fr.ibm.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).