162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
262306a36Sopenharmony_ci/******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Module Name: nsconvert - Object conversions for objects returned by
562306a36Sopenharmony_ci *                          predefined methods
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2000 - 2023, Intel Corp.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci *****************************************************************************/
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <acpi/acpi.h>
1262306a36Sopenharmony_ci#include "accommon.h"
1362306a36Sopenharmony_ci#include "acnamesp.h"
1462306a36Sopenharmony_ci#include "acinterp.h"
1562306a36Sopenharmony_ci#include "acpredef.h"
1662306a36Sopenharmony_ci#include "amlresrc.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define _COMPONENT          ACPI_NAMESPACE
1962306a36Sopenharmony_ciACPI_MODULE_NAME("nsconvert")
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/*******************************************************************************
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci * FUNCTION:    acpi_ns_convert_to_integer
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * PARAMETERS:  original_object     - Object to be converted
2662306a36Sopenharmony_ci *              return_object       - Where the new converted object is returned
2762306a36Sopenharmony_ci *
2862306a36Sopenharmony_ci * RETURN:      Status. AE_OK if conversion was successful.
2962306a36Sopenharmony_ci *
3062306a36Sopenharmony_ci * DESCRIPTION: Attempt to convert a String/Buffer object to an Integer.
3162306a36Sopenharmony_ci *
3262306a36Sopenharmony_ci ******************************************************************************/
3362306a36Sopenharmony_ciacpi_status
3462306a36Sopenharmony_ciacpi_ns_convert_to_integer(union acpi_operand_object *original_object,
3562306a36Sopenharmony_ci			   union acpi_operand_object **return_object)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	union acpi_operand_object *new_object;
3862306a36Sopenharmony_ci	acpi_status status;
3962306a36Sopenharmony_ci	u64 value = 0;
4062306a36Sopenharmony_ci	u32 i;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	switch (original_object->common.type) {
4362306a36Sopenharmony_ci	case ACPI_TYPE_STRING:
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci		/* String-to-Integer conversion */
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci		status =
4862306a36Sopenharmony_ci		    acpi_ut_strtoul64(original_object->string.pointer, &value);
4962306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
5062306a36Sopenharmony_ci			return (status);
5162306a36Sopenharmony_ci		}
5262306a36Sopenharmony_ci		break;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	case ACPI_TYPE_BUFFER:
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci		/* Buffer-to-Integer conversion. Max buffer size is 64 bits. */
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci		if (original_object->buffer.length > 8) {
5962306a36Sopenharmony_ci			return (AE_AML_OPERAND_TYPE);
6062306a36Sopenharmony_ci		}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci		/* Extract each buffer byte to create the integer */
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci		for (i = 0; i < original_object->buffer.length; i++) {
6562306a36Sopenharmony_ci			value |= ((u64)
6662306a36Sopenharmony_ci				  original_object->buffer.pointer[i] << (i *
6762306a36Sopenharmony_ci									 8));
6862306a36Sopenharmony_ci		}
6962306a36Sopenharmony_ci		break;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	default:
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci		return (AE_AML_OPERAND_TYPE);
7462306a36Sopenharmony_ci	}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	new_object = acpi_ut_create_integer_object(value);
7762306a36Sopenharmony_ci	if (!new_object) {
7862306a36Sopenharmony_ci		return (AE_NO_MEMORY);
7962306a36Sopenharmony_ci	}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	*return_object = new_object;
8262306a36Sopenharmony_ci	return (AE_OK);
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci/*******************************************************************************
8662306a36Sopenharmony_ci *
8762306a36Sopenharmony_ci * FUNCTION:    acpi_ns_convert_to_string
8862306a36Sopenharmony_ci *
8962306a36Sopenharmony_ci * PARAMETERS:  original_object     - Object to be converted
9062306a36Sopenharmony_ci *              return_object       - Where the new converted object is returned
9162306a36Sopenharmony_ci *
9262306a36Sopenharmony_ci * RETURN:      Status. AE_OK if conversion was successful.
9362306a36Sopenharmony_ci *
9462306a36Sopenharmony_ci * DESCRIPTION: Attempt to convert a Integer/Buffer object to a String.
9562306a36Sopenharmony_ci *
9662306a36Sopenharmony_ci ******************************************************************************/
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ciacpi_status
9962306a36Sopenharmony_ciacpi_ns_convert_to_string(union acpi_operand_object *original_object,
10062306a36Sopenharmony_ci			  union acpi_operand_object **return_object)
10162306a36Sopenharmony_ci{
10262306a36Sopenharmony_ci	union acpi_operand_object *new_object;
10362306a36Sopenharmony_ci	acpi_size length;
10462306a36Sopenharmony_ci	acpi_status status;
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	switch (original_object->common.type) {
10762306a36Sopenharmony_ci	case ACPI_TYPE_INTEGER:
10862306a36Sopenharmony_ci		/*
10962306a36Sopenharmony_ci		 * Integer-to-String conversion. Commonly, convert
11062306a36Sopenharmony_ci		 * an integer of value 0 to a NULL string. The last element of
11162306a36Sopenharmony_ci		 * _BIF and _BIX packages occasionally need this fix.
11262306a36Sopenharmony_ci		 */
11362306a36Sopenharmony_ci		if (original_object->integer.value == 0) {
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci			/* Allocate a new NULL string object */
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci			new_object = acpi_ut_create_string_object(0);
11862306a36Sopenharmony_ci			if (!new_object) {
11962306a36Sopenharmony_ci				return (AE_NO_MEMORY);
12062306a36Sopenharmony_ci			}
12162306a36Sopenharmony_ci		} else {
12262306a36Sopenharmony_ci			status = acpi_ex_convert_to_string(original_object,
12362306a36Sopenharmony_ci							   &new_object,
12462306a36Sopenharmony_ci							   ACPI_IMPLICIT_CONVERT_HEX);
12562306a36Sopenharmony_ci			if (ACPI_FAILURE(status)) {
12662306a36Sopenharmony_ci				return (status);
12762306a36Sopenharmony_ci			}
12862306a36Sopenharmony_ci		}
12962306a36Sopenharmony_ci		break;
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	case ACPI_TYPE_BUFFER:
13262306a36Sopenharmony_ci		/*
13362306a36Sopenharmony_ci		 * Buffer-to-String conversion. Use a to_string
13462306a36Sopenharmony_ci		 * conversion, no transform performed on the buffer data. The best
13562306a36Sopenharmony_ci		 * example of this is the _BIF method, where the string data from
13662306a36Sopenharmony_ci		 * the battery is often (incorrectly) returned as buffer object(s).
13762306a36Sopenharmony_ci		 */
13862306a36Sopenharmony_ci		length = 0;
13962306a36Sopenharmony_ci		while ((length < original_object->buffer.length) &&
14062306a36Sopenharmony_ci		       (original_object->buffer.pointer[length])) {
14162306a36Sopenharmony_ci			length++;
14262306a36Sopenharmony_ci		}
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci		/* Allocate a new string object */
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci		new_object = acpi_ut_create_string_object(length);
14762306a36Sopenharmony_ci		if (!new_object) {
14862306a36Sopenharmony_ci			return (AE_NO_MEMORY);
14962306a36Sopenharmony_ci		}
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci		/*
15262306a36Sopenharmony_ci		 * Copy the raw buffer data with no transform. String is already NULL
15362306a36Sopenharmony_ci		 * terminated at Length+1.
15462306a36Sopenharmony_ci		 */
15562306a36Sopenharmony_ci		memcpy(new_object->string.pointer,
15662306a36Sopenharmony_ci		       original_object->buffer.pointer, length);
15762306a36Sopenharmony_ci		break;
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	default:
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci		return (AE_AML_OPERAND_TYPE);
16262306a36Sopenharmony_ci	}
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci	*return_object = new_object;
16562306a36Sopenharmony_ci	return (AE_OK);
16662306a36Sopenharmony_ci}
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci/*******************************************************************************
16962306a36Sopenharmony_ci *
17062306a36Sopenharmony_ci * FUNCTION:    acpi_ns_convert_to_buffer
17162306a36Sopenharmony_ci *
17262306a36Sopenharmony_ci * PARAMETERS:  original_object     - Object to be converted
17362306a36Sopenharmony_ci *              return_object       - Where the new converted object is returned
17462306a36Sopenharmony_ci *
17562306a36Sopenharmony_ci * RETURN:      Status. AE_OK if conversion was successful.
17662306a36Sopenharmony_ci *
17762306a36Sopenharmony_ci * DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer.
17862306a36Sopenharmony_ci *
17962306a36Sopenharmony_ci ******************************************************************************/
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ciacpi_status
18262306a36Sopenharmony_ciacpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
18362306a36Sopenharmony_ci			  union acpi_operand_object **return_object)
18462306a36Sopenharmony_ci{
18562306a36Sopenharmony_ci	union acpi_operand_object *new_object;
18662306a36Sopenharmony_ci	acpi_status status;
18762306a36Sopenharmony_ci	union acpi_operand_object **elements;
18862306a36Sopenharmony_ci	u32 *dword_buffer;
18962306a36Sopenharmony_ci	u32 count;
19062306a36Sopenharmony_ci	u32 i;
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci	switch (original_object->common.type) {
19362306a36Sopenharmony_ci	case ACPI_TYPE_INTEGER:
19462306a36Sopenharmony_ci		/*
19562306a36Sopenharmony_ci		 * Integer-to-Buffer conversion.
19662306a36Sopenharmony_ci		 * Convert the Integer to a packed-byte buffer. _MAT and other
19762306a36Sopenharmony_ci		 * objects need this sometimes, if a read has been performed on a
19862306a36Sopenharmony_ci		 * Field object that is less than or equal to the global integer
19962306a36Sopenharmony_ci		 * size (32 or 64 bits).
20062306a36Sopenharmony_ci		 */
20162306a36Sopenharmony_ci		status =
20262306a36Sopenharmony_ci		    acpi_ex_convert_to_buffer(original_object, &new_object);
20362306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
20462306a36Sopenharmony_ci			return (status);
20562306a36Sopenharmony_ci		}
20662306a36Sopenharmony_ci		break;
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	case ACPI_TYPE_STRING:
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci		/* String-to-Buffer conversion. Simple data copy */
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci		new_object = acpi_ut_create_buffer_object
21362306a36Sopenharmony_ci		    (original_object->string.length);
21462306a36Sopenharmony_ci		if (!new_object) {
21562306a36Sopenharmony_ci			return (AE_NO_MEMORY);
21662306a36Sopenharmony_ci		}
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci		memcpy(new_object->buffer.pointer,
21962306a36Sopenharmony_ci		       original_object->string.pointer,
22062306a36Sopenharmony_ci		       original_object->string.length);
22162306a36Sopenharmony_ci		break;
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	case ACPI_TYPE_PACKAGE:
22462306a36Sopenharmony_ci		/*
22562306a36Sopenharmony_ci		 * This case is often seen for predefined names that must return a
22662306a36Sopenharmony_ci		 * Buffer object with multiple DWORD integers within. For example,
22762306a36Sopenharmony_ci		 * _FDE and _GTM. The Package can be converted to a Buffer.
22862306a36Sopenharmony_ci		 */
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci		/* All elements of the Package must be integers */
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci		elements = original_object->package.elements;
23362306a36Sopenharmony_ci		count = original_object->package.count;
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci		for (i = 0; i < count; i++) {
23662306a36Sopenharmony_ci			if ((!*elements) ||
23762306a36Sopenharmony_ci			    ((*elements)->common.type != ACPI_TYPE_INTEGER)) {
23862306a36Sopenharmony_ci				return (AE_AML_OPERAND_TYPE);
23962306a36Sopenharmony_ci			}
24062306a36Sopenharmony_ci			elements++;
24162306a36Sopenharmony_ci		}
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci		/* Create the new buffer object to replace the Package */
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci		new_object = acpi_ut_create_buffer_object(ACPI_MUL_4(count));
24662306a36Sopenharmony_ci		if (!new_object) {
24762306a36Sopenharmony_ci			return (AE_NO_MEMORY);
24862306a36Sopenharmony_ci		}
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci		/* Copy the package elements (integers) to the buffer as DWORDs */
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci		elements = original_object->package.elements;
25362306a36Sopenharmony_ci		dword_buffer = ACPI_CAST_PTR(u32, new_object->buffer.pointer);
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci		for (i = 0; i < count; i++) {
25662306a36Sopenharmony_ci			*dword_buffer = (u32)(*elements)->integer.value;
25762306a36Sopenharmony_ci			dword_buffer++;
25862306a36Sopenharmony_ci			elements++;
25962306a36Sopenharmony_ci		}
26062306a36Sopenharmony_ci		break;
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	default:
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci		return (AE_AML_OPERAND_TYPE);
26562306a36Sopenharmony_ci	}
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci	*return_object = new_object;
26862306a36Sopenharmony_ci	return (AE_OK);
26962306a36Sopenharmony_ci}
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci/*******************************************************************************
27262306a36Sopenharmony_ci *
27362306a36Sopenharmony_ci * FUNCTION:    acpi_ns_convert_to_unicode
27462306a36Sopenharmony_ci *
27562306a36Sopenharmony_ci * PARAMETERS:  scope               - Namespace node for the method/object
27662306a36Sopenharmony_ci *              original_object     - ASCII String Object to be converted
27762306a36Sopenharmony_ci *              return_object       - Where the new converted object is returned
27862306a36Sopenharmony_ci *
27962306a36Sopenharmony_ci * RETURN:      Status. AE_OK if conversion was successful.
28062306a36Sopenharmony_ci *
28162306a36Sopenharmony_ci * DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer.
28262306a36Sopenharmony_ci *
28362306a36Sopenharmony_ci ******************************************************************************/
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ciacpi_status
28662306a36Sopenharmony_ciacpi_ns_convert_to_unicode(struct acpi_namespace_node *scope,
28762306a36Sopenharmony_ci			   union acpi_operand_object *original_object,
28862306a36Sopenharmony_ci			   union acpi_operand_object **return_object)
28962306a36Sopenharmony_ci{
29062306a36Sopenharmony_ci	union acpi_operand_object *new_object;
29162306a36Sopenharmony_ci	char *ascii_string;
29262306a36Sopenharmony_ci	u16 *unicode_buffer;
29362306a36Sopenharmony_ci	u32 unicode_length;
29462306a36Sopenharmony_ci	u32 i;
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	if (!original_object) {
29762306a36Sopenharmony_ci		return (AE_OK);
29862306a36Sopenharmony_ci	}
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci	/* If a Buffer was returned, it must be at least two bytes long */
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	if (original_object->common.type == ACPI_TYPE_BUFFER) {
30362306a36Sopenharmony_ci		if (original_object->buffer.length < 2) {
30462306a36Sopenharmony_ci			return (AE_AML_OPERAND_VALUE);
30562306a36Sopenharmony_ci		}
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci		*return_object = NULL;
30862306a36Sopenharmony_ci		return (AE_OK);
30962306a36Sopenharmony_ci	}
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	/*
31262306a36Sopenharmony_ci	 * The original object is an ASCII string. Convert this string to
31362306a36Sopenharmony_ci	 * a unicode buffer.
31462306a36Sopenharmony_ci	 */
31562306a36Sopenharmony_ci	ascii_string = original_object->string.pointer;
31662306a36Sopenharmony_ci	unicode_length = (original_object->string.length * 2) + 2;
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	/* Create a new buffer object for the Unicode data */
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci	new_object = acpi_ut_create_buffer_object(unicode_length);
32162306a36Sopenharmony_ci	if (!new_object) {
32262306a36Sopenharmony_ci		return (AE_NO_MEMORY);
32362306a36Sopenharmony_ci	}
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci	unicode_buffer = ACPI_CAST_PTR(u16, new_object->buffer.pointer);
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci	/* Convert ASCII to Unicode */
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci	for (i = 0; i < original_object->string.length; i++) {
33062306a36Sopenharmony_ci		unicode_buffer[i] = (u16)ascii_string[i];
33162306a36Sopenharmony_ci	}
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci	*return_object = new_object;
33462306a36Sopenharmony_ci	return (AE_OK);
33562306a36Sopenharmony_ci}
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci/*******************************************************************************
33862306a36Sopenharmony_ci *
33962306a36Sopenharmony_ci * FUNCTION:    acpi_ns_convert_to_resource
34062306a36Sopenharmony_ci *
34162306a36Sopenharmony_ci * PARAMETERS:  scope               - Namespace node for the method/object
34262306a36Sopenharmony_ci *              original_object     - Object to be converted
34362306a36Sopenharmony_ci *              return_object       - Where the new converted object is returned
34462306a36Sopenharmony_ci *
34562306a36Sopenharmony_ci * RETURN:      Status. AE_OK if conversion was successful
34662306a36Sopenharmony_ci *
34762306a36Sopenharmony_ci * DESCRIPTION: Attempt to convert a Integer object to a resource_template
34862306a36Sopenharmony_ci *              Buffer.
34962306a36Sopenharmony_ci *
35062306a36Sopenharmony_ci ******************************************************************************/
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ciacpi_status
35362306a36Sopenharmony_ciacpi_ns_convert_to_resource(struct acpi_namespace_node *scope,
35462306a36Sopenharmony_ci			    union acpi_operand_object *original_object,
35562306a36Sopenharmony_ci			    union acpi_operand_object **return_object)
35662306a36Sopenharmony_ci{
35762306a36Sopenharmony_ci	union acpi_operand_object *new_object;
35862306a36Sopenharmony_ci	u8 *buffer;
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci	/*
36162306a36Sopenharmony_ci	 * We can fix the following cases for an expected resource template:
36262306a36Sopenharmony_ci	 * 1. No return value (interpreter slack mode is disabled)
36362306a36Sopenharmony_ci	 * 2. A "Return (Zero)" statement
36462306a36Sopenharmony_ci	 * 3. A "Return empty buffer" statement
36562306a36Sopenharmony_ci	 *
36662306a36Sopenharmony_ci	 * We will return a buffer containing a single end_tag
36762306a36Sopenharmony_ci	 * resource descriptor.
36862306a36Sopenharmony_ci	 */
36962306a36Sopenharmony_ci	if (original_object) {
37062306a36Sopenharmony_ci		switch (original_object->common.type) {
37162306a36Sopenharmony_ci		case ACPI_TYPE_INTEGER:
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci			/* We can only repair an Integer==0 */
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci			if (original_object->integer.value) {
37662306a36Sopenharmony_ci				return (AE_AML_OPERAND_TYPE);
37762306a36Sopenharmony_ci			}
37862306a36Sopenharmony_ci			break;
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci		case ACPI_TYPE_BUFFER:
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_ci			if (original_object->buffer.length) {
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ci				/* Additional checks can be added in the future */
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci				*return_object = NULL;
38762306a36Sopenharmony_ci				return (AE_OK);
38862306a36Sopenharmony_ci			}
38962306a36Sopenharmony_ci			break;
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ci		case ACPI_TYPE_STRING:
39262306a36Sopenharmony_ci		default:
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci			return (AE_AML_OPERAND_TYPE);
39562306a36Sopenharmony_ci		}
39662306a36Sopenharmony_ci	}
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci	/* Create the new buffer object for the resource descriptor */
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci	new_object = acpi_ut_create_buffer_object(2);
40162306a36Sopenharmony_ci	if (!new_object) {
40262306a36Sopenharmony_ci		return (AE_NO_MEMORY);
40362306a36Sopenharmony_ci	}
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci	buffer = ACPI_CAST_PTR(u8, new_object->buffer.pointer);
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci	/* Initialize the Buffer with a single end_tag descriptor */
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_ci	buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE);
41062306a36Sopenharmony_ci	buffer[1] = 0x00;
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci	*return_object = new_object;
41362306a36Sopenharmony_ci	return (AE_OK);
41462306a36Sopenharmony_ci}
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci/*******************************************************************************
41762306a36Sopenharmony_ci *
41862306a36Sopenharmony_ci * FUNCTION:    acpi_ns_convert_to_reference
41962306a36Sopenharmony_ci *
42062306a36Sopenharmony_ci * PARAMETERS:  scope               - Namespace node for the method/object
42162306a36Sopenharmony_ci *              original_object     - Object to be converted
42262306a36Sopenharmony_ci *              return_object       - Where the new converted object is returned
42362306a36Sopenharmony_ci *
42462306a36Sopenharmony_ci * RETURN:      Status. AE_OK if conversion was successful
42562306a36Sopenharmony_ci *
42662306a36Sopenharmony_ci * DESCRIPTION: Attempt to convert a Integer object to a object_reference.
42762306a36Sopenharmony_ci *              Buffer.
42862306a36Sopenharmony_ci *
42962306a36Sopenharmony_ci ******************************************************************************/
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ciacpi_status
43262306a36Sopenharmony_ciacpi_ns_convert_to_reference(struct acpi_namespace_node *scope,
43362306a36Sopenharmony_ci			     union acpi_operand_object *original_object,
43462306a36Sopenharmony_ci			     union acpi_operand_object **return_object)
43562306a36Sopenharmony_ci{
43662306a36Sopenharmony_ci	union acpi_operand_object *new_object = NULL;
43762306a36Sopenharmony_ci	acpi_status status;
43862306a36Sopenharmony_ci	struct acpi_namespace_node *node;
43962306a36Sopenharmony_ci	union acpi_generic_state scope_info;
44062306a36Sopenharmony_ci	char *name;
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci	ACPI_FUNCTION_NAME(ns_convert_to_reference);
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_ci	/* Convert path into internal presentation */
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci	status =
44762306a36Sopenharmony_ci	    acpi_ns_internalize_name(original_object->string.pointer, &name);
44862306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
44962306a36Sopenharmony_ci		return_ACPI_STATUS(status);
45062306a36Sopenharmony_ci	}
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci	/* Find the namespace node */
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci	scope_info.scope.node =
45562306a36Sopenharmony_ci	    ACPI_CAST_PTR(struct acpi_namespace_node, scope);
45662306a36Sopenharmony_ci	status =
45762306a36Sopenharmony_ci	    acpi_ns_lookup(&scope_info, name, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
45862306a36Sopenharmony_ci			   ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
45962306a36Sopenharmony_ci			   NULL, &node);
46062306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci		/* Check if we are resolving a named reference within a package */
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci		ACPI_ERROR_NAMESPACE(&scope_info,
46562306a36Sopenharmony_ci				     original_object->string.pointer, status);
46662306a36Sopenharmony_ci		goto error_exit;
46762306a36Sopenharmony_ci	}
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci	/* Create and init a new internal ACPI object */
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ci	new_object = acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_REFERENCE);
47262306a36Sopenharmony_ci	if (!new_object) {
47362306a36Sopenharmony_ci		status = AE_NO_MEMORY;
47462306a36Sopenharmony_ci		goto error_exit;
47562306a36Sopenharmony_ci	}
47662306a36Sopenharmony_ci	new_object->reference.node = node;
47762306a36Sopenharmony_ci	new_object->reference.object = node->object;
47862306a36Sopenharmony_ci	new_object->reference.class = ACPI_REFCLASS_NAME;
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_ci	/*
48162306a36Sopenharmony_ci	 * Increase reference of the object if needed (the object is likely a
48262306a36Sopenharmony_ci	 * null for device nodes).
48362306a36Sopenharmony_ci	 */
48462306a36Sopenharmony_ci	acpi_ut_add_reference(node->object);
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_cierror_exit:
48762306a36Sopenharmony_ci	ACPI_FREE(name);
48862306a36Sopenharmony_ci	*return_object = new_object;
48962306a36Sopenharmony_ci	return (status);
49062306a36Sopenharmony_ci}
491