acpi/nfit: Add support of NVDIMM memory error notification in ACPI 6.2
ACPI 6.2 defines a new ACPI notification value to NVDIMM Root Device in Table 5-169. 0x81 Unconsumed Uncorrectable Memory Error Detected Used to pro-actively notify OSPM of uncorrectable memory errors detected (for example a memory scrubbing engine that continuously scans the NVDIMMs memory). This is an optional notification. Only locations that were mapped in to SPA by the platform will generate a notification. Add support of this notification value by initiating an ARS scan. This will find new error locations and add their badblocks information. Link: http://www.uefi.org/sites/default/files/resources/ACPI_6_2.pdf Signed-off-by: Toshi Kani <toshi.kani@hpe.com> Cc: Rafael J. Wysocki <rjw@rjwysocki.net> Cc: Vishal Verma <vishal.l.verma@intel.com> Cc: Linda Knippers <linda.knippers@hpe.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
975750a98c
commit
56b47fe657
@ -3016,7 +3016,7 @@ static int acpi_nfit_remove(struct acpi_device *adev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __acpi_nfit_notify(struct device *dev, acpi_handle handle, u32 event)
|
static void acpi_nfit_update_notify(struct device *dev, acpi_handle handle)
|
||||||
{
|
{
|
||||||
struct acpi_nfit_desc *acpi_desc = dev_get_drvdata(dev);
|
struct acpi_nfit_desc *acpi_desc = dev_get_drvdata(dev);
|
||||||
struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };
|
struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||||
@ -3024,11 +3024,6 @@ void __acpi_nfit_notify(struct device *dev, acpi_handle handle, u32 event)
|
|||||||
acpi_status status;
|
acpi_status status;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
dev_dbg(dev, "%s: event: %d\n", __func__, event);
|
|
||||||
|
|
||||||
if (event != NFIT_NOTIFY_UPDATE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!dev->driver) {
|
if (!dev->driver) {
|
||||||
/* dev->driver may be null if we're being removed */
|
/* dev->driver may be null if we're being removed */
|
||||||
dev_dbg(dev, "%s: no driver found for dev\n", __func__);
|
dev_dbg(dev, "%s: no driver found for dev\n", __func__);
|
||||||
@ -3065,6 +3060,27 @@ void __acpi_nfit_notify(struct device *dev, acpi_handle handle, u32 event)
|
|||||||
dev_err(dev, "Invalid _FIT\n");
|
dev_err(dev, "Invalid _FIT\n");
|
||||||
kfree(buf.pointer);
|
kfree(buf.pointer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void acpi_nfit_uc_error_notify(struct device *dev, acpi_handle handle)
|
||||||
|
{
|
||||||
|
struct acpi_nfit_desc *acpi_desc = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
acpi_nfit_ars_rescan(acpi_desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __acpi_nfit_notify(struct device *dev, acpi_handle handle, u32 event)
|
||||||
|
{
|
||||||
|
dev_dbg(dev, "%s: event: 0x%x\n", __func__, event);
|
||||||
|
|
||||||
|
switch (event) {
|
||||||
|
case NFIT_NOTIFY_UPDATE:
|
||||||
|
return acpi_nfit_update_notify(dev, handle);
|
||||||
|
case NFIT_NOTIFY_UC_MEMORY_ERROR:
|
||||||
|
return acpi_nfit_uc_error_notify(dev, handle);
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
EXPORT_SYMBOL_GPL(__acpi_nfit_notify);
|
EXPORT_SYMBOL_GPL(__acpi_nfit_notify);
|
||||||
|
|
||||||
static void acpi_nfit_notify(struct acpi_device *adev, u32 event)
|
static void acpi_nfit_notify(struct acpi_device *adev, u32 event)
|
||||||
|
@ -79,6 +79,7 @@ enum {
|
|||||||
|
|
||||||
enum nfit_root_notifiers {
|
enum nfit_root_notifiers {
|
||||||
NFIT_NOTIFY_UPDATE = 0x80,
|
NFIT_NOTIFY_UPDATE = 0x80,
|
||||||
|
NFIT_NOTIFY_UC_MEMORY_ERROR = 0x81,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum nfit_dimm_notifiers {
|
enum nfit_dimm_notifiers {
|
||||||
|
Loading…
Reference in New Issue
Block a user