diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/acpi/apei/apei-base.c | 26 | ||||
-rw-r--r-- | drivers/acpi/apei/apei-internal.h | 2 | ||||
-rw-r--r-- | drivers/acpi/apei/ghes.c | 10 |
3 files changed, 38 insertions, 0 deletions
diff --git a/drivers/acpi/apei/apei-base.c b/drivers/acpi/apei/apei-base.c index 0714194229da..8041248fce9b 100644 --- a/drivers/acpi/apei/apei-base.c +++ b/drivers/acpi/apei/apei-base.c | |||
@@ -604,3 +604,29 @@ struct dentry *apei_get_debugfs_dir(void) | |||
604 | return dapei; | 604 | return dapei; |
605 | } | 605 | } |
606 | EXPORT_SYMBOL_GPL(apei_get_debugfs_dir); | 606 | EXPORT_SYMBOL_GPL(apei_get_debugfs_dir); |
607 | |||
608 | int apei_osc_setup(void) | ||
609 | { | ||
610 | static u8 whea_uuid_str[] = "ed855e0c-6c90-47bf-a62a-26de0fc5ad5c"; | ||
611 | acpi_handle handle; | ||
612 | u32 capbuf[3]; | ||
613 | struct acpi_osc_context context = { | ||
614 | .uuid_str = whea_uuid_str, | ||
615 | .rev = 1, | ||
616 | .cap.length = sizeof(capbuf), | ||
617 | .cap.pointer = capbuf, | ||
618 | }; | ||
619 | |||
620 | capbuf[OSC_QUERY_TYPE] = OSC_QUERY_ENABLE; | ||
621 | capbuf[OSC_SUPPORT_TYPE] = 0; | ||
622 | capbuf[OSC_CONTROL_TYPE] = 0; | ||
623 | |||
624 | if (ACPI_FAILURE(acpi_get_handle(NULL, "\\_SB", &handle)) | ||
625 | || ACPI_FAILURE(acpi_run_osc(handle, &context))) | ||
626 | return -EIO; | ||
627 | else { | ||
628 | kfree(context.ret.pointer); | ||
629 | return 0; | ||
630 | } | ||
631 | } | ||
632 | EXPORT_SYMBOL_GPL(apei_osc_setup); | ||
diff --git a/drivers/acpi/apei/apei-internal.h b/drivers/acpi/apei/apei-internal.h index f286cf753f32..f57050e7a5e7 100644 --- a/drivers/acpi/apei/apei-internal.h +++ b/drivers/acpi/apei/apei-internal.h | |||
@@ -124,4 +124,6 @@ void apei_estatus_print(const char *pfx, | |||
124 | const struct acpi_hest_generic_status *estatus); | 124 | const struct acpi_hest_generic_status *estatus); |
125 | int apei_estatus_check_header(const struct acpi_hest_generic_status *estatus); | 125 | int apei_estatus_check_header(const struct acpi_hest_generic_status *estatus); |
126 | int apei_estatus_check(const struct acpi_hest_generic_status *estatus); | 126 | int apei_estatus_check(const struct acpi_hest_generic_status *estatus); |
127 | |||
128 | int apei_osc_setup(void); | ||
127 | #endif | 129 | #endif |
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index b142b94bf8b2..b1390a61cde1 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c | |||
@@ -681,6 +681,16 @@ static int __init ghes_init(void) | |||
681 | if (rc) | 681 | if (rc) |
682 | goto err_ioremap_exit; | 682 | goto err_ioremap_exit; |
683 | 683 | ||
684 | rc = apei_osc_setup(); | ||
685 | if (rc == 0 && osc_sb_apei_support_acked) | ||
686 | pr_info(GHES_PFX "APEI firmware first mode is enabled by APEI bit and WHEA _OSC.\n"); | ||
687 | else if (rc == 0 && !osc_sb_apei_support_acked) | ||
688 | pr_info(GHES_PFX "APEI firmware first mode is enabled by WHEA _OSC.\n"); | ||
689 | else if (rc && osc_sb_apei_support_acked) | ||
690 | pr_info(GHES_PFX "APEI firmware first mode is enabled by APEI bit.\n"); | ||
691 | else | ||
692 | pr_info(GHES_PFX "Failed to enable APEI firmware first mode.\n"); | ||
693 | |||
684 | return 0; | 694 | return 0; |
685 | err_ioremap_exit: | 695 | err_ioremap_exit: |
686 | ghes_ioremap_exit(); | 696 | ghes_ioremap_exit(); |