From: Ira Weiny <ira.weiny@intel.com>
To: Dave Jiang <dave.jiang@intel.com>, Fan Ni <fan.ni@samsung.com>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Navneet Singh <navneet.singh@intel.com>,
Jonathan Corbet <corbet@lwn.net>,
Andrew Morton <akpm@linux-foundation.org>
Cc: Dan Williams <dan.j.williams@intel.com>,
Davidlohr Bueso <dave@stgolabs.net>,
Alison Schofield <alison.schofield@intel.com>,
Vishal Verma <vishal.l.verma@intel.com>,
Ira Weiny <ira.weiny@intel.com>,
linux-cxl@vger.kernel.org, linux-doc@vger.kernel.org,
nvdimm@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: [PATCH v6 12/27] cxl/cdat: Gather DSMAS data for DCD regions
Date: Tue, 05 Nov 2024 12:38:34 -0600 [thread overview]
Message-ID: <20241105-dcd-type2-upstream-v6-12-85c7fa2140fe@intel.com> (raw)
In-Reply-To: <20241105-dcd-type2-upstream-v6-0-85c7fa2140fe@intel.com>
Additional DCD region (partition) information is contained in the DSMAS
CDAT tables, including performance, read only, and shareable attributes.
Match DCD partitions with DSMAS tables and store the meta data.
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
---
drivers/cxl/core/cdat.c | 39 +++++++++++++++++++++++++++++++++++++++
drivers/cxl/core/mbox.c | 2 ++
drivers/cxl/cxlmem.h | 3 +++
3 files changed, 44 insertions(+)
diff --git a/drivers/cxl/core/cdat.c b/drivers/cxl/core/cdat.c
index b5d30c5bf1e20725d13b4397a7ba90662bcd8766..7cd7734a3b0f0b742ee6e63973d12fb3e83ac332 100644
--- a/drivers/cxl/core/cdat.c
+++ b/drivers/cxl/core/cdat.c
@@ -17,6 +17,8 @@ struct dsmas_entry {
struct access_coordinate cdat_coord[ACCESS_COORDINATE_MAX];
int entries;
int qos_class;
+ bool shareable;
+ bool read_only;
};
static u32 cdat_normalize(u16 entry, u64 base, u8 type)
@@ -74,6 +76,8 @@ static int cdat_dsmas_handler(union acpi_subtable_headers *header, void *arg,
return -ENOMEM;
dent->handle = dsmas->dsmad_handle;
+ dent->shareable = dsmas->flags & ACPI_CDAT_DSMAS_SHAREABLE;
+ dent->read_only = dsmas->flags & ACPI_CDAT_DSMAS_READ_ONLY;
dent->dpa_range.start = le64_to_cpu((__force __le64)dsmas->dpa_base_address);
dent->dpa_range.end = le64_to_cpu((__force __le64)dsmas->dpa_base_address) +
le64_to_cpu((__force __le64)dsmas->dpa_length) - 1;
@@ -255,6 +259,39 @@ static void update_perf_entry(struct device *dev, struct dsmas_entry *dent,
dent->coord[ACCESS_COORDINATE_CPU].write_latency);
}
+static void update_dcd_perf(struct cxl_dev_state *cxlds,
+ struct dsmas_entry *dent)
+{
+ struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlds);
+ struct device *dev = cxlds->dev;
+
+ for (int i = 0; i < mds->nr_dc_region; i++) {
+ /* CXL defines a u32 handle while CDAT defines u8, ignore upper bits */
+ u8 dc_handle = mds->dc_region[i].dsmad_handle & 0xff;
+
+ if (resource_size(&cxlds->dc_res[i])) {
+ struct range dc_range = {
+ .start = cxlds->dc_res[i].start,
+ .end = cxlds->dc_res[i].end,
+ };
+
+ if (range_contains(&dent->dpa_range, &dc_range)) {
+ if (dent->handle != dc_handle)
+ dev_warn(dev, "DC Region/DSMAS mis-matched handle/range; region [range 0x%016llx-0x%016llx] (%u); dsmas [range 0x%016llx-0x%016llx] (%u)\n"
+ " setting DC region attributes regardless\n",
+ dent->dpa_range.start, dent->dpa_range.end,
+ dent->handle,
+ dc_range.start, dc_range.end,
+ dc_handle);
+
+ mds->dc_region[i].shareable = dent->shareable;
+ mds->dc_region[i].read_only = dent->read_only;
+ update_perf_entry(dev, dent, &mds->dc_perf[i]);
+ }
+ }
+ }
+}
+
static void cxl_memdev_set_qos_class(struct cxl_dev_state *cxlds,
struct xarray *dsmas_xa)
{
@@ -278,6 +315,8 @@ static void cxl_memdev_set_qos_class(struct cxl_dev_state *cxlds,
else if (resource_size(&cxlds->pmem_res) &&
range_contains(&pmem_range, &dent->dpa_range))
update_perf_entry(dev, dent, &mds->pmem_perf);
+ else if (cxl_dcd_supported(mds))
+ update_dcd_perf(cxlds, dent);
else
dev_dbg(dev, "no partition for dsmas dpa: %#llx\n",
dent->dpa_range.start);
diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c
index 2c9a9af3dde3a294cde628880066b514b870029f..a4b5cb61b4e6f9b17e3e3e0cce356b0ac9f960d0 100644
--- a/drivers/cxl/core/mbox.c
+++ b/drivers/cxl/core/mbox.c
@@ -1649,6 +1649,8 @@ struct cxl_memdev_state *cxl_memdev_state_create(struct device *dev)
mds->cxlds.type = CXL_DEVTYPE_CLASSMEM;
mds->ram_perf.qos_class = CXL_QOS_CLASS_INVALID;
mds->pmem_perf.qos_class = CXL_QOS_CLASS_INVALID;
+ for (int i = 0; i < CXL_MAX_DC_REGION; i++)
+ mds->dc_perf[i].qos_class = CXL_QOS_CLASS_INVALID;
return mds;
}
diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h
index 05a0718aea73b3b2a02c608bae198eac7c462523..bbdf52ac1d5cb5df82812c13ff50ca7cacfd0db6 100644
--- a/drivers/cxl/cxlmem.h
+++ b/drivers/cxl/cxlmem.h
@@ -466,6 +466,8 @@ struct cxl_dc_region_info {
u64 blk_size;
u32 dsmad_handle;
u8 flags;
+ bool shareable;
+ bool read_only;
u8 name[CXL_DC_REGION_STRLEN];
};
@@ -533,6 +535,7 @@ struct cxl_memdev_state {
u8 nr_dc_region;
struct cxl_dc_region_info dc_region[CXL_MAX_DC_REGION];
+ struct cxl_dpa_perf dc_perf[CXL_MAX_DC_REGION];
struct cxl_event_state event;
struct cxl_poison_state poison;
--
2.47.0
next prev parent reply other threads:[~2024-11-05 18:39 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-05 18:38 [PATCH v6 00/27] DCD: Add support for Dynamic Capacity Devices (DCD) Ira Weiny
2024-11-05 18:38 ` [PATCH v6 01/27] range: Add range_overlaps() Ira Weiny
2024-11-05 18:38 ` [PATCH v6 02/27] ACPI/CDAT: Add CDAT/DSMAS shared and read only flag values Ira Weiny
2024-11-05 20:04 ` Rafael J. Wysocki
2024-11-05 18:38 ` [PATCH v6 03/27] dax: Document struct dev_dax_range Ira Weiny
2024-11-05 18:38 ` [PATCH v6 04/27] cxl/pci: Delay event buffer allocation Ira Weiny
2024-11-05 18:38 ` [PATCH v6 05/27] cxl/hdm: Use guard() in cxl_dpa_set_mode() Ira Weiny
2024-11-07 11:08 ` Jonathan Cameron
2024-11-07 19:46 ` Ira Weiny
2024-11-05 18:38 ` [PATCH v6 06/27] cxl/region: Refactor common create region code Ira Weiny
2024-11-05 18:38 ` [PATCH v6 07/27] cxl/mbox: Flag support for Dynamic Capacity Devices (DCD) ira.weiny
2024-11-05 18:38 ` [PATCH v6 08/27] cxl/mem: Read dynamic capacity configuration from the device ira.weiny
2024-11-05 18:38 ` [PATCH v6 09/27] cxl/core: Separate region mode from decoder mode ira.weiny
2024-11-05 18:38 ` [PATCH v6 10/27] cxl/region: Add dynamic capacity decoder and region modes ira.weiny
2024-11-05 18:38 ` [PATCH v6 11/27] cxl/hdm: Add dynamic capacity size support to endpoint decoders ira.weiny
2024-11-05 18:38 ` Ira Weiny [this message]
2024-11-05 18:38 ` [PATCH v6 13/27] cxl/mem: Expose DCD partition capabilities in sysfs ira.weiny
2024-11-05 18:38 ` [PATCH v6 14/27] cxl/port: Add endpoint decoder DC mode support to sysfs ira.weiny
2024-11-05 18:38 ` [PATCH v6 15/27] cxl/region: Add sparse DAX region support ira.weiny
2024-11-05 18:38 ` [PATCH v6 16/27] cxl/events: Split event msgnum configuration from irq setup Ira Weiny
2024-11-05 18:38 ` [PATCH v6 17/27] cxl/pci: Factor out interrupt policy check Ira Weiny
2024-11-05 18:38 ` [PATCH v6 18/27] cxl/mem: Configure dynamic capacity interrupts ira.weiny
2024-11-05 18:38 ` [PATCH v6 19/27] cxl/core: Return endpoint decoder information from region search Ira Weiny
2024-11-05 18:38 ` [PATCH v6 20/27] cxl/extent: Process DCD events and realize region extents ira.weiny
2024-11-06 15:13 ` Li, Ming4
2024-11-07 11:29 ` Jonathan Cameron
2024-11-05 18:38 ` [PATCH v6 21/27] cxl/region/extent: Expose region extent information in sysfs ira.weiny
2024-11-05 18:38 ` [PATCH v6 22/27] dax/bus: Factor out dev dax resize logic Ira Weiny
2024-11-05 18:38 ` [PATCH v6 23/27] dax/region: Create resources on sparse DAX regions ira.weiny
2024-11-07 11:32 ` Jonathan Cameron
2024-11-05 18:38 ` [PATCH v6 24/27] cxl/region: Read existing extents on region creation ira.weiny
2024-11-05 18:38 ` [PATCH v6 25/27] cxl/mem: Trace Dynamic capacity Event Record ira.weiny
2024-11-05 18:38 ` [PATCH v6 26/27] tools/testing/cxl: Make event logs dynamic Ira Weiny
2024-11-05 18:38 ` [PATCH v6 27/27] tools/testing/cxl: Add DC Regions to mock mem data Ira Weiny
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=20241105-dcd-type2-upstream-v6-12-85c7fa2140fe@intel.com \
--to=ira.weiny@intel.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=akpm@linux-foundation.org \
--cc=alison.schofield@intel.com \
--cc=corbet@lwn.net \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=fan.ni@samsung.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=navneet.singh@intel.com \
--cc=nvdimm@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