diff options
author | Dan Williams <dan.j.williams@intel.com> | 2016-10-15 18:33:52 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2016-10-19 11:57:33 -0400 |
commit | 42237e393f64d619ed56e17fbf8fd27526485695 (patch) | |
tree | 51789f92c92ae65b02ef4e8834c05ee17045b9b8 | |
parent | 8d7c22ac0c036978a072b7e13c607b5402c474e0 (diff) |
libnvdimm: allow a platform to force enable label support
Platforms like QEMU-KVM implement an NFIT table and label DSMs.
However, since that environment does not define an aliased
configuration, the labels are currently ignored and the kernel registers
a single full-sized pmem-namespace per region. Now that the kernel
supports sub-divisions of pmem regions the labels have a purpose.
Arrange for the labels to be honored when we find an existing / valid
namespace index block.
Cc: <qemu-devel@nongnu.org>
Cc: Haozhong Zhang <haozhong.zhang@intel.com>
Cc: Xiao Guangrong <guangrong.xiao@linux.intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r-- | drivers/nvdimm/dimm.c | 2 | ||||
-rw-r--r-- | drivers/nvdimm/dimm_devs.c | 7 | ||||
-rw-r--r-- | drivers/nvdimm/nd.h | 1 |
3 files changed, 10 insertions, 0 deletions
diff --git a/drivers/nvdimm/dimm.c b/drivers/nvdimm/dimm.c index 619834e144d1..ee0b412827bf 100644 --- a/drivers/nvdimm/dimm.c +++ b/drivers/nvdimm/dimm.c | |||
@@ -64,6 +64,8 @@ static int nvdimm_probe(struct device *dev) | |||
64 | nd_label_copy(ndd, to_next_namespace_index(ndd), | 64 | nd_label_copy(ndd, to_next_namespace_index(ndd), |
65 | to_current_namespace_index(ndd)); | 65 | to_current_namespace_index(ndd)); |
66 | rc = nd_label_reserve_dpa(ndd); | 66 | rc = nd_label_reserve_dpa(ndd); |
67 | if (ndd->ns_current >= 0) | ||
68 | nvdimm_set_aliasing(dev); | ||
67 | nvdimm_bus_unlock(dev); | 69 | nvdimm_bus_unlock(dev); |
68 | 70 | ||
69 | if (rc) | 71 | if (rc) |
diff --git a/drivers/nvdimm/dimm_devs.c b/drivers/nvdimm/dimm_devs.c index d614493ad5ac..0eedc49e0d47 100644 --- a/drivers/nvdimm/dimm_devs.c +++ b/drivers/nvdimm/dimm_devs.c | |||
@@ -184,6 +184,13 @@ int nvdimm_set_config_data(struct nvdimm_drvdata *ndd, size_t offset, | |||
184 | return rc; | 184 | return rc; |
185 | } | 185 | } |
186 | 186 | ||
187 | void nvdimm_set_aliasing(struct device *dev) | ||
188 | { | ||
189 | struct nvdimm *nvdimm = to_nvdimm(dev); | ||
190 | |||
191 | nvdimm->flags |= NDD_ALIASING; | ||
192 | } | ||
193 | |||
187 | static void nvdimm_release(struct device *dev) | 194 | static void nvdimm_release(struct device *dev) |
188 | { | 195 | { |
189 | struct nvdimm *nvdimm = to_nvdimm(dev); | 196 | struct nvdimm *nvdimm = to_nvdimm(dev); |
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h index 065abf1b8f32..35dd75057e16 100644 --- a/drivers/nvdimm/nd.h +++ b/drivers/nvdimm/nd.h | |||
@@ -238,6 +238,7 @@ int nvdimm_set_config_data(struct nvdimm_drvdata *ndd, size_t offset, | |||
238 | void *buf, size_t len); | 238 | void *buf, size_t len); |
239 | long nvdimm_clear_poison(struct device *dev, phys_addr_t phys, | 239 | long nvdimm_clear_poison(struct device *dev, phys_addr_t phys, |
240 | unsigned int len); | 240 | unsigned int len); |
241 | void nvdimm_set_aliasing(struct device *dev); | ||
241 | struct nd_btt *to_nd_btt(struct device *dev); | 242 | struct nd_btt *to_nd_btt(struct device *dev); |
242 | 243 | ||
243 | struct nd_gen_sb { | 244 | struct nd_gen_sb { |