Commit a7225598 authored by Dan Williams's avatar Dan Williams

nfit: make DIMM DSMs optional

Commit 4995734e "acpi, nfit: fix acpi_check_dsm() vs zero functions
implemented" attempted to fix a QEMU regression by supporting its usage
of a zero-mask as a valid response to a DSM-family probe request.
However, this behavior breaks HP platforms that return a zero-mask by
default causing the probe to misidentify the DSM-family.

Instead, the QEMU regression can be fixed by simply not requiring the DSM
family to be identified.

This effectively reverts commit 4995734e, and removes the DSM
requirement from the init path.

Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Xiao Guangrong <guangrong.xiao@linux.intel.com>
Cc: Linda Knippers <linda.knippers@hpe.com>
Fixes: 4995734e ("acpi, nfit: fix acpi_check_dsm() vs zero functions implemented")
Reported-by: default avatarJerry Hoemann <jerry.hoemann@hpe.com>
Tested-by: default avatarJerry Hoemann <jerry.hoemann@hpe.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent a99cde43
...@@ -1131,11 +1131,11 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc, ...@@ -1131,11 +1131,11 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
/* /*
* Until standardization materializes we need to consider up to 3 * Until standardization materializes we need to consider up to 3
* different command sets. Note, that checking for zero functions * different command sets. Note, that checking for function0 (bit0)
* tells us if any commands might be reachable through this uuid. * tells us if any commands are reachable through this uuid.
*/ */
for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_HPE2; i++) for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_HPE2; i++)
if (acpi_check_dsm(adev_dimm->handle, to_nfit_uuid(i), 1, 0)) if (acpi_check_dsm(adev_dimm->handle, to_nfit_uuid(i), 1, 1))
break; break;
/* limit the supported commands to those that are publicly documented */ /* limit the supported commands to those that are publicly documented */
...@@ -1151,9 +1151,10 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc, ...@@ -1151,9 +1151,10 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
if (disable_vendor_specific) if (disable_vendor_specific)
dsm_mask &= ~(1 << 8); dsm_mask &= ~(1 << 8);
} else { } else {
dev_err(dev, "unknown dimm command family\n"); dev_dbg(dev, "unknown dimm command family\n");
nfit_mem->family = -1; nfit_mem->family = -1;
return force_enable_dimms ? 0 : -ENODEV; /* DSMs are optional, continue loading the driver... */
return 0;
} }
uuid = to_nfit_uuid(nfit_mem->family); uuid = to_nfit_uuid(nfit_mem->family);
......
...@@ -680,6 +680,9 @@ bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, u64 rev, u64 funcs) ...@@ -680,6 +680,9 @@ bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, u64 rev, u64 funcs)
u64 mask = 0; u64 mask = 0;
union acpi_object *obj; union acpi_object *obj;
if (funcs == 0)
return false;
obj = acpi_evaluate_dsm(handle, uuid, rev, 0, NULL); obj = acpi_evaluate_dsm(handle, uuid, rev, 0, NULL);
if (!obj) if (!obj)
return false; return false;
...@@ -692,9 +695,6 @@ bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, u64 rev, u64 funcs) ...@@ -692,9 +695,6 @@ bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, u64 rev, u64 funcs)
mask |= (((u64)obj->buffer.pointer[i]) << (i * 8)); mask |= (((u64)obj->buffer.pointer[i]) << (i * 8));
ACPI_FREE(obj); ACPI_FREE(obj);
if (funcs == 0)
return true;
/* /*
* Bit 0 indicates whether there's support for any functions other than * Bit 0 indicates whether there's support for any functions other than
* function 0 for the specified UUID and revision. * function 0 for the specified UUID and revision.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment