NULL,
 };
 
+static inline int papr_scm_node(int node)
+{
+       int min_dist = INT_MAX, dist;
+       int nid, min_node;
+
+       if ((node == NUMA_NO_NODE) || node_online(node))
+               return node;
+
+       min_node = first_online_node;
+       for_each_online_node(nid) {
+               dist = node_distance(node, nid);
+               if (dist < min_dist) {
+                       min_dist = dist;
+                       min_node = nid;
+               }
+       }
+       return min_node;
+}
+
 static int papr_scm_nvdimm_init(struct papr_scm_priv *p)
 {
        struct device *dev = &p->pdev->dev;
        struct nd_mapping_desc mapping;
        struct nd_region_desc ndr_desc;
        unsigned long dimm_flags;
+       int target_nid, online_nid;
 
        p->bus_desc.ndctl = papr_scm_ndctl;
        p->bus_desc.module = THIS_MODULE;
 
        memset(&ndr_desc, 0, sizeof(ndr_desc));
        ndr_desc.attr_groups = region_attr_groups;
-       ndr_desc.numa_node = dev_to_node(&p->pdev->dev);
-       ndr_desc.target_node = ndr_desc.numa_node;
+       target_nid = dev_to_node(&p->pdev->dev);
+       online_nid = papr_scm_node(target_nid);
+       ndr_desc.numa_node = online_nid;
+       ndr_desc.target_node = target_nid;
        ndr_desc.res = &p->res;
        ndr_desc.of_node = p->dn;
        ndr_desc.provider_data = p;
                                ndr_desc.res, p->dn);
                goto err;
        }
+       if (target_nid != online_nid)
+               dev_info(dev, "Region registered with target node %d and online node %d",
+                        target_nid, online_nid);
 
        return 0;