diff options
Diffstat (limited to 'drivers/acpi/apei/einj.c')
| -rw-r--r-- | drivers/acpi/apei/einj.c | 43 | 
1 files changed, 26 insertions, 17 deletions
| diff --git a/drivers/acpi/apei/einj.c b/drivers/acpi/apei/einj.c index f74b2ea11f21..589b96c38704 100644 --- a/drivers/acpi/apei/einj.c +++ b/drivers/acpi/apei/einj.c @@ -46,7 +46,8 @@   * Some BIOSes allow parameters to the SET_ERROR_TYPE entries in the   * EINJ table through an unpublished extension. Use with caution as   * most will ignore the parameter and make their own choice of address - * for error injection. + * for error injection.  This extension is used only if + * param_extension module parameter is specified.   */  struct einj_parameter {  	u64 type; @@ -65,6 +66,9 @@ struct einj_parameter {  	((struct acpi_whea_header *)((char *)(tab) +			\  				    sizeof(struct acpi_table_einj))) +static bool param_extension; +module_param(param_extension, bool, 0); +  static struct acpi_table_einj *einj_tab;  static struct apei_resources einj_resources; @@ -285,7 +289,7 @@ static int __einj_error_inject(u32 type, u64 param1, u64 param2)  	einj_exec_ctx_init(&ctx); -	rc = apei_exec_run(&ctx, ACPI_EINJ_BEGIN_OPERATION); +	rc = apei_exec_run_optional(&ctx, ACPI_EINJ_BEGIN_OPERATION);  	if (rc)  		return rc;  	apei_exec_ctx_set_input(&ctx, type); @@ -323,7 +327,7 @@ static int __einj_error_inject(u32 type, u64 param1, u64 param2)  	rc = __einj_error_trigger(trigger_paddr);  	if (rc)  		return rc; -	rc = apei_exec_run(&ctx, ACPI_EINJ_END_OPERATION); +	rc = apei_exec_run_optional(&ctx, ACPI_EINJ_END_OPERATION);  	return rc;  } @@ -489,14 +493,6 @@ static int __init einj_init(void)  				     einj_debug_dir, NULL, &error_type_fops);  	if (!fentry)  		goto err_cleanup; -	fentry = debugfs_create_x64("param1", S_IRUSR | S_IWUSR, -				    einj_debug_dir, &error_param1); -	if (!fentry) -		goto err_cleanup; -	fentry = debugfs_create_x64("param2", S_IRUSR | S_IWUSR, -				    einj_debug_dir, &error_param2); -	if (!fentry) -		goto err_cleanup;  	fentry = debugfs_create_file("error_inject", S_IWUSR,  				     einj_debug_dir, NULL, &error_inject_fops);  	if (!fentry) @@ -513,12 +509,23 @@ static int __init einj_init(void)  	rc = apei_exec_pre_map_gars(&ctx);  	if (rc)  		goto err_release; -	param_paddr = einj_get_parameter_address(); -	if (param_paddr) { -		einj_param = ioremap(param_paddr, sizeof(*einj_param)); -		rc = -ENOMEM; -		if (!einj_param) -			goto err_unmap; +	if (param_extension) { +		param_paddr = einj_get_parameter_address(); +		if (param_paddr) { +			einj_param = ioremap(param_paddr, sizeof(*einj_param)); +			rc = -ENOMEM; +			if (!einj_param) +				goto err_unmap; +			fentry = debugfs_create_x64("param1", S_IRUSR | S_IWUSR, +						    einj_debug_dir, &error_param1); +			if (!fentry) +				goto err_unmap; +			fentry = debugfs_create_x64("param2", S_IRUSR | S_IWUSR, +						    einj_debug_dir, &error_param2); +			if (!fentry) +				goto err_unmap; +		} else +			pr_warn(EINJ_PFX "Parameter extension is not supported.\n");  	}  	pr_info(EINJ_PFX "Error INJection is initialized.\n"); @@ -526,6 +533,8 @@ static int __init einj_init(void)  	return 0;  err_unmap: +	if (einj_param) +		iounmap(einj_param);  	apei_exec_post_unmap_gars(&ctx);  err_release:  	apei_resources_release(&einj_resources); | 
