uteval.c 19.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7
/******************************************************************************
 *
 * Module Name: uteval - Object evaluation
 *
 *****************************************************************************/

/*
B
Bob Moore 已提交
8
 * Copyright (C) 2000 - 2006, R. Byron Moore
L
Linus Torvalds 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 * 3. Neither the names of the above-listed copyright holders nor the names
 *    of any contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 */

#include <acpi/acpi.h>
#include <acpi/acnamesp.h>
#include <acpi/acinterp.h>

#define _COMPONENT          ACPI_UTILITIES
L
Len Brown 已提交
49
ACPI_MODULE_NAME("uteval")
L
Linus Torvalds 已提交
50

R
Robert Moore 已提交
51 52
/* Local prototypes */
static void
L
Len Brown 已提交
53
acpi_ut_copy_id_string(char *destination, char *source, acpi_size max_length);
R
Robert Moore 已提交
54 55

static acpi_status
L
Len Brown 已提交
56 57
acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
			  struct acpi_compatible_id *one_cid);
L
Linus Torvalds 已提交
58

B
Bob Moore 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
/*
 * Strings supported by the _OSI predefined (internal) method.
 */
static const char *acpi_interfaces_supported[] = {
	/* Operating System Vendor Strings */

	"Linux",
	"Windows 2000",
	"Windows 2001",
	"Windows 2001 SP0",
	"Windows 2001 SP1",
	"Windows 2001 SP2",
	"Windows 2001 SP3",
	"Windows 2001 SP4",
	"Windows 2001.1",
	"Windows 2001.1 SP1",	/* Added 03/2006 */
	"Windows 2006",		/* Added 03/2006 */

	/* Feature Group Strings */

	"Extended Address Space Descriptor"
	    /*
	     * All "optional" feature group strings (features that are implemented
	     * by the host) should be implemented in the host version of
	     * acpi_os_validate_interface and should not be added here.
	     */
};

L
Linus Torvalds 已提交
87 88 89 90 91 92 93 94
/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_osi_implementation
 *
 * PARAMETERS:  walk_state          - Current walk state
 *
 * RETURN:      Status
 *
B
Bob Moore 已提交
95
 * DESCRIPTION: Implementation of the _OSI predefined control method
L
Linus Torvalds 已提交
96 97 98
 *
 ******************************************************************************/

L
Len Brown 已提交
99
acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
L
Linus Torvalds 已提交
100
{
B
Bob Moore 已提交
101
	acpi_status status;
L
Len Brown 已提交
102 103 104
	union acpi_operand_object *string_desc;
	union acpi_operand_object *return_desc;
	acpi_native_uint i;
L
Linus Torvalds 已提交
105

B
Bob Moore 已提交
106
	ACPI_FUNCTION_TRACE(ut_osi_implementation);
L
Linus Torvalds 已提交
107 108 109 110 111

	/* Validate the string input argument */

	string_desc = walk_state->arguments[0].object;
	if (!string_desc || (string_desc->common.type != ACPI_TYPE_STRING)) {
L
Len Brown 已提交
112
		return_ACPI_STATUS(AE_TYPE);
L
Linus Torvalds 已提交
113 114
	}

B
Bob Moore 已提交
115
	/* Create a return object */
L
Linus Torvalds 已提交
116

L
Len Brown 已提交
117
	return_desc = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER);
L
Linus Torvalds 已提交
118
	if (!return_desc) {
L
Len Brown 已提交
119
		return_ACPI_STATUS(AE_NO_MEMORY);
L
Linus Torvalds 已提交
120 121
	}

B
Bob Moore 已提交
122
	/* Default return value is SUPPORTED */
L
Linus Torvalds 已提交
123

B
Bob Moore 已提交
124 125 126 127
	return_desc->integer.value = ACPI_UINT32_MAX;
	walk_state->return_desc = return_desc;

	/* Compare input string to static table of supported interfaces */
B
Bob Moore 已提交
128

B
Bob Moore 已提交
129 130 131 132
	for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_interfaces_supported); i++) {
		if (!ACPI_STRCMP
		    (string_desc->string.pointer,
		     acpi_interfaces_supported[i])) {
L
Linus Torvalds 已提交
133

B
Bob Moore 已提交
134 135 136
			/* The interface is supported */

			return_ACPI_STATUS(AE_CTRL_TERMINATE);
L
Linus Torvalds 已提交
137 138 139
		}
	}

B
Bob Moore 已提交
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
	/*
	 * Did not match the string in the static table, call the host OSL to
	 * check for a match with one of the optional strings (such as
	 * "Module Device", "3.0 Thermal Model", etc.)
	 */
	status = acpi_os_validate_interface(string_desc->string.pointer);
	if (ACPI_SUCCESS(status)) {

		/* The interface is supported */

		return_ACPI_STATUS(AE_CTRL_TERMINATE);
	}

	/* The interface is not supported */

	return_desc->integer.value = 0;
L
Len Brown 已提交
156
	return_ACPI_STATUS(AE_CTRL_TERMINATE);
L
Linus Torvalds 已提交
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_evaluate_object
 *
 * PARAMETERS:  prefix_node         - Starting node
 *              Path                - Path to object from starting node
 *              expected_return_types - Bitmap of allowed return types
 *              return_desc         - Where a return value is stored
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Evaluates a namespace object and verifies the type of the
 *              return object.  Common code that simplifies accessing objects
 *              that have required return objects of fixed types.
 *
 *              NOTE: Internal function, no parameter validation
 *
 ******************************************************************************/

acpi_status
L
Len Brown 已提交
179 180 181 182
acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
			char *path,
			u32 expected_return_btypes,
			union acpi_operand_object **return_desc)
L
Linus Torvalds 已提交
183
{
L
Len Brown 已提交
184 185 186
	struct acpi_parameter_info info;
	acpi_status status;
	u32 return_btype;
L
Linus Torvalds 已提交
187

B
Bob Moore 已提交
188
	ACPI_FUNCTION_TRACE(ut_evaluate_object);
L
Linus Torvalds 已提交
189 190 191 192 193 194 195

	info.node = prefix_node;
	info.parameters = NULL;
	info.parameter_type = ACPI_PARAM_ARGS;

	/* Evaluate the object/method */

L
Len Brown 已提交
196 197
	status = acpi_ns_evaluate_relative(path, &info);
	if (ACPI_FAILURE(status)) {
L
Linus Torvalds 已提交
198
		if (status == AE_NOT_FOUND) {
L
Len Brown 已提交
199 200 201 202 203
			ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
					  "[%4.4s.%s] was not found\n",
					  acpi_ut_get_node_name(prefix_node),
					  path));
		} else {
B
Bob Moore 已提交
204 205
			ACPI_ERROR_METHOD("Method execution failed",
					  prefix_node, path, status);
L
Linus Torvalds 已提交
206 207
		}

L
Len Brown 已提交
208
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
209 210 211 212 213 214
	}

	/* Did we get a return object? */

	if (!info.return_object) {
		if (expected_return_btypes) {
B
Bob Moore 已提交
215 216
			ACPI_ERROR_METHOD("No object was returned from",
					  prefix_node, path, AE_NOT_EXIST);
L
Linus Torvalds 已提交
217

L
Len Brown 已提交
218
			return_ACPI_STATUS(AE_NOT_EXIST);
L
Linus Torvalds 已提交
219 220
		}

L
Len Brown 已提交
221
		return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
222 223 224 225
	}

	/* Map the return object type to the bitmapped type */

L
Len Brown 已提交
226
	switch (ACPI_GET_OBJECT_TYPE(info.return_object)) {
L
Linus Torvalds 已提交
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
	case ACPI_TYPE_INTEGER:
		return_btype = ACPI_BTYPE_INTEGER;
		break;

	case ACPI_TYPE_BUFFER:
		return_btype = ACPI_BTYPE_BUFFER;
		break;

	case ACPI_TYPE_STRING:
		return_btype = ACPI_BTYPE_STRING;
		break;

	case ACPI_TYPE_PACKAGE:
		return_btype = ACPI_BTYPE_PACKAGE;
		break;

	default:
		return_btype = 0;
		break;
	}

L
Len Brown 已提交
248
	if ((acpi_gbl_enable_interpreter_slack) && (!expected_return_btypes)) {
L
Linus Torvalds 已提交
249 250 251 252 253
		/*
		 * We received a return object, but one was not expected.  This can
		 * happen frequently if the "implicit return" feature is enabled.
		 * Just delete the return object and return AE_OK.
		 */
L
Len Brown 已提交
254 255
		acpi_ut_remove_reference(info.return_object);
		return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
256 257 258 259 260
	}

	/* Is the return object one of the expected types? */

	if (!(expected_return_btypes & return_btype)) {
B
Bob Moore 已提交
261 262 263 264 265 266 267 268
		ACPI_ERROR_METHOD("Return object type is incorrect",
				  prefix_node, path, AE_TYPE);

		ACPI_ERROR((AE_INFO,
			    "Type returned from %s was incorrect: %s, expected Btypes: %X",
			    path,
			    acpi_ut_get_object_type_name(info.return_object),
			    expected_return_btypes));
L
Linus Torvalds 已提交
269 270 271

		/* On error exit, we must delete the return object */

L
Len Brown 已提交
272 273
		acpi_ut_remove_reference(info.return_object);
		return_ACPI_STATUS(AE_TYPE);
L
Linus Torvalds 已提交
274 275 276 277 278
	}

	/* Object type is OK, return it */

	*return_desc = info.return_object;
L
Len Brown 已提交
279
	return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
280 281 282 283 284 285
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_evaluate_numeric_object
 *
R
Robert Moore 已提交
286
 * PARAMETERS:  object_name         - Object name to be evaluated
L
Linus Torvalds 已提交
287
 *              device_node         - Node for the device
R
Robert Moore 已提交
288
 *              Address             - Where the value is returned
L
Linus Torvalds 已提交
289 290 291 292 293 294 295 296 297 298 299
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Evaluates a numeric namespace object for a selected device
 *              and stores result in *Address.
 *
 *              NOTE: Internal function, no parameter validation
 *
 ******************************************************************************/

acpi_status
L
Len Brown 已提交
300 301 302
acpi_ut_evaluate_numeric_object(char *object_name,
				struct acpi_namespace_node *device_node,
				acpi_integer * address)
L
Linus Torvalds 已提交
303
{
L
Len Brown 已提交
304 305
	union acpi_operand_object *obj_desc;
	acpi_status status;
L
Linus Torvalds 已提交
306

B
Bob Moore 已提交
307
	ACPI_FUNCTION_TRACE(ut_evaluate_numeric_object);
L
Linus Torvalds 已提交
308

L
Len Brown 已提交
309 310 311 312
	status = acpi_ut_evaluate_object(device_node, object_name,
					 ACPI_BTYPE_INTEGER, &obj_desc);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
313 314 315 316 317 318 319 320
	}

	/* Get the returned Integer */

	*address = obj_desc->integer.value;

	/* On exit, we must delete the return object */

L
Len Brown 已提交
321 322
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_copy_id_string
 *
 * PARAMETERS:  Destination         - Where to copy the string
 *              Source              - Source string
 *              max_length          - Length of the destination buffer
 *
 * RETURN:      None
 *
 * DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods.
 *              Performs removal of a leading asterisk if present -- workaround
 *              for a known issue on a bunch of machines.
 *
 ******************************************************************************/

static void
L
Len Brown 已提交
342
acpi_ut_copy_id_string(char *destination, char *source, acpi_size max_length)
L
Linus Torvalds 已提交
343 344 345 346 347 348 349 350 351 352 353 354 355 356
{

	/*
	 * Workaround for ID strings that have a leading asterisk. This construct
	 * is not allowed by the ACPI specification  (ID strings must be
	 * alphanumeric), but enough existing machines have this embedded in their
	 * ID strings that the following code is useful.
	 */
	if (*source == '*') {
		source++;
	}

	/* Do the actual copy */

L
Len Brown 已提交
357
	ACPI_STRNCPY(destination, source, max_length);
L
Linus Torvalds 已提交
358 359 360 361 362 363 364
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_execute_HID
 *
 * PARAMETERS:  device_node         - Node for the device
R
Robert Moore 已提交
365
 *              Hid                 - Where the HID is returned
L
Linus Torvalds 已提交
366 367 368 369 370 371 372 373 374 375 376
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Executes the _HID control method that returns the hardware
 *              ID of the device.
 *
 *              NOTE: Internal function, no parameter validation
 *
 ******************************************************************************/

acpi_status
L
Len Brown 已提交
377 378
acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
		    struct acpi_device_id *hid)
L
Linus Torvalds 已提交
379
{
L
Len Brown 已提交
380 381
	union acpi_operand_object *obj_desc;
	acpi_status status;
L
Linus Torvalds 已提交
382

B
Bob Moore 已提交
383
	ACPI_FUNCTION_TRACE(ut_execute_HID);
L
Linus Torvalds 已提交
384

L
Len Brown 已提交
385 386 387 388 389
	status = acpi_ut_evaluate_object(device_node, METHOD_NAME__HID,
					 ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
					 &obj_desc);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
390 391
	}

L
Len Brown 已提交
392
	if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
B
Bob Moore 已提交
393

L
Linus Torvalds 已提交
394 395
		/* Convert the Numeric HID to string */

L
Len Brown 已提交
396 397 398
		acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value,
					  hid->value);
	} else {
L
Linus Torvalds 已提交
399 400
		/* Copy the String HID from the returned object */

L
Len Brown 已提交
401 402
		acpi_ut_copy_id_string(hid->value, obj_desc->string.pointer,
				       sizeof(hid->value));
L
Linus Torvalds 已提交
403 404 405 406
	}

	/* On exit, we must delete the return object */

L
Len Brown 已提交
407 408
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_translate_one_cid
 *
 * PARAMETERS:  obj_desc            - _CID object, must be integer or string
 *              one_cid             - Where the CID string is returned
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Return a numeric or string _CID value as a string.
 *              (Compatible ID)
 *
 *              NOTE:  Assumes a maximum _CID string length of
 *                     ACPI_MAX_CID_LENGTH.
 *
 ******************************************************************************/

static acpi_status
L
Len Brown 已提交
429 430
acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
			  struct acpi_compatible_id *one_cid)
L
Linus Torvalds 已提交
431 432
{

L
Len Brown 已提交
433
	switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
L
Linus Torvalds 已提交
434 435 436 437
	case ACPI_TYPE_INTEGER:

		/* Convert the Numeric CID to string */

L
Len Brown 已提交
438 439
		acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value,
					  one_cid->value);
L
Linus Torvalds 已提交
440 441 442 443 444 445 446 447 448 449
		return (AE_OK);

	case ACPI_TYPE_STRING:

		if (obj_desc->string.length > ACPI_MAX_CID_LENGTH) {
			return (AE_AML_STRING_LIMIT);
		}

		/* Copy the String CID from the returned object */

L
Len Brown 已提交
450 451
		acpi_ut_copy_id_string(one_cid->value, obj_desc->string.pointer,
				       ACPI_MAX_CID_LENGTH);
L
Linus Torvalds 已提交
452 453 454 455 456 457 458 459 460 461 462 463 464
		return (AE_OK);

	default:

		return (AE_TYPE);
	}
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_execute_CID
 *
 * PARAMETERS:  device_node         - Node for the device
R
Robert Moore 已提交
465
 *              return_cid_list     - Where the CID list is returned
L
Linus Torvalds 已提交
466 467 468 469 470 471 472 473 474 475 476
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Executes the _CID control method that returns one or more
 *              compatible hardware IDs for the device.
 *
 *              NOTE: Internal function, no parameter validation
 *
 ******************************************************************************/

acpi_status
L
Len Brown 已提交
477 478
acpi_ut_execute_CID(struct acpi_namespace_node * device_node,
		    struct acpi_compatible_id_list ** return_cid_list)
L
Linus Torvalds 已提交
479
{
L
Len Brown 已提交
480 481 482 483
	union acpi_operand_object *obj_desc;
	acpi_status status;
	u32 count;
	u32 size;
L
Linus Torvalds 已提交
484
	struct acpi_compatible_id_list *cid_list;
L
Len Brown 已提交
485
	acpi_native_uint i;
L
Linus Torvalds 已提交
486

B
Bob Moore 已提交
487
	ACPI_FUNCTION_TRACE(ut_execute_CID);
L
Linus Torvalds 已提交
488 489 490

	/* Evaluate the _CID method for this device */

L
Len Brown 已提交
491 492 493 494 495
	status = acpi_ut_evaluate_object(device_node, METHOD_NAME__CID,
					 ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING
					 | ACPI_BTYPE_PACKAGE, &obj_desc);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
496 497 498 499 500
	}

	/* Get the number of _CIDs returned */

	count = 1;
L
Len Brown 已提交
501
	if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) {
L
Linus Torvalds 已提交
502 503 504 505 506
		count = obj_desc->package.count;
	}

	/* Allocate a worst-case buffer for the _CIDs */

L
Len Brown 已提交
507 508
	size = (((count - 1) * sizeof(struct acpi_compatible_id)) +
		sizeof(struct acpi_compatible_id_list));
L
Linus Torvalds 已提交
509

B
Bob Moore 已提交
510
	cid_list = ACPI_ALLOCATE_ZEROED((acpi_size) size);
L
Linus Torvalds 已提交
511
	if (!cid_list) {
L
Len Brown 已提交
512
		return_ACPI_STATUS(AE_NO_MEMORY);
L
Linus Torvalds 已提交
513 514 515 516 517 518 519 520
	}

	/* Init CID list */

	cid_list->count = count;
	cid_list->size = size;

	/*
R
Robert Moore 已提交
521 522 523 524
	 *  A _CID can return either a single compatible ID or a package of
	 *  compatible IDs.  Each compatible ID can be one of the following:
	 *  1) Integer (32 bit compressed EISA ID) or
	 *  2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss")
L
Linus Torvalds 已提交
525 526 527 528
	 */

	/* The _CID object can be either a single CID or a package (list) of CIDs */

L
Len Brown 已提交
529
	if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) {
B
Bob Moore 已提交
530

L
Linus Torvalds 已提交
531 532 533
		/* Translate each package element */

		for (i = 0; i < count; i++) {
L
Len Brown 已提交
534 535 536 537 538
			status =
			    acpi_ut_translate_one_cid(obj_desc->package.
						      elements[i],
						      &cid_list->id[i]);
			if (ACPI_FAILURE(status)) {
L
Linus Torvalds 已提交
539 540 541
				break;
			}
		}
L
Len Brown 已提交
542
	} else {
L
Linus Torvalds 已提交
543 544
		/* Only one CID, translate to a string */

L
Len Brown 已提交
545
		status = acpi_ut_translate_one_cid(obj_desc, cid_list->id);
L
Linus Torvalds 已提交
546 547 548 549
	}

	/* Cleanup on error */

L
Len Brown 已提交
550
	if (ACPI_FAILURE(status)) {
B
Bob Moore 已提交
551
		ACPI_FREE(cid_list);
L
Len Brown 已提交
552
	} else {
L
Linus Torvalds 已提交
553 554 555 556 557
		*return_cid_list = cid_list;
	}

	/* On exit, we must delete the _CID return object */

L
Len Brown 已提交
558 559
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
560 561 562 563 564 565 566
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_execute_UID
 *
 * PARAMETERS:  device_node         - Node for the device
R
Robert Moore 已提交
567
 *              Uid                 - Where the UID is returned
L
Linus Torvalds 已提交
568 569 570 571 572 573 574 575 576 577 578
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Executes the _UID control method that returns the hardware
 *              ID of the device.
 *
 *              NOTE: Internal function, no parameter validation
 *
 ******************************************************************************/

acpi_status
L
Len Brown 已提交
579 580
acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
		    struct acpi_device_id *uid)
L
Linus Torvalds 已提交
581
{
L
Len Brown 已提交
582 583
	union acpi_operand_object *obj_desc;
	acpi_status status;
L
Linus Torvalds 已提交
584

B
Bob Moore 已提交
585
	ACPI_FUNCTION_TRACE(ut_execute_UID);
L
Linus Torvalds 已提交
586

L
Len Brown 已提交
587 588 589 590 591
	status = acpi_ut_evaluate_object(device_node, METHOD_NAME__UID,
					 ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
					 &obj_desc);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
592 593
	}

L
Len Brown 已提交
594
	if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
B
Bob Moore 已提交
595

L
Linus Torvalds 已提交
596 597
		/* Convert the Numeric UID to string */

L
Len Brown 已提交
598 599 600
		acpi_ex_unsigned_integer_to_string(obj_desc->integer.value,
						   uid->value);
	} else {
L
Linus Torvalds 已提交
601 602
		/* Copy the String UID from the returned object */

L
Len Brown 已提交
603 604
		acpi_ut_copy_id_string(uid->value, obj_desc->string.pointer,
				       sizeof(uid->value));
L
Linus Torvalds 已提交
605 606 607 608
	}

	/* On exit, we must delete the return object */

L
Len Brown 已提交
609 610
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
611 612 613 614 615 616 617
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_execute_STA
 *
 * PARAMETERS:  device_node         - Node for the device
R
Robert Moore 已提交
618
 *              Flags               - Where the status flags are returned
L
Linus Torvalds 已提交
619 620 621 622 623 624 625 626 627 628 629
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Executes _STA for selected device and stores results in
 *              *Flags.
 *
 *              NOTE: Internal function, no parameter validation
 *
 ******************************************************************************/

acpi_status
L
Len Brown 已提交
630
acpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 * flags)
L
Linus Torvalds 已提交
631
{
L
Len Brown 已提交
632 633
	union acpi_operand_object *obj_desc;
	acpi_status status;
L
Linus Torvalds 已提交
634

B
Bob Moore 已提交
635
	ACPI_FUNCTION_TRACE(ut_execute_STA);
L
Linus Torvalds 已提交
636

L
Len Brown 已提交
637 638 639
	status = acpi_ut_evaluate_object(device_node, METHOD_NAME__STA,
					 ACPI_BTYPE_INTEGER, &obj_desc);
	if (ACPI_FAILURE(status)) {
L
Linus Torvalds 已提交
640
		if (AE_NOT_FOUND == status) {
L
Len Brown 已提交
641 642 643
			ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
					  "_STA on %4.4s was not found, assuming device is present\n",
					  acpi_ut_get_node_name(device_node)));
L
Linus Torvalds 已提交
644

B
Bob Moore 已提交
645
			*flags = ACPI_UINT32_MAX;
L
Linus Torvalds 已提交
646 647 648
			status = AE_OK;
		}

L
Len Brown 已提交
649
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
650 651 652 653 654 655 656 657
	}

	/* Extract the status flags */

	*flags = (u32) obj_desc->integer.value;

	/* On exit, we must delete the return object */

L
Len Brown 已提交
658 659
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
660 661 662 663 664 665 666
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_ut_execute_Sxds
 *
 * PARAMETERS:  device_node         - Node for the device
R
Robert Moore 已提交
667
 *              Flags               - Where the status flags are returned
L
Linus Torvalds 已提交
668 669 670 671 672 673 674 675 676 677 678
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Executes _STA for selected device and stores results in
 *              *Flags.
 *
 *              NOTE: Internal function, no parameter validation
 *
 ******************************************************************************/

acpi_status
L
Len Brown 已提交
679
acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest)
L
Linus Torvalds 已提交
680
{
L
Len Brown 已提交
681 682 683
	union acpi_operand_object *obj_desc;
	acpi_status status;
	u32 i;
L
Linus Torvalds 已提交
684

B
Bob Moore 已提交
685
	ACPI_FUNCTION_TRACE(ut_execute_sxds);
L
Linus Torvalds 已提交
686 687 688

	for (i = 0; i < 4; i++) {
		highest[i] = 0xFF;
L
Len Brown 已提交
689
		status = acpi_ut_evaluate_object(device_node,
B
Bob Moore 已提交
690 691 692 693
						 ACPI_CAST_PTR(char,
							       acpi_gbl_highest_dstate_names
							       [i]),
						 ACPI_BTYPE_INTEGER, &obj_desc);
L
Len Brown 已提交
694
		if (ACPI_FAILURE(status)) {
L
Linus Torvalds 已提交
695
			if (status != AE_NOT_FOUND) {
L
Len Brown 已提交
696 697
				ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
						  "%s on Device %4.4s, %s\n",
B
Bob Moore 已提交
698 699 700
						  ACPI_CAST_PTR(char,
								acpi_gbl_highest_dstate_names
								[i]),
L
Len Brown 已提交
701 702 703 704 705 706
						  acpi_ut_get_node_name
						  (device_node),
						  acpi_format_exception
						  (status)));

				return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
707
			}
L
Len Brown 已提交
708
		} else {
L
Linus Torvalds 已提交
709 710 711 712 713 714
			/* Extract the Dstate value */

			highest[i] = (u8) obj_desc->integer.value;

			/* Delete the return object */

L
Len Brown 已提交
715
			acpi_ut_remove_reference(obj_desc);
L
Linus Torvalds 已提交
716 717 718
		}
	}

L
Len Brown 已提交
719
	return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
720
}