Dave Jiang wrote:
> Add a CXL bus type, and detect whether a 'dimm' is backed by the CXL
> subsystem.
>
> Reviewed-by: Alison Schofield <[email protected]>
> Signed-off-by: Dave Jiang <[email protected]>
>
> ---
> v2:
> - Improve commit log. (Vishal)
> ---
> ndctl/lib/libndctl.c | 53
> ++++++++++++++++++++++++++++++++++++++++++++++++
> ndctl/lib/libndctl.sym | 1 +
> ndctl/lib/private.h | 1 +
> ndctl/libndctl.h | 1 +
> 4 files changed, 56 insertions(+)
>
> diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c
> index ad54f0626510..10422e24d38b 100644
> --- a/ndctl/lib/libndctl.c
> +++ b/ndctl/lib/libndctl.c
> @@ -12,6 +12,7 @@
> #include <ctype.h>
> #include <fcntl.h>
> #include <dirent.h>
> +#include <libgen.h>
This new include had me looking for why below...
> #include <sys/stat.h>
> #include <sys/types.h>
> #include <sys/ioctl.h>
> @@ -876,6 +877,48 @@ static enum ndctl_fwa_method fwa_method_to_method(const
> char *fwa_method)
> return NDCTL_FWA_METHOD_RESET;
> }
>
> +static int is_ndbus_cxl(const char *ctl_base)
> +{
> + char *path, *ppath, *subsys;
> + char tmp_path[PATH_MAX];
> + int rc;
> +
> + /* get the real path of ctl_base */
> + path = realpath(ctl_base, NULL);
> + if (!path)
> + return -errno;
> +
> + /* setup to get the nd bridge device backing the ctl */
> + sprintf(tmp_path, "%s/device", path);
> + free(path);
> +
> + path = realpath(tmp_path, NULL);
> + if (!path)
> + return -errno;
> +
> + /* get the parent dir of the ndbus, which should be the nvdimm-bridge */
> + ppath = dirname(path);
> +
> + /* setup to get the subsystem of the nvdimm-bridge */
> + sprintf(tmp_path, "%s/%s", ppath, "subsystem");
> + free(path);
> +
> + path = realpath(tmp_path, NULL);
> + if (!path)
> + return -errno;
> +
> + subsys = basename(path);
> +
> + /* check if subsystem is cxl */
> + if (!strcmp(subsys, "cxl"))
> + rc = 1;
> + else
> + rc = 0;
> +
> + free(path);
> + return rc;
> +}
> +
> static void *add_bus(void *parent, int id, const char *ctl_base)
> {
> char buf[SYSFS_ATTR_SIZE];
> @@ -919,6 +962,11 @@ static void *add_bus(void *parent, int id, const char
> *ctl_base)
> else
> bus->has_of_node = 1;
>
> + if (is_ndbus_cxl(ctl_base))
> + bus->has_cxl = 1;
> + else
> + bus->has_cxl = 0;
> +
I think you can drop is_ndbus_cxl() and just do this:
@@ -981,6 +976,11 @@ static void *add_bus(void *parent, int id, const char
*ctl_base)
if (!bus->provider)
goto err_read;
+ if (strcasestr("cxl", provider))
+ bus->has_cxl = 1;
+ else
+ bus->has_cxl = 0;
+
sprintf(path, "%s/device/wait_probe", ctl_base);
bus->wait_probe_path = strdup(path);
if (!bus->wait_probe_path)