Message ID | 20240715172835.24757-8-alejandro.lucero-palau@amd.com |
---|---|
State | Superseded |
Headers | show |
Series | cxl: add Type2 device support | expand |
On Mon, Jul 15, 2024 at 06:28:27PM +0100, alejandro.lucero-palau@amd.com wrote: > From: Alejandro Lucero <alucerop@amd.com> > > Add memdev creation from sfc driver. > > Current cxl core is relying on a CXL_DEVTYPE_CLASSMEM type device when > creating a memdev leading to problems when obtaining cxl_memdev_state > references from a CXL_DEVTYPE_DEVMEM type. This last device type is > managed by a specific vendor driver and does not need same sysfs files > since not userspace intervention is expected. This patch checks for the > right device type in those functions using cxl_memdev_state. > > Signed-off-by: Alejandro Lucero <alucerop@amd.com> > --- > drivers/cxl/core/cdat.c | 3 +++ > drivers/cxl/core/memdev.c | 9 +++++++++ > drivers/cxl/mem.c | 17 +++++++++++------ > drivers/net/ethernet/sfc/efx_cxl.c | 10 ++++++++-- > include/linux/cxl_accel_mem.h | 3 +++ > 5 files changed, 34 insertions(+), 8 deletions(-) > > diff --git a/drivers/cxl/core/cdat.c b/drivers/cxl/core/cdat.c > index bb83867d9fec..0d4679c137d4 100644 > --- a/drivers/cxl/core/cdat.c > +++ b/drivers/cxl/core/cdat.c > @@ -558,6 +558,9 @@ void cxl_region_perf_data_calculate(struct cxl_region *cxlr, > }; > struct cxl_dpa_perf *perf; > > + if (!mds) > + return; > + > switch (cxlr->mode) { > case CXL_DECODER_RAM: > perf = &mds->ram_perf; > diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c > index 58a51e7fd37f..b902948b121f 100644 > --- a/drivers/cxl/core/memdev.c > +++ b/drivers/cxl/core/memdev.c > @@ -468,6 +468,9 @@ static umode_t cxl_ram_visible(struct kobject *kobj, struct attribute *a, int n) > struct cxl_memdev *cxlmd = to_cxl_memdev(dev); > struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); > > + if (!mds) > + return 0; > + > if (a == &dev_attr_ram_qos_class.attr) > if (mds->ram_perf.qos_class == CXL_QOS_CLASS_INVALID) > return 0; > @@ -487,6 +490,9 @@ static umode_t cxl_pmem_visible(struct kobject *kobj, struct attribute *a, int n > struct cxl_memdev *cxlmd = to_cxl_memdev(dev); > struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); > > + if (!mds) > + return 0; > + > if (a == &dev_attr_pmem_qos_class.attr) > if (mds->pmem_perf.qos_class == CXL_QOS_CLASS_INVALID) > return 0; > @@ -507,6 +513,9 @@ static umode_t cxl_memdev_security_visible(struct kobject *kobj, > struct cxl_memdev *cxlmd = to_cxl_memdev(dev); > struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); > > + if (!mds) > + return 0; > + > if (a == &dev_attr_security_sanitize.attr && > !test_bit(CXL_SEC_ENABLED_SANITIZE, mds->security.enabled_cmds)) > return 0; > diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c > index 2f1b49bfe162..f76af75a87b7 100644 > --- a/drivers/cxl/mem.c > +++ b/drivers/cxl/mem.c > @@ -131,12 +131,14 @@ static int cxl_mem_probe(struct device *dev) > dentry = cxl_debugfs_create_dir(dev_name(dev)); > debugfs_create_devm_seqfile(dev, "dpamem", dentry, cxl_mem_dpa_show); > > - if (test_bit(CXL_POISON_ENABLED_INJECT, mds->poison.enabled_cmds)) > - debugfs_create_file("inject_poison", 0200, dentry, cxlmd, > - &cxl_poison_inject_fops); > - if (test_bit(CXL_POISON_ENABLED_CLEAR, mds->poison.enabled_cmds)) > - debugfs_create_file("clear_poison", 0200, dentry, cxlmd, > - &cxl_poison_clear_fops); > + if (mds) { > + if (test_bit(CXL_POISON_ENABLED_INJECT, mds->poison.enabled_cmds)) > + debugfs_create_file("inject_poison", 0200, dentry, cxlmd, > + &cxl_poison_inject_fops); > + if (test_bit(CXL_POISON_ENABLED_CLEAR, mds->poison.enabled_cmds)) > + debugfs_create_file("clear_poison", 0200, dentry, cxlmd, > + &cxl_poison_clear_fops); > + } > > rc = devm_add_action_or_reset(dev, remove_debugfs, dentry); > if (rc) > @@ -222,6 +224,9 @@ static umode_t cxl_mem_visible(struct kobject *kobj, struct attribute *a, int n) > struct cxl_memdev *cxlmd = to_cxl_memdev(dev); > struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); > > + if (!mds) > + return 0; > + > if (a == &dev_attr_trigger_poison_list.attr) > if (!test_bit(CXL_POISON_ENABLED_LIST, > mds->poison.enabled_cmds)) > diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c > index a84fe7992c53..0abe66490ef5 100644 > --- a/drivers/net/ethernet/sfc/efx_cxl.c > +++ b/drivers/net/ethernet/sfc/efx_cxl.c > @@ -57,10 +57,16 @@ void efx_cxl_init(struct efx_nic *efx) > if (cxl_accel_request_resource(cxl->cxlds, true)) > pci_info(pci_dev, "CXL accel resource request failed"); > > - if (!cxl_await_media_ready(cxl->cxlds)) > + if (!cxl_await_media_ready(cxl->cxlds)) { > cxl_accel_set_media_ready(cxl->cxlds); > - else > + } else { > pci_info(pci_dev, "CXL accel media not active"); pci_warning() ?? > + return; > + } > + > + cxl->cxlmd = devm_cxl_add_memdev(&pci_dev->dev, cxl->cxlds); > + if (IS_ERR(cxl->cxlmd)) > + pci_info(pci_dev, "CXL accel memdev creation failed"); pci_err() Fan > } > > > diff --git a/include/linux/cxl_accel_mem.h b/include/linux/cxl_accel_mem.h > index b883c438a132..442ed9862292 100644 > --- a/include/linux/cxl_accel_mem.h > +++ b/include/linux/cxl_accel_mem.h > @@ -26,4 +26,7 @@ int cxl_pci_accel_setup_regs(struct pci_dev *pdev, struct cxl_dev_state *cxlds); > int cxl_accel_request_resource(struct cxl_dev_state *cxlds, bool is_ram); > void cxl_accel_set_media_ready(struct cxl_dev_state *cxlds); > int cxl_await_media_ready(struct cxl_dev_state *cxlds); > + > +struct cxl_memdev *devm_cxl_add_memdev(struct device *host, > + struct cxl_dev_state *cxlds); > #endif > -- > 2.17.1 >
On Mon, 15 Jul 2024 18:28:27 +0100 alejandro.lucero-palau@amd.com wrote: > From: Alejandro Lucero <alucerop@amd.com> > > Add memdev creation from sfc driver. > > Current cxl core is relying on a CXL_DEVTYPE_CLASSMEM type device when > creating a memdev leading to problems when obtaining cxl_memdev_state > references from a CXL_DEVTYPE_DEVMEM type. This last device type is > managed by a specific vendor driver and does not need same sysfs files > since not userspace intervention is expected. This patch checks for the > right device type in those functions using cxl_memdev_state. > > Signed-off-by: Alejandro Lucero <alucerop@amd.com> Same general comment about treating failure to get things you expect as proper driver probe errors. Very unlikely we'd ever want to carry on if these fail. If we do want to, that should be a high level decision and the chances are the driver needs to know that the error occurred so it can take some mitigating measures (using some alternative mechanisms etc). > diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c > index a84fe7992c53..0abe66490ef5 100644 > --- a/drivers/net/ethernet/sfc/efx_cxl.c > +++ b/drivers/net/ethernet/sfc/efx_cxl.c > @@ -57,10 +57,16 @@ void efx_cxl_init(struct efx_nic *efx) > if (cxl_accel_request_resource(cxl->cxlds, true)) > pci_info(pci_dev, "CXL accel resource request failed"); > > - if (!cxl_await_media_ready(cxl->cxlds)) > + if (!cxl_await_media_ready(cxl->cxlds)) { > cxl_accel_set_media_ready(cxl->cxlds); > - else > + } else { > pci_info(pci_dev, "CXL accel media not active"); > + return; Once you are returning an error in this path you can just have return -ETIMEDOUT; or similar here adn avoid this code changing in this patch. > + } > + > + cxl->cxlmd = devm_cxl_add_memdev(&pci_dev->dev, cxl->cxlds); > + if (IS_ERR(cxl->cxlmd)) > + pci_info(pci_dev, "CXL accel memdev creation failed"); I'd treat this one as fatal as well. People argue in favor of muddling on to allow firmware upgrade etc. That is fine, but pass up the errors then decide to ignore them at the higher levels. > } > >
On 7/24/24 22:32, fan wrote: > On Mon, Jul 15, 2024 at 06:28:27PM +0100, alejandro.lucero-palau@amd.com wrote: >> From: Alejandro Lucero <alucerop@amd.com> >> >> Add memdev creation from sfc driver. >> >> Current cxl core is relying on a CXL_DEVTYPE_CLASSMEM type device when >> creating a memdev leading to problems when obtaining cxl_memdev_state >> references from a CXL_DEVTYPE_DEVMEM type. This last device type is >> managed by a specific vendor driver and does not need same sysfs files >> since not userspace intervention is expected. This patch checks for the >> right device type in those functions using cxl_memdev_state. >> >> Signed-off-by: Alejandro Lucero <alucerop@amd.com> >> --- >> drivers/cxl/core/cdat.c | 3 +++ >> drivers/cxl/core/memdev.c | 9 +++++++++ >> drivers/cxl/mem.c | 17 +++++++++++------ >> drivers/net/ethernet/sfc/efx_cxl.c | 10 ++++++++-- >> include/linux/cxl_accel_mem.h | 3 +++ >> 5 files changed, 34 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/cxl/core/cdat.c b/drivers/cxl/core/cdat.c >> index bb83867d9fec..0d4679c137d4 100644 >> --- a/drivers/cxl/core/cdat.c >> +++ b/drivers/cxl/core/cdat.c >> @@ -558,6 +558,9 @@ void cxl_region_perf_data_calculate(struct cxl_region *cxlr, >> }; >> struct cxl_dpa_perf *perf; >> >> + if (!mds) >> + return; >> + >> switch (cxlr->mode) { >> case CXL_DECODER_RAM: >> perf = &mds->ram_perf; >> diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c >> index 58a51e7fd37f..b902948b121f 100644 >> --- a/drivers/cxl/core/memdev.c >> +++ b/drivers/cxl/core/memdev.c >> @@ -468,6 +468,9 @@ static umode_t cxl_ram_visible(struct kobject *kobj, struct attribute *a, int n) >> struct cxl_memdev *cxlmd = to_cxl_memdev(dev); >> struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); >> >> + if (!mds) >> + return 0; >> + >> if (a == &dev_attr_ram_qos_class.attr) >> if (mds->ram_perf.qos_class == CXL_QOS_CLASS_INVALID) >> return 0; >> @@ -487,6 +490,9 @@ static umode_t cxl_pmem_visible(struct kobject *kobj, struct attribute *a, int n >> struct cxl_memdev *cxlmd = to_cxl_memdev(dev); >> struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); >> >> + if (!mds) >> + return 0; >> + >> if (a == &dev_attr_pmem_qos_class.attr) >> if (mds->pmem_perf.qos_class == CXL_QOS_CLASS_INVALID) >> return 0; >> @@ -507,6 +513,9 @@ static umode_t cxl_memdev_security_visible(struct kobject *kobj, >> struct cxl_memdev *cxlmd = to_cxl_memdev(dev); >> struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); >> >> + if (!mds) >> + return 0; >> + >> if (a == &dev_attr_security_sanitize.attr && >> !test_bit(CXL_SEC_ENABLED_SANITIZE, mds->security.enabled_cmds)) >> return 0; >> diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c >> index 2f1b49bfe162..f76af75a87b7 100644 >> --- a/drivers/cxl/mem.c >> +++ b/drivers/cxl/mem.c >> @@ -131,12 +131,14 @@ static int cxl_mem_probe(struct device *dev) >> dentry = cxl_debugfs_create_dir(dev_name(dev)); >> debugfs_create_devm_seqfile(dev, "dpamem", dentry, cxl_mem_dpa_show); >> >> - if (test_bit(CXL_POISON_ENABLED_INJECT, mds->poison.enabled_cmds)) >> - debugfs_create_file("inject_poison", 0200, dentry, cxlmd, >> - &cxl_poison_inject_fops); >> - if (test_bit(CXL_POISON_ENABLED_CLEAR, mds->poison.enabled_cmds)) >> - debugfs_create_file("clear_poison", 0200, dentry, cxlmd, >> - &cxl_poison_clear_fops); >> + if (mds) { >> + if (test_bit(CXL_POISON_ENABLED_INJECT, mds->poison.enabled_cmds)) >> + debugfs_create_file("inject_poison", 0200, dentry, cxlmd, >> + &cxl_poison_inject_fops); >> + if (test_bit(CXL_POISON_ENABLED_CLEAR, mds->poison.enabled_cmds)) >> + debugfs_create_file("clear_poison", 0200, dentry, cxlmd, >> + &cxl_poison_clear_fops); >> + } >> >> rc = devm_add_action_or_reset(dev, remove_debugfs, dentry); >> if (rc) >> @@ -222,6 +224,9 @@ static umode_t cxl_mem_visible(struct kobject *kobj, struct attribute *a, int n) >> struct cxl_memdev *cxlmd = to_cxl_memdev(dev); >> struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); >> >> + if (!mds) >> + return 0; >> + >> if (a == &dev_attr_trigger_poison_list.attr) >> if (!test_bit(CXL_POISON_ENABLED_LIST, >> mds->poison.enabled_cmds)) >> diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c >> index a84fe7992c53..0abe66490ef5 100644 >> --- a/drivers/net/ethernet/sfc/efx_cxl.c >> +++ b/drivers/net/ethernet/sfc/efx_cxl.c >> @@ -57,10 +57,16 @@ void efx_cxl_init(struct efx_nic *efx) >> if (cxl_accel_request_resource(cxl->cxlds, true)) >> pci_info(pci_dev, "CXL accel resource request failed"); >> >> - if (!cxl_await_media_ready(cxl->cxlds)) >> + if (!cxl_await_media_ready(cxl->cxlds)) { >> cxl_accel_set_media_ready(cxl->cxlds); >> - else >> + } else { >> pci_info(pci_dev, "CXL accel media not active"); > pci_warning() ?? The code will be modified and no error will be needed to be handled. >> + return; >> + } >> + >> + cxl->cxlmd = devm_cxl_add_memdev(&pci_dev->dev, cxl->cxlds); >> + if (IS_ERR(cxl->cxlmd)) >> + pci_info(pci_dev, "CXL accel memdev creation failed"); > pci_err() Yes. I'll fix it. Thanks > Fan >> } >> >> >> diff --git a/include/linux/cxl_accel_mem.h b/include/linux/cxl_accel_mem.h >> index b883c438a132..442ed9862292 100644 >> --- a/include/linux/cxl_accel_mem.h >> +++ b/include/linux/cxl_accel_mem.h >> @@ -26,4 +26,7 @@ int cxl_pci_accel_setup_regs(struct pci_dev *pdev, struct cxl_dev_state *cxlds); >> int cxl_accel_request_resource(struct cxl_dev_state *cxlds, bool is_ram); >> void cxl_accel_set_media_ready(struct cxl_dev_state *cxlds); >> int cxl_await_media_ready(struct cxl_dev_state *cxlds); >> + >> +struct cxl_memdev *devm_cxl_add_memdev(struct device *host, >> + struct cxl_dev_state *cxlds); >> #endif >> -- >> 2.17.1 >>
On 8/4/24 18:31, Jonathan Cameron wrote: > On Mon, 15 Jul 2024 18:28:27 +0100 > alejandro.lucero-palau@amd.com wrote: > >> From: Alejandro Lucero <alucerop@amd.com> >> >> Add memdev creation from sfc driver. >> >> Current cxl core is relying on a CXL_DEVTYPE_CLASSMEM type device when >> creating a memdev leading to problems when obtaining cxl_memdev_state >> references from a CXL_DEVTYPE_DEVMEM type. This last device type is >> managed by a specific vendor driver and does not need same sysfs files >> since not userspace intervention is expected. This patch checks for the >> right device type in those functions using cxl_memdev_state. >> >> Signed-off-by: Alejandro Lucero <alucerop@amd.com> > Same general comment about treating failure to get things you expect > as proper driver probe errors. Very unlikely we'd ever want to carry > on if these fail. If we do want to, that should be a high level decision > and the chances are the driver needs to know that the error occurred > so it can take some mitigating measures (using some alternative mechanisms > etc). OK Other comments below already addressed when replying to fan. Thanks! >> diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c >> index a84fe7992c53..0abe66490ef5 100644 >> --- a/drivers/net/ethernet/sfc/efx_cxl.c >> +++ b/drivers/net/ethernet/sfc/efx_cxl.c >> @@ -57,10 +57,16 @@ void efx_cxl_init(struct efx_nic *efx) >> if (cxl_accel_request_resource(cxl->cxlds, true)) >> pci_info(pci_dev, "CXL accel resource request failed"); >> >> - if (!cxl_await_media_ready(cxl->cxlds)) >> + if (!cxl_await_media_ready(cxl->cxlds)) { >> cxl_accel_set_media_ready(cxl->cxlds); >> - else >> + } else { >> pci_info(pci_dev, "CXL accel media not active"); >> + return; > Once you are returning an error in this path you can just have > return -ETIMEDOUT; or similar here adn avoid > this code changing in this patch. >> + } >> + >> + cxl->cxlmd = devm_cxl_add_memdev(&pci_dev->dev, cxl->cxlds); >> + if (IS_ERR(cxl->cxlmd)) >> + pci_info(pci_dev, "CXL accel memdev creation failed"); > I'd treat this one as fatal as well. > > People argue in favor of muddling on to allow firmware upgrade etc. > That is fine, but pass up the errors then decide to ignore them > at the higher levels. > >> } >> >> >
diff --git a/drivers/cxl/core/cdat.c b/drivers/cxl/core/cdat.c index bb83867d9fec..0d4679c137d4 100644 --- a/drivers/cxl/core/cdat.c +++ b/drivers/cxl/core/cdat.c @@ -558,6 +558,9 @@ void cxl_region_perf_data_calculate(struct cxl_region *cxlr, }; struct cxl_dpa_perf *perf; + if (!mds) + return; + switch (cxlr->mode) { case CXL_DECODER_RAM: perf = &mds->ram_perf; diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c index 58a51e7fd37f..b902948b121f 100644 --- a/drivers/cxl/core/memdev.c +++ b/drivers/cxl/core/memdev.c @@ -468,6 +468,9 @@ static umode_t cxl_ram_visible(struct kobject *kobj, struct attribute *a, int n) struct cxl_memdev *cxlmd = to_cxl_memdev(dev); struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); + if (!mds) + return 0; + if (a == &dev_attr_ram_qos_class.attr) if (mds->ram_perf.qos_class == CXL_QOS_CLASS_INVALID) return 0; @@ -487,6 +490,9 @@ static umode_t cxl_pmem_visible(struct kobject *kobj, struct attribute *a, int n struct cxl_memdev *cxlmd = to_cxl_memdev(dev); struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); + if (!mds) + return 0; + if (a == &dev_attr_pmem_qos_class.attr) if (mds->pmem_perf.qos_class == CXL_QOS_CLASS_INVALID) return 0; @@ -507,6 +513,9 @@ static umode_t cxl_memdev_security_visible(struct kobject *kobj, struct cxl_memdev *cxlmd = to_cxl_memdev(dev); struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); + if (!mds) + return 0; + if (a == &dev_attr_security_sanitize.attr && !test_bit(CXL_SEC_ENABLED_SANITIZE, mds->security.enabled_cmds)) return 0; diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c index 2f1b49bfe162..f76af75a87b7 100644 --- a/drivers/cxl/mem.c +++ b/drivers/cxl/mem.c @@ -131,12 +131,14 @@ static int cxl_mem_probe(struct device *dev) dentry = cxl_debugfs_create_dir(dev_name(dev)); debugfs_create_devm_seqfile(dev, "dpamem", dentry, cxl_mem_dpa_show); - if (test_bit(CXL_POISON_ENABLED_INJECT, mds->poison.enabled_cmds)) - debugfs_create_file("inject_poison", 0200, dentry, cxlmd, - &cxl_poison_inject_fops); - if (test_bit(CXL_POISON_ENABLED_CLEAR, mds->poison.enabled_cmds)) - debugfs_create_file("clear_poison", 0200, dentry, cxlmd, - &cxl_poison_clear_fops); + if (mds) { + if (test_bit(CXL_POISON_ENABLED_INJECT, mds->poison.enabled_cmds)) + debugfs_create_file("inject_poison", 0200, dentry, cxlmd, + &cxl_poison_inject_fops); + if (test_bit(CXL_POISON_ENABLED_CLEAR, mds->poison.enabled_cmds)) + debugfs_create_file("clear_poison", 0200, dentry, cxlmd, + &cxl_poison_clear_fops); + } rc = devm_add_action_or_reset(dev, remove_debugfs, dentry); if (rc) @@ -222,6 +224,9 @@ static umode_t cxl_mem_visible(struct kobject *kobj, struct attribute *a, int n) struct cxl_memdev *cxlmd = to_cxl_memdev(dev); struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); + if (!mds) + return 0; + if (a == &dev_attr_trigger_poison_list.attr) if (!test_bit(CXL_POISON_ENABLED_LIST, mds->poison.enabled_cmds)) diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c index a84fe7992c53..0abe66490ef5 100644 --- a/drivers/net/ethernet/sfc/efx_cxl.c +++ b/drivers/net/ethernet/sfc/efx_cxl.c @@ -57,10 +57,16 @@ void efx_cxl_init(struct efx_nic *efx) if (cxl_accel_request_resource(cxl->cxlds, true)) pci_info(pci_dev, "CXL accel resource request failed"); - if (!cxl_await_media_ready(cxl->cxlds)) + if (!cxl_await_media_ready(cxl->cxlds)) { cxl_accel_set_media_ready(cxl->cxlds); - else + } else { pci_info(pci_dev, "CXL accel media not active"); + return; + } + + cxl->cxlmd = devm_cxl_add_memdev(&pci_dev->dev, cxl->cxlds); + if (IS_ERR(cxl->cxlmd)) + pci_info(pci_dev, "CXL accel memdev creation failed"); } diff --git a/include/linux/cxl_accel_mem.h b/include/linux/cxl_accel_mem.h index b883c438a132..442ed9862292 100644 --- a/include/linux/cxl_accel_mem.h +++ b/include/linux/cxl_accel_mem.h @@ -26,4 +26,7 @@ int cxl_pci_accel_setup_regs(struct pci_dev *pdev, struct cxl_dev_state *cxlds); int cxl_accel_request_resource(struct cxl_dev_state *cxlds, bool is_ram); void cxl_accel_set_media_ready(struct cxl_dev_state *cxlds); int cxl_await_media_ready(struct cxl_dev_state *cxlds); + +struct cxl_memdev *devm_cxl_add_memdev(struct device *host, + struct cxl_dev_state *cxlds); #endif