Message ID | 20230323015357.8481-1-xueshuai@linux.alibaba.com (mailing list archive) |
---|---|
State | Mainlined, archived |
Headers | show |
Series | [v2] ACPI: APEI: EINJ: warn on invalid argument when explicitly indicated by platform | expand |
On Thu, Mar 23, 2023 at 2:54 AM Shuai Xue <xueshuai@linux.alibaba.com> wrote: > > OSPM executes an EXECUTE_OPERATION action to instruct the platform to begin > the injection operation, then executes a GET_COMMAND_STATUS action to > determine the status of the completed operation. The ACPI Specification > documented error codes[1] are: > > 0 = Success (Linux #define EINJ_STATUS_SUCCESS) > 1 = Unknown failure (Linux #define EINJ_STATUS_FAIL) > 2 = Invalid Access (Linux #define EINJ_STATUS_INVAL) > > The original code report -EBUSY for both "Unknown Failure" and "Invalid > Access" cases. Actually, firmware could do some platform dependent sanity > checks and returns different error codes, e.g. "Invalid Access" to indicate > to the user that the parameters they supplied cannot be used for injection. > > To this end, fix to return -EINVAL in the __einj_error_inject() error > handling case instead of always -EBUSY, when explicitly indicated by the > platform in the status of the completed operation. > > [1] ACPI Specification 6.5 18.6.1. Error Injection Table > > Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com> > Reviewed-by: Tony Luck <tony.luck@intel.com> > --- > changelog since v1: > - elaborate commit log based on follow up discussion with Tony > - pick up Reviewed-by tag of Tony > --- > drivers/acpi/apei/einj.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/drivers/acpi/apei/einj.c b/drivers/acpi/apei/einj.c > index b4373e575660..fa0b4320312e 100644 > --- a/drivers/acpi/apei/einj.c > +++ b/drivers/acpi/apei/einj.c > @@ -489,9 +489,15 @@ static int __einj_error_inject(u32 type, u32 flags, u64 param1, u64 param2, > if (rc) > return rc; > val = apei_exec_ctx_get_output(&ctx); > - if (val != EINJ_STATUS_SUCCESS) > + if (val == EINJ_STATUS_FAIL) > return -EBUSY; > + else if (val == EINJ_STATUS_INVAL) > + return -EINVAL; > > + /* > + * The error is injected into the platform successfully, then it needs > + * to trigger the error. > + */ > rc = apei_exec_run(&ctx, ACPI_EINJ_GET_TRIGGER_TABLE); > if (rc) > return rc; > -- Applied as 6.4 material, thanks!
diff --git a/drivers/acpi/apei/einj.c b/drivers/acpi/apei/einj.c index b4373e575660..fa0b4320312e 100644 --- a/drivers/acpi/apei/einj.c +++ b/drivers/acpi/apei/einj.c @@ -489,9 +489,15 @@ static int __einj_error_inject(u32 type, u32 flags, u64 param1, u64 param2, if (rc) return rc; val = apei_exec_ctx_get_output(&ctx); - if (val != EINJ_STATUS_SUCCESS) + if (val == EINJ_STATUS_FAIL) return -EBUSY; + else if (val == EINJ_STATUS_INVAL) + return -EINVAL; + /* + * The error is injected into the platform successfully, then it needs + * to trigger the error. + */ rc = apei_exec_run(&ctx, ACPI_EINJ_GET_TRIGGER_TABLE); if (rc) return rc;