All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frederic Barrat <fbarrat@linux.ibm.com>
To: "Alastair D'Silva" <alastair@au1.ibm.com>, alastair@d-silva.org
Cc: "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>,
	"Krzysztof Kozlowski" <krzk@kernel.org>,
	"Anton Blanchard" <anton@ozlabs.org>,
	"Geert Uytterhoeven" <geert+renesas@glider.be>,
	"Anju T Sudhakar" <anju@linux.vnet.ibm.com>,
	"Mahesh Salgaonkar" <mahesh@linux.vnet.ibm.com>,
	"Vasant Hegde" <hegdevasant@linux.vnet.ibm.com>,
	"Cédric Le Goater" <clg@kaod.org>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Hari Bathini" <hbathini@linux.ibm.com>,
	"Greg Kurz" <groug@kaod.org>,
	"Masahiro Yamada" <yamada.masahiro@socionext.com>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"David Hildenbrand" <david@redhat.com>,
	"Oscar Salvador" <osalvador@suse.com>,
	"Michal Hocko" <mhocko@suse.com>,
	"Pavel Tatashin" <pasha.tatashin@soleen.com>,
	"Wei Yang" <richard.weiyang@gmail.com>, "Qian Cai" <cai@lca.pw>,
	linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH 06/10] ocxl: Add functions to map/unmap LPC memory
Date: Thu, 7 Nov 2019 19:05:11 +0100	[thread overview]
Message-ID: <127f1885-df07-2a23-976e-f97c6ff8e2b2@linux.ibm.com> (raw)
In-Reply-To: <20191025044721.16617-7-alastair@au1.ibm.com>



Le 25/10/2019 à 06:47, Alastair D'Silva a écrit :
> From: Alastair D'Silva <alastair@d-silva.org>
> 
> Add functions to map/unmap LPC memory
> 
> Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
> ---
>   drivers/misc/ocxl/config.c        |  4 +++
>   drivers/misc/ocxl/core.c          | 50 +++++++++++++++++++++++++++++++
>   drivers/misc/ocxl/ocxl_internal.h |  3 ++
>   include/misc/ocxl.h               | 18 +++++++++++
>   4 files changed, 75 insertions(+)
> 
> diff --git a/drivers/misc/ocxl/config.c b/drivers/misc/ocxl/config.c
> index c8e19bfb5ef9..fb0c3b6f8312 100644
> --- a/drivers/misc/ocxl/config.c
> +++ b/drivers/misc/ocxl/config.c
> @@ -568,6 +568,10 @@ static int read_afu_lpc_memory_info(struct pci_dev *dev,
>   		afu->special_purpose_mem_size =
>   			total_mem_size - lpc_mem_size;
>   	}
> +
> +	dev_info(&dev->dev, "Probed LPC memory of %#llx bytes and special purpose memory of %#llx bytes\n",
> +		afu->lpc_mem_size, afu->special_purpose_mem_size);
> +
>   	return 0;
>   }
>   
> diff --git a/drivers/misc/ocxl/core.c b/drivers/misc/ocxl/core.c
> index 2531c6cf19a0..5554f5ce4b9e 100644
> --- a/drivers/misc/ocxl/core.c
> +++ b/drivers/misc/ocxl/core.c
> @@ -210,6 +210,55 @@ static void unmap_mmio_areas(struct ocxl_afu *afu)
>   	release_fn_bar(afu->fn, afu->config.global_mmio_bar);
>   }
>   
> +int ocxl_afu_map_lpc_mem(struct ocxl_afu *afu)
> +{
> +	struct pci_dev *dev = to_pci_dev(afu->fn->dev.parent);
> +
> +	if ((afu->config.lpc_mem_size + afu->config.special_purpose_mem_size) == 0)
> +		return 0;
> +
> +	afu->lpc_base_addr = ocxl_link_lpc_map(afu->fn->link, dev);
> +	if (afu->lpc_base_addr == 0)
> +		return -EINVAL;
> +
> +	if (afu->config.lpc_mem_size) {
> +		afu->lpc_res.start = afu->lpc_base_addr + afu->config.lpc_mem_offset;
> +		afu->lpc_res.end = afu->lpc_res.start + afu->config.lpc_mem_size - 1;
> +	}
> +
> +	if (afu->config.special_purpose_mem_size) {
> +		afu->special_purpose_res.start = afu->lpc_base_addr +
> +						 afu->config.special_purpose_mem_offset;
> +		afu->special_purpose_res.end = afu->special_purpose_res.start +
> +					       afu->config.special_purpose_mem_size - 1;
> +	}
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL(ocxl_afu_map_lpc_mem);


We should use EXPORT_SYMBOL_GPL().

ok, so we're unmapping the lpc memory implicitly when calling 
ocxl_function_close() and therefore don't really need to export 
(ocxl_)unmap_lpc_mem(). I guess that's fine and easy enough to add if 
one day somebody has the need to unmap without closing.


> +
> +struct resource *ocxl_afu_lpc_mem(struct ocxl_afu *afu)
> +{
> +	return &afu->lpc_res;
> +}
> +EXPORT_SYMBOL(ocxl_afu_lpc_mem);
> +
> +static void unmap_lpc_mem(struct ocxl_afu *afu)
> +{
> +	struct pci_dev *dev = to_pci_dev(afu->fn->dev.parent);
> +
> +	if (afu->lpc_res.start || afu->special_purpose_res.start) {
> +		void *link = afu->fn->link;
> +
> +		ocxl_link_lpc_release(link, dev);
> +
> +		afu->lpc_res.start = 0;
> +		afu->lpc_res.end = 0;
> +		afu->special_purpose_res.start = 0;
> +		afu->special_purpose_res.end = 0;
> +	}
> +}
> +
>   static int configure_afu(struct ocxl_afu *afu, u8 afu_idx, struct pci_dev *dev)
>   {
>   	int rc;
> @@ -251,6 +300,7 @@ static int configure_afu(struct ocxl_afu *afu, u8 afu_idx, struct pci_dev *dev)
>   
>   static void deconfigure_afu(struct ocxl_afu *afu)
>   {
> +	unmap_lpc_mem(afu);
>   	unmap_mmio_areas(afu);
>   	reclaim_afu_pasid(afu);
>   	reclaim_afu_actag(afu);
> diff --git a/drivers/misc/ocxl/ocxl_internal.h b/drivers/misc/ocxl/ocxl_internal.h
> index 20b417e00949..9f4b47900e62 100644
> --- a/drivers/misc/ocxl/ocxl_internal.h
> +++ b/drivers/misc/ocxl/ocxl_internal.h
> @@ -52,6 +52,9 @@ struct ocxl_afu {
>   	void __iomem *global_mmio_ptr;
>   	u64 pp_mmio_start;
>   	void *private;
> +	u64 lpc_base_addr; /* Covers both LPC & special purpose memory */
> +	struct resource lpc_res;
> +	struct resource special_purpose_res;
>   };
>   
>   enum ocxl_context_status {
> diff --git a/include/misc/ocxl.h b/include/misc/ocxl.h
> index 06dd5839e438..6f7c02f0d5e3 100644
> --- a/include/misc/ocxl.h
> +++ b/include/misc/ocxl.h
> @@ -212,6 +212,24 @@ int ocxl_irq_set_handler(struct ocxl_context *ctx, int irq_id,
>   
>   // AFU Metadata
>   
> +/**
> + * Map the LPC system & special purpose memory for an AFU
> + *
> + * Do not call this during device discovery, as there may me multiple
> + * devices on a link, and the memory is mapped for the whole link, not
> + * just one device. It should only be called after all devices have
> + * registered their memory on the link.


If we were supporting more than one AFU-carrying functions, we would 
need to rework this, as functions could come and go and the total range 
could be dynamic (even the max address of the range could increase, if a 
function is updated with an AFU with a bigger LPC size). But we don't 
support multiple AFU-carrying functions, so current implementation is 
fine. And simple.

   Fred


> + *
> + * afu: The AFU that has the LPC memory to map
> + */
> +extern int ocxl_afu_map_lpc_mem(struct ocxl_afu *afu);
> +
> +/**
> + * Get the physical address range of LPC memory for an AFU
> + * afu: The AFU associated with the LPC memory
> + */
> +extern struct resource *ocxl_afu_lpc_mem(struct ocxl_afu *afu);
> +
>   /**
>    * Get a pointer to the config for an AFU
>    *
> 
_______________________________________________
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: Frederic Barrat <fbarrat@linux.ibm.com>
To: "Alastair D'Silva" <alastair@au1.ibm.com>, alastair@d-silva.org
Cc: "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>,
	"Keith Busch" <keith.busch@intel.com>,
	"Ira Weiny" <ira.weiny@intel.com>,
	"Krzysztof Kozlowski" <krzk@kernel.org>,
	"Anton Blanchard" <anton@ozlabs.org>,
	"Geert Uytterhoeven" <geert+renesas@glider.be>,
	"Anju T Sudhakar" <anju@linux.vnet.ibm.com>,
	"Mahesh Salgaonkar" <mahesh@linux.vnet.ibm.com>,
	"Vasant Hegde" <hegdevasant@linux.vnet.ibm.com>,
	"Cédric Le Goater" <clg@kaod.org>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Hari Bathini" <hbathini@linux.ibm.com>,
	"Greg Kurz" <groug@kaod.org>,
	"Masahiro Yamada" <yamada.masahiro@socionext.com>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"David Hildenbrand" <david@redhat.com>,
	"Oscar Salvador" <osalvador@suse.com>,
	"Michal Hocko" <mhocko@suse.com>,
	"Pavel Tatashin" <pasha.tatashin@soleen.com>,
	"Wei Yang" <richard.weiyang@gmail.com>, "Qian Cai" <cai@lca.pw>,
	linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org,
	linux-nvdimm@lists.01.org, linux-mm@kvack.org
Subject: Re: [PATCH 06/10] ocxl: Add functions to map/unmap LPC memory
Date: Thu, 7 Nov 2019 19:05:11 +0100	[thread overview]
Message-ID: <127f1885-df07-2a23-976e-f97c6ff8e2b2@linux.ibm.com> (raw)
In-Reply-To: <20191025044721.16617-7-alastair@au1.ibm.com>



Le 25/10/2019 à 06:47, Alastair D'Silva a écrit :
> From: Alastair D'Silva <alastair@d-silva.org>
> 
> Add functions to map/unmap LPC memory
> 
> Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
> ---
>   drivers/misc/ocxl/config.c        |  4 +++
>   drivers/misc/ocxl/core.c          | 50 +++++++++++++++++++++++++++++++
>   drivers/misc/ocxl/ocxl_internal.h |  3 ++
>   include/misc/ocxl.h               | 18 +++++++++++
>   4 files changed, 75 insertions(+)
> 
> diff --git a/drivers/misc/ocxl/config.c b/drivers/misc/ocxl/config.c
> index c8e19bfb5ef9..fb0c3b6f8312 100644
> --- a/drivers/misc/ocxl/config.c
> +++ b/drivers/misc/ocxl/config.c
> @@ -568,6 +568,10 @@ static int read_afu_lpc_memory_info(struct pci_dev *dev,
>   		afu->special_purpose_mem_size =
>   			total_mem_size - lpc_mem_size;
>   	}
> +
> +	dev_info(&dev->dev, "Probed LPC memory of %#llx bytes and special purpose memory of %#llx bytes\n",
> +		afu->lpc_mem_size, afu->special_purpose_mem_size);
> +
>   	return 0;
>   }
>   
> diff --git a/drivers/misc/ocxl/core.c b/drivers/misc/ocxl/core.c
> index 2531c6cf19a0..5554f5ce4b9e 100644
> --- a/drivers/misc/ocxl/core.c
> +++ b/drivers/misc/ocxl/core.c
> @@ -210,6 +210,55 @@ static void unmap_mmio_areas(struct ocxl_afu *afu)
>   	release_fn_bar(afu->fn, afu->config.global_mmio_bar);
>   }
>   
> +int ocxl_afu_map_lpc_mem(struct ocxl_afu *afu)
> +{
> +	struct pci_dev *dev = to_pci_dev(afu->fn->dev.parent);
> +
> +	if ((afu->config.lpc_mem_size + afu->config.special_purpose_mem_size) == 0)
> +		return 0;
> +
> +	afu->lpc_base_addr = ocxl_link_lpc_map(afu->fn->link, dev);
> +	if (afu->lpc_base_addr == 0)
> +		return -EINVAL;
> +
> +	if (afu->config.lpc_mem_size) {
> +		afu->lpc_res.start = afu->lpc_base_addr + afu->config.lpc_mem_offset;
> +		afu->lpc_res.end = afu->lpc_res.start + afu->config.lpc_mem_size - 1;
> +	}
> +
> +	if (afu->config.special_purpose_mem_size) {
> +		afu->special_purpose_res.start = afu->lpc_base_addr +
> +						 afu->config.special_purpose_mem_offset;
> +		afu->special_purpose_res.end = afu->special_purpose_res.start +
> +					       afu->config.special_purpose_mem_size - 1;
> +	}
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL(ocxl_afu_map_lpc_mem);


We should use EXPORT_SYMBOL_GPL().

ok, so we're unmapping the lpc memory implicitly when calling 
ocxl_function_close() and therefore don't really need to export 
(ocxl_)unmap_lpc_mem(). I guess that's fine and easy enough to add if 
one day somebody has the need to unmap without closing.


> +
> +struct resource *ocxl_afu_lpc_mem(struct ocxl_afu *afu)
> +{
> +	return &afu->lpc_res;
> +}
> +EXPORT_SYMBOL(ocxl_afu_lpc_mem);
> +
> +static void unmap_lpc_mem(struct ocxl_afu *afu)
> +{
> +	struct pci_dev *dev = to_pci_dev(afu->fn->dev.parent);
> +
> +	if (afu->lpc_res.start || afu->special_purpose_res.start) {
> +		void *link = afu->fn->link;
> +
> +		ocxl_link_lpc_release(link, dev);
> +
> +		afu->lpc_res.start = 0;
> +		afu->lpc_res.end = 0;
> +		afu->special_purpose_res.start = 0;
> +		afu->special_purpose_res.end = 0;
> +	}
> +}
> +
>   static int configure_afu(struct ocxl_afu *afu, u8 afu_idx, struct pci_dev *dev)
>   {
>   	int rc;
> @@ -251,6 +300,7 @@ static int configure_afu(struct ocxl_afu *afu, u8 afu_idx, struct pci_dev *dev)
>   
>   static void deconfigure_afu(struct ocxl_afu *afu)
>   {
> +	unmap_lpc_mem(afu);
>   	unmap_mmio_areas(afu);
>   	reclaim_afu_pasid(afu);
>   	reclaim_afu_actag(afu);
> diff --git a/drivers/misc/ocxl/ocxl_internal.h b/drivers/misc/ocxl/ocxl_internal.h
> index 20b417e00949..9f4b47900e62 100644
> --- a/drivers/misc/ocxl/ocxl_internal.h
> +++ b/drivers/misc/ocxl/ocxl_internal.h
> @@ -52,6 +52,9 @@ struct ocxl_afu {
>   	void __iomem *global_mmio_ptr;
>   	u64 pp_mmio_start;
>   	void *private;
> +	u64 lpc_base_addr; /* Covers both LPC & special purpose memory */
> +	struct resource lpc_res;
> +	struct resource special_purpose_res;
>   };
>   
>   enum ocxl_context_status {
> diff --git a/include/misc/ocxl.h b/include/misc/ocxl.h
> index 06dd5839e438..6f7c02f0d5e3 100644
> --- a/include/misc/ocxl.h
> +++ b/include/misc/ocxl.h
> @@ -212,6 +212,24 @@ int ocxl_irq_set_handler(struct ocxl_context *ctx, int irq_id,
>   
>   // AFU Metadata
>   
> +/**
> + * Map the LPC system & special purpose memory for an AFU
> + *
> + * Do not call this during device discovery, as there may me multiple
> + * devices on a link, and the memory is mapped for the whole link, not
> + * just one device. It should only be called after all devices have
> + * registered their memory on the link.


If we were supporting more than one AFU-carrying functions, we would 
need to rework this, as functions could come and go and the total range 
could be dynamic (even the max address of the range could increase, if a 
function is updated with an AFU with a bigger LPC size). But we don't 
support multiple AFU-carrying functions, so current implementation is 
fine. And simple.

   Fred


> + *
> + * afu: The AFU that has the LPC memory to map
> + */
> +extern int ocxl_afu_map_lpc_mem(struct ocxl_afu *afu);
> +
> +/**
> + * Get the physical address range of LPC memory for an AFU
> + * afu: The AFU associated with the LPC memory
> + */
> +extern struct resource *ocxl_afu_lpc_mem(struct ocxl_afu *afu);
> +
>   /**
>    * Get a pointer to the config for an AFU
>    *
> 


WARNING: multiple messages have this Message-ID (diff)
From: Frederic Barrat <fbarrat@linux.ibm.com>
To: "Alastair D'Silva" <alastair@au1.ibm.com>, alastair@d-silva.org
Cc: "Oscar Salvador" <osalvador@suse.com>,
	"Michal Hocko" <mhocko@suse.com>,
	"Geert Uytterhoeven" <geert+renesas@glider.be>,
	"David Hildenbrand" <david@redhat.com>,
	"Wei Yang" <richard.weiyang@gmail.com>,
	"Keith Busch" <keith.busch@intel.com>,
	"Masahiro Yamada" <yamada.masahiro@socionext.com>,
	"Paul Mackerras" <paulus@samba.org>,
	"Ira Weiny" <ira.weiny@intel.com>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Pavel Tatashin" <pasha.tatashin@soleen.com>,
	"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>,
	"Qian Cai" <cai@lca.pw>, "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,
	"Vasant Hegde" <hegdevasant@linux.vnet.ibm.com>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH 06/10] ocxl: Add functions to map/unmap LPC memory
Date: Thu, 7 Nov 2019 19:05:11 +0100	[thread overview]
Message-ID: <127f1885-df07-2a23-976e-f97c6ff8e2b2@linux.ibm.com> (raw)
In-Reply-To: <20191025044721.16617-7-alastair@au1.ibm.com>



Le 25/10/2019 à 06:47, Alastair D'Silva a écrit :
> From: Alastair D'Silva <alastair@d-silva.org>
> 
> Add functions to map/unmap LPC memory
> 
> Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
> ---
>   drivers/misc/ocxl/config.c        |  4 +++
>   drivers/misc/ocxl/core.c          | 50 +++++++++++++++++++++++++++++++
>   drivers/misc/ocxl/ocxl_internal.h |  3 ++
>   include/misc/ocxl.h               | 18 +++++++++++
>   4 files changed, 75 insertions(+)
> 
> diff --git a/drivers/misc/ocxl/config.c b/drivers/misc/ocxl/config.c
> index c8e19bfb5ef9..fb0c3b6f8312 100644
> --- a/drivers/misc/ocxl/config.c
> +++ b/drivers/misc/ocxl/config.c
> @@ -568,6 +568,10 @@ static int read_afu_lpc_memory_info(struct pci_dev *dev,
>   		afu->special_purpose_mem_size =
>   			total_mem_size - lpc_mem_size;
>   	}
> +
> +	dev_info(&dev->dev, "Probed LPC memory of %#llx bytes and special purpose memory of %#llx bytes\n",
> +		afu->lpc_mem_size, afu->special_purpose_mem_size);
> +
>   	return 0;
>   }
>   
> diff --git a/drivers/misc/ocxl/core.c b/drivers/misc/ocxl/core.c
> index 2531c6cf19a0..5554f5ce4b9e 100644
> --- a/drivers/misc/ocxl/core.c
> +++ b/drivers/misc/ocxl/core.c
> @@ -210,6 +210,55 @@ static void unmap_mmio_areas(struct ocxl_afu *afu)
>   	release_fn_bar(afu->fn, afu->config.global_mmio_bar);
>   }
>   
> +int ocxl_afu_map_lpc_mem(struct ocxl_afu *afu)
> +{
> +	struct pci_dev *dev = to_pci_dev(afu->fn->dev.parent);
> +
> +	if ((afu->config.lpc_mem_size + afu->config.special_purpose_mem_size) == 0)
> +		return 0;
> +
> +	afu->lpc_base_addr = ocxl_link_lpc_map(afu->fn->link, dev);
> +	if (afu->lpc_base_addr == 0)
> +		return -EINVAL;
> +
> +	if (afu->config.lpc_mem_size) {
> +		afu->lpc_res.start = afu->lpc_base_addr + afu->config.lpc_mem_offset;
> +		afu->lpc_res.end = afu->lpc_res.start + afu->config.lpc_mem_size - 1;
> +	}
> +
> +	if (afu->config.special_purpose_mem_size) {
> +		afu->special_purpose_res.start = afu->lpc_base_addr +
> +						 afu->config.special_purpose_mem_offset;
> +		afu->special_purpose_res.end = afu->special_purpose_res.start +
> +					       afu->config.special_purpose_mem_size - 1;
> +	}
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL(ocxl_afu_map_lpc_mem);


We should use EXPORT_SYMBOL_GPL().

ok, so we're unmapping the lpc memory implicitly when calling 
ocxl_function_close() and therefore don't really need to export 
(ocxl_)unmap_lpc_mem(). I guess that's fine and easy enough to add if 
one day somebody has the need to unmap without closing.


> +
> +struct resource *ocxl_afu_lpc_mem(struct ocxl_afu *afu)
> +{
> +	return &afu->lpc_res;
> +}
> +EXPORT_SYMBOL(ocxl_afu_lpc_mem);
> +
> +static void unmap_lpc_mem(struct ocxl_afu *afu)
> +{
> +	struct pci_dev *dev = to_pci_dev(afu->fn->dev.parent);
> +
> +	if (afu->lpc_res.start || afu->special_purpose_res.start) {
> +		void *link = afu->fn->link;
> +
> +		ocxl_link_lpc_release(link, dev);
> +
> +		afu->lpc_res.start = 0;
> +		afu->lpc_res.end = 0;
> +		afu->special_purpose_res.start = 0;
> +		afu->special_purpose_res.end = 0;
> +	}
> +}
> +
>   static int configure_afu(struct ocxl_afu *afu, u8 afu_idx, struct pci_dev *dev)
>   {
>   	int rc;
> @@ -251,6 +300,7 @@ static int configure_afu(struct ocxl_afu *afu, u8 afu_idx, struct pci_dev *dev)
>   
>   static void deconfigure_afu(struct ocxl_afu *afu)
>   {
> +	unmap_lpc_mem(afu);
>   	unmap_mmio_areas(afu);
>   	reclaim_afu_pasid(afu);
>   	reclaim_afu_actag(afu);
> diff --git a/drivers/misc/ocxl/ocxl_internal.h b/drivers/misc/ocxl/ocxl_internal.h
> index 20b417e00949..9f4b47900e62 100644
> --- a/drivers/misc/ocxl/ocxl_internal.h
> +++ b/drivers/misc/ocxl/ocxl_internal.h
> @@ -52,6 +52,9 @@ struct ocxl_afu {
>   	void __iomem *global_mmio_ptr;
>   	u64 pp_mmio_start;
>   	void *private;
> +	u64 lpc_base_addr; /* Covers both LPC & special purpose memory */
> +	struct resource lpc_res;
> +	struct resource special_purpose_res;
>   };
>   
>   enum ocxl_context_status {
> diff --git a/include/misc/ocxl.h b/include/misc/ocxl.h
> index 06dd5839e438..6f7c02f0d5e3 100644
> --- a/include/misc/ocxl.h
> +++ b/include/misc/ocxl.h
> @@ -212,6 +212,24 @@ int ocxl_irq_set_handler(struct ocxl_context *ctx, int irq_id,
>   
>   // AFU Metadata
>   
> +/**
> + * Map the LPC system & special purpose memory for an AFU
> + *
> + * Do not call this during device discovery, as there may me multiple
> + * devices on a link, and the memory is mapped for the whole link, not
> + * just one device. It should only be called after all devices have
> + * registered their memory on the link.


If we were supporting more than one AFU-carrying functions, we would 
need to rework this, as functions could come and go and the total range 
could be dynamic (even the max address of the range could increase, if a 
function is updated with an AFU with a bigger LPC size). But we don't 
support multiple AFU-carrying functions, so current implementation is 
fine. And simple.

   Fred


> + *
> + * afu: The AFU that has the LPC memory to map
> + */
> +extern int ocxl_afu_map_lpc_mem(struct ocxl_afu *afu);
> +
> +/**
> + * Get the physical address range of LPC memory for an AFU
> + * afu: The AFU associated with the LPC memory
> + */
> +extern struct resource *ocxl_afu_lpc_mem(struct ocxl_afu *afu);
> +
>   /**
>    * Get a pointer to the config for an AFU
>    *
> 


  reply	other threads:[~2019-11-07 18:05 UTC|newest]

Thread overview: 155+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-25  4:46 [PATCH 00/10] Add support for OpenCAPI SCM devices Alastair D'Silva
2019-10-25  4:46 ` Alastair D'Silva
2019-10-25  4:46 ` Alastair D'Silva
2019-10-25  4:46 ` [PATCH 01/10] memory_hotplug: Add a bounds check to __add_pages Alastair D'Silva
2019-10-25  4:46   ` Alastair D'Silva
2019-10-25  4:46   ` Alastair D'Silva
2019-10-25  4:46 ` [PATCH 02/10] nvdimm: remove prototypes for nonexistent functions Alastair D'Silva
2019-10-25  4:46   ` Alastair D'Silva
2019-10-25  4:46   ` Alastair D'Silva
2019-10-27 23:41   ` Andrew Donnellan
2019-10-27 23:41     ` Andrew Donnellan
2019-10-27 23:41     ` Andrew Donnellan
2019-11-07 17:56   ` Frederic Barrat
2019-11-07 17:56     ` Frederic Barrat
2019-11-07 17:56     ` Frederic Barrat
2019-11-15  4:30   ` Dan Williams
2019-11-15  4:30     ` Dan Williams
2019-11-15  4:30     ` Dan Williams
2019-10-25  4:46 ` [PATCH 03/10] powerpc: Add OPAL calls for LPC memory alloc/release Alastair D'Silva
2019-10-25  4:46   ` Alastair D'Silva
2019-10-25  4:46   ` Alastair D'Silva
2019-11-07 17:57   ` Frederic Barrat
2019-11-07 17:57     ` Frederic Barrat
2019-11-07 17:57     ` Frederic Barrat
2019-10-25  4:46 ` [PATCH 04/10] powerpc: Map & release OpenCAPI LPC memory Alastair D'Silva
2019-10-25  4:46   ` Alastair D'Silva
2019-10-25  4:46   ` Alastair D'Silva
2019-10-27 21:24   ` kbuild test robot
2019-10-27 21:24     ` kbuild test robot
2019-10-27 21:24     ` kbuild test robot
2019-10-27 21:24     ` kbuild test robot
2019-10-27 21:59   ` kbuild test robot
2019-10-27 21:59     ` kbuild test robot
2019-10-27 21:59     ` kbuild test robot
2019-10-27 21:59     ` kbuild test robot
2019-10-28  2:34   ` kbuild test robot
2019-10-28  2:34     ` kbuild test robot
2019-10-28  2:34     ` kbuild test robot
2019-10-28  2:34     ` kbuild test robot
2019-10-29  1:49   ` Andrew Donnellan
2019-10-29  1:49     ` Andrew Donnellan
2019-10-29  1:49     ` Andrew Donnellan
2019-10-29  2:44     ` Alastair D'Silva
2019-10-29  2:44       ` Alastair D'Silva
2019-10-29  2:44       ` Alastair D'Silva
2019-10-29  2:47       ` Andrew Donnellan
2019-10-29  2:47         ` Andrew Donnellan
2019-10-29  2:47         ` Andrew Donnellan
2019-11-07 17:59   ` Frederic Barrat
2019-11-07 17:59     ` Frederic Barrat
2019-11-07 17:59     ` Frederic Barrat
2019-11-11  9:34   ` Aneesh Kumar K.V
2019-11-11  9:34     ` Aneesh Kumar K.V
2019-10-25  4:47 ` [PATCH 05/10] ocxl: Tally up the LPC memory on a link & allow it to be mapped Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-11-07 18:02   ` Frederic Barrat
2019-11-07 18:02     ` Frederic Barrat
2019-11-07 18:02     ` Frederic Barrat
2019-10-25  4:47 ` [PATCH 06/10] ocxl: Add functions to map/unmap LPC memory Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-11-07 18:05   ` Frederic Barrat [this message]
2019-11-07 18:05     ` Frederic Barrat
2019-11-07 18:05     ` Frederic Barrat
2019-10-25  4:47 ` [PATCH 07/10] ocxl: Save the device serial number in ocxl_fn Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-11-06  3:10   ` Andrew Donnellan
2019-11-06  3:10     ` Andrew Donnellan
2019-11-06  3:10     ` Andrew Donnellan
2019-11-07 18:18   ` Frederic Barrat
2019-11-07 18:18     ` Frederic Barrat
2019-11-07 18:18     ` Frederic Barrat
2019-10-25  4:47 ` [PATCH 08/10] nvdimm: Add driver for OpenCAPI Storage Class Memory Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-10-27 22:19   ` kbuild test robot
2019-10-27 22:19     ` kbuild test robot
2019-10-27 22:19     ` kbuild test robot
2019-10-27 22:19     ` kbuild test robot
2019-10-27 22:53   ` kbuild test robot
2019-10-27 22:53     ` kbuild test robot
2019-10-27 22:53     ` kbuild test robot
2019-10-27 22:53     ` kbuild test robot
2019-10-28  1:12   ` [RFC PATCH] nvdimm: scm_get() can be static kbuild test robot
2019-10-28  1:12     ` kbuild test robot
2019-10-28  1:12     ` kbuild test robot
2019-10-28  1:12     ` kbuild test robot
2019-11-11 11:14   ` [PATCH 08/10] nvdimm: Add driver for OpenCAPI Storage Class Memory Aneesh Kumar K.V
2019-11-11 11:14     ` Aneesh Kumar K.V
2019-11-12  5:37     ` Dan Williams
2019-11-12  5:37       ` Dan Williams
2019-11-12  5:41       ` Dan Williams
2019-11-12  5:41         ` Dan Williams
2019-11-14 13:41   ` Frederic Barrat
2019-11-14 13:41     ` Frederic Barrat
2019-11-14 13:41     ` Frederic Barrat
2019-11-14 16:35     ` Dan Williams
2019-11-14 16:35       ` Dan Williams
2019-11-14 16:35       ` Dan Williams
2019-11-18 23:47       ` Andrew Donnellan
2019-11-18 23:47         ` Andrew Donnellan
2019-11-18 23:47         ` Andrew Donnellan
2019-11-19  0:04         ` Dan Williams
2019-11-19  0:04           ` Dan Williams
2019-11-19  0:04           ` Dan Williams
2019-11-19  2:48         ` Alastair D'Silva
2019-11-19  2:48           ` Alastair D'Silva
2019-11-19  2:48           ` Alastair D'Silva
2019-11-19  3:26           ` Andrew Donnellan
2019-11-19  3:26             ` Andrew Donnellan
2019-11-19  3:26             ` Andrew Donnellan
2019-11-19  4:41             ` Dan Williams
2019-11-19  4:41               ` Dan Williams
2019-11-19  4:41               ` Dan Williams
2019-11-18 23:01     ` Alastair D'Silva
2019-11-18 23:01       ` Alastair D'Silva
2019-11-18 23:01       ` Alastair D'Silva
2019-10-25  4:47 ` [PATCH 09/10] powerpc: Enable OpenCAPI Storage Class Memory driver on bare metal Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-10-28  2:43   ` Oliver O'Halloran
2019-10-28  2:43     ` Oliver O'Halloran
2019-10-28  2:43     ` Oliver O'Halloran
2019-10-28  2:43     ` Oliver O'Halloran
2019-11-08  7:10   ` Frederic Barrat
2019-11-08  7:10     ` Frederic Barrat
2019-11-08  7:10     ` Frederic Barrat
2020-01-31  4:56     ` Alastair D'Silva
2020-01-31  4:56       ` Alastair D'Silva
2020-01-31  4:56       ` Alastair D'Silva
2020-01-31  5:14       ` Dan Williams
2020-01-31  5:14         ` Dan Williams
2020-01-31  5:14         ` Dan Williams
2019-11-11  9:46   ` Aneesh Kumar K.V
2019-11-11  9:46     ` Aneesh Kumar K.V
2019-10-25  4:47 ` [PATCH 10/10] ocxl: Conditionally bind SCM devices to the generic OCXL driver Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-10-25  4:47   ` Alastair D'Silva
2019-10-26  6:43   ` Christoph Hellwig
2019-10-26  6:43     ` Christoph Hellwig
2019-10-26  6:43     ` Christoph Hellwig
2019-11-06  3:46   ` Andrew Donnellan
2019-11-06  3:46     ` Andrew Donnellan
2019-11-06  3:46     ` Andrew Donnellan
2019-11-07 18:08   ` Frederic Barrat
2019-11-07 18:08     ` Frederic Barrat
2019-11-07 18:08     ` Frederic Barrat
2019-11-08  0:37     ` Alastair D'Silva
2019-11-08  0:37       ` Alastair D'Silva
2019-11-08  0:37       ` Alastair D'Silva
2019-10-25  7:57 ` [PATCH 00/10] Add support for OpenCAPI SCM devices Geert Uytterhoeven
2019-10-25  7:57   ` Geert Uytterhoeven
2019-10-25  7:57   ` Geert Uytterhoeven

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=127f1885-df07-2a23-976e-f97c6ff8e2b2@linux.ibm.com \
    --to=fbarrat@linux.ibm.com \
    --cc=ajd@linux.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=alastair@au1.ibm.com \
    --cc=alastair@d-silva.org \
    --cc=anju@linux.vnet.ibm.com \
    --cc=anton@ozlabs.org \
    --cc=arnd@arndb.de \
    --cc=benh@kernel.crashing.org \
    --cc=cai@lca.pw \
    --cc=clg@kaod.org \
    --cc=david@redhat.com \
    --cc=geert+renesas@glider.be \
    --cc=gregkh@linuxfoundation.org \
    --cc=groug@kaod.org \
    --cc=hbathini@linux.ibm.com \
    --cc=hegdevasant@linux.vnet.ibm.com \
    --cc=krzk@kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mahesh@linux.vnet.ibm.com \
    --cc=mhocko@suse.com \
    --cc=mpe@ellerman.id.au \
    --cc=osalvador@suse.com \
    --cc=pasha.tatashin@soleen.com \
    --cc=paulus@samba.org \
    --cc=richard.weiyang@gmail.com \
    --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.