mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 04:04:43 +01:00
cxl/region: Factor out code into cxl_region_setup_poison()
Poison injection setup code is embedded in cxl_region_probe(). For improved encapsulation, readability, and maintainability, factor out code into function cxl_region_setup_poison(). This patch is a prerequisite to disable poison by region offset for Normalized Addressing. No functional changes. Reviewed-by: Dave Jiang <dave.jiang@intel.com> Reviewed-by: Alison Schofield <alison.schofield@intel.com> Signed-off-by: Robert Richter <rrichter@amd.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Link: https://patch.msgid.link/20260114164837.1076338-13-rrichter@amd.com Signed-off-by: Dave Jiang <dave.jiang@intel.com>
This commit is contained in:
parent
a2e7948950
commit
d1c9ba46d6
1 changed files with 28 additions and 25 deletions
|
|
@ -3916,6 +3916,31 @@ static int cxl_region_debugfs_poison_clear(void *data, u64 offset)
|
|||
DEFINE_DEBUGFS_ATTRIBUTE(cxl_poison_clear_fops, NULL,
|
||||
cxl_region_debugfs_poison_clear, "%llx\n");
|
||||
|
||||
static int cxl_region_setup_poison(struct cxl_region *cxlr)
|
||||
{
|
||||
struct device *dev = &cxlr->dev;
|
||||
struct cxl_region_params *p = &cxlr->params;
|
||||
struct dentry *dentry;
|
||||
|
||||
/* Create poison attributes if all memdevs support the capabilities */
|
||||
for (int i = 0; i < p->nr_targets; i++) {
|
||||
struct cxl_endpoint_decoder *cxled = p->targets[i];
|
||||
struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
|
||||
|
||||
if (!cxl_memdev_has_poison_cmd(cxlmd, CXL_POISON_ENABLED_INJECT) ||
|
||||
!cxl_memdev_has_poison_cmd(cxlmd, CXL_POISON_ENABLED_CLEAR))
|
||||
return 0;
|
||||
}
|
||||
|
||||
dentry = cxl_debugfs_create_dir(dev_name(dev));
|
||||
debugfs_create_file("inject_poison", 0200, dentry, cxlr,
|
||||
&cxl_poison_inject_fops);
|
||||
debugfs_create_file("clear_poison", 0200, dentry, cxlr,
|
||||
&cxl_poison_clear_fops);
|
||||
|
||||
return devm_add_action_or_reset(dev, remove_debugfs, dentry);
|
||||
}
|
||||
|
||||
static int cxl_region_can_probe(struct cxl_region *cxlr)
|
||||
{
|
||||
struct cxl_region_params *p = &cxlr->params;
|
||||
|
|
@ -3945,7 +3970,6 @@ static int cxl_region_probe(struct device *dev)
|
|||
{
|
||||
struct cxl_region *cxlr = to_cxl_region(dev);
|
||||
struct cxl_region_params *p = &cxlr->params;
|
||||
bool poison_supported = true;
|
||||
int rc;
|
||||
|
||||
rc = cxl_region_can_probe(cxlr);
|
||||
|
|
@ -3969,30 +3993,9 @@ static int cxl_region_probe(struct device *dev)
|
|||
if (rc)
|
||||
return rc;
|
||||
|
||||
/* Create poison attributes if all memdevs support the capabilities */
|
||||
for (int i = 0; i < p->nr_targets; i++) {
|
||||
struct cxl_endpoint_decoder *cxled = p->targets[i];
|
||||
struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
|
||||
|
||||
if (!cxl_memdev_has_poison_cmd(cxlmd, CXL_POISON_ENABLED_INJECT) ||
|
||||
!cxl_memdev_has_poison_cmd(cxlmd, CXL_POISON_ENABLED_CLEAR)) {
|
||||
poison_supported = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (poison_supported) {
|
||||
struct dentry *dentry;
|
||||
|
||||
dentry = cxl_debugfs_create_dir(dev_name(dev));
|
||||
debugfs_create_file("inject_poison", 0200, dentry, cxlr,
|
||||
&cxl_poison_inject_fops);
|
||||
debugfs_create_file("clear_poison", 0200, dentry, cxlr,
|
||||
&cxl_poison_clear_fops);
|
||||
rc = devm_add_action_or_reset(dev, remove_debugfs, dentry);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
rc = cxl_region_setup_poison(cxlr);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
switch (cxlr->mode) {
|
||||
case CXL_PARTMODE_PMEM:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue