On Sun, Apr 13, 2025 at 05:52:10PM -0500, Ira Weiny wrote: > Devices which optionally support Dynamic Capacity (DC) are configured > via mailbox commands. CXL 3.2 section 9.13.3 requires the host to issue > the Get DC Configuration command in order to properly configure DCDs. > Without the Get DC Configuration command DCD can't be supported. > > Implement the DC mailbox commands as specified in CXL 3.2 section > 8.2.10.9.9 (opcodes 48XXh) to read and store the DCD configuration > information. Disable DCD if an invalid configuration is found. > > Linux has no support for more than one dynamic capacity partition. Read > and validate all the partitions but configure only the first partition > as 'dynamic ram A'. Additional partitions can be added in the future if > such a device ever materializes. Additionally is it anticipated that no > skips will be present from the end of the pmem partition. Check for an > disallow this configuration as well. > > Linux has no use for the trailing fields of the Get Dynamic Capacity > Configuration Output Payload (Total number of supported extents, number > of available extents, total number of supported tags, and number of > available tags). Avoid defining those fields to use the more useful > dynamic C array. > > Based on an original patch by Navneet Singh. > > Signed-off-by: Ira Weiny <ira.we...@intel.com> > > --- > Changes: > [iweiny: rebase] > [iweiny: Update spec references to 3.2] > [djbw: Limit to 1 partition] > [djbw: Avoid inter-partition skipping] > [djbw: s/region/partition/] > [djbw: remove cxl_dc_region[partition]_info->name] > [iweiny: adjust to lack of dcd_cmds in mds] > [iweiny: remove extra 'region' from names] > [iweiny: remove unused CXL_DYNAMIC_CAPACITY_SANITIZE_ON_RELEASE_FLAG] > --- > drivers/cxl/core/hdm.c | 2 + > drivers/cxl/core/mbox.c | 179 > ++++++++++++++++++++++++++++++++++++++++++++++++ > drivers/cxl/cxl.h | 1 + > drivers/cxl/cxlmem.h | 54 ++++++++++++++- > drivers/cxl/pci.c | 3 + > 5 files changed, 238 insertions(+), 1 deletion(-) ... > /* Set Timestamp CXL 3.0 Spec 8.2.9.4.2 */ > struct cxl_mbox_set_timestamp_in { > __le64 timestamp; > @@ -845,9 +871,24 @@ enum { > int cxl_internal_send_cmd(struct cxl_mailbox *cxl_mbox, > struct cxl_mbox_cmd *cmd); > int cxl_dev_state_identify(struct cxl_memdev_state *mds); > + > +struct cxl_mem_dev_info { > + u64 total_bytes; > + u64 volatile_bytes; > + u64 persistent_bytes; > +};
Defined, but never used. Fan > + > +struct cxl_dc_partition_info { > + size_t start; > + size_t size; > +}; > + > +int cxl_dev_dc_identify(struct cxl_mailbox *mbox, > + struct cxl_dc_partition_info *dc_info); > int cxl_await_media_ready(struct cxl_dev_state *cxlds); > int cxl_enumerate_cmds(struct cxl_memdev_state *mds); > int cxl_mem_dpa_fetch(struct cxl_memdev_state *mds, struct cxl_dpa_info > *info); > +void cxl_configure_dcd(struct cxl_memdev_state *mds, struct cxl_dpa_info > *info); > struct cxl_memdev_state *cxl_memdev_state_create(struct device *dev); > void set_exclusive_cxl_commands(struct cxl_memdev_state *mds, > unsigned long *cmds); > @@ -860,6 +901,17 @@ void cxl_event_trace_record(const struct cxl_memdev > *cxlmd, > const uuid_t *uuid, union cxl_event *evt); > int cxl_get_dirty_count(struct cxl_memdev_state *mds, u32 *count); > int cxl_arm_dirty_shutdown(struct cxl_memdev_state *mds); > + > +static inline bool cxl_dcd_supported(struct cxl_memdev_state *mds) > +{ > + return mds->dcd_supported; > +} > + > +static inline void cxl_disable_dcd(struct cxl_memdev_state *mds) > +{ > + mds->dcd_supported = false; > +} > + > int cxl_set_timestamp(struct cxl_memdev_state *mds); > int cxl_poison_state_init(struct cxl_memdev_state *mds); > int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len, > diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c > index 7b14a154463c..bc40cf6e2fe9 100644 > --- a/drivers/cxl/pci.c > +++ b/drivers/cxl/pci.c > @@ -998,6 +998,9 @@ static int cxl_pci_probe(struct pci_dev *pdev, const > struct pci_device_id *id) > if (rc) > return rc; > > + if (cxl_dcd_supported(mds)) > + cxl_configure_dcd(mds, &range_info); > + > rc = cxl_dpa_setup(cxlds, &range_info); > if (rc) > return rc; > > -- > 2.49.0 > -- Fan Ni