@@ -347,11 +347,6 @@ and is between 256 and 4096 characters.
not play well with APC CPU idle - disable it if you have
APC and your system crashes randomly.
- apei.hest_disable= [ACPI]
- Disable Hardware Error Source Table (HEST) support,
- corresponding firmware-first mode error processing
- logic will be disabled.
-
apic= [APIC,X86-32] Advanced Programmable Interrupt Controller
Change the output verbosity whilst booting
Format: { quiet (default) | verbose | debug }
@@ -853,6 +848,11 @@ and is between 256 and 4096 characters.
hd= [EIDE] (E)IDE hard drive subsystem geometry
Format: <cyl>,<head>,<sect>
+ hest_disable [ACPI]
+ Disable Hardware Error Source Table (HEST) support,
+ corresponding firmware-first mode error processing
+ logic will be disabled.
+
highmem=nn[KMG] [KNL,BOOT] forces the highmem zone to have an exact
size of <nn>. This works even on boxes that have no
highmem otherwise. This also works to reduce highmem
@@ -1,5 +1,5 @@
config ACPI_APEI
- tristate "ACPI Platform Error Interface (APEI)"
+ bool "ACPI Platform Error Interface (APEI)"
depends on X86
help
APEI allows to report errors (for example from the chipset)
@@ -45,12 +45,6 @@
#define APEI_PFX "APEI: "
-struct dentry *apei_debug_dir;
-EXPORT_SYMBOL_GPL(apei_debug_dir);
-
-int hest_disable;
-EXPORT_SYMBOL(hest_disable);
-
/*
* APEI ERST (Error Record Serialization Table) and EINJ (Error
* INJection) interpreter framework.
@@ -553,37 +547,13 @@ int apei_exec_collect_resources(struct a
}
EXPORT_SYMBOL_GPL(apei_exec_collect_resources);
-static int __init apei_init(void)
+struct dentry *apei_get_debugfs_dir(void)
{
- int rc;
-
- apei_debug_dir = debugfs_create_dir("apei", NULL);
- if (!apei_debug_dir)
- return -ENOMEM;
- if (!hest_disable) {
- rc = hest_init();
- if (rc) {
- hest_disable = 1;
- if (rc != -ENODEV)
- pr_err(
- "ACPI: APEI: Failed to initialize Hardware "
- "Error Source Table (HEST) subsystem\n");
- }
- }
+ static struct dentry *dapei;
- return 0;
-}
+ if (!dapei)
+ dapei = debugfs_create_dir("apei", NULL);
-static void __exit apei_exit(void)
-{
- debugfs_remove_recursive(apei_debug_dir);
+ return dapei;
}
-
-module_init(apei_init);
-module_exit(apei_exit);
-
-module_param(hest_disable, int, 0444);
-
-MODULE_AUTHOR("Huang Ying");
-MODULE_DESCRIPTION("ACPI Platform Error Interface support");
-MODULE_LICENSE("GPL");
+EXPORT_SYMBOL_GPL(apei_get_debugfs_dir);
@@ -6,8 +6,6 @@
#ifndef APEI_INTERNAL_H
#define APEI_INTERNAL_H
-int hest_init(void);
-
struct apei_exec_context;
typedef int (*apei_exec_ins_func_t)(struct apei_exec_context *ctx,
@@ -93,5 +91,5 @@ int apei_exec_collect_resources(struct a
struct apei_resources *resources);
struct dentry;
-extern struct dentry *apei_debug_dir;
+struct dentry *apei_get_debugfs_dir(void);
#endif
@@ -409,7 +409,7 @@ static int __init einj_init(void)
}
rc = -ENOMEM;
- einj_debug_dir = debugfs_create_dir("einj", apei_debug_dir);
+ einj_debug_dir = debugfs_create_dir("einj", apei_get_debugfs_dir());
if (!einj_debug_dir)
goto err_cleanup;
fentry = debugfs_create_file("available_error_type", S_IRUSR,
@@ -40,6 +40,9 @@
#define HEST_PFX "HEST: "
+int hest_disable;
+EXPORT_SYMBOL_GPL(hest_disable);
+
/* HEST table parsing */
static struct acpi_table_hest *hest_tab;
@@ -118,30 +121,49 @@ int apei_hest_parse(apei_hest_func_t fun
}
EXPORT_SYMBOL_GPL(apei_hest_parse);
-int __init hest_init(void)
+static int __init setup_hest_disable(char *str)
+{
+ hest_disable = 1;
+ return 0;
+}
+
+__setup("hest_disable", setup_hest_disable);
+
+static int __init hest_init(void)
{
acpi_status status;
- int rc;
+ int rc = 0;
if (acpi_disabled)
- return -ENODEV;
+ goto err;
+
+ if (hest_disable) {
+ pr_info(HEST_PFX "HEST tabling parsing is disabled.\n");
+ goto err;
+ }
status = acpi_get_table(ACPI_SIG_HEST, 0,
(struct acpi_table_header **)&hest_tab);
if (status == AE_NOT_FOUND) {
pr_info(HEST_PFX "Table is not found!\n");
- return -ENODEV;
+ goto err;
} else if (ACPI_FAILURE(status)) {
const char *msg = acpi_format_exception(status);
pr_info(HEST_PFX "Failed to get table, %s\n", msg);
- return -EINVAL;
+ rc = -EINVAL;
+ goto err;
}
rc = apei_hest_parse(hest_void_parse, NULL);
if (rc)
- return rc;
+ goto err;
pr_info(HEST_PFX "HEST table parsing is initialized.\n");
return 0;
+err:
+ hest_disable = 1;
+ return rc;
}
+
+subsys_initcall(hest_init);