acpi, nfit: Prefer _DSM over _LSR for namespace label reads
authorDan Williams <dan.j.williams@intel.com>
Wed, 13 Jun 2018 16:06:52 +0000 (09:06 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sat, 14 Jul 2018 17:27:00 +0000 (10:27 -0700)
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>
drivers/acpi/nfit/core.c

index 471402cee1f16c4bf1ed71ae3a8ea7cb157fd75b..2be8373153edb7038798934b569ad16e98c58cc5 100644 (file)
@@ -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));