162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 262306a36Sopenharmony_ci/****************************************************************************** 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Module Name: exutils - interpreter/scanner utilities 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2000 - 2023, Intel Corp. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci *****************************************************************************/ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* 1162306a36Sopenharmony_ci * DEFINE_AML_GLOBALS is tested in amlcode.h 1262306a36Sopenharmony_ci * to determine whether certain global names should be "defined" or only 1362306a36Sopenharmony_ci * "declared" in the current compilation. This enhances maintainability 1462306a36Sopenharmony_ci * by enabling a single header file to embody all knowledge of the names 1562306a36Sopenharmony_ci * in question. 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * Exactly one module of any executable should #define DEFINE_GLOBALS 1862306a36Sopenharmony_ci * before #including the header files which use this convention. The 1962306a36Sopenharmony_ci * names in question will be defined and initialized in that module, 2062306a36Sopenharmony_ci * and declared as extern in all other modules which #include those 2162306a36Sopenharmony_ci * header files. 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define DEFINE_AML_GLOBALS 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#include <acpi/acpi.h> 2762306a36Sopenharmony_ci#include "accommon.h" 2862306a36Sopenharmony_ci#include "acinterp.h" 2962306a36Sopenharmony_ci#include "amlcode.h" 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define _COMPONENT ACPI_EXECUTER 3262306a36Sopenharmony_ciACPI_MODULE_NAME("exutils") 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* Local prototypes */ 3562306a36Sopenharmony_cistatic u32 acpi_ex_digits_needed(u64 value, u32 base); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci/******************************************************************************* 3862306a36Sopenharmony_ci * 3962306a36Sopenharmony_ci * FUNCTION: acpi_ex_enter_interpreter 4062306a36Sopenharmony_ci * 4162306a36Sopenharmony_ci * PARAMETERS: None 4262306a36Sopenharmony_ci * 4362306a36Sopenharmony_ci * RETURN: None 4462306a36Sopenharmony_ci * 4562306a36Sopenharmony_ci * DESCRIPTION: Enter the interpreter execution region. Failure to enter 4662306a36Sopenharmony_ci * the interpreter region is a fatal system error. Used in 4762306a36Sopenharmony_ci * conjunction with exit_interpreter. 4862306a36Sopenharmony_ci * 4962306a36Sopenharmony_ci ******************************************************************************/ 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_civoid acpi_ex_enter_interpreter(void) 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci acpi_status status; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci ACPI_FUNCTION_TRACE(ex_enter_interpreter); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER); 5862306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 5962306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, 6062306a36Sopenharmony_ci "Could not acquire AML Interpreter mutex")); 6162306a36Sopenharmony_ci } 6262306a36Sopenharmony_ci status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 6362306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 6462306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, "Could not acquire AML Namespace mutex")); 6562306a36Sopenharmony_ci } 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci return_VOID; 6862306a36Sopenharmony_ci} 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/******************************************************************************* 7162306a36Sopenharmony_ci * 7262306a36Sopenharmony_ci * FUNCTION: acpi_ex_exit_interpreter 7362306a36Sopenharmony_ci * 7462306a36Sopenharmony_ci * PARAMETERS: None 7562306a36Sopenharmony_ci * 7662306a36Sopenharmony_ci * RETURN: None 7762306a36Sopenharmony_ci * 7862306a36Sopenharmony_ci * DESCRIPTION: Exit the interpreter execution region. This is the top level 7962306a36Sopenharmony_ci * routine used to exit the interpreter when all processing has 8062306a36Sopenharmony_ci * been completed, or when the method blocks. 8162306a36Sopenharmony_ci * 8262306a36Sopenharmony_ci * Cases where the interpreter is unlocked internally: 8362306a36Sopenharmony_ci * 1) Method will be blocked on a Sleep() AML opcode 8462306a36Sopenharmony_ci * 2) Method will be blocked on an Acquire() AML opcode 8562306a36Sopenharmony_ci * 3) Method will be blocked on a Wait() AML opcode 8662306a36Sopenharmony_ci * 4) Method will be blocked to acquire the global lock 8762306a36Sopenharmony_ci * 5) Method will be blocked waiting to execute a serialized control 8862306a36Sopenharmony_ci * method that is currently executing 8962306a36Sopenharmony_ci * 6) About to invoke a user-installed opregion handler 9062306a36Sopenharmony_ci * 9162306a36Sopenharmony_ci ******************************************************************************/ 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_civoid acpi_ex_exit_interpreter(void) 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci acpi_status status; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci ACPI_FUNCTION_TRACE(ex_exit_interpreter); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 10062306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 10162306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, "Could not release AML Namespace mutex")); 10262306a36Sopenharmony_ci } 10362306a36Sopenharmony_ci status = acpi_ut_release_mutex(ACPI_MTX_INTERPRETER); 10462306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 10562306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, 10662306a36Sopenharmony_ci "Could not release AML Interpreter mutex")); 10762306a36Sopenharmony_ci } 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci return_VOID; 11062306a36Sopenharmony_ci} 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/******************************************************************************* 11362306a36Sopenharmony_ci * 11462306a36Sopenharmony_ci * FUNCTION: acpi_ex_truncate_for32bit_table 11562306a36Sopenharmony_ci * 11662306a36Sopenharmony_ci * PARAMETERS: obj_desc - Object to be truncated 11762306a36Sopenharmony_ci * 11862306a36Sopenharmony_ci * RETURN: TRUE if a truncation was performed, FALSE otherwise. 11962306a36Sopenharmony_ci * 12062306a36Sopenharmony_ci * DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is 12162306a36Sopenharmony_ci * 32-bit, as determined by the revision of the DSDT. 12262306a36Sopenharmony_ci * 12362306a36Sopenharmony_ci ******************************************************************************/ 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ciu8 acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc) 12662306a36Sopenharmony_ci{ 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci /* 13162306a36Sopenharmony_ci * Object must be a valid number and we must be executing 13262306a36Sopenharmony_ci * a control method. Object could be NS node for AML_INT_NAMEPATH_OP. 13362306a36Sopenharmony_ci */ 13462306a36Sopenharmony_ci if ((!obj_desc) || 13562306a36Sopenharmony_ci (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) || 13662306a36Sopenharmony_ci (obj_desc->common.type != ACPI_TYPE_INTEGER)) { 13762306a36Sopenharmony_ci return (FALSE); 13862306a36Sopenharmony_ci } 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci if ((acpi_gbl_integer_byte_width == 4) && 14162306a36Sopenharmony_ci (obj_desc->integer.value > (u64)ACPI_UINT32_MAX)) { 14262306a36Sopenharmony_ci /* 14362306a36Sopenharmony_ci * We are executing in a 32-bit ACPI table. Truncate 14462306a36Sopenharmony_ci * the value to 32 bits by zeroing out the upper 32-bit field 14562306a36Sopenharmony_ci */ 14662306a36Sopenharmony_ci obj_desc->integer.value &= (u64)ACPI_UINT32_MAX; 14762306a36Sopenharmony_ci return (TRUE); 14862306a36Sopenharmony_ci } 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci return (FALSE); 15162306a36Sopenharmony_ci} 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci/******************************************************************************* 15462306a36Sopenharmony_ci * 15562306a36Sopenharmony_ci * FUNCTION: acpi_ex_acquire_global_lock 15662306a36Sopenharmony_ci * 15762306a36Sopenharmony_ci * PARAMETERS: field_flags - Flags with Lock rule: 15862306a36Sopenharmony_ci * always_lock or never_lock 15962306a36Sopenharmony_ci * 16062306a36Sopenharmony_ci * RETURN: None 16162306a36Sopenharmony_ci * 16262306a36Sopenharmony_ci * DESCRIPTION: Obtain the ACPI hardware Global Lock, only if the field 16362306a36Sopenharmony_ci * flags specify that it is to be obtained before field access. 16462306a36Sopenharmony_ci * 16562306a36Sopenharmony_ci ******************************************************************************/ 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_civoid acpi_ex_acquire_global_lock(u32 field_flags) 16862306a36Sopenharmony_ci{ 16962306a36Sopenharmony_ci acpi_status status; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci ACPI_FUNCTION_TRACE(ex_acquire_global_lock); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci /* Only use the lock if the always_lock bit is set */ 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci if (!(field_flags & AML_FIELD_LOCK_RULE_MASK)) { 17662306a36Sopenharmony_ci return_VOID; 17762306a36Sopenharmony_ci } 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci /* Attempt to get the global lock, wait forever */ 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci status = acpi_ex_acquire_mutex_object(ACPI_WAIT_FOREVER, 18262306a36Sopenharmony_ci acpi_gbl_global_lock_mutex, 18362306a36Sopenharmony_ci acpi_os_get_thread_id()); 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 18662306a36Sopenharmony_ci ACPI_EXCEPTION((AE_INFO, status, 18762306a36Sopenharmony_ci "Could not acquire Global Lock")); 18862306a36Sopenharmony_ci } 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci return_VOID; 19162306a36Sopenharmony_ci} 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci/******************************************************************************* 19462306a36Sopenharmony_ci * 19562306a36Sopenharmony_ci * FUNCTION: acpi_ex_release_global_lock 19662306a36Sopenharmony_ci * 19762306a36Sopenharmony_ci * PARAMETERS: field_flags - Flags with Lock rule: 19862306a36Sopenharmony_ci * always_lock or never_lock 19962306a36Sopenharmony_ci * 20062306a36Sopenharmony_ci * RETURN: None 20162306a36Sopenharmony_ci * 20262306a36Sopenharmony_ci * DESCRIPTION: Release the ACPI hardware Global Lock 20362306a36Sopenharmony_ci * 20462306a36Sopenharmony_ci ******************************************************************************/ 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_civoid acpi_ex_release_global_lock(u32 field_flags) 20762306a36Sopenharmony_ci{ 20862306a36Sopenharmony_ci acpi_status status; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci ACPI_FUNCTION_TRACE(ex_release_global_lock); 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci /* Only use the lock if the always_lock bit is set */ 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci if (!(field_flags & AML_FIELD_LOCK_RULE_MASK)) { 21562306a36Sopenharmony_ci return_VOID; 21662306a36Sopenharmony_ci } 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci /* Release the global lock */ 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci status = acpi_ex_release_mutex_object(acpi_gbl_global_lock_mutex); 22162306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci /* Report the error, but there isn't much else we can do */ 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci ACPI_EXCEPTION((AE_INFO, status, 22662306a36Sopenharmony_ci "Could not release Global Lock")); 22762306a36Sopenharmony_ci } 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci return_VOID; 23062306a36Sopenharmony_ci} 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci/******************************************************************************* 23362306a36Sopenharmony_ci * 23462306a36Sopenharmony_ci * FUNCTION: acpi_ex_digits_needed 23562306a36Sopenharmony_ci * 23662306a36Sopenharmony_ci * PARAMETERS: value - Value to be represented 23762306a36Sopenharmony_ci * base - Base of representation 23862306a36Sopenharmony_ci * 23962306a36Sopenharmony_ci * RETURN: The number of digits. 24062306a36Sopenharmony_ci * 24162306a36Sopenharmony_ci * DESCRIPTION: Calculate the number of digits needed to represent the Value 24262306a36Sopenharmony_ci * in the given Base (Radix) 24362306a36Sopenharmony_ci * 24462306a36Sopenharmony_ci ******************************************************************************/ 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_cistatic u32 acpi_ex_digits_needed(u64 value, u32 base) 24762306a36Sopenharmony_ci{ 24862306a36Sopenharmony_ci u32 num_digits; 24962306a36Sopenharmony_ci u64 current_value; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci ACPI_FUNCTION_TRACE(ex_digits_needed); 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci /* u64 is unsigned, so we don't worry about a '-' prefix */ 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci if (value == 0) { 25662306a36Sopenharmony_ci return_UINT32(1); 25762306a36Sopenharmony_ci } 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci current_value = value; 26062306a36Sopenharmony_ci num_digits = 0; 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci /* Count the digits in the requested base */ 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci while (current_value) { 26562306a36Sopenharmony_ci (void)acpi_ut_short_divide(current_value, base, ¤t_value, 26662306a36Sopenharmony_ci NULL); 26762306a36Sopenharmony_ci num_digits++; 26862306a36Sopenharmony_ci } 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci return_UINT32(num_digits); 27162306a36Sopenharmony_ci} 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci/******************************************************************************* 27462306a36Sopenharmony_ci * 27562306a36Sopenharmony_ci * FUNCTION: acpi_ex_eisa_id_to_string 27662306a36Sopenharmony_ci * 27762306a36Sopenharmony_ci * PARAMETERS: out_string - Where to put the converted string (8 bytes) 27862306a36Sopenharmony_ci * compressed_id - EISAID to be converted 27962306a36Sopenharmony_ci * 28062306a36Sopenharmony_ci * RETURN: None 28162306a36Sopenharmony_ci * 28262306a36Sopenharmony_ci * DESCRIPTION: Convert a numeric EISAID to string representation. Return 28362306a36Sopenharmony_ci * buffer must be large enough to hold the string. The string 28462306a36Sopenharmony_ci * returned is always exactly of length ACPI_EISAID_STRING_SIZE 28562306a36Sopenharmony_ci * (includes null terminator). The EISAID is always 32 bits. 28662306a36Sopenharmony_ci * 28762306a36Sopenharmony_ci ******************************************************************************/ 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_civoid acpi_ex_eisa_id_to_string(char *out_string, u64 compressed_id) 29062306a36Sopenharmony_ci{ 29162306a36Sopenharmony_ci u32 swapped_id; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci /* The EISAID should be a 32-bit integer */ 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci if (compressed_id > ACPI_UINT32_MAX) { 29862306a36Sopenharmony_ci ACPI_WARNING((AE_INFO, 29962306a36Sopenharmony_ci "Expected EISAID is larger than 32 bits: " 30062306a36Sopenharmony_ci "0x%8.8X%8.8X, truncating", 30162306a36Sopenharmony_ci ACPI_FORMAT_UINT64(compressed_id))); 30262306a36Sopenharmony_ci } 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci /* Swap ID to big-endian to get contiguous bits */ 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci swapped_id = acpi_ut_dword_byte_swap((u32)compressed_id); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci /* First 3 bytes are uppercase letters. Next 4 bytes are hexadecimal */ 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci out_string[0] = 31162306a36Sopenharmony_ci (char)(0x40 + (((unsigned long)swapped_id >> 26) & 0x1F)); 31262306a36Sopenharmony_ci out_string[1] = (char)(0x40 + ((swapped_id >> 21) & 0x1F)); 31362306a36Sopenharmony_ci out_string[2] = (char)(0x40 + ((swapped_id >> 16) & 0x1F)); 31462306a36Sopenharmony_ci out_string[3] = acpi_ut_hex_to_ascii_char((u64) swapped_id, 12); 31562306a36Sopenharmony_ci out_string[4] = acpi_ut_hex_to_ascii_char((u64) swapped_id, 8); 31662306a36Sopenharmony_ci out_string[5] = acpi_ut_hex_to_ascii_char((u64) swapped_id, 4); 31762306a36Sopenharmony_ci out_string[6] = acpi_ut_hex_to_ascii_char((u64) swapped_id, 0); 31862306a36Sopenharmony_ci out_string[7] = 0; 31962306a36Sopenharmony_ci} 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci/******************************************************************************* 32262306a36Sopenharmony_ci * 32362306a36Sopenharmony_ci * FUNCTION: acpi_ex_integer_to_string 32462306a36Sopenharmony_ci * 32562306a36Sopenharmony_ci * PARAMETERS: out_string - Where to put the converted string. At least 32662306a36Sopenharmony_ci * 21 bytes are needed to hold the largest 32762306a36Sopenharmony_ci * possible 64-bit integer. 32862306a36Sopenharmony_ci * value - Value to be converted 32962306a36Sopenharmony_ci * 33062306a36Sopenharmony_ci * RETURN: Converted string in out_string 33162306a36Sopenharmony_ci * 33262306a36Sopenharmony_ci * DESCRIPTION: Convert a 64-bit integer to decimal string representation. 33362306a36Sopenharmony_ci * Assumes string buffer is large enough to hold the string. The 33462306a36Sopenharmony_ci * largest string is (ACPI_MAX64_DECIMAL_DIGITS + 1). 33562306a36Sopenharmony_ci * 33662306a36Sopenharmony_ci ******************************************************************************/ 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_civoid acpi_ex_integer_to_string(char *out_string, u64 value) 33962306a36Sopenharmony_ci{ 34062306a36Sopenharmony_ci u32 count; 34162306a36Sopenharmony_ci u32 digits_needed; 34262306a36Sopenharmony_ci u32 remainder; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci digits_needed = acpi_ex_digits_needed(value, 10); 34762306a36Sopenharmony_ci out_string[digits_needed] = 0; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci for (count = digits_needed; count > 0; count--) { 35062306a36Sopenharmony_ci (void)acpi_ut_short_divide(value, 10, &value, &remainder); 35162306a36Sopenharmony_ci out_string[count - 1] = (char)('0' + remainder); 35262306a36Sopenharmony_ci } 35362306a36Sopenharmony_ci} 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci/******************************************************************************* 35662306a36Sopenharmony_ci * 35762306a36Sopenharmony_ci * FUNCTION: acpi_ex_pci_cls_to_string 35862306a36Sopenharmony_ci * 35962306a36Sopenharmony_ci * PARAMETERS: out_string - Where to put the converted string (7 bytes) 36062306a36Sopenharmony_ci * class_code - PCI class code to be converted (3 bytes) 36162306a36Sopenharmony_ci * 36262306a36Sopenharmony_ci * RETURN: Converted string in out_string 36362306a36Sopenharmony_ci * 36462306a36Sopenharmony_ci * DESCRIPTION: Convert 3-bytes PCI class code to string representation. 36562306a36Sopenharmony_ci * Return buffer must be large enough to hold the string. The 36662306a36Sopenharmony_ci * string returned is always exactly of length 36762306a36Sopenharmony_ci * ACPI_PCICLS_STRING_SIZE (includes null terminator). 36862306a36Sopenharmony_ci * 36962306a36Sopenharmony_ci ******************************************************************************/ 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_civoid acpi_ex_pci_cls_to_string(char *out_string, u8 class_code[3]) 37262306a36Sopenharmony_ci{ 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci /* All 3 bytes are hexadecimal */ 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci out_string[0] = acpi_ut_hex_to_ascii_char((u64)class_code[0], 4); 37962306a36Sopenharmony_ci out_string[1] = acpi_ut_hex_to_ascii_char((u64)class_code[0], 0); 38062306a36Sopenharmony_ci out_string[2] = acpi_ut_hex_to_ascii_char((u64)class_code[1], 4); 38162306a36Sopenharmony_ci out_string[3] = acpi_ut_hex_to_ascii_char((u64)class_code[1], 0); 38262306a36Sopenharmony_ci out_string[4] = acpi_ut_hex_to_ascii_char((u64)class_code[2], 4); 38362306a36Sopenharmony_ci out_string[5] = acpi_ut_hex_to_ascii_char((u64)class_code[2], 0); 38462306a36Sopenharmony_ci out_string[6] = 0; 38562306a36Sopenharmony_ci} 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci/******************************************************************************* 38862306a36Sopenharmony_ci * 38962306a36Sopenharmony_ci * FUNCTION: acpi_is_valid_space_id 39062306a36Sopenharmony_ci * 39162306a36Sopenharmony_ci * PARAMETERS: space_id - ID to be validated 39262306a36Sopenharmony_ci * 39362306a36Sopenharmony_ci * RETURN: TRUE if space_id is a valid/supported ID. 39462306a36Sopenharmony_ci * 39562306a36Sopenharmony_ci * DESCRIPTION: Validate an operation region space_ID. 39662306a36Sopenharmony_ci * 39762306a36Sopenharmony_ci ******************************************************************************/ 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ciu8 acpi_is_valid_space_id(u8 space_id) 40062306a36Sopenharmony_ci{ 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci if ((space_id >= ACPI_NUM_PREDEFINED_REGIONS) && 40362306a36Sopenharmony_ci (space_id < ACPI_USER_REGION_BEGIN) && 40462306a36Sopenharmony_ci (space_id != ACPI_ADR_SPACE_DATA_TABLE) && 40562306a36Sopenharmony_ci (space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) { 40662306a36Sopenharmony_ci return (FALSE); 40762306a36Sopenharmony_ci } 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci return (TRUE); 41062306a36Sopenharmony_ci} 411