libnvdimm, dax: introduce device-dax infrastructure
[cascardo/linux.git] / drivers / nvdimm / namespace_devs.c
index e5ad516..c5e3196 100644 (file)
@@ -1288,6 +1288,8 @@ static ssize_t mode_show(struct device *dev,
                mode = "safe";
        else if (claim && is_nd_pfn(claim))
                mode = "memory";
+       else if (claim && is_nd_dax(claim))
+               mode = "dax";
        else if (!claim && pmem_should_map_pages(dev))
                mode = "memory";
        else
@@ -1379,14 +1381,17 @@ struct nd_namespace_common *nvdimm_namespace_common_probe(struct device *dev)
 {
        struct nd_btt *nd_btt = is_nd_btt(dev) ? to_nd_btt(dev) : NULL;
        struct nd_pfn *nd_pfn = is_nd_pfn(dev) ? to_nd_pfn(dev) : NULL;
+       struct nd_dax *nd_dax = is_nd_dax(dev) ? to_nd_dax(dev) : NULL;
        struct nd_namespace_common *ndns = NULL;
        resource_size_t size;
 
-       if (nd_btt || nd_pfn) {
+       if (nd_btt || nd_pfn || nd_dax) {
                if (nd_btt)
                        ndns = nd_btt->ndns;
                else if (nd_pfn)
                        ndns = nd_pfn->ndns;
+               else if (nd_dax)
+                       ndns = nd_dax->nd_pfn.ndns;
 
                if (!ndns)
                        return ERR_PTR(-ENODEV);
@@ -1779,6 +1784,18 @@ void nd_region_create_blk_seed(struct nd_region *nd_region)
                nd_device_register(nd_region->ns_seed);
 }
 
+void nd_region_create_dax_seed(struct nd_region *nd_region)
+{
+       WARN_ON(!is_nvdimm_bus_locked(&nd_region->dev));
+       nd_region->dax_seed = nd_dax_create(nd_region);
+       /*
+        * Seed creation failures are not fatal, provisioning is simply
+        * disabled until memory becomes available
+        */
+       if (!nd_region->dax_seed)
+               dev_err(&nd_region->dev, "failed to create dax namespace\n");
+}
+
 void nd_region_create_pfn_seed(struct nd_region *nd_region)
 {
        WARN_ON(!is_nvdimm_bus_locked(&nd_region->dev));