Loading Documentation/ABI/testing/sysfs-bus-cxl +15 −0 Original line number Diff line number Diff line Loading @@ -178,6 +178,21 @@ Description: hardware decoder target list. What: /sys/bus/cxl/devices/portX/decoders_committed Date: October, 2023 KernelVersion: v6.7 Contact: linux-cxl@vger.kernel.org Description: (RO) A memory device is considered active when any of its decoders are in the "committed" state (See CXL 3.0 8.2.4.19.7 CXL HDM Decoder n Control Register). Hotplug and destructive operations like "sanitize" are blocked while device is actively decoding a Host Physical Address range. Note that this number may be elevated without any regionX objects active or even enumerated, as this may be due to decoders established by platform firwmare or a previous kernel (kexec). What: /sys/bus/cxl/devices/decoderX.Y Date: June, 2021 KernelVersion: v5.14 Loading drivers/cxl/core/hdm.c +4 −3 Original line number Diff line number Diff line Loading @@ -633,10 +633,11 @@ static int cxl_decoder_commit(struct cxl_decoder *cxld) if (cxld->flags & CXL_DECODER_F_ENABLE) return 0; if (port->commit_end + 1 != id) { if (cxl_num_decoders_committed(port) != id) { dev_dbg(&port->dev, "%s: out of order commit, expected decoder%d.%d\n", dev_name(&cxld->dev), port->id, port->commit_end + 1); dev_name(&cxld->dev), port->id, cxl_num_decoders_committed(port)); return -EBUSY; } Loading Loading @@ -853,7 +854,7 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld, cxld->target_type = CXL_DECODER_HOSTONLYMEM; else cxld->target_type = CXL_DECODER_DEVMEM; if (cxld->id != port->commit_end + 1) { if (cxld->id != cxl_num_decoders_committed(port)) { dev_warn(&port->dev, "decoder%d.%d: Committed out of order\n", port->id, cxld->id); Loading drivers/cxl/core/mbox.c +1 −1 Original line number Diff line number Diff line Loading @@ -1200,7 +1200,7 @@ int cxl_mem_sanitize(struct cxl_memdev *cxlmd, u16 cmd) * Require an endpoint to be safe otherwise the driver can not * be sure that the device is unmapped. */ if (endpoint && endpoint->commit_end == -1) if (endpoint && cxl_num_decoders_committed(endpoint) == 0) rc = __cxl_mem_sanitize(mds, cmd); else rc = -EBUSY; Loading drivers/cxl/core/memdev.c +2 −2 Original line number Diff line number Diff line Loading @@ -231,7 +231,7 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd) if (rc) return rc; if (port->commit_end == -1) { if (cxl_num_decoders_committed(port) == 0) { /* No regions mapped to this memdev */ rc = cxl_get_poison_by_memdev(cxlmd); } else { Loading Loading @@ -282,7 +282,7 @@ static struct cxl_region *cxl_dpa_to_region(struct cxl_memdev *cxlmd, u64 dpa) .dpa = dpa, }; port = cxlmd->endpoint; if (port && is_cxl_endpoint(port) && port->commit_end != -1) if (port && is_cxl_endpoint(port) && cxl_num_decoders_committed(port)) device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region); return ctx.cxlr; Loading drivers/cxl/core/port.c +32 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,13 @@ DECLARE_RWSEM(cxl_region_rwsem); static DEFINE_IDA(cxl_port_ida); static DEFINE_XARRAY(cxl_root_buses); int cxl_num_decoders_committed(struct cxl_port *port) { lockdep_assert_held(&cxl_region_rwsem); return port->commit_end + 1; } static ssize_t devtype_show(struct device *dev, struct device_attribute *attr, char *buf) { Loading Loading @@ -537,8 +544,33 @@ static void cxl_port_release(struct device *dev) kfree(port); } static ssize_t decoders_committed_show(struct device *dev, struct device_attribute *attr, char *buf) { struct cxl_port *port = to_cxl_port(dev); int rc; down_read(&cxl_region_rwsem); rc = sysfs_emit(buf, "%d\n", cxl_num_decoders_committed(port)); up_read(&cxl_region_rwsem); return rc; } static DEVICE_ATTR_RO(decoders_committed); static struct attribute *cxl_port_attrs[] = { &dev_attr_decoders_committed.attr, NULL, }; static struct attribute_group cxl_port_attribute_group = { .attrs = cxl_port_attrs, }; static const struct attribute_group *cxl_port_attribute_groups[] = { &cxl_base_attribute_group, &cxl_port_attribute_group, NULL, }; Loading Loading
Documentation/ABI/testing/sysfs-bus-cxl +15 −0 Original line number Diff line number Diff line Loading @@ -178,6 +178,21 @@ Description: hardware decoder target list. What: /sys/bus/cxl/devices/portX/decoders_committed Date: October, 2023 KernelVersion: v6.7 Contact: linux-cxl@vger.kernel.org Description: (RO) A memory device is considered active when any of its decoders are in the "committed" state (See CXL 3.0 8.2.4.19.7 CXL HDM Decoder n Control Register). Hotplug and destructive operations like "sanitize" are blocked while device is actively decoding a Host Physical Address range. Note that this number may be elevated without any regionX objects active or even enumerated, as this may be due to decoders established by platform firwmare or a previous kernel (kexec). What: /sys/bus/cxl/devices/decoderX.Y Date: June, 2021 KernelVersion: v5.14 Loading
drivers/cxl/core/hdm.c +4 −3 Original line number Diff line number Diff line Loading @@ -633,10 +633,11 @@ static int cxl_decoder_commit(struct cxl_decoder *cxld) if (cxld->flags & CXL_DECODER_F_ENABLE) return 0; if (port->commit_end + 1 != id) { if (cxl_num_decoders_committed(port) != id) { dev_dbg(&port->dev, "%s: out of order commit, expected decoder%d.%d\n", dev_name(&cxld->dev), port->id, port->commit_end + 1); dev_name(&cxld->dev), port->id, cxl_num_decoders_committed(port)); return -EBUSY; } Loading Loading @@ -853,7 +854,7 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld, cxld->target_type = CXL_DECODER_HOSTONLYMEM; else cxld->target_type = CXL_DECODER_DEVMEM; if (cxld->id != port->commit_end + 1) { if (cxld->id != cxl_num_decoders_committed(port)) { dev_warn(&port->dev, "decoder%d.%d: Committed out of order\n", port->id, cxld->id); Loading
drivers/cxl/core/mbox.c +1 −1 Original line number Diff line number Diff line Loading @@ -1200,7 +1200,7 @@ int cxl_mem_sanitize(struct cxl_memdev *cxlmd, u16 cmd) * Require an endpoint to be safe otherwise the driver can not * be sure that the device is unmapped. */ if (endpoint && endpoint->commit_end == -1) if (endpoint && cxl_num_decoders_committed(endpoint) == 0) rc = __cxl_mem_sanitize(mds, cmd); else rc = -EBUSY; Loading
drivers/cxl/core/memdev.c +2 −2 Original line number Diff line number Diff line Loading @@ -231,7 +231,7 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd) if (rc) return rc; if (port->commit_end == -1) { if (cxl_num_decoders_committed(port) == 0) { /* No regions mapped to this memdev */ rc = cxl_get_poison_by_memdev(cxlmd); } else { Loading Loading @@ -282,7 +282,7 @@ static struct cxl_region *cxl_dpa_to_region(struct cxl_memdev *cxlmd, u64 dpa) .dpa = dpa, }; port = cxlmd->endpoint; if (port && is_cxl_endpoint(port) && port->commit_end != -1) if (port && is_cxl_endpoint(port) && cxl_num_decoders_committed(port)) device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region); return ctx.cxlr; Loading
drivers/cxl/core/port.c +32 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,13 @@ DECLARE_RWSEM(cxl_region_rwsem); static DEFINE_IDA(cxl_port_ida); static DEFINE_XARRAY(cxl_root_buses); int cxl_num_decoders_committed(struct cxl_port *port) { lockdep_assert_held(&cxl_region_rwsem); return port->commit_end + 1; } static ssize_t devtype_show(struct device *dev, struct device_attribute *attr, char *buf) { Loading Loading @@ -537,8 +544,33 @@ static void cxl_port_release(struct device *dev) kfree(port); } static ssize_t decoders_committed_show(struct device *dev, struct device_attribute *attr, char *buf) { struct cxl_port *port = to_cxl_port(dev); int rc; down_read(&cxl_region_rwsem); rc = sysfs_emit(buf, "%d\n", cxl_num_decoders_committed(port)); up_read(&cxl_region_rwsem); return rc; } static DEVICE_ATTR_RO(decoders_committed); static struct attribute *cxl_port_attrs[] = { &dev_attr_decoders_committed.attr, NULL, }; static struct attribute_group cxl_port_attribute_group = { .attrs = cxl_port_attrs, }; static const struct attribute_group *cxl_port_attribute_groups[] = { &cxl_base_attribute_group, &cxl_port_attribute_group, NULL, }; Loading