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, &current_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