aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/apei
diff options
context:
space:
mode:
authorChen Gong <gong.chen@linux.intel.com>2012-03-15 04:53:36 -0400
committerLen Brown <len.brown@intel.com>2012-03-30 03:30:18 -0400
commitee49089dc7d9fc78db51e18f4fba68e88edc49a4 (patch)
tree998a8223c8f1457d5d1c9146d6602cb24c810688 /drivers/acpi/apei
parent185210cc754754c2504afcef9d1c9cd4b8761a9c (diff)
ACPI, APEI, EINJ, new parameter to control trigger action
Some APEI firmware implementation will access injected address specified in param1 to trigger the error when injecting memory error, which means if one SRAR error is injected, the crash always happens because it is executed in kernel context. This new parameter can disable trigger action and control is taken over by the user. In this way, an SRAR error can happen in user context instead of crashing the system. This function is highly depended on BIOS implementation so please ensure you know the BIOS trigger procedure before you enable this switch. v2: notrigger should be created together with param1/param2 Tested-by: Tony Luck <tony.luck@lintel.com> Signed-off-by: Chen Gong <gong.chen@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/apei')
-rw-r--r--drivers/acpi/apei/einj.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/acpi/apei/einj.c b/drivers/acpi/apei/einj.c
index 3d3816f6d367..8e1793649ec0 100644
--- a/drivers/acpi/apei/einj.c
+++ b/drivers/acpi/apei/einj.c
@@ -74,6 +74,8 @@ struct vendor_error_type_extension {
74 u8 reserved[3]; 74 u8 reserved[3];
75}; 75};
76 76
77static u32 notrigger;
78
77static u32 vendor_flags; 79static u32 vendor_flags;
78static struct debugfs_blob_wrapper vendor_blob; 80static struct debugfs_blob_wrapper vendor_blob;
79static char vendor_dev[64]; 81static char vendor_dev[64];
@@ -496,9 +498,11 @@ static int __einj_error_inject(u32 type, u64 param1, u64 param2)
496 if (rc) 498 if (rc)
497 return rc; 499 return rc;
498 trigger_paddr = apei_exec_ctx_get_output(&ctx); 500 trigger_paddr = apei_exec_ctx_get_output(&ctx);
499 rc = __einj_error_trigger(trigger_paddr, type, param1, param2); 501 if (notrigger == 0) {
500 if (rc) 502 rc = __einj_error_trigger(trigger_paddr, type, param1, param2);
501 return rc; 503 if (rc)
504 return rc;
505 }
502 rc = apei_exec_run_optional(&ctx, ACPI_EINJ_END_OPERATION); 506 rc = apei_exec_run_optional(&ctx, ACPI_EINJ_END_OPERATION);
503 507
504 return rc; 508 return rc;
@@ -700,6 +704,11 @@ static int __init einj_init(void)
700 einj_debug_dir, &error_param2); 704 einj_debug_dir, &error_param2);
701 if (!fentry) 705 if (!fentry)
702 goto err_unmap; 706 goto err_unmap;
707
708 fentry = debugfs_create_x32("notrigger", S_IRUSR | S_IWUSR,
709 einj_debug_dir, &notrigger);
710 if (!fentry)
711 goto err_unmap;
703 } 712 }
704 713
705 if (vendor_dev[0]) { 714 if (vendor_dev[0]) {