Commit caa603aa authored by Dan Williams's avatar Dan Williams

acpi, nfit: collate health state flags

Be tolerant of cases where the BIOS provided NFIT does not consistently
set the flags in all NVDIMM Region Mapping structures associated with a
given dimm.
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 1499934d
...@@ -457,9 +457,9 @@ static bool add_memdev(struct acpi_nfit_desc *acpi_desc, ...@@ -457,9 +457,9 @@ static bool add_memdev(struct acpi_nfit_desc *acpi_desc,
INIT_LIST_HEAD(&nfit_memdev->list); INIT_LIST_HEAD(&nfit_memdev->list);
memcpy(nfit_memdev->memdev, memdev, sizeof(*memdev)); memcpy(nfit_memdev->memdev, memdev, sizeof(*memdev));
list_add_tail(&nfit_memdev->list, &acpi_desc->memdevs); list_add_tail(&nfit_memdev->list, &acpi_desc->memdevs);
dev_dbg(dev, "%s: memdev handle: %#x spa: %d dcr: %d\n", dev_dbg(dev, "%s: memdev handle: %#x spa: %d dcr: %d flags: %#x\n",
__func__, memdev->device_handle, memdev->range_index, __func__, memdev->device_handle, memdev->range_index,
memdev->region_index); memdev->region_index, memdev->flags);
return true; return true;
} }
...@@ -1505,6 +1505,7 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc) ...@@ -1505,6 +1505,7 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc)
list_for_each_entry(nfit_mem, &acpi_desc->dimms, list) { list_for_each_entry(nfit_mem, &acpi_desc->dimms, list) {
struct acpi_nfit_flush_address *flush; struct acpi_nfit_flush_address *flush;
unsigned long flags = 0, cmd_mask; unsigned long flags = 0, cmd_mask;
struct nfit_memdev *nfit_memdev;
u32 device_handle; u32 device_handle;
u16 mem_flags; u16 mem_flags;
...@@ -1518,6 +1519,17 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc) ...@@ -1518,6 +1519,17 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc)
if (nfit_mem->bdw && nfit_mem->memdev_pmem) if (nfit_mem->bdw && nfit_mem->memdev_pmem)
flags |= NDD_ALIASING; flags |= NDD_ALIASING;
/* collate flags across all memdevs for this dimm */
list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) {
struct acpi_nfit_memory_map *dimm_memdev;
dimm_memdev = __to_nfit_memdev(nfit_mem);
if (dimm_memdev->device_handle
!= nfit_memdev->memdev->device_handle)
continue;
dimm_memdev->flags |= nfit_memdev->memdev->flags;
}
mem_flags = __to_nfit_memdev(nfit_mem)->flags; mem_flags = __to_nfit_memdev(nfit_mem)->flags;
if (mem_flags & ACPI_NFIT_MEM_NOT_ARMED) if (mem_flags & ACPI_NFIT_MEM_NOT_ARMED)
flags |= NDD_UNARMED; flags |= NDD_UNARMED;
......
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