diff options
author | Dan Williams <dan.j.williams@intel.com> | 2018-06-13 18:06:52 +0200 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2018-07-14 19:27:00 +0200 |
commit | 099b07a25fff6ee1b37f3ca7f4d2b53186326db0 (patch) | |
tree | eed49b2d32ccee9bc1e05c38bb94f13c3024f5a0 /drivers | |
parent | libnvdimm: Introduce locked DIMM capacity support (diff) | |
download | linux-099b07a25fff6ee1b37f3ca7f4d2b53186326db0.tar.xz linux-099b07a25fff6ee1b37f3ca7f4d2b53186326db0.zip |
acpi, nfit: Prefer _DSM over _LSR for namespace label reads
The _LSR method indicates locked status via error-code-3 returned in the
_LSR payload. When any error is returned the payload of _LSR is
truncated to a zero-length buffer.
The _DSM path in comparison allows system software to retrieve the
locked status *and* namespace label area contents.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/acpi/nfit/core.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c index 471402cee1f1..2be8373153ed 100644 --- a/drivers/acpi/nfit/core.c +++ b/drivers/acpi/nfit/core.c @@ -1697,7 +1697,7 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc, { struct acpi_device *adev, *adev_dimm; struct device *dev = acpi_desc->dev; - unsigned long dsm_mask; + unsigned long dsm_mask, label_mask; const guid_t *guid; int i; int family = -1; @@ -1769,6 +1769,16 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc, 1ULL << i)) set_bit(i, &nfit_mem->dsm_mask); + /* + * Prefer the NVDIMM_FAMILY_INTEL label read commands if present + * due to their better semantics handling locked capacity. + */ + label_mask = 1 << ND_CMD_GET_CONFIG_SIZE | 1 << ND_CMD_GET_CONFIG_DATA + | 1 << ND_CMD_SET_CONFIG_DATA; + if (family == NVDIMM_FAMILY_INTEL + && (dsm_mask & label_mask) == label_mask) + return 0; + if (acpi_nvdimm_has_method(adev_dimm, "_LSI") && acpi_nvdimm_has_method(adev_dimm, "_LSR")) { dev_dbg(dev, "%s: has _LSR\n", dev_name(&adev_dimm->dev)); |