dev->parent = &cxlmd->dev;
        dev->bus = &cxl_bus_type;
        dev->type = &cxl_nvdimm_type;
+       /*
+        * A "%llx" string is 17-bytes vs dimm_id that is max
+        * NVDIMM_KEY_DESC_LEN
+        */
+       BUILD_BUG_ON(sizeof(cxl_nvd->dev_id) < 17 ||
+                    sizeof(cxl_nvd->dev_id) > NVDIMM_KEY_DESC_LEN);
+       sprintf(cxl_nvd->dev_id, "%llx", cxlmd->cxlds->serial);
 
        return cxl_nvd;
 }
 
        enum cxl_nvdimm_brige_state state;
 };
 
+#define CXL_DEV_ID_LEN 19
+
 struct cxl_nvdimm {
        struct device dev;
        struct cxl_memdev *cxlmd;
        struct cxl_nvdimm_bridge *bridge;
        struct xarray pmem_regions;
+       u8 dev_id[CXL_DEV_ID_LEN]; /* for nvdimm, string of 'serial' */
 };
 
 struct cxl_pmem_region_mapping {
 
        set_bit(ND_CMD_SET_CONFIG_DATA, &cmd_mask);
        nvdimm = __nvdimm_create(cxl_nvb->nvdimm_bus, cxl_nvd,
                                 cxl_dimm_attribute_groups, flags,
-                                cmd_mask, 0, NULL, NULL, cxl_security_ops, NULL);
+                                cmd_mask, 0, NULL, cxl_nvd->dev_id,
+                                cxl_security_ops, NULL);
        if (!nvdimm) {
                rc = -ENOMEM;
                goto out;