162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 262306a36Sopenharmony_ci/******************************************************************************* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Module Name: utexcep - Exception code support 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci ******************************************************************************/ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#define EXPORT_ACPI_INTERFACES 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define ACPI_DEFINE_EXCEPTION_TABLE 1162306a36Sopenharmony_ci#include <acpi/acpi.h> 1262306a36Sopenharmony_ci#include "accommon.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define _COMPONENT ACPI_UTILITIES 1562306a36Sopenharmony_ciACPI_MODULE_NAME("utexcep") 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/******************************************************************************* 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * FUNCTION: acpi_format_exception 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * PARAMETERS: status - The acpi_status code to be formatted 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * RETURN: A string containing the exception text. A valid pointer is 2462306a36Sopenharmony_ci * always returned. 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * DESCRIPTION: This function translates an ACPI exception into an ASCII 2762306a36Sopenharmony_ci * string. Returns "unknown status" string for invalid codes. 2862306a36Sopenharmony_ci * 2962306a36Sopenharmony_ci ******************************************************************************/ 3062306a36Sopenharmony_ciconst char *acpi_format_exception(acpi_status status) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci const struct acpi_exception_info *exception; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci exception = acpi_ut_validate_exception(status); 3762306a36Sopenharmony_ci if (!exception) { 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci /* Exception code was not recognized */ 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, 4262306a36Sopenharmony_ci "Unknown exception code: 0x%8.8X", status)); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci return ("UNKNOWN_STATUS_CODE"); 4562306a36Sopenharmony_ci } 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci return (exception->name); 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ciACPI_EXPORT_SYMBOL(acpi_format_exception) 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/******************************************************************************* 5362306a36Sopenharmony_ci * 5462306a36Sopenharmony_ci * FUNCTION: acpi_ut_validate_exception 5562306a36Sopenharmony_ci * 5662306a36Sopenharmony_ci * PARAMETERS: status - The acpi_status code to be formatted 5762306a36Sopenharmony_ci * 5862306a36Sopenharmony_ci * RETURN: A string containing the exception text. NULL if exception is 5962306a36Sopenharmony_ci * not valid. 6062306a36Sopenharmony_ci * 6162306a36Sopenharmony_ci * DESCRIPTION: This function validates and translates an ACPI exception into 6262306a36Sopenharmony_ci * an ASCII string. 6362306a36Sopenharmony_ci * 6462306a36Sopenharmony_ci ******************************************************************************/ 6562306a36Sopenharmony_ciconst struct acpi_exception_info *acpi_ut_validate_exception(acpi_status status) 6662306a36Sopenharmony_ci{ 6762306a36Sopenharmony_ci u32 sub_status; 6862306a36Sopenharmony_ci const struct acpi_exception_info *exception = NULL; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci /* 7362306a36Sopenharmony_ci * Status is composed of two parts, a "type" and an actual code 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_ci sub_status = (status & ~AE_CODE_MASK); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci switch (status & AE_CODE_MASK) { 7862306a36Sopenharmony_ci case AE_CODE_ENVIRONMENTAL: 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci if (sub_status <= AE_CODE_ENV_MAX) { 8162306a36Sopenharmony_ci exception = &acpi_gbl_exception_names_env[sub_status]; 8262306a36Sopenharmony_ci } 8362306a36Sopenharmony_ci break; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci case AE_CODE_PROGRAMMER: 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci if (sub_status <= AE_CODE_PGM_MAX) { 8862306a36Sopenharmony_ci exception = &acpi_gbl_exception_names_pgm[sub_status]; 8962306a36Sopenharmony_ci } 9062306a36Sopenharmony_ci break; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci case AE_CODE_ACPI_TABLES: 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci if (sub_status <= AE_CODE_TBL_MAX) { 9562306a36Sopenharmony_ci exception = &acpi_gbl_exception_names_tbl[sub_status]; 9662306a36Sopenharmony_ci } 9762306a36Sopenharmony_ci break; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci case AE_CODE_AML: 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci if (sub_status <= AE_CODE_AML_MAX) { 10262306a36Sopenharmony_ci exception = &acpi_gbl_exception_names_aml[sub_status]; 10362306a36Sopenharmony_ci } 10462306a36Sopenharmony_ci break; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci case AE_CODE_CONTROL: 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci if (sub_status <= AE_CODE_CTRL_MAX) { 10962306a36Sopenharmony_ci exception = &acpi_gbl_exception_names_ctrl[sub_status]; 11062306a36Sopenharmony_ci } 11162306a36Sopenharmony_ci break; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci default: 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci break; 11662306a36Sopenharmony_ci } 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci if (!exception || !exception->name) { 11962306a36Sopenharmony_ci return (NULL); 12062306a36Sopenharmony_ci } 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci return (exception); 12362306a36Sopenharmony_ci} 124