From: Ben Widawsky <ben.widawsky@intel.com>
To: linux-cxl@vger.kernel.org
Cc: patches@lists.linux.dev, Ben Widawsky <ben.widawsky@intel.com>,
Alison Schofield <alison.schofield@intel.com>,
Dan Williams <dan.j.williams@intel.com>,
Ira Weiny <ira.weiny@intel.com>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Vishal Verma <vishal.l.verma@intel.com>
Subject: [RFC PATCH 3/7] cxl/port: Surface ram and pmem resources
Date: Wed, 16 Mar 2022 16:02:59 -0700 [thread overview]
Message-ID: <20220316230303.1813397-4-ben.widawsky@intel.com> (raw)
In-Reply-To: <20220316230303.1813397-1-ben.widawsky@intel.com>
CXL Type 2 and 3 endpoints may contain Host-managed Device Memory (HDM).
This memory can be either volatile, persistent, or some combination of
both. Similar to the root decoder the port's resources can be considered
the host memory of which decoders allocate out of. Unlike the root
decoder resource, device resources are in the device physical address
space domain.
Signed-off-by: Ben Widawsky <ben.widawsky@intel.com>
---
drivers/cxl/core/port.c | 54 +++++++++++++++++++++++++++++++++++++++++
drivers/cxl/cxl.h | 7 ++++++
drivers/cxl/mem.c | 7 ++++--
3 files changed, 66 insertions(+), 2 deletions(-)
diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
index c46f0b01ce3c..6653de4dfb43 100644
--- a/drivers/cxl/core/port.c
+++ b/drivers/cxl/core/port.c
@@ -2,6 +2,7 @@
/* Copyright(c) 2020 Intel Corporation. All rights reserved. */
#include <linux/io-64-nonatomic-lo-hi.h>
#include <linux/workqueue.h>
+#include <linux/genalloc.h>
#include <linux/device.h>
#include <linux/module.h>
#include <linux/pci.h>
@@ -503,6 +504,59 @@ struct cxl_port *devm_cxl_add_port(struct device *host, struct device *uport,
}
EXPORT_SYMBOL_NS_GPL(devm_cxl_add_port, CXL);
+static int *gen_pool_vcookie;
+static int *gen_pool_pcookie;
+
+struct cxl_port *devm_cxl_add_endpoint_port(struct device *host,
+ struct device *uport,
+ resource_size_t component_reg_phys,
+ u64 capacity, u64 pmem_offset,
+ struct cxl_port *parent_port)
+{
+ int rc;
+ struct cxl_port *ep =
+ devm_cxl_add_port(host, uport, component_reg_phys, parent_port);
+ if (IS_ERR(ep) || !capacity)
+ return ep;
+
+ ep->media = devm_gen_pool_create(&ep->dev, ilog2(SZ_256M), NUMA_NO_NODE, NULL);
+ if (IS_ERR(ep->media)) {
+ ep = ERR_CAST(ep->media);
+ goto err_out;
+ }
+
+ if (pmem_offset) {
+ rc = gen_pool_add_owner(ep->media, 0, -1, pmem_offset,
+ NUMA_NO_NODE, &gen_pool_vcookie);
+ if (rc) {
+ ep = ERR_PTR(rc);
+ goto err_out;
+ }
+ dev_dbg(&ep->dev, "Created volatile capacity pool: %zx\n",
+ gen_pool_avail(ep->media));
+ }
+
+ if (pmem_offset < capacity) {
+ rc = gen_pool_add_owner(ep->media, pmem_offset, -1,
+ capacity - pmem_offset, NUMA_NO_NODE,
+ &gen_pool_pcookie);
+ if (rc) {
+ ep = ERR_PTR(rc);
+ goto err_out;
+ }
+ dev_dbg(&ep->dev, "Created persistent capacity pool: %zx\n",
+ gen_pool_avail(ep->media));
+ }
+
+ return ep;
+
+err_out:
+ dev_err(&ep->dev, "Failed to allocated gen pools\n");
+ put_device(&ep->dev);
+ return ep;
+}
+EXPORT_SYMBOL_NS_GPL(devm_cxl_add_endpoint_port, CXL);
+
struct pci_bus *cxl_port_to_pci_bus(struct cxl_port *port)
{
/* There is no pci_bus associated with a CXL platform-root port */
diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index f523268060fd..d18e93e77f7e 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -330,6 +330,7 @@ struct cxl_nvdimm {
* @component_reg_phys: component register capability base address (optional)
* @dead: last ep has been removed, force port re-creation
* @depth: How deep this port is relative to the root. depth 0 is the root.
+ * @media: Media's address space (endpoint only)
*/
struct cxl_port {
struct device dev;
@@ -341,6 +342,7 @@ struct cxl_port {
resource_size_t component_reg_phys;
bool dead;
unsigned int depth;
+ struct gen_pool *media;
};
/**
@@ -389,6 +391,11 @@ struct pci_bus *cxl_port_to_pci_bus(struct cxl_port *port);
struct cxl_port *devm_cxl_add_port(struct device *host, struct device *uport,
resource_size_t component_reg_phys,
struct cxl_port *parent_port);
+struct cxl_port *devm_cxl_add_endpoint_port(struct device *host,
+ struct device *uport,
+ resource_size_t component_reg_phys,
+ u64 capacity, u64 pmem_offset,
+ struct cxl_port *parent_port);
struct cxl_port *find_cxl_root(struct device *dev);
int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd);
int cxl_bus_rescan(void);
diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c
index 91fb8d5b21a7..b6f8edaed802 100644
--- a/drivers/cxl/mem.c
+++ b/drivers/cxl/mem.c
@@ -50,9 +50,12 @@ static int create_endpoint(struct cxl_memdev *cxlmd,
{
struct cxl_dev_state *cxlds = cxlmd->cxlds;
struct cxl_port *endpoint;
+ u64 partition = range_len(&cxlds->ram_range);
+ u64 size = range_len(&cxlds->ram_range) + range_len(&cxlds->pmem_range);
- endpoint = devm_cxl_add_port(&parent_port->dev, &cxlmd->dev,
- cxlds->component_reg_phys, parent_port);
+ endpoint = devm_cxl_add_endpoint_port(&parent_port->dev, &cxlmd->dev,
+ cxlds->component_reg_phys, size,
+ partition, parent_port);
if (IS_ERR(endpoint))
return PTR_ERR(endpoint);
--
2.35.1
next prev parent reply other threads:[~2022-03-16 23:03 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-16 23:02 [RFC PATCH 0/7] Revamped region creation Ben Widawsky
2022-03-16 23:02 ` [RFC PATCH 1/7] cxl/core: Use is_endpoint_decoder Ben Widawsky
2022-03-16 23:02 ` [RFC PATCH 2/7] cxl/core: Distinguish cxl_decoder into types Ben Widawsky
2022-03-18 21:03 ` Dan Williams
2022-03-18 22:12 ` Ben Widawsky
2022-03-19 2:08 ` Dan Williams
2022-03-19 2:16 ` Dan Williams
2022-03-16 23:02 ` Ben Widawsky [this message]
2022-03-16 23:03 ` [RFC PATCH 4/7] cxl/core/hdm: Allocate resources from the media Ben Widawsky
2022-03-17 20:23 ` Ben Widawsky
2022-03-16 23:03 ` [RFC PATCH 5/7] cxl/core/port: add decoder attrs for size and volatility Ben Widawsky
2022-03-17 21:49 ` Ben Widawsky
2022-03-17 23:29 ` [RFC v2 " Ben Widawsky
2022-03-16 23:03 ` [RFC PATCH 6/7] cxl/region: Add region creation ABI Ben Widawsky
2022-03-16 23:03 ` [RFC PATCH 7/7] cxl/region: Introduce concept of region configuration Ben Widawsky
2022-03-17 21:03 ` [RFC PATCH 0/7] Revamped region creation Ben Widawsky
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=20220316230303.1813397-4-ben.widawsky@intel.com \
--to=ben.widawsky@intel.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=alison.schofield@intel.com \
--cc=dan.j.williams@intel.com \
--cc=ira.weiny@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=patches@lists.linux.dev \
--cc=vishal.l.verma@intel.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