rsutils.c 23.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7
/*******************************************************************************
 *
 * Module Name: rsutils - Utilities for the resource manager
 *
 ******************************************************************************/

/*
8
 * Copyright (C) 2000 - 2012, Intel Corp.
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
 * 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>
L
Len Brown 已提交
45 46 47
#include "accommon.h"
#include "acnamesp.h"
#include "acresrc.h"
L
Linus Torvalds 已提交
48 49

#define _COMPONENT          ACPI_RESOURCES
L
Len Brown 已提交
50
ACPI_MODULE_NAME("rsutils")
L
Linus Torvalds 已提交
51

B
Bob Moore 已提交
52 53 54 55
/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_decode_bitmask
 *
56 57
 * PARAMETERS:  mask            - Bitmask to decode
 *              list            - Where the converted list is returned
B
Bob Moore 已提交
58 59 60 61 62 63 64 65
 *
 * RETURN:      Count of bits set (length of list)
 *
 * DESCRIPTION: Convert a bit mask into a list of values
 *
 ******************************************************************************/
u8 acpi_rs_decode_bitmask(u16 mask, u8 * list)
{
66
	u8 i;
B
Bob Moore 已提交
67 68
	u8 bit_count;

B
Bob Moore 已提交
69 70
	ACPI_FUNCTION_ENTRY();

B
Bob Moore 已提交
71 72 73 74
	/* Decode the mask bits */

	for (i = 0, bit_count = 0; mask; i++) {
		if (mask & 0x0001) {
75
			list[bit_count] = i;
B
Bob Moore 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88
			bit_count++;
		}

		mask >>= 1;
	}

	return (bit_count);
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_encode_bitmask
 *
89 90
 * PARAMETERS:  list            - List of values to encode
 *              count           - Length of list
B
Bob Moore 已提交
91 92 93 94 95 96 97 98 99
 *
 * RETURN:      Encoded bitmask
 *
 * DESCRIPTION: Convert a list of values to an encoded bitmask
 *
 ******************************************************************************/

u16 acpi_rs_encode_bitmask(u8 * list, u8 count)
{
100 101
	u32 i;
	u16 mask;
B
Bob Moore 已提交
102

B
Bob Moore 已提交
103 104
	ACPI_FUNCTION_ENTRY();

B
Bob Moore 已提交
105 106 107
	/* Encode the list into a single bitmask */

	for (i = 0, mask = 0; i < count; i++) {
108
		mask |= (0x1 << list[i]);
B
Bob Moore 已提交
109 110
	}

111
	return mask;
B
Bob Moore 已提交
112 113
}

B
Bob Moore 已提交
114 115 116 117
/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_move_data
 *
118 119
 * PARAMETERS:  destination         - Pointer to the destination descriptor
 *              source              - Pointer to the source descriptor
B
Bob Moore 已提交
120 121 122 123 124 125 126 127 128 129
 *              item_count          - How many items to move
 *              move_type           - Byte width
 *
 * RETURN:      None
 *
 * DESCRIPTION: Move multiple data items from one descriptor to another. Handles
 *              alignment issues and endian issues if necessary, as configured
 *              via the ACPI_MOVE_* macros. (This is why a memcpy is not used)
 *
 ******************************************************************************/
B
Bob Moore 已提交
130

B
Bob Moore 已提交
131 132 133
void
acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type)
{
134
	u32 i;
B
Bob Moore 已提交
135

B
Bob Moore 已提交
136 137
	ACPI_FUNCTION_ENTRY();

B
Bob Moore 已提交
138 139 140 141
	/* One move per item */

	for (i = 0; i < item_count; i++) {
		switch (move_type) {
B
Bob Moore 已提交
142 143 144 145 146
			/*
			 * For the 8-bit case, we can perform the move all at once
			 * since there are no alignment or endian issues
			 */
		case ACPI_RSC_MOVE8:
147 148 149
		case ACPI_RSC_MOVE_GPIO_RES:
		case ACPI_RSC_MOVE_SERIAL_VEN:
		case ACPI_RSC_MOVE_SERIAL_RES:
B
Bob Moore 已提交
150 151
			ACPI_MEMCPY(destination, source, item_count);
			return;
B
Bob Moore 已提交
152

B
Bob Moore 已提交
153 154
			/*
			 * 16-, 32-, and 64-bit cases must use the move macros that perform
L
Lucas De Marchi 已提交
155
			 * endian conversion and/or accommodate hardware that cannot perform
B
Bob Moore 已提交
156 157 158
			 * misaligned memory transfers
			 */
		case ACPI_RSC_MOVE16:
159
		case ACPI_RSC_MOVE_GPIO_PIN:
B
Bob Moore 已提交
160 161
			ACPI_MOVE_16_TO_16(&ACPI_CAST_PTR(u16, destination)[i],
					   &ACPI_CAST_PTR(u16, source)[i]);
B
Bob Moore 已提交
162 163
			break;

B
Bob Moore 已提交
164
		case ACPI_RSC_MOVE32:
B
Bob Moore 已提交
165 166
			ACPI_MOVE_32_TO_32(&ACPI_CAST_PTR(u32, destination)[i],
					   &ACPI_CAST_PTR(u32, source)[i]);
B
Bob Moore 已提交
167 168
			break;

B
Bob Moore 已提交
169
		case ACPI_RSC_MOVE64:
B
Bob Moore 已提交
170 171
			ACPI_MOVE_64_TO_64(&ACPI_CAST_PTR(u64, destination)[i],
					   &ACPI_CAST_PTR(u64, source)[i]);
B
Bob Moore 已提交
172 173 174 175 176 177 178 179 180 181
			break;

		default:
			return;
		}
	}
}

/*******************************************************************************
 *
B
Bob Moore 已提交
182
 * FUNCTION:    acpi_rs_set_resource_length
B
Bob Moore 已提交
183
 *
B
Bob Moore 已提交
184 185
 * PARAMETERS:  total_length        - Length of the AML descriptor, including
 *                                    the header and length fields.
186
 *              aml                 - Pointer to the raw AML descriptor
B
Bob Moore 已提交
187
 *
B
Bob Moore 已提交
188
 * RETURN:      None
B
Bob Moore 已提交
189
 *
B
Bob Moore 已提交
190 191 192 193
 * DESCRIPTION: Set the resource_length field of an AML
 *              resource descriptor, both Large and Small descriptors are
 *              supported automatically. Note: Descriptor Type field must
 *              be valid.
B
Bob Moore 已提交
194 195 196
 *
 ******************************************************************************/

B
Bob Moore 已提交
197 198 199
void
acpi_rs_set_resource_length(acpi_rsdesc_size total_length,
			    union aml_resource *aml)
B
Bob Moore 已提交
200
{
B
Bob Moore 已提交
201
	acpi_rs_length resource_length;
B
Bob Moore 已提交
202 203 204

	ACPI_FUNCTION_ENTRY();

B
Bob Moore 已提交
205
	/* Length is the total descriptor length minus the header length */
B
Bob Moore 已提交
206

B
Bob Moore 已提交
207 208
	resource_length = (acpi_rs_length)
	    (total_length - acpi_ut_get_resource_header_length(aml));
B
Bob Moore 已提交
209

B
Bob Moore 已提交
210
	/* Length is stored differently for large and small descriptors */
B
Bob Moore 已提交
211

B
Bob Moore 已提交
212
	if (aml->small_header.descriptor_type & ACPI_RESOURCE_NAME_LARGE) {
B
Bob Moore 已提交
213

B
Bob Moore 已提交
214
		/* Large descriptor -- bytes 1-2 contain the 16-bit length */
B
Bob Moore 已提交
215

B
Bob Moore 已提交
216 217
		ACPI_MOVE_16_TO_16(&aml->large_header.resource_length,
				   &resource_length);
B
Bob Moore 已提交
218
	} else {
B
Bob Moore 已提交
219
		/* Small descriptor -- bits 2:0 of byte 0 contain the length */
B
Bob Moore 已提交
220

B
Bob Moore 已提交
221
		aml->small_header.descriptor_type = (u8)
B
Bob Moore 已提交
222

B
Bob Moore 已提交
223 224 225
		    /* Clear any existing length, preserving descriptor type bits */
		    ((aml->small_header.
		      descriptor_type & ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK)
B
Bob Moore 已提交
226

B
Bob Moore 已提交
227
		     | resource_length);
B
Bob Moore 已提交
228 229 230 231 232 233 234 235 236 237
	}
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_set_resource_header
 *
 * PARAMETERS:  descriptor_type     - Byte to be inserted as the type
 *              total_length        - Length of the AML descriptor, including
 *                                    the header and length fields.
238
 *              aml                 - Pointer to the raw AML descriptor
B
Bob Moore 已提交
239 240 241 242 243 244 245 246 247 248 249
 *
 * RETURN:      None
 *
 * DESCRIPTION: Set the descriptor_type and resource_length fields of an AML
 *              resource descriptor, both Large and Small descriptors are
 *              supported automatically
 *
 ******************************************************************************/

void
acpi_rs_set_resource_header(u8 descriptor_type,
B
Bob Moore 已提交
250 251
			    acpi_rsdesc_size total_length,
			    union aml_resource *aml)
B
Bob Moore 已提交
252 253 254
{
	ACPI_FUNCTION_ENTRY();

B
Bob Moore 已提交
255
	/* Set the Resource Type */
B
Bob Moore 已提交
256 257 258

	aml->small_header.descriptor_type = descriptor_type;

B
Bob Moore 已提交
259
	/* Set the Resource Length */
B
Bob Moore 已提交
260

B
Bob Moore 已提交
261
	acpi_rs_set_resource_length(total_length, aml);
B
Bob Moore 已提交
262 263 264 265 266 267
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_strcpy
 *
268 269
 * PARAMETERS:  destination         - Pointer to the destination string
 *              source              - Pointer to the source string
B
Bob Moore 已提交
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
 *
 * RETURN:      String length, including NULL terminator
 *
 * DESCRIPTION: Local string copy that returns the string length, saving a
 *              strcpy followed by a strlen.
 *
 ******************************************************************************/

static u16 acpi_rs_strcpy(char *destination, char *source)
{
	u16 i;

	ACPI_FUNCTION_ENTRY();

	for (i = 0; source[i]; i++) {
		destination[i] = source[i];
	}

	destination[i] = 0;

	/* Return string length including the NULL terminator */

	return ((u16) (i + 1));
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_get_resource_source
 *
 * PARAMETERS:  resource_length     - Length field of the descriptor
 *              minimum_length      - Minimum length of the descriptor (minus
 *                                    any optional fields)
 *              resource_source     - Where the resource_source is returned
303
 *              aml                 - Pointer to the raw AML descriptor
B
Bob Moore 已提交
304 305 306
 *              string_ptr          - (optional) where to store the actual
 *                                    resource_source string
 *
B
Bob Moore 已提交
307 308
 * RETURN:      Length of the string plus NULL terminator, rounded up to native
 *              word boundary
B
Bob Moore 已提交
309 310 311 312 313 314
 *
 * DESCRIPTION: Copy the optional resource_source data from a raw AML descriptor
 *              to an internal resource descriptor
 *
 ******************************************************************************/

B
Bob Moore 已提交
315 316 317
acpi_rs_length
acpi_rs_get_resource_source(acpi_rs_length resource_length,
			    acpi_rs_length minimum_length,
B
Bob Moore 已提交
318 319 320
			    struct acpi_resource_source * resource_source,
			    union aml_resource * aml, char *string_ptr)
{
B
Bob Moore 已提交
321
	acpi_rsdesc_size total_length;
B
Bob Moore 已提交
322 323 324 325 326 327
	u8 *aml_resource_source;

	ACPI_FUNCTION_ENTRY();

	total_length =
	    resource_length + sizeof(struct aml_resource_large_header);
B
Bob Moore 已提交
328
	aml_resource_source = ACPI_ADD_PTR(u8, aml, minimum_length);
B
Bob Moore 已提交
329 330 331 332 333 334 335 336

	/*
	 * resource_source is present if the length of the descriptor is longer than
	 * the minimum length.
	 *
	 * Note: Some resource descriptors will have an additional null, so
	 * we add 1 to the minimum length.
	 */
B
Bob Moore 已提交
337
	if (total_length > (acpi_rsdesc_size) (minimum_length + 1)) {
B
Bob Moore 已提交
338

B
Bob Moore 已提交
339 340 341 342 343 344 345 346 347 348
		/* Get the resource_source_index */

		resource_source->index = aml_resource_source[0];

		resource_source->string_ptr = string_ptr;
		if (!string_ptr) {
			/*
			 * String destination pointer is not specified; Set the String
			 * pointer to the end of the current resource_source structure.
			 */
B
Bob Moore 已提交
349 350 351
			resource_source->string_ptr =
			    ACPI_ADD_PTR(char, resource_source,
					 sizeof(struct acpi_resource_source));
B
Bob Moore 已提交
352 353
		}

B
Bob Moore 已提交
354
		/*
B
Bob Moore 已提交
355 356 357
		 * In order for the Resource length to be a multiple of the native
		 * word, calculate the length of the string (+1 for NULL terminator)
		 * and expand to the next word multiple.
B
Bob Moore 已提交
358 359 360
		 *
		 * Zero the entire area of the buffer.
		 */
L
Len Brown 已提交
361 362
		total_length = (u32)
		ACPI_STRLEN(ACPI_CAST_PTR(char, &aml_resource_source[1])) + 1;
B
Bob Moore 已提交
363
		total_length = (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(total_length);
B
Bob Moore 已提交
364

B
Bob Moore 已提交
365 366
		ACPI_MEMSET(resource_source->string_ptr, 0, total_length);

B
Bob Moore 已提交
367 368 369 370
		/* Copy the resource_source string to the destination */

		resource_source->string_length =
		    acpi_rs_strcpy(resource_source->string_ptr,
B
Bob Moore 已提交
371 372
				   ACPI_CAST_PTR(char,
						 &aml_resource_source[1]));
B
Bob Moore 已提交
373

B
Bob Moore 已提交
374
		return ((acpi_rs_length) total_length);
B
Bob Moore 已提交
375
	}
B
Bob Moore 已提交
376 377 378 379 380 381 382

	/* resource_source is not present */

	resource_source->index = 0;
	resource_source->string_length = 0;
	resource_source->string_ptr = NULL;
	return (0);
B
Bob Moore 已提交
383 384 385 386 387 388
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_set_resource_source
 *
389
 * PARAMETERS:  aml                 - Pointer to the raw AML descriptor
B
Bob Moore 已提交
390 391 392 393 394 395 396
 *              minimum_length      - Minimum length of the descriptor (minus
 *                                    any optional fields)
 *              resource_source     - Internal resource_source

 *
 * RETURN:      Total length of the AML descriptor
 *
B
Bob Moore 已提交
397
 * DESCRIPTION: Convert an optional resource_source from internal format to a
B
Bob Moore 已提交
398 399 400 401
 *              raw AML resource descriptor
 *
 ******************************************************************************/

B
Bob Moore 已提交
402
acpi_rsdesc_size
B
Bob Moore 已提交
403
acpi_rs_set_resource_source(union aml_resource * aml,
B
Bob Moore 已提交
404
			    acpi_rs_length minimum_length,
B
Bob Moore 已提交
405 406 407
			    struct acpi_resource_source * resource_source)
{
	u8 *aml_resource_source;
B
Bob Moore 已提交
408
	acpi_rsdesc_size descriptor_length;
B
Bob Moore 已提交
409 410 411 412 413 414 415 416

	ACPI_FUNCTION_ENTRY();

	descriptor_length = minimum_length;

	/* Non-zero string length indicates presence of a resource_source */

	if (resource_source->string_length) {
B
Bob Moore 已提交
417

B
Bob Moore 已提交
418 419
		/* Point to the end of the AML descriptor */

B
Bob Moore 已提交
420
		aml_resource_source = ACPI_ADD_PTR(u8, aml, minimum_length);
B
Bob Moore 已提交
421 422 423 424 425 426 427

		/* Copy the resource_source_index */

		aml_resource_source[0] = (u8) resource_source->index;

		/* Copy the resource_source string */

B
Bob Moore 已提交
428
		ACPI_STRCPY(ACPI_CAST_PTR(char, &aml_resource_source[1]),
B
Bob Moore 已提交
429 430 431 432 433 434 435
			    resource_source->string_ptr);

		/*
		 * Add the length of the string (+ 1 for null terminator) to the
		 * final descriptor length
		 */
		descriptor_length +=
B
Bob Moore 已提交
436
		    ((acpi_rsdesc_size) resource_source->string_length + 1);
B
Bob Moore 已提交
437 438 439 440 441 442 443
	}

	/* Return the new total length of the AML descriptor */

	return (descriptor_length);
}

L
Linus Torvalds 已提交
444 445 446 447
/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_get_prt_method_data
 *
448
 * PARAMETERS:  node            - Device node
B
Bob Moore 已提交
449 450
 *              ret_buffer      - Pointer to a buffer structure for the
 *                                results
L
Linus Torvalds 已提交
451 452 453 454 455 456 457 458 459 460
 *
 * RETURN:      Status
 *
 * DESCRIPTION: This function is called to get the _PRT value of an object
 *              contained in an object specified by the handle passed in
 *
 *              If the function fails an appropriate status will be returned
 *              and the contents of the callers buffer is undefined.
 *
 ******************************************************************************/
B
Bob Moore 已提交
461

L
Linus Torvalds 已提交
462
acpi_status
B
Bob Moore 已提交
463 464
acpi_rs_get_prt_method_data(struct acpi_namespace_node * node,
			    struct acpi_buffer * ret_buffer)
L
Linus Torvalds 已提交
465
{
L
Len Brown 已提交
466 467
	union acpi_operand_object *obj_desc;
	acpi_status status;
L
Linus Torvalds 已提交
468

B
Bob Moore 已提交
469
	ACPI_FUNCTION_TRACE(rs_get_prt_method_data);
L
Linus Torvalds 已提交
470 471 472

	/* Parameters guaranteed valid by caller */

R
Robert Moore 已提交
473 474
	/* Execute the method, no parameters */

B
Bob Moore 已提交
475
	status = acpi_ut_evaluate_object(node, METHOD_NAME__PRT,
L
Len Brown 已提交
476 477 478
					 ACPI_BTYPE_PACKAGE, &obj_desc);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
479 480 481 482 483 484
	}

	/*
	 * Create a resource linked list from the byte stream buffer that comes
	 * back from the _CRS method execution.
	 */
L
Len Brown 已提交
485
	status = acpi_rs_create_pci_routing_table(obj_desc, ret_buffer);
L
Linus Torvalds 已提交
486 487 488

	/* On exit, we must delete the object returned by evaluate_object */

L
Len Brown 已提交
489 490
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
491 492 493 494 495 496
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_get_crs_method_data
 *
497
 * PARAMETERS:  node            - Device node
B
Bob Moore 已提交
498 499
 *              ret_buffer      - Pointer to a buffer structure for the
 *                                results
L
Linus Torvalds 已提交
500 501 502 503 504 505 506 507 508 509 510 511
 *
 * RETURN:      Status
 *
 * DESCRIPTION: This function is called to get the _CRS value of an object
 *              contained in an object specified by the handle passed in
 *
 *              If the function fails an appropriate status will be returned
 *              and the contents of the callers buffer is undefined.
 *
 ******************************************************************************/

acpi_status
B
Bob Moore 已提交
512 513
acpi_rs_get_crs_method_data(struct acpi_namespace_node *node,
			    struct acpi_buffer *ret_buffer)
L
Linus Torvalds 已提交
514
{
L
Len Brown 已提交
515 516
	union acpi_operand_object *obj_desc;
	acpi_status status;
L
Linus Torvalds 已提交
517

B
Bob Moore 已提交
518
	ACPI_FUNCTION_TRACE(rs_get_crs_method_data);
L
Linus Torvalds 已提交
519 520 521

	/* Parameters guaranteed valid by caller */

R
Robert Moore 已提交
522 523
	/* Execute the method, no parameters */

B
Bob Moore 已提交
524
	status = acpi_ut_evaluate_object(node, METHOD_NAME__CRS,
L
Len Brown 已提交
525 526 527
					 ACPI_BTYPE_BUFFER, &obj_desc);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
528 529 530 531 532 533 534
	}

	/*
	 * Make the call to create a resource linked list from the
	 * byte stream buffer that comes back from the _CRS method
	 * execution.
	 */
L
Len Brown 已提交
535
	status = acpi_rs_create_resource_list(obj_desc, ret_buffer);
L
Linus Torvalds 已提交
536

537
	/* On exit, we must delete the object returned by evaluateObject */
L
Linus Torvalds 已提交
538

L
Len Brown 已提交
539 540
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
541 542 543 544 545 546
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_get_prs_method_data
 *
547
 * PARAMETERS:  node            - Device node
B
Bob Moore 已提交
548 549
 *              ret_buffer      - Pointer to a buffer structure for the
 *                                results
L
Linus Torvalds 已提交
550 551 552 553 554 555 556 557 558 559
 *
 * RETURN:      Status
 *
 * DESCRIPTION: This function is called to get the _PRS value of an object
 *              contained in an object specified by the handle passed in
 *
 *              If the function fails an appropriate status will be returned
 *              and the contents of the callers buffer is undefined.
 *
 ******************************************************************************/
R
Robert Moore 已提交
560

L
Linus Torvalds 已提交
561 562
#ifdef ACPI_FUTURE_USAGE
acpi_status
B
Bob Moore 已提交
563 564
acpi_rs_get_prs_method_data(struct acpi_namespace_node *node,
			    struct acpi_buffer *ret_buffer)
L
Linus Torvalds 已提交
565
{
L
Len Brown 已提交
566 567
	union acpi_operand_object *obj_desc;
	acpi_status status;
L
Linus Torvalds 已提交
568

B
Bob Moore 已提交
569
	ACPI_FUNCTION_TRACE(rs_get_prs_method_data);
L
Linus Torvalds 已提交
570 571 572

	/* Parameters guaranteed valid by caller */

R
Robert Moore 已提交
573 574
	/* Execute the method, no parameters */

B
Bob Moore 已提交
575
	status = acpi_ut_evaluate_object(node, METHOD_NAME__PRS,
L
Len Brown 已提交
576 577 578
					 ACPI_BTYPE_BUFFER, &obj_desc);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
579 580 581 582 583 584 585
	}

	/*
	 * Make the call to create a resource linked list from the
	 * byte stream buffer that comes back from the _CRS method
	 * execution.
	 */
L
Len Brown 已提交
586
	status = acpi_rs_create_resource_list(obj_desc, ret_buffer);
L
Linus Torvalds 已提交
587

588
	/* On exit, we must delete the object returned by evaluateObject */
L
Linus Torvalds 已提交
589

L
Len Brown 已提交
590 591
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
592
}
L
Len Brown 已提交
593
#endif				/*  ACPI_FUTURE_USAGE  */
L
Linus Torvalds 已提交
594

595 596 597 598
/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_get_aei_method_data
 *
599
 * PARAMETERS:  node            - Device node
600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638
 *              ret_buffer      - Pointer to a buffer structure for the
 *                                results
 *
 * RETURN:      Status
 *
 * DESCRIPTION: This function is called to get the _AEI value of an object
 *              contained in an object specified by the handle passed in
 *
 *              If the function fails an appropriate status will be returned
 *              and the contents of the callers buffer is undefined.
 *
 ******************************************************************************/

acpi_status
acpi_rs_get_aei_method_data(struct acpi_namespace_node *node,
			    struct acpi_buffer *ret_buffer)
{
	union acpi_operand_object *obj_desc;
	acpi_status status;

	ACPI_FUNCTION_TRACE(rs_get_aei_method_data);

	/* Parameters guaranteed valid by caller */

	/* Execute the method, no parameters */

	status = acpi_ut_evaluate_object(node, METHOD_NAME__AEI,
					 ACPI_BTYPE_BUFFER, &obj_desc);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
	}

	/*
	 * Make the call to create a resource linked list from the
	 * byte stream buffer that comes back from the _CRS method
	 * execution.
	 */
	status = acpi_rs_create_resource_list(obj_desc, ret_buffer);

639
	/* On exit, we must delete the object returned by evaluateObject */
640 641 642 643 644

	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
}

L
Linus Torvalds 已提交
645 646 647 648
/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_get_method_data
 *
649 650
 * PARAMETERS:  handle          - Handle to the containing object
 *              path            - Path to method, relative to Handle
B
Bob Moore 已提交
651 652
 *              ret_buffer      - Pointer to a buffer structure for the
 *                                results
L
Linus Torvalds 已提交
653 654 655 656 657 658 659 660 661 662 663 664
 *
 * RETURN:      Status
 *
 * DESCRIPTION: This function is called to get the _CRS or _PRS value of an
 *              object contained in an object specified by the handle passed in
 *
 *              If the function fails an appropriate status will be returned
 *              and the contents of the callers buffer is undefined.
 *
 ******************************************************************************/

acpi_status
L
Len Brown 已提交
665 666
acpi_rs_get_method_data(acpi_handle handle,
			char *path, struct acpi_buffer *ret_buffer)
L
Linus Torvalds 已提交
667
{
L
Len Brown 已提交
668 669
	union acpi_operand_object *obj_desc;
	acpi_status status;
L
Linus Torvalds 已提交
670

B
Bob Moore 已提交
671
	ACPI_FUNCTION_TRACE(rs_get_method_data);
L
Linus Torvalds 已提交
672 673 674

	/* Parameters guaranteed valid by caller */

R
Robert Moore 已提交
675 676
	/* Execute the method, no parameters */

L
Len Brown 已提交
677 678 679 680
	status =
	    acpi_ut_evaluate_object(handle, path, ACPI_BTYPE_BUFFER, &obj_desc);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
681 682 683 684 685 686 687
	}

	/*
	 * Make the call to create a resource linked list from the
	 * byte stream buffer that comes back from the method
	 * execution.
	 */
L
Len Brown 已提交
688
	status = acpi_rs_create_resource_list(obj_desc, ret_buffer);
L
Linus Torvalds 已提交
689 690 691

	/* On exit, we must delete the object returned by evaluate_object */

L
Len Brown 已提交
692 693
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
694 695 696 697 698 699
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_set_srs_method_data
 *
700
 * PARAMETERS:  node            - Device node
B
Bob Moore 已提交
701 702
 *              in_buffer       - Pointer to a buffer structure of the
 *                                parameter
L
Linus Torvalds 已提交
703 704 705 706 707 708 709 710 711
 *
 * RETURN:      Status
 *
 * DESCRIPTION: This function is called to set the _SRS of an object contained
 *              in an object specified by the handle passed in
 *
 *              If the function fails an appropriate status will be returned
 *              and the contents of the callers buffer is undefined.
 *
B
Bob Moore 已提交
712 713
 * Note: Parameters guaranteed valid by caller
 *
L
Linus Torvalds 已提交
714 715 716
 ******************************************************************************/

acpi_status
B
Bob Moore 已提交
717 718
acpi_rs_set_srs_method_data(struct acpi_namespace_node *node,
			    struct acpi_buffer *in_buffer)
L
Linus Torvalds 已提交
719
{
B
Bob Moore 已提交
720 721
	struct acpi_evaluate_info *info;
	union acpi_operand_object *args[2];
L
Len Brown 已提交
722 723
	acpi_status status;
	struct acpi_buffer buffer;
L
Linus Torvalds 已提交
724

B
Bob Moore 已提交
725
	ACPI_FUNCTION_TRACE(rs_set_srs_method_data);
L
Linus Torvalds 已提交
726

B
Bob Moore 已提交
727 728 729 730 731 732 733 734 735 736 737
	/* Allocate and initialize the evaluation information block */

	info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
	if (!info) {
		return_ACPI_STATUS(AE_NO_MEMORY);
	}

	info->prefix_node = node;
	info->pathname = METHOD_NAME__SRS;
	info->parameters = args;
	info->flags = ACPI_IGNORE_RETURN_VALUE;
L
Linus Torvalds 已提交
738 739 740

	/*
	 * The in_buffer parameter will point to a linked list of
B
Bob Moore 已提交
741
	 * resource parameters. It needs to be formatted into a
L
Linus Torvalds 已提交
742 743 744 745 746
	 * byte stream to be sent in as an input parameter to _SRS
	 *
	 * Convert the linked list into a byte stream
	 */
	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
B
Bob Moore 已提交
747
	status = acpi_rs_create_aml_resources(in_buffer->pointer, &buffer);
L
Len Brown 已提交
748
	if (ACPI_FAILURE(status)) {
B
Bob Moore 已提交
749
		goto cleanup;
L
Linus Torvalds 已提交
750 751
	}

B
Bob Moore 已提交
752
	/* Create and initialize the method parameter object */
R
Robert Moore 已提交
753

B
Bob Moore 已提交
754 755 756 757 758 759 760 761 762
	args[0] = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER);
	if (!args[0]) {
		/*
		 * Must free the buffer allocated above (otherwise it is freed
		 * later)
		 */
		ACPI_FREE(buffer.pointer);
		status = AE_NO_MEMORY;
		goto cleanup;
L
Linus Torvalds 已提交
763 764
	}

B
Bob Moore 已提交
765 766 767 768
	args[0]->buffer.length = (u32) buffer.length;
	args[0]->buffer.pointer = buffer.pointer;
	args[0]->common.flags = AOPOBJ_DATA_VALID;
	args[1] = NULL;
L
Linus Torvalds 已提交
769

B
Bob Moore 已提交
770
	/* Execute the method, no return value is expected */
L
Linus Torvalds 已提交
771

B
Bob Moore 已提交
772
	status = acpi_ns_evaluate(info);
R
Robert Moore 已提交
773

B
Bob Moore 已提交
774
	/* Clean up and return the status from acpi_ns_evaluate */
L
Linus Torvalds 已提交
775

B
Bob Moore 已提交
776
	acpi_ut_remove_reference(args[0]);
R
Robert Moore 已提交
777

B
Bob Moore 已提交
778 779
      cleanup:
	ACPI_FREE(info);
L
Len Brown 已提交
780
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
781
}