All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alastair D'Silva" <alastair@au1.ibm.com>
To: Frederic Barrat <fbarrat@linux.ibm.com>
Cc: "Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>,
	"Benjamin Herrenschmidt" <benh@kernel.crashing.org>,
	"Paul Mackerras" <paulus@samba.org>,
	"Michael Ellerman" <mpe@ellerman.id.au>,
	"Andrew Donnellan" <ajd@linux.ibm.com>,
	"Arnd Bergmann" <arnd@arndb.de>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Mauro Carvalho Chehab" <mchehab+samsung@kernel.org>,
	"David S. Miller" <davem@davemloft.net>,
	"Rob Herring" <robh@kernel.org>,
	"Anton Blanchard" <anton@ozlabs.org>,
	"Krzysztof Kozlowski" <krzk@kernel.org>,
	"Mahesh Salgaonkar" <mahesh@linux.vnet.ibm.com>,
	"Madhavan Srinivasan" <maddy@linux.vnet.ibm.com>,
	"Cédric Le Goater" <clg@kaod.org>,
	"Anju T Sudhakar" <anju@linux.vnet.ibm.com>,
	"Hari Bathini" <hbathini@linux.ibm.com>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Greg Kurz" <groug@kaod.org>,
	"Nicholas Piggin" <npiggin@gmail.com>,
	"Masahiro Yamada" <yamada.masahiro@socionext.com>,
	"Alexey Kardashevskiy" <aik@ozlabs.ru>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 13/27] powerpc/powernv/pmem: Read the capability registers & wait for device ready
Date: Wed, 04 Mar 2020 15:15:53 +1100	[thread overview]
Message-ID: <b1157d7a777049d417818884eed5e027b1008f7e.camel@au1.ibm.com> (raw)
In-Reply-To: <3d2de7c1-ee95-ed6c-0346-4a1d20a0b75e@linux.ibm.com>

On Mon, 2020-03-02 at 18:51 +0100, Frederic Barrat wrote:
> 
> Le 21/02/2020 à 04:27, Alastair D'Silva a écrit :
> > From: Alastair D'Silva <alastair@d-silva.org>
> > 
> > This patch reads timeouts & firmware version from the controller,
> > and
> > uses those timeouts to wait for the controller to report that it is
> > ready
> > before handing the memory over to libnvdimm.
> > 
> > Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
> > ---
> >   arch/powerpc/platforms/powernv/pmem/Makefile  |  2 +-
> >   arch/powerpc/platforms/powernv/pmem/ocxl.c    | 92
> > +++++++++++++++++++
> >   .../platforms/powernv/pmem/ocxl_internal.c    | 19 ++++
> >   .../platforms/powernv/pmem/ocxl_internal.h    | 24 +++++
> >   4 files changed, 136 insertions(+), 1 deletion(-)
> >   create mode 100644
> > arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > 
> > diff --git a/arch/powerpc/platforms/powernv/pmem/Makefile
> > b/arch/powerpc/platforms/powernv/pmem/Makefile
> > index 1c55c4193175..4ceda25907d4 100644
> > --- a/arch/powerpc/platforms/powernv/pmem/Makefile
> > +++ b/arch/powerpc/platforms/powernv/pmem/Makefile
> > @@ -4,4 +4,4 @@ ccflags-$(CONFIG_PPC_WERROR)	+= -Werror
> >   
> >   obj-$(CONFIG_OCXL_PMEM) += ocxlpmem.o
> >   
> > -ocxlpmem-y := ocxl.o
> > +ocxlpmem-y := ocxl.o ocxl_internal.o
> > diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > b/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > index 3c4eeb5dcc0f..431212c9f0cc 100644
> > --- a/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > +++ b/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > @@ -8,6 +8,7 @@
> >   
> >   #include <linux/module.h>
> >   #include <misc/ocxl.h>
> > +#include <linux/delay.h>
> >   #include <linux/ndctl.h>
> >   #include <linux/mm_types.h>
> >   #include <linux/memory_hotplug.h>
> > @@ -215,6 +216,36 @@ static int register_lpc_mem(struct ocxlpmem
> > *ocxlpmem)
> >   	return 0;
> >   }
> >   
> > +/**
> > + * is_usable() - Is a controller usable?
> > + * @ocxlpmem: the device metadata
> > + * @verbose: True to log errors
> > + * Return: true if the controller is usable
> > + */
> > +static bool is_usable(const struct ocxlpmem *ocxlpmem, bool
> > verbose)
> > +{
> > +	u64 chi = 0;
> > +	int rc = ocxlpmem_chi(ocxlpmem, &chi);
> > +
> > +	if (rc < 0)
> > +		return false;
> > +
> > +	if (!(chi & GLOBAL_MMIO_CHI_CRDY)) {
> > +		if (verbose)
> > +			dev_err(&ocxlpmem->dev, "controller is not
> > ready.\n");
> > +		return false;
> > +	}
> > +
> > +	if (!(chi & GLOBAL_MMIO_CHI_MA)) {
> > +		if (verbose)
> > +			dev_err(&ocxlpmem->dev,
> > +				"controller does not have memory
> > available.\n");
> > +		return false;
> > +	}
> > +
> > +	return true;
> > +}
> > +
> >   /**
> >    * allocate_minor() - Allocate a minor number to use for an
> > OpenCAPI pmem device
> >    * @ocxlpmem: the device metadata
> > @@ -328,6 +359,48 @@ static void ocxlpmem_remove(struct pci_dev
> > *pdev)
> >   	}
> >   }
> >   
> > +/**
> > + * read_device_metadata() - Retrieve config information from the
> > AFU and save it for future use
> > + * @ocxlpmem: the device metadata
> > + * Return: 0 on success, negative on failure
> > + */
> > +static int read_device_metadata(struct ocxlpmem *ocxlpmem)
> > +{
> > +	u64 val;
> > +	int rc;
> > +
> > +	rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_CCAP0,
> > +				     OCXL_LITTLE_ENDIAN, &val);
> > +	if (rc)
> > +		return rc;
> > +
> > +	ocxlpmem->scm_revision = val & 0xFFFF;
> > +	ocxlpmem->read_latency = (val >> 32) & 0xFF;
> > +	ocxlpmem->readiness_timeout = (val >> 48) & 0x0F;
> > +	ocxlpmem->memory_available_timeout = val >> 52;
> > +
> > +	rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_CCAP1,
> > +				     OCXL_LITTLE_ENDIAN, &val);
> > +	if (rc)
> > +		return rc;
> > +
> > +	ocxlpmem->max_controller_dump_size = val & 0xFFFFFFFF;
> > +
> > +	// Extract firmware version text
> > +	rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_FWVER,
> > +				     OCXL_HOST_ENDIAN, (u64 *)ocxlpmem-
> > >fw_version);
> > +	if (rc)
> > +		return rc;
> > +
> > +	ocxlpmem->fw_version[8] = '\0';
> > +
> > +	dev_info(&ocxlpmem->dev,
> > +		 "Firmware version '%s' SCM revision %d:%d\n",
> > ocxlpmem->fw_version,
> > +		 ocxlpmem->scm_revision >> 4, ocxlpmem->scm_revision &
> > 0x0F);
> > +
> > +	return 0;
> > +}
> > +
> >   /**
> >    * probe_function0() - Set up function 0 for an OpenCAPI
> > persistent memory device
> >    * This is important as it enables templates higher than 0 across
> > all other functions,
> > @@ -368,6 +441,7 @@ static int probe(struct pci_dev *pdev, const
> > struct pci_device_id *ent)
> >   {
> >   	struct ocxlpmem *ocxlpmem;
> >   	int rc;
> > +	u16 elapsed, timeout;
> >   
> >   	if (PCI_FUNC(pdev->devfn) == 0)
> >   		return probe_function0(pdev);
> > @@ -422,6 +496,24 @@ static int probe(struct pci_dev *pdev, const
> > struct pci_device_id *ent)
> >   		goto err;
> >   	}
> >   
> > +	if (read_device_metadata(ocxlpmem)) {
> > +		dev_err(&pdev->dev, "Could not read metadata\n");
> 
> 
> Need to set rc
> 
> 
Whoops :)

> 
> > +		goto err;
> > +	}
> > +
> > +	elapsed = 0;
> > +	timeout = ocxlpmem->readiness_timeout + ocxlpmem-
> > >memory_available_timeout;
> > +	while (!is_usable(ocxlpmem, false)) {
> > +		if (elapsed++ > timeout) {
> > +			dev_warn(&ocxlpmem->dev, "OpenCAPI Persistent
> > Memory ready timeout.\n");
> > +			(void)is_usable(ocxlpmem, true);
> 
> I guess that extra call to is_usable() is just to log the cause of
> the 
> error. However, with some bad luck, the call could now succeed.
> 

Yeah, that's pretty ugly, I'll re-engineer it.

> 
>    Fred
> 
> 
> > +			rc = -ENXIO;
> > +			goto err;
> > +		}
> > +
> > +		msleep(1000);
> > +	}
> > +
> >   	rc = register_lpc_mem(ocxlpmem);
> >   	if (rc) {
> >   		dev_err(&pdev->dev, "Could not register OpenCAPI
> > persistent memory with libnvdimm\n");
> > diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > new file mode 100644
> > index 000000000000..617ca943b1b8
> > --- /dev/null
> > +++ b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > @@ -0,0 +1,19 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +// Copyright 2019 IBM Corp.
> > +
> > +#include <misc/ocxl.h>
> > +#include <linux/delay.h>
> > +#include "ocxl_internal.h"
> > +
> > +int ocxlpmem_chi(const struct ocxlpmem *ocxlpmem, u64 *chi)
> > +{
> > +	u64 val;
> > +	int rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_CHI,
> > +					 OCXL_LITTLE_ENDIAN, &val);
> > +	if (rc)
> > +		return rc;
> > +
> > +	*chi = val;
> > +
> > +	return 0;
> > +}
> > diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > index 9cf3e42750e7..ba0301533d00 100644
> > --- a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > +++ b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > @@ -97,4 +97,28 @@ struct ocxlpmem {
> >   	void *metadata_addr;
> >   	struct resource pmem_res;
> >   	struct nd_region *nd_region;
> > +	char fw_version[8+1];
> > +
> > +	u32 max_controller_dump_size;
> > +	u16 scm_revision; // major/minor
> > +	u8 readiness_timeout;  /* The worst case time (in seconds) that
> > the host shall
> > +				* wait for the controller to become
> > operational following a reset (CHI.CRDY).
> > +				*/
> > +	u8 memory_available_timeout;   /* The worst case time (in
> > seconds) that the host shall
> > +					* wait for memory to become
> > available following a reset (CHI.MA).
> > +					*/
> > +
> > +	u16 read_latency; /* The nominal measure of latency (in
> > nanoseconds)
> > +			   * associated with an unassisted read of a
> > memory block.
> > +			   * This represents the capability of the raw
> > media technology without assistance
> > +			   */
> >   };
> > +
> > +/**
> > + * ocxlpmem_chi() - Get the value of the CHI register
> > + * @ocxlpmem: the device metadata
> > + * @chi: returns the CHI value
> > + *
> > + * Returns 0 on success, negative on error
> > + */
> > +int ocxlpmem_chi(const struct ocxlpmem *ocxlpmem, u64 *chi);
> > 
-- 
Alastair D'Silva
Open Source Developer
Linux Technology Centre, IBM Australia
mob: 0423 762 819
_______________________________________________
Linux-nvdimm mailing list -- linux-nvdimm@lists.01.org
To unsubscribe send an email to linux-nvdimm-leave@lists.01.org

WARNING: multiple messages have this Message-ID (diff)
From: "Alastair D'Silva" <alastair@au1.ibm.com>
To: Frederic Barrat <fbarrat@linux.ibm.com>
Cc: "Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>,
	"Oliver O'Halloran" <oohall@gmail.com>,
	"Benjamin Herrenschmidt" <benh@kernel.crashing.org>,
	"Paul Mackerras" <paulus@samba.org>,
	"Michael Ellerman" <mpe@ellerman.id.au>,
	"Andrew Donnellan" <ajd@linux.ibm.com>,
	"Arnd Bergmann" <arnd@arndb.de>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Dan Williams" <dan.j.williams@intel.com>,
	"Vishal Verma" <vishal.l.verma@intel.com>,
	"Dave Jiang" <dave.jiang@intel.com>,
	"Ira Weiny" <ira.weiny@intel.com>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Mauro Carvalho Chehab" <mchehab+samsung@kernel.org>,
	"David S. Miller" <davem@davemloft.net>,
	"Rob Herring" <robh@kernel.org>,
	"Anton Blanchard" <anton@ozlabs.org>,
	"Krzysztof Kozlowski" <krzk@kernel.org>,
	"Mahesh Salgaonkar" <mahesh@linux.vnet.ibm.com>,
	"Madhavan Srinivasan" <maddy@linux.vnet.ibm.com>,
	"Cédric Le Goater" <clg@kaod.org>,
	"Anju T Sudhakar" <anju@linux.vnet.ibm.com>,
	"Hari Bathini" <hbathini@linux.ibm.com>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Greg Kurz" <groug@kaod.org>,
	"Nicholas Piggin" <npiggin@gmail.com>,
	"Masahiro Yamada" <yamada.masahiro@socionext.com>,
	"Alexey Kardashevskiy" <aik@ozlabs.ru>,
	linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	linux-nvdimm@lists.01.org, linux-mm@kvack.org
Subject: Re: [PATCH v3 13/27] powerpc/powernv/pmem: Read the capability registers & wait for device ready
Date: Wed, 04 Mar 2020 15:15:53 +1100	[thread overview]
Message-ID: <b1157d7a777049d417818884eed5e027b1008f7e.camel@au1.ibm.com> (raw)
In-Reply-To: <3d2de7c1-ee95-ed6c-0346-4a1d20a0b75e@linux.ibm.com>

On Mon, 2020-03-02 at 18:51 +0100, Frederic Barrat wrote:
> 
> Le 21/02/2020 à 04:27, Alastair D'Silva a écrit :
> > From: Alastair D'Silva <alastair@d-silva.org>
> > 
> > This patch reads timeouts & firmware version from the controller,
> > and
> > uses those timeouts to wait for the controller to report that it is
> > ready
> > before handing the memory over to libnvdimm.
> > 
> > Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
> > ---
> >   arch/powerpc/platforms/powernv/pmem/Makefile  |  2 +-
> >   arch/powerpc/platforms/powernv/pmem/ocxl.c    | 92
> > +++++++++++++++++++
> >   .../platforms/powernv/pmem/ocxl_internal.c    | 19 ++++
> >   .../platforms/powernv/pmem/ocxl_internal.h    | 24 +++++
> >   4 files changed, 136 insertions(+), 1 deletion(-)
> >   create mode 100644
> > arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > 
> > diff --git a/arch/powerpc/platforms/powernv/pmem/Makefile
> > b/arch/powerpc/platforms/powernv/pmem/Makefile
> > index 1c55c4193175..4ceda25907d4 100644
> > --- a/arch/powerpc/platforms/powernv/pmem/Makefile
> > +++ b/arch/powerpc/platforms/powernv/pmem/Makefile
> > @@ -4,4 +4,4 @@ ccflags-$(CONFIG_PPC_WERROR)	+= -Werror
> >   
> >   obj-$(CONFIG_OCXL_PMEM) += ocxlpmem.o
> >   
> > -ocxlpmem-y := ocxl.o
> > +ocxlpmem-y := ocxl.o ocxl_internal.o
> > diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > b/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > index 3c4eeb5dcc0f..431212c9f0cc 100644
> > --- a/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > +++ b/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > @@ -8,6 +8,7 @@
> >   
> >   #include <linux/module.h>
> >   #include <misc/ocxl.h>
> > +#include <linux/delay.h>
> >   #include <linux/ndctl.h>
> >   #include <linux/mm_types.h>
> >   #include <linux/memory_hotplug.h>
> > @@ -215,6 +216,36 @@ static int register_lpc_mem(struct ocxlpmem
> > *ocxlpmem)
> >   	return 0;
> >   }
> >   
> > +/**
> > + * is_usable() - Is a controller usable?
> > + * @ocxlpmem: the device metadata
> > + * @verbose: True to log errors
> > + * Return: true if the controller is usable
> > + */
> > +static bool is_usable(const struct ocxlpmem *ocxlpmem, bool
> > verbose)
> > +{
> > +	u64 chi = 0;
> > +	int rc = ocxlpmem_chi(ocxlpmem, &chi);
> > +
> > +	if (rc < 0)
> > +		return false;
> > +
> > +	if (!(chi & GLOBAL_MMIO_CHI_CRDY)) {
> > +		if (verbose)
> > +			dev_err(&ocxlpmem->dev, "controller is not
> > ready.\n");
> > +		return false;
> > +	}
> > +
> > +	if (!(chi & GLOBAL_MMIO_CHI_MA)) {
> > +		if (verbose)
> > +			dev_err(&ocxlpmem->dev,
> > +				"controller does not have memory
> > available.\n");
> > +		return false;
> > +	}
> > +
> > +	return true;
> > +}
> > +
> >   /**
> >    * allocate_minor() - Allocate a minor number to use for an
> > OpenCAPI pmem device
> >    * @ocxlpmem: the device metadata
> > @@ -328,6 +359,48 @@ static void ocxlpmem_remove(struct pci_dev
> > *pdev)
> >   	}
> >   }
> >   
> > +/**
> > + * read_device_metadata() - Retrieve config information from the
> > AFU and save it for future use
> > + * @ocxlpmem: the device metadata
> > + * Return: 0 on success, negative on failure
> > + */
> > +static int read_device_metadata(struct ocxlpmem *ocxlpmem)
> > +{
> > +	u64 val;
> > +	int rc;
> > +
> > +	rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_CCAP0,
> > +				     OCXL_LITTLE_ENDIAN, &val);
> > +	if (rc)
> > +		return rc;
> > +
> > +	ocxlpmem->scm_revision = val & 0xFFFF;
> > +	ocxlpmem->read_latency = (val >> 32) & 0xFF;
> > +	ocxlpmem->readiness_timeout = (val >> 48) & 0x0F;
> > +	ocxlpmem->memory_available_timeout = val >> 52;
> > +
> > +	rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_CCAP1,
> > +				     OCXL_LITTLE_ENDIAN, &val);
> > +	if (rc)
> > +		return rc;
> > +
> > +	ocxlpmem->max_controller_dump_size = val & 0xFFFFFFFF;
> > +
> > +	// Extract firmware version text
> > +	rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_FWVER,
> > +				     OCXL_HOST_ENDIAN, (u64 *)ocxlpmem-
> > >fw_version);
> > +	if (rc)
> > +		return rc;
> > +
> > +	ocxlpmem->fw_version[8] = '\0';
> > +
> > +	dev_info(&ocxlpmem->dev,
> > +		 "Firmware version '%s' SCM revision %d:%d\n",
> > ocxlpmem->fw_version,
> > +		 ocxlpmem->scm_revision >> 4, ocxlpmem->scm_revision &
> > 0x0F);
> > +
> > +	return 0;
> > +}
> > +
> >   /**
> >    * probe_function0() - Set up function 0 for an OpenCAPI
> > persistent memory device
> >    * This is important as it enables templates higher than 0 across
> > all other functions,
> > @@ -368,6 +441,7 @@ static int probe(struct pci_dev *pdev, const
> > struct pci_device_id *ent)
> >   {
> >   	struct ocxlpmem *ocxlpmem;
> >   	int rc;
> > +	u16 elapsed, timeout;
> >   
> >   	if (PCI_FUNC(pdev->devfn) == 0)
> >   		return probe_function0(pdev);
> > @@ -422,6 +496,24 @@ static int probe(struct pci_dev *pdev, const
> > struct pci_device_id *ent)
> >   		goto err;
> >   	}
> >   
> > +	if (read_device_metadata(ocxlpmem)) {
> > +		dev_err(&pdev->dev, "Could not read metadata\n");
> 
> 
> Need to set rc
> 
> 
Whoops :)

> 
> > +		goto err;
> > +	}
> > +
> > +	elapsed = 0;
> > +	timeout = ocxlpmem->readiness_timeout + ocxlpmem-
> > >memory_available_timeout;
> > +	while (!is_usable(ocxlpmem, false)) {
> > +		if (elapsed++ > timeout) {
> > +			dev_warn(&ocxlpmem->dev, "OpenCAPI Persistent
> > Memory ready timeout.\n");
> > +			(void)is_usable(ocxlpmem, true);
> 
> I guess that extra call to is_usable() is just to log the cause of
> the 
> error. However, with some bad luck, the call could now succeed.
> 

Yeah, that's pretty ugly, I'll re-engineer it.

> 
>    Fred
> 
> 
> > +			rc = -ENXIO;
> > +			goto err;
> > +		}
> > +
> > +		msleep(1000);
> > +	}
> > +
> >   	rc = register_lpc_mem(ocxlpmem);
> >   	if (rc) {
> >   		dev_err(&pdev->dev, "Could not register OpenCAPI
> > persistent memory with libnvdimm\n");
> > diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > new file mode 100644
> > index 000000000000..617ca943b1b8
> > --- /dev/null
> > +++ b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > @@ -0,0 +1,19 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +// Copyright 2019 IBM Corp.
> > +
> > +#include <misc/ocxl.h>
> > +#include <linux/delay.h>
> > +#include "ocxl_internal.h"
> > +
> > +int ocxlpmem_chi(const struct ocxlpmem *ocxlpmem, u64 *chi)
> > +{
> > +	u64 val;
> > +	int rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_CHI,
> > +					 OCXL_LITTLE_ENDIAN, &val);
> > +	if (rc)
> > +		return rc;
> > +
> > +	*chi = val;
> > +
> > +	return 0;
> > +}
> > diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > index 9cf3e42750e7..ba0301533d00 100644
> > --- a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > +++ b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > @@ -97,4 +97,28 @@ struct ocxlpmem {
> >   	void *metadata_addr;
> >   	struct resource pmem_res;
> >   	struct nd_region *nd_region;
> > +	char fw_version[8+1];
> > +
> > +	u32 max_controller_dump_size;
> > +	u16 scm_revision; // major/minor
> > +	u8 readiness_timeout;  /* The worst case time (in seconds) that
> > the host shall
> > +				* wait for the controller to become
> > operational following a reset (CHI.CRDY).
> > +				*/
> > +	u8 memory_available_timeout;   /* The worst case time (in
> > seconds) that the host shall
> > +					* wait for memory to become
> > available following a reset (CHI.MA).
> > +					*/
> > +
> > +	u16 read_latency; /* The nominal measure of latency (in
> > nanoseconds)
> > +			   * associated with an unassisted read of a
> > memory block.
> > +			   * This represents the capability of the raw
> > media technology without assistance
> > +			   */
> >   };
> > +
> > +/**
> > + * ocxlpmem_chi() - Get the value of the CHI register
> > + * @ocxlpmem: the device metadata
> > + * @chi: returns the CHI value
> > + *
> > + * Returns 0 on success, negative on error
> > + */
> > +int ocxlpmem_chi(const struct ocxlpmem *ocxlpmem, u64 *chi);
> > 
-- 
Alastair D'Silva
Open Source Developer
Linux Technology Centre, IBM Australia
mob: 0423 762 819


WARNING: multiple messages have this Message-ID (diff)
From: "Alastair D'Silva" <alastair@au1.ibm.com>
To: Frederic Barrat <fbarrat@linux.ibm.com>
Cc: "Madhavan Srinivasan" <maddy@linux.vnet.ibm.com>,
	"Alexey Kardashevskiy" <aik@ozlabs.ru>,
	"Masahiro Yamada" <yamada.masahiro@socionext.com>,
	"Oliver O'Halloran" <oohall@gmail.com>,
	"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,
	"Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.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,
	"Vishal Verma" <vishal.l.verma@intel.com>,
	"Paul Mackerras" <paulus@samba.org>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	linuxppc-dev@lists.ozlabs.org,
	"David S. Miller" <davem@davemloft.net>
Subject: Re: [PATCH v3 13/27] powerpc/powernv/pmem: Read the capability registers & wait for device ready
Date: Wed, 04 Mar 2020 15:15:53 +1100	[thread overview]
Message-ID: <b1157d7a777049d417818884eed5e027b1008f7e.camel@au1.ibm.com> (raw)
In-Reply-To: <3d2de7c1-ee95-ed6c-0346-4a1d20a0b75e@linux.ibm.com>

On Mon, 2020-03-02 at 18:51 +0100, Frederic Barrat wrote:
> 
> Le 21/02/2020 à 04:27, Alastair D'Silva a écrit :
> > From: Alastair D'Silva <alastair@d-silva.org>
> > 
> > This patch reads timeouts & firmware version from the controller,
> > and
> > uses those timeouts to wait for the controller to report that it is
> > ready
> > before handing the memory over to libnvdimm.
> > 
> > Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
> > ---
> >   arch/powerpc/platforms/powernv/pmem/Makefile  |  2 +-
> >   arch/powerpc/platforms/powernv/pmem/ocxl.c    | 92
> > +++++++++++++++++++
> >   .../platforms/powernv/pmem/ocxl_internal.c    | 19 ++++
> >   .../platforms/powernv/pmem/ocxl_internal.h    | 24 +++++
> >   4 files changed, 136 insertions(+), 1 deletion(-)
> >   create mode 100644
> > arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > 
> > diff --git a/arch/powerpc/platforms/powernv/pmem/Makefile
> > b/arch/powerpc/platforms/powernv/pmem/Makefile
> > index 1c55c4193175..4ceda25907d4 100644
> > --- a/arch/powerpc/platforms/powernv/pmem/Makefile
> > +++ b/arch/powerpc/platforms/powernv/pmem/Makefile
> > @@ -4,4 +4,4 @@ ccflags-$(CONFIG_PPC_WERROR)	+= -Werror
> >   
> >   obj-$(CONFIG_OCXL_PMEM) += ocxlpmem.o
> >   
> > -ocxlpmem-y := ocxl.o
> > +ocxlpmem-y := ocxl.o ocxl_internal.o
> > diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > b/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > index 3c4eeb5dcc0f..431212c9f0cc 100644
> > --- a/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > +++ b/arch/powerpc/platforms/powernv/pmem/ocxl.c
> > @@ -8,6 +8,7 @@
> >   
> >   #include <linux/module.h>
> >   #include <misc/ocxl.h>
> > +#include <linux/delay.h>
> >   #include <linux/ndctl.h>
> >   #include <linux/mm_types.h>
> >   #include <linux/memory_hotplug.h>
> > @@ -215,6 +216,36 @@ static int register_lpc_mem(struct ocxlpmem
> > *ocxlpmem)
> >   	return 0;
> >   }
> >   
> > +/**
> > + * is_usable() - Is a controller usable?
> > + * @ocxlpmem: the device metadata
> > + * @verbose: True to log errors
> > + * Return: true if the controller is usable
> > + */
> > +static bool is_usable(const struct ocxlpmem *ocxlpmem, bool
> > verbose)
> > +{
> > +	u64 chi = 0;
> > +	int rc = ocxlpmem_chi(ocxlpmem, &chi);
> > +
> > +	if (rc < 0)
> > +		return false;
> > +
> > +	if (!(chi & GLOBAL_MMIO_CHI_CRDY)) {
> > +		if (verbose)
> > +			dev_err(&ocxlpmem->dev, "controller is not
> > ready.\n");
> > +		return false;
> > +	}
> > +
> > +	if (!(chi & GLOBAL_MMIO_CHI_MA)) {
> > +		if (verbose)
> > +			dev_err(&ocxlpmem->dev,
> > +				"controller does not have memory
> > available.\n");
> > +		return false;
> > +	}
> > +
> > +	return true;
> > +}
> > +
> >   /**
> >    * allocate_minor() - Allocate a minor number to use for an
> > OpenCAPI pmem device
> >    * @ocxlpmem: the device metadata
> > @@ -328,6 +359,48 @@ static void ocxlpmem_remove(struct pci_dev
> > *pdev)
> >   	}
> >   }
> >   
> > +/**
> > + * read_device_metadata() - Retrieve config information from the
> > AFU and save it for future use
> > + * @ocxlpmem: the device metadata
> > + * Return: 0 on success, negative on failure
> > + */
> > +static int read_device_metadata(struct ocxlpmem *ocxlpmem)
> > +{
> > +	u64 val;
> > +	int rc;
> > +
> > +	rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_CCAP0,
> > +				     OCXL_LITTLE_ENDIAN, &val);
> > +	if (rc)
> > +		return rc;
> > +
> > +	ocxlpmem->scm_revision = val & 0xFFFF;
> > +	ocxlpmem->read_latency = (val >> 32) & 0xFF;
> > +	ocxlpmem->readiness_timeout = (val >> 48) & 0x0F;
> > +	ocxlpmem->memory_available_timeout = val >> 52;
> > +
> > +	rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_CCAP1,
> > +				     OCXL_LITTLE_ENDIAN, &val);
> > +	if (rc)
> > +		return rc;
> > +
> > +	ocxlpmem->max_controller_dump_size = val & 0xFFFFFFFF;
> > +
> > +	// Extract firmware version text
> > +	rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_FWVER,
> > +				     OCXL_HOST_ENDIAN, (u64 *)ocxlpmem-
> > >fw_version);
> > +	if (rc)
> > +		return rc;
> > +
> > +	ocxlpmem->fw_version[8] = '\0';
> > +
> > +	dev_info(&ocxlpmem->dev,
> > +		 "Firmware version '%s' SCM revision %d:%d\n",
> > ocxlpmem->fw_version,
> > +		 ocxlpmem->scm_revision >> 4, ocxlpmem->scm_revision &
> > 0x0F);
> > +
> > +	return 0;
> > +}
> > +
> >   /**
> >    * probe_function0() - Set up function 0 for an OpenCAPI
> > persistent memory device
> >    * This is important as it enables templates higher than 0 across
> > all other functions,
> > @@ -368,6 +441,7 @@ static int probe(struct pci_dev *pdev, const
> > struct pci_device_id *ent)
> >   {
> >   	struct ocxlpmem *ocxlpmem;
> >   	int rc;
> > +	u16 elapsed, timeout;
> >   
> >   	if (PCI_FUNC(pdev->devfn) == 0)
> >   		return probe_function0(pdev);
> > @@ -422,6 +496,24 @@ static int probe(struct pci_dev *pdev, const
> > struct pci_device_id *ent)
> >   		goto err;
> >   	}
> >   
> > +	if (read_device_metadata(ocxlpmem)) {
> > +		dev_err(&pdev->dev, "Could not read metadata\n");
> 
> 
> Need to set rc
> 
> 
Whoops :)

> 
> > +		goto err;
> > +	}
> > +
> > +	elapsed = 0;
> > +	timeout = ocxlpmem->readiness_timeout + ocxlpmem-
> > >memory_available_timeout;
> > +	while (!is_usable(ocxlpmem, false)) {
> > +		if (elapsed++ > timeout) {
> > +			dev_warn(&ocxlpmem->dev, "OpenCAPI Persistent
> > Memory ready timeout.\n");
> > +			(void)is_usable(ocxlpmem, true);
> 
> I guess that extra call to is_usable() is just to log the cause of
> the 
> error. However, with some bad luck, the call could now succeed.
> 

Yeah, that's pretty ugly, I'll re-engineer it.

> 
>    Fred
> 
> 
> > +			rc = -ENXIO;
> > +			goto err;
> > +		}
> > +
> > +		msleep(1000);
> > +	}
> > +
> >   	rc = register_lpc_mem(ocxlpmem);
> >   	if (rc) {
> >   		dev_err(&pdev->dev, "Could not register OpenCAPI
> > persistent memory with libnvdimm\n");
> > diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > new file mode 100644
> > index 000000000000..617ca943b1b8
> > --- /dev/null
> > +++ b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c
> > @@ -0,0 +1,19 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +// Copyright 2019 IBM Corp.
> > +
> > +#include <misc/ocxl.h>
> > +#include <linux/delay.h>
> > +#include "ocxl_internal.h"
> > +
> > +int ocxlpmem_chi(const struct ocxlpmem *ocxlpmem, u64 *chi)
> > +{
> > +	u64 val;
> > +	int rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu,
> > GLOBAL_MMIO_CHI,
> > +					 OCXL_LITTLE_ENDIAN, &val);
> > +	if (rc)
> > +		return rc;
> > +
> > +	*chi = val;
> > +
> > +	return 0;
> > +}
> > diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > index 9cf3e42750e7..ba0301533d00 100644
> > --- a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > +++ b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h
> > @@ -97,4 +97,28 @@ struct ocxlpmem {
> >   	void *metadata_addr;
> >   	struct resource pmem_res;
> >   	struct nd_region *nd_region;
> > +	char fw_version[8+1];
> > +
> > +	u32 max_controller_dump_size;
> > +	u16 scm_revision; // major/minor
> > +	u8 readiness_timeout;  /* The worst case time (in seconds) that
> > the host shall
> > +				* wait for the controller to become
> > operational following a reset (CHI.CRDY).
> > +				*/
> > +	u8 memory_available_timeout;   /* The worst case time (in
> > seconds) that the host shall
> > +					* wait for memory to become
> > available following a reset (CHI.MA).
> > +					*/
> > +
> > +	u16 read_latency; /* The nominal measure of latency (in
> > nanoseconds)
> > +			   * associated with an unassisted read of a
> > memory block.
> > +			   * This represents the capability of the raw
> > media technology without assistance
> > +			   */
> >   };
> > +
> > +/**
> > + * ocxlpmem_chi() - Get the value of the CHI register
> > + * @ocxlpmem: the device metadata
> > + * @chi: returns the CHI value
> > + *
> > + * Returns 0 on success, negative on error
> > + */
> > +int ocxlpmem_chi(const struct ocxlpmem *ocxlpmem, u64 *chi);
> > 
-- 
Alastair D'Silva
Open Source Developer
Linux Technology Centre, IBM Australia
mob: 0423 762 819


  reply	other threads:[~2020-03-04  4:16 UTC|newest]

Thread overview: 391+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-21  3:26 [PATCH v3 00/27] Add support for OpenCAPI Persistent Memory devices Alastair D'Silva
2020-02-21  3:26 ` Alastair D'Silva
2020-02-21  3:26 ` Alastair D'Silva
2020-02-21  3:26 ` [PATCH v3 01/27] powerpc: Add OPAL calls for LPC memory alloc/release Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-24  5:49   ` Andrew Donnellan
2020-02-24  5:49     ` Andrew Donnellan
2020-02-24  5:49     ` Andrew Donnellan
2020-02-24  5:50     ` Alastair D'Silva
2020-02-24  5:50       ` Alastair D'Silva
2020-02-24  5:50       ` Alastair D'Silva
2020-02-21  3:26 ` [PATCH v3 02/27] mm/memory_hotplug: Allow check_hotplug_memory_addressable to be called from drivers Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-21  7:03   ` Andrew Donnellan
2020-02-21  7:03     ` Andrew Donnellan
2020-02-21  7:03     ` Andrew Donnellan
2020-02-21  3:26 ` [PATCH v3 03/27] powerpc: Map & release OpenCAPI LPC memory Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-24  2:51   ` Andrew Donnellan
2020-02-24  2:51     ` Andrew Donnellan
2020-02-24  2:51     ` Andrew Donnellan
2020-02-24  5:49     ` Andrew Donnellan
2020-02-24  5:49       ` Andrew Donnellan
2020-02-24  5:49       ` Andrew Donnellan
2020-02-25 10:02   ` Frederic Barrat
2020-02-25 10:02     ` Frederic Barrat
2020-02-25 10:02     ` Frederic Barrat
2020-02-26  0:19     ` Alastair D'Silva
2020-02-26  0:19       ` Alastair D'Silva
2020-02-26  0:19       ` Alastair D'Silva
2020-03-03  6:10   ` Andrew Donnellan
2020-03-03  6:10     ` Andrew Donnellan
2020-03-03  6:10     ` Andrew Donnellan
2020-03-04  5:33     ` Alastair D'Silva
2020-03-04  5:33       ` Alastair D'Silva
2020-03-04  5:33       ` Alastair D'Silva
2020-02-21  3:26 ` [PATCH v3 04/27] ocxl: Remove unnecessary externs Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-21  6:06   ` Andrew Donnellan
2020-02-21  6:06     ` Andrew Donnellan
2020-02-21  6:06     ` Andrew Donnellan
2020-02-25 13:23   ` Frederic Barrat
2020-02-25 13:23     ` Frederic Barrat
2020-02-25 13:23     ` Frederic Barrat
2020-02-26  8:14   ` Baoquan He
2020-02-26  8:14     ` Baoquan He
2020-02-26  8:14     ` Baoquan He
2020-02-26  8:26     ` Alastair D'Silva
2020-02-26  8:26       ` Alastair D'Silva
2020-02-26  8:26       ` Alastair D'Silva
2020-02-26  9:01       ` Greg Kurz
2020-02-26  9:01         ` Greg Kurz
2020-02-26  9:01         ` Greg Kurz
2020-02-26 14:15         ` 'Baoquan He'
2020-02-26 14:15           ` 'Baoquan He'
2020-02-26 14:15           ` 'Baoquan He'
2020-02-26 14:20           ` Greg Kurz
2020-02-26 14:20             ` Greg Kurz
2020-02-26 14:20             ` Greg Kurz
2020-02-26 14:54             ` 'Baoquan He'
2020-02-26 14:54               ` 'Baoquan He'
2020-02-26 14:54               ` 'Baoquan He'
2020-02-21  3:26 ` [PATCH v3 05/27] ocxl: Address kernel doc errors & warnings Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-24  2:11   ` Andrew Donnellan
2020-02-24  2:11     ` Andrew Donnellan
2020-02-24  2:11     ` Andrew Donnellan
2020-02-21  3:26 ` [PATCH v3 06/27] ocxl: Tally up the LPC memory on a link & allow it to be mapped Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-21  3:26   ` Alastair D'Silva
2020-02-24  5:25   ` Andrew Donnellan
2020-02-24  5:25     ` Andrew Donnellan
2020-02-24  5:25     ` Andrew Donnellan
2020-02-24  5:36     ` Alastair D'Silva
2020-02-24  5:36       ` Alastair D'Silva
2020-02-24  5:36       ` Alastair D'Silva
2020-02-25 16:30   ` Frederic Barrat
2020-02-25 16:30     ` Frederic Barrat
2020-02-25 16:30     ` Frederic Barrat
2020-02-26  0:29     ` Alastair D'Silva
2020-02-26  0:29       ` Alastair D'Silva
2020-02-26  0:29       ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 07/27] ocxl: Add functions to map/unmap LPC memory Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-24  6:02   ` Andrew Donnellan
2020-02-24  6:02     ` Andrew Donnellan
2020-02-24  6:02     ` Andrew Donnellan
2020-02-24  6:08     ` Alastair D'Silva
2020-02-24  6:08       ` Alastair D'Silva
2020-02-24  6:08       ` Alastair D'Silva
2020-02-25 17:01   ` Frederic Barrat
2020-02-25 17:01     ` Frederic Barrat
2020-02-25 17:01     ` Frederic Barrat
2020-02-21  3:27 ` [PATCH v3 08/27] ocxl: Emit a log message showing how much LPC memory was detected Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-24  6:06   ` Andrew Donnellan
2020-02-24  6:06     ` Andrew Donnellan
2020-02-24  6:06     ` Andrew Donnellan
2020-02-24  6:10     ` Alastair D'Silva
2020-02-24  6:10       ` Alastair D'Silva
2020-02-24  6:10       ` Alastair D'Silva
2020-02-24  6:13       ` Andrew Donnellan
2020-02-24  6:13         ` Andrew Donnellan
2020-02-24  6:13         ` Andrew Donnellan
2020-02-25 17:03   ` Frederic Barrat
2020-02-25 17:03     ` Frederic Barrat
2020-02-25 17:03     ` Frederic Barrat
2020-02-21  3:27 ` [PATCH v3 09/27] ocxl: Save the device serial number in ocxl_fn Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 10/27] powerpc: Add driver for OpenCAPI Persistent Memory Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-26  5:07   ` Andrew Donnellan
2020-02-26  5:07     ` Andrew Donnellan
2020-02-26  5:07     ` Andrew Donnellan
2020-02-26  5:49     ` Alastair D'Silva
2020-02-26  5:49       ` Alastair D'Silva
2020-02-26  5:49       ` Alastair D'Silva
2020-02-27 20:44   ` Frederic Barrat
2020-02-27 20:44     ` Frederic Barrat
2020-02-27 20:44     ` Frederic Barrat
2020-02-28  0:54     ` Alastair D'Silva
2020-02-28  0:54       ` Alastair D'Silva
2020-02-28  0:54       ` Alastair D'Silva
2020-02-28 18:32   ` Frederic Barrat
2020-02-28 18:32     ` Frederic Barrat
2020-02-28 18:32     ` Frederic Barrat
2020-02-21  3:27 ` [PATCH v3 11/27] powerpc: Enable the OpenCAPI Persistent Memory driver for powernv_defconfig Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-25  3:01   ` Andrew Donnellan
2020-02-25  3:01     ` Andrew Donnellan
2020-02-25  3:01     ` Andrew Donnellan
2020-02-21  3:27 ` [PATCH v3 12/27] powerpc/powernv/pmem: Add register addresses & status values to the header Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-27  5:08   ` Andrew Donnellan
2020-02-27  5:08     ` Andrew Donnellan
2020-02-27  5:08     ` Andrew Donnellan
2020-02-27  5:16     ` Alastair D'Silva
2020-02-27  5:16       ` Alastair D'Silva
2020-02-27  5:16       ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 13/27] powerpc/powernv/pmem: Read the capability registers & wait for device ready Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-27  3:54   ` Andrew Donnellan
2020-02-27  3:54     ` Andrew Donnellan
2020-02-27  3:54     ` Andrew Donnellan
2020-02-27  3:58     ` Alastair D'Silva
2020-02-27  3:58       ` Alastair D'Silva
2020-02-27  3:58       ` Alastair D'Silva
2020-03-02 17:51   ` Frederic Barrat
2020-03-02 17:51     ` Frederic Barrat
2020-03-02 17:51     ` Frederic Barrat
2020-03-04  4:15     ` Alastair D'Silva [this message]
2020-03-04  4:15       ` Alastair D'Silva
2020-03-04  4:15       ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 14/27] powerpc/powernv/pmem: Add support for Admin commands Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-27  8:22   ` Andrew Donnellan
2020-02-27  8:22     ` Andrew Donnellan
2020-02-27  8:22     ` Andrew Donnellan
2020-02-27  8:27     ` Andrew Donnellan
2020-02-27  8:27       ` Andrew Donnellan
2020-02-27  8:27       ` Andrew Donnellan
2020-02-27 23:54       ` Alastair D'Silva
2020-02-27 23:54         ` Alastair D'Silva
2020-02-27 23:54         ` Alastair D'Silva
2020-02-27 23:51     ` Alastair D'Silva
2020-02-27 23:51       ` Alastair D'Silva
2020-02-27 23:51       ` Alastair D'Silva
2020-02-27 17:01   ` Dan Williams
2020-02-27 17:01     ` Dan Williams
2020-02-27 17:01     ` Dan Williams
2020-02-27 23:57     ` Alastair D'Silva
2020-02-27 23:57       ` Alastair D'Silva
2020-02-27 23:57       ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 15/27] powerpc/powernv/pmem: Add support for near storage commands Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-27  8:30   ` Andrew Donnellan
2020-02-27  8:30     ` Andrew Donnellan
2020-02-27  8:30     ` Andrew Donnellan
2020-02-27 23:56     ` Alastair D'Silva
2020-02-27 23:56       ` Alastair D'Silva
2020-02-27 23:56       ` Alastair D'Silva
2020-02-27 17:02   ` Dan Williams
2020-02-27 17:02     ` Dan Williams
2020-02-27 17:02     ` Dan Williams
2020-03-02 17:58   ` Frederic Barrat
2020-03-02 17:58     ` Frederic Barrat
2020-03-02 17:58     ` Frederic Barrat
2020-03-02 18:42     ` Dan Williams
2020-03-02 18:42       ` Dan Williams
2020-03-02 18:42       ` Dan Williams
2020-03-04  4:42       ` Alastair D'Silva
2020-03-04  4:42         ` Alastair D'Silva
2020-03-04  4:42         ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 16/27] powerpc/powernv/pmem: Register a character device for userspace to interact with Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-03-02  5:34   ` Andrew Donnellan
2020-03-02  5:34     ` Andrew Donnellan
2020-03-02  5:34     ` Andrew Donnellan
2020-03-02  6:05     ` Alastair D'Silva
2020-03-02  6:05       ` Alastair D'Silva
2020-03-02  6:05       ` Alastair D'Silva
2020-03-03  9:28   ` Frederic Barrat
2020-03-03  9:28     ` Frederic Barrat
2020-03-03  9:28     ` Frederic Barrat
2020-03-05  3:38     ` Alastair D'Silva
2020-03-05  3:38       ` Alastair D'Silva
2020-03-05  3:38       ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 17/27] powerpc/powernv/pmem: Implement the Read Error Log command Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-03-03 10:36   ` Frederic Barrat
2020-03-03 10:36     ` Frederic Barrat
2020-03-03 10:36     ` Frederic Barrat
2020-03-05  4:31     ` Alastair D'Silva
2020-03-05  4:31       ` Alastair D'Silva
2020-03-05  4:31       ` Alastair D'Silva
2020-03-05  9:33       ` Frederic Barrat
2020-03-05  9:33         ` Frederic Barrat
2020-03-05  9:33         ` Frederic Barrat
2020-03-04  5:58   ` Andrew Donnellan
2020-03-04  5:58     ` Andrew Donnellan
2020-03-04  5:58     ` Andrew Donnellan
2020-02-21  3:27 ` [PATCH v3 18/27] powerpc/powernv/pmem: Add controller dump IOCTLs Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-03-03 18:04   ` Frederic Barrat
2020-03-03 18:04     ` Frederic Barrat
2020-03-03 18:04     ` Frederic Barrat
2020-03-05 23:37     ` Alastair D'Silva
2020-03-05 23:37       ` Alastair D'Silva
2020-03-05 23:37       ` Alastair D'Silva
2020-03-04  6:53   ` Andrew Donnellan
2020-03-04  6:53     ` Andrew Donnellan
2020-03-04  6:53     ` Andrew Donnellan
2020-03-06  3:34     ` Alastair D'Silva
2020-03-06  3:34       ` Alastair D'Silva
2020-03-06  3:34       ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 19/27] powerpc/powernv/pmem: Add an IOCTL to report controller statistics Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-03-04  9:25   ` Frederic Barrat
2020-03-04  9:25     ` Frederic Barrat
2020-03-04  9:25     ` Frederic Barrat
2020-03-12  0:15     ` Alastair D'Silva
2020-03-12  0:15       ` Alastair D'Silva
2020-03-12  0:15       ` Alastair D'Silva
2020-03-05  0:46   ` Andrew Donnellan
2020-03-05  0:46     ` Andrew Donnellan
2020-03-05  0:46     ` Andrew Donnellan
2020-03-12  4:47     ` Alastair D'Silva
2020-03-12  4:47       ` Alastair D'Silva
2020-03-12  4:47       ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 20/27] powerpc/powernv/pmem: Forward events to userspace Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-03-03  7:02   ` Andrew Donnellan
2020-03-03  7:02     ` Andrew Donnellan
2020-03-03  7:02     ` Andrew Donnellan
2020-03-04  5:48     ` Alastair D'Silva
2020-03-04  5:48       ` Alastair D'Silva
2020-03-04  5:48       ` Alastair D'Silva
2020-03-04 11:00   ` Frederic Barrat
2020-03-04 11:00     ` Frederic Barrat
2020-03-04 11:00     ` Frederic Barrat
2020-03-11  3:32     ` Alastair D'Silva
2020-03-11  3:32       ` Alastair D'Silva
2020-03-11  3:32       ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 21/27] powerpc/powernv/pmem: Add an IOCTL to request controller health & perf data Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-28  6:12   ` Andrew Donnellan
2020-02-28  6:12     ` Andrew Donnellan
2020-02-28  6:12     ` Andrew Donnellan
2020-03-02  5:40     ` Alastair D'Silva
2020-03-02  5:40       ` Alastair D'Silva
2020-03-02  5:40       ` Alastair D'Silva
2020-03-04 11:06     ` Frederic Barrat
2020-03-04 11:06       ` Frederic Barrat
2020-03-04 11:06       ` Frederic Barrat
2020-03-11  3:38       ` Alastair D'Silva
2020-03-11  3:38         ` Alastair D'Silva
2020-03-11  3:38         ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 22/27] powerpc/powernv/pmem: Implement the heartbeat command Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-28  6:20   ` Andrew Donnellan
2020-02-28  6:20     ` Andrew Donnellan
2020-02-28  6:20     ` Andrew Donnellan
2020-03-04 14:25   ` Frederic Barrat
2020-03-04 14:25     ` Frederic Barrat
2020-03-04 14:25     ` Frederic Barrat
2020-02-21  3:27 ` [PATCH v3 23/27] powerpc/powernv/pmem: Add debug IOCTLs Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-03-01 22:01   ` kbuild test robot
2020-03-04 15:21   ` Frederic Barrat
2020-03-04 15:21     ` Frederic Barrat
2020-03-04 15:21     ` Frederic Barrat
2020-03-12  4:24     ` Alastair D'Silva
2020-03-12  4:24       ` Alastair D'Silva
2020-03-12  4:24       ` Alastair D'Silva
2020-03-05  3:11   ` Andrew Donnellan
2020-03-05  3:11     ` Andrew Donnellan
2020-03-05  3:11     ` Andrew Donnellan
2020-03-12  4:58     ` Alastair D'Silva
2020-03-12  4:58       ` Alastair D'Silva
2020-03-12  4:58       ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 24/27] powerpc/powernv/pmem: Expose SMART data via ndctl Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-03-04 15:40   ` Frederic Barrat
2020-03-04 15:40     ` Frederic Barrat
2020-03-04 15:40     ` Frederic Barrat
2020-03-05  3:36   ` Andrew Donnellan
2020-03-05  3:36     ` Andrew Donnellan
2020-03-05  3:36     ` Andrew Donnellan
2020-03-12 23:14     ` Alastair D'Silva
2020-03-12 23:14       ` Alastair D'Silva
2020-03-12 23:14       ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 25/27] powerpc/powernv/pmem: Expose the serial number in sysfs Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-28  6:25   ` Andrew Donnellan
2020-02-28  6:25     ` Andrew Donnellan
2020-02-28  6:25     ` Andrew Donnellan
2020-02-28  7:15     ` Greg Kroah-Hartman
2020-02-28  7:15       ` Greg Kroah-Hartman
2020-02-28  7:15       ` Greg Kroah-Hartman
2020-03-01 23:42       ` Alastair D'Silva
2020-03-01 23:42         ` Alastair D'Silva
2020-03-01 23:42         ` Alastair D'Silva
2020-03-02  5:38         ` Alastair D'Silva
2020-03-02  5:38           ` Alastair D'Silva
2020-03-02  5:38           ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 26/27] powerpc/powernv/pmem: Expose the firmware version " Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-03-02  7:35   ` Andrew Donnellan
2020-03-02  7:35     ` Andrew Donnellan
2020-03-02  7:35     ` Andrew Donnellan
2020-03-04  4:11     ` Alastair D'Silva
2020-03-04  4:11       ` Alastair D'Silva
2020-03-04  4:11       ` Alastair D'Silva
2020-02-21  3:27 ` [PATCH v3 27/27] MAINTAINERS: Add myself & nvdimm/ocxl to ocxl Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  3:27   ` Alastair D'Silva
2020-02-21  5:35   ` Andrew Donnellan
2020-02-21  5:35     ` Andrew Donnellan
2020-02-21  5:35     ` Andrew Donnellan
2020-02-21 16:21 ` [PATCH v3 00/27] Add support for OpenCAPI Persistent Memory devices Dan Williams
2020-02-21 16:21   ` Dan Williams
2020-02-21 16:21   ` Dan Williams
2020-02-21 16:24   ` Dan Williams
2020-02-21 16:24     ` Dan Williams
2020-02-21 16:24     ` Dan Williams
2020-02-24  4:34   ` Alastair D'Silva
2020-02-24  4:34     ` Alastair D'Silva
2020-02-24  4:34     ` Alastair D'Silva
2020-02-24  4:37     ` Matthew Wilcox
2020-02-24  4:37       ` Matthew Wilcox
2020-02-24  4:37       ` Matthew Wilcox
2020-02-24  4:42       ` Alastair D'Silva
2020-02-24  4:42         ` Alastair D'Silva
2020-02-24  4:42         ` Alastair D'Silva
2020-02-24  6:51         ` Oliver O'Halloran
2020-02-24  6:51           ` Oliver O'Halloran
2020-02-24  6:51           ` Oliver O'Halloran
2020-02-26  0:13           ` Alastair D'Silva
2020-02-26  0:13             ` Alastair D'Silva
2020-02-26  0:13             ` Alastair D'Silva
2020-02-26  0:32             ` Dan Williams
2020-02-26  0:32               ` Dan Williams
2020-02-26  0:32               ` Dan Williams
2020-02-26  0:35               ` Alastair D'Silva
2020-02-26  0:35                 ` Alastair D'Silva
2020-02-26  0:35                 ` Alastair D'Silva

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=b1157d7a777049d417818884eed5e027b1008f7e.camel@au1.ibm.com \
    --to=alastair@au1.ibm.com \
    --cc=aik@ozlabs.ru \
    --cc=ajd@linux.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=aneesh.kumar@linux.ibm.com \
    --cc=anju@linux.vnet.ibm.com \
    --cc=anton@ozlabs.org \
    --cc=arnd@arndb.de \
    --cc=benh@kernel.crashing.org \
    --cc=clg@kaod.org \
    --cc=davem@davemloft.net \
    --cc=fbarrat@linux.ibm.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=groug@kaod.org \
    --cc=hbathini@linux.ibm.com \
    --cc=krzk@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maddy@linux.vnet.ibm.com \
    --cc=mahesh@linux.vnet.ibm.com \
    --cc=mchehab+samsung@kernel.org \
    --cc=mpe@ellerman.id.au \
    --cc=npiggin@gmail.com \
    --cc=paulus@samba.org \
    --cc=robh@kernel.org \
    --cc=tglx@linutronix.de \
    --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 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.