On Thu, 01 Dec 2022 13:33:26 -0800
Dan Williams <[email protected]> wrote:

> The 'struct cxl_nvdimm_bridge' object advertises platform CXL PMEM
> resources. It coordinates with libnvdimm to attach nvdimm devices and
> regions for each corresponding CXL object. That coordination is
> complicated, i.e. difficult to reason about, and it turns out redundant.
> It is already the case that the CXL core knows how to tear down a
> cxl_region when a cxl_memdev goes through ->remove(), so that pathway
> can be extended to directly cleanup cxl_nvdimm and cxl_pmem_region
> objects.
> 
> Towards the goal of ripping out the cxl_nvdimm_bridge state machine,
> arrange for cxl_acpi to optionally pre-load the cxl_pmem driver so that
> the nvdimm bridge is active synchronously with
> devm_cxl_add_nvdimm_bridge(), and remove all the bind attributes for the
> cxl_nvdimm* objects since the cxl root device and cxl_memdev bind
> attributes are sufficient.
> 
> Tested-by: Robert Richter <[email protected]>
> Signed-off-by: Dan Williams <[email protected]>

Seems reasonable and I can't see a disadvantage in doing this...
Reviewed-by: Jonathan Cameron <[email protected]>


> ---
>  drivers/cxl/acpi.c |    1 +
>  drivers/cxl/pmem.c |    9 +++++++++
>  2 files changed, 10 insertions(+)
> 
> diff --git a/drivers/cxl/acpi.c b/drivers/cxl/acpi.c
> index fb9f72813067..c540da0cbf1e 100644
> --- a/drivers/cxl/acpi.c
> +++ b/drivers/cxl/acpi.c
> @@ -539,3 +539,4 @@ module_platform_driver(cxl_acpi_driver);
>  MODULE_LICENSE("GPL v2");
>  MODULE_IMPORT_NS(CXL);
>  MODULE_IMPORT_NS(ACPI);
> +MODULE_SOFTDEP("pre: cxl_pmem");
> diff --git a/drivers/cxl/pmem.c b/drivers/cxl/pmem.c
> index 4c627d67281a..946e171e7d4a 100644
> --- a/drivers/cxl/pmem.c
> +++ b/drivers/cxl/pmem.c
> @@ -99,6 +99,9 @@ static struct cxl_driver cxl_nvdimm_driver = {
>       .name = "cxl_nvdimm",
>       .probe = cxl_nvdimm_probe,
>       .id = CXL_DEVICE_NVDIMM,
> +     .drv = {
> +             .suppress_bind_attrs = true,
> +     },
>  };
>  
>  static int cxl_pmem_get_config_size(struct cxl_dev_state *cxlds,
> @@ -360,6 +363,9 @@ static struct cxl_driver cxl_nvdimm_bridge_driver = {
>       .probe = cxl_nvdimm_bridge_probe,
>       .remove = cxl_nvdimm_bridge_remove,
>       .id = CXL_DEVICE_NVDIMM_BRIDGE,
> +     .drv = {
> +             .suppress_bind_attrs = true,
> +     },
>  };
>  
>  static int match_cxl_nvdimm(struct device *dev, void *data)
> @@ -583,6 +589,9 @@ static struct cxl_driver cxl_pmem_region_driver = {
>       .name = "cxl_pmem_region",
>       .probe = cxl_pmem_region_probe,
>       .id = CXL_DEVICE_PMEM_REGION,
> +     .drv = {
> +             .suppress_bind_attrs = true,
> +     },
>  };
>  
>  /*
> 


Reply via email to