From: Robert Richter <rrichter@amd.com>
To: Alison Schofield <alison.schofield@intel.com>,
Vishal Verma <vishal.l.verma@intel.com>,
Ira Weiny <ira.weiny@intel.com>,
Dan Williams <dan.j.williams@intel.com>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Dave Jiang <dave.jiang@intel.com>,
Davidlohr Bueso <dave@stgolabs.net>
Cc: <linux-cxl@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
Gregory Price <gourry@gourry.net>,
"Fabio M. De Francesco" <fabio.m.de.francesco@linux.intel.com>,
Terry Bowman <terry.bowman@amd.com>,
Robert Richter <rrichter@amd.com>
Subject: [PATCH v2 11/18] cxl/region: Split region registration into an initialization and adding part
Date: Fri, 7 Feb 2025 16:37:46 +0100 [thread overview]
Message-ID: <20250207153753.418849-12-rrichter@amd.com> (raw)
In-Reply-To: <20250207153753.418849-1-rrichter@amd.com>
Before adding an endpoint to a region, the endpoint is initialized
first. Move that part to a new function
cxl_endpoint_decoder_initialize(). The function is in preparation of
adding more parameters that need to be determined in a setup.
The split also helps better separating the code. After initialization
the addition of an endpoint may fail with an error code and all the
data would need to be reverted to not leave the endpoint in an
undefined state. With separate functions the init part can succeed
even if the endpoint cannot be added.
Function naming follows the style of device_register() etc. Thus,
rename function cxl_add_to_region() to
cxl_endpoint_decoder_register().
Signed-off-by: Robert Richter <rrichter@amd.com>
Reviewed-by: Gregory Price <gourry@gourry.net>
---
drivers/cxl/core/region.c | 36 ++++++++++++++++++++++++++++--------
drivers/cxl/cxl.h | 6 ++++--
drivers/cxl/port.c | 9 +++++----
3 files changed, 37 insertions(+), 14 deletions(-)
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
index 9ce0282c0042..fb43e154c7b9 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -3345,7 +3345,7 @@ static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd,
dev_name(&cxlr->dev), p->res, p->interleave_ways,
p->interleave_granularity);
- /* ...to match put_device() in cxl_add_to_region() */
+ /* ...to match put_device() in cxl_endpoint_decoder_add() */
get_device(&cxlr->dev);
up_write(&cxl_region_rwsem);
@@ -3357,19 +3357,28 @@ static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd,
return ERR_PTR(rc);
}
-int cxl_add_to_region(struct cxl_endpoint_decoder *cxled)
+static int cxl_endpoint_decoder_initialize(struct cxl_endpoint_decoder *cxled)
{
- struct range *hpa = &cxled->cxld.hpa_range;
struct cxl_root_decoder *cxlrd;
- struct cxl_region_params *p;
- struct cxl_region *cxlr;
- bool attach = false;
- int rc;
cxlrd = cxl_find_root_decoder(cxled);
if (!cxlrd)
return -ENXIO;
+ cxled->cxlrd = cxlrd;
+
+ return 0;
+}
+
+static int cxl_endpoint_decoder_add(struct cxl_endpoint_decoder *cxled)
+{
+ struct range *hpa = &cxled->cxld.hpa_range;
+ struct cxl_root_decoder *cxlrd = cxled->cxlrd;
+ struct cxl_region_params *p;
+ struct cxl_region *cxlr;
+ bool attach = false;
+ int rc;
+
/*
* Ensure that if multiple threads race to construct_region() for @hpa
* one does the construction and the others add to that.
@@ -3406,7 +3415,18 @@ int cxl_add_to_region(struct cxl_endpoint_decoder *cxled)
return rc;
}
-EXPORT_SYMBOL_NS_GPL(cxl_add_to_region, "CXL");
+
+int cxl_endpoint_decoder_register(struct cxl_endpoint_decoder *cxled)
+{
+ int rc;
+
+ rc = cxl_endpoint_decoder_initialize(cxled);
+ if (rc)
+ return rc;
+
+ return cxl_endpoint_decoder_add(cxled);
+}
+EXPORT_SYMBOL_NS_GPL(cxl_endpoint_decoder_register, "CXL");
static int is_system_ram(struct resource *res, void *arg)
{
diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index 85dfc8df0a80..50e7d878bb6f 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -392,6 +392,7 @@ enum cxl_decoder_state {
*/
struct cxl_endpoint_decoder {
struct cxl_decoder cxld;
+ struct cxl_root_decoder *cxlrd;
struct resource *dpa_res;
resource_size_t skip;
enum cxl_decoder_state state;
@@ -854,7 +855,7 @@ struct cxl_nvdimm_bridge *cxl_find_nvdimm_bridge(struct cxl_port *port);
#ifdef CONFIG_CXL_REGION
bool is_cxl_pmem_region(struct device *dev);
struct cxl_pmem_region *to_cxl_pmem_region(struct device *dev);
-int cxl_add_to_region(struct cxl_endpoint_decoder *cxled);
+int cxl_endpoint_decoder_register(struct cxl_endpoint_decoder *cxled);
struct cxl_dax_region *to_cxl_dax_region(struct device *dev);
#else
static inline bool is_cxl_pmem_region(struct device *dev)
@@ -865,7 +866,8 @@ static inline struct cxl_pmem_region *to_cxl_pmem_region(struct device *dev)
{
return NULL;
}
-static inline int cxl_add_to_region(struct cxl_endpoint_decoder *cxled)
+static inline int
+cxl_endpoint_decoder_register(struct cxl_endpoint_decoder *cxled)
{
return 0;
}
diff --git a/drivers/cxl/port.c b/drivers/cxl/port.c
index 74587a403e3d..36e487366c7a 100644
--- a/drivers/cxl/port.c
+++ b/drivers/cxl/port.c
@@ -46,13 +46,14 @@ static int discover_region(struct device *dev, void *unused)
return 0;
/*
- * Region enumeration is opportunistic, if this add-event fails,
+ * Region enumeration is opportunistic, ignore errors and
* continue to the next endpoint decoder.
*/
- rc = cxl_add_to_region(cxled);
+ rc = cxl_endpoint_decoder_register(cxled);
if (rc)
- dev_dbg(dev, "failed to add to region: %#llx-%#llx\n",
- cxled->cxld.hpa_range.start, cxled->cxld.hpa_range.end);
+ dev_warn(cxled->cxld.dev.parent,
+ "failed to register %s: %d\n",
+ dev_name(&cxled->cxld.dev), rc);
return 0;
}
--
2.39.5
next prev parent reply other threads:[~2025-02-07 15:39 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-07 15:37 [PATCH v2 00/18] cxl: Address translation support, part 1: Cleanups and refactoring Robert Richter
2025-02-07 15:37 ` [PATCH v2 01/18] cxl: Remove else after return Robert Richter
2025-02-07 18:11 ` Jonathan Cameron
2025-02-07 23:56 ` Davidlohr Bueso
2025-02-07 15:37 ` [PATCH v2 02/18] cxl/pci: Moving code in cxl_hdm_decode_init() Robert Richter
2025-02-07 16:02 ` Gregory Price
2025-02-07 23:57 ` Davidlohr Bueso
2025-02-07 15:37 ` [PATCH v2 03/18] cxl/pci: cxl_hdm_decode_init: Move comment Robert Richter
2025-02-07 16:02 ` Gregory Price
2025-02-07 21:36 ` Jim Kao
2025-02-07 22:19 ` Gregory Price
2025-02-10 11:07 ` Robert Richter
2025-02-07 15:37 ` [PATCH v2 04/18] cxl/pci: Add comments to cxl_hdm_decode_init() Robert Richter
2025-02-07 15:37 ` [PATCH v2 05/18] cxl: Introduce parent_port_of() helper Robert Richter
2025-02-07 23:08 ` Alison Schofield
2025-02-10 11:38 ` Robert Richter
2025-02-07 15:37 ` [PATCH v2 06/18] cxl/region: Rename function to cxl_find_decoder_early() Robert Richter
2025-02-07 15:37 ` [PATCH v2 07/18] cxl/region: Avoid duplicate call of cxl_find_decoder_early() Robert Richter
2025-02-07 15:37 ` [PATCH v2 08/18] cxl/region: Move find_cxl_root() to cxl_add_to_region() Robert Richter
2025-02-07 15:37 ` [PATCH v2 09/18] cxl/region: Factor out code to find the root decoder Robert Richter
2025-02-07 15:37 ` [PATCH v2 10/18] cxl/region: Factor out code to find a root decoder's region Robert Richter
2025-02-07 16:20 ` Gregory Price
2025-02-07 15:37 ` Robert Richter [this message]
2025-02-07 15:37 ` [PATCH v2 12/18] cxl/region: Use iterator to find the root port in cxl_find_root_decoder() Robert Richter
2025-02-07 15:37 ` [PATCH v2 13/18] cxl/region: Add function to find a port's switch decoder by range Robert Richter
2025-02-07 16:29 ` Gregory Price
2025-02-07 22:22 ` Alison Schofield
2025-02-10 12:31 ` Robert Richter
2025-02-07 15:37 ` [PATCH v2 14/18] cxl/region: Unfold cxl_find_root_decoder() into cxl_endpoint_decoder_initialize() Robert Richter
2025-02-07 15:37 ` [PATCH v2 15/18] cxl/region: Show message on registration failure Robert Richter
2025-02-07 15:37 ` [PATCH v2 16/18] cxl/region: Show message on broken target list Robert Richter
2025-02-07 23:36 ` Alison Schofield
2025-02-10 12:35 ` Robert Richter
2025-02-07 15:37 ` [PATCH v2 17/18] cxl: Show message when a decoder was added to a port Robert Richter
2025-02-07 15:37 ` [PATCH v2 18/18] cxl/acpi: Unify CFMWS memory log messages with SRAT messages Robert Richter
2025-02-07 16:30 ` Gregory Price
2025-02-07 17:48 ` Robert Richter
2025-02-07 21:24 ` [PATCH v2 00/18] cxl: Address translation support, part 1: Cleanups and refactoring Gregory Price
2025-02-11 8:43 ` Robert Richter
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=20250207153753.418849-12-rrichter@amd.com \
--to=rrichter@amd.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=alison.schofield@intel.com \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=fabio.m.de.francesco@linux.intel.com \
--cc=gourry@gourry.net \
--cc=ira.weiny@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=terry.bowman@amd.com \
--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