From: Huang Ying <ying.hu...@intel.com>

commit 9fb0bfe1408d5506b7b83d13d1eed573fd71d67d upstream

APEI firmware first mode must be turned on explicitly on some
machines, otherwise there may be no GHES hardware error record for
hardware error notification.  APEI bit in generic _OSC call can be
used to do that, but on some machine, a special WHEA _OSC call must be
used.  This patch adds the support to that WHEA _OSC call.

Signed-off-by: Huang Ying <ying.hu...@intel.com>
Reviewed-by: Andi Kleen <a...@linux.intel.com>
Reviewed-by: Matthew Garrett <m...@redhat.com>
Signed-off-by: Len Brown <len.br...@intel.com>
Signed-off-by: Stephen Hemminger <shemmin...@vyatta.com>
---
 drivers/acpi/apei/apei-base.c     |   26 ++++++++++++++++++++++++++
 drivers/acpi/apei/apei-internal.h |    2 ++
 drivers/acpi/apei/ghes.c          |   10 ++++++++++
 3 files changed, 38 insertions(+)

--- a/drivers/acpi/apei/apei-base.c     2012-05-21 17:24:11.528242941 -0700
+++ b/drivers/acpi/apei/apei-base.c     2012-05-21 17:24:42.128593952 -0700
@@ -603,3 +603,29 @@ struct dentry *apei_get_debugfs_dir(void
        return dapei;
 }
 EXPORT_SYMBOL_GPL(apei_get_debugfs_dir);
+
+int apei_osc_setup(void)
+{
+       static u8 whea_uuid_str[] = "ed855e0c-6c90-47bf-a62a-26de0fc5ad5c";
+       acpi_handle handle;
+       u32 capbuf[3];
+       struct acpi_osc_context context = {
+               .uuid_str       = whea_uuid_str,
+               .rev            = 1,
+               .cap.length     = sizeof(capbuf),
+               .cap.pointer    = capbuf,
+       };
+
+       capbuf[OSC_QUERY_TYPE] = OSC_QUERY_ENABLE;
+       capbuf[OSC_SUPPORT_TYPE] = 0;
+       capbuf[OSC_CONTROL_TYPE] = 0;
+
+       if (ACPI_FAILURE(acpi_get_handle(NULL, "\\_SB", &handle))
+           || ACPI_FAILURE(acpi_run_osc(handle, &context)))
+               return -EIO;
+       else {
+               kfree(context.ret.pointer);
+               return 0;
+       }
+}
+EXPORT_SYMBOL_GPL(apei_osc_setup);
--- a/drivers/acpi/apei/apei-internal.h 2012-05-21 17:24:11.528242941 -0700
+++ b/drivers/acpi/apei/apei-internal.h 2012-05-21 17:24:42.128593952 -0700
@@ -113,4 +113,6 @@ void apei_estatus_print(const char *pfx,
                        const struct acpi_hest_generic_status *estatus);
 int apei_estatus_check_header(const struct acpi_hest_generic_status *estatus);
 int apei_estatus_check(const struct acpi_hest_generic_status *estatus);
+
+int apei_osc_setup(void);
 #endif
--- a/drivers/acpi/apei/ghes.c  2012-05-21 17:24:39.620565184 -0700
+++ b/drivers/acpi/apei/ghes.c  2012-05-21 17:24:42.128593952 -0700
@@ -678,6 +678,16 @@ static int __init ghes_init(void)
        if (rc)
                goto err_ioremap_exit;
 
+       rc = apei_osc_setup();
+       if (rc == 0 && osc_sb_apei_support_acked)
+               pr_info(GHES_PFX "APEI firmware first mode is enabled by APEI 
bit and WHEA _OSC.\n");
+       else if (rc == 0 && !osc_sb_apei_support_acked)
+               pr_info(GHES_PFX "APEI firmware first mode is enabled by WHEA 
_OSC.\n");
+       else if (rc && osc_sb_apei_support_acked)
+               pr_info(GHES_PFX "APEI firmware first mode is enabled by APEI 
bit.\n");
+       else
+               pr_info(GHES_PFX "Failed to enable APEI firmware first 
mode.\n");
+
        return 0;
 err_ioremap_exit:
        ghes_ioremap_exit();


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to