utxface.c 16.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2
/******************************************************************************
 *
3
 * Module Name: utxface - External interfaces, miscellaneous utility functions
L
Linus Torvalds 已提交
4 5 6 7
 *
 *****************************************************************************/

/*
8
 * Copyright (C) 2000 - 2015, 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
 * 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.
 */

44 45
#define EXPORT_ACPI_INTERFACES

L
Linus Torvalds 已提交
46
#include <acpi/acpi.h>
L
Len Brown 已提交
47 48
#include "accommon.h"
#include "acdebug.h"
L
Linus Torvalds 已提交
49 50

#define _COMPONENT          ACPI_UTILITIES
L
Len Brown 已提交
51
ACPI_MODULE_NAME("utxface")
L
Linus Torvalds 已提交
52 53 54 55 56 57 58 59 60

/*******************************************************************************
 *
 * FUNCTION:    acpi_terminate
 *
 * PARAMETERS:  None
 *
 * RETURN:      Status
 *
61
 * DESCRIPTION: Shutdown the ACPICA subsystem and release all resources.
L
Linus Torvalds 已提交
62 63
 *
 ******************************************************************************/
64
acpi_status __init acpi_terminate(void)
L
Linus Torvalds 已提交
65
{
L
Len Brown 已提交
66
	acpi_status status;
L
Linus Torvalds 已提交
67

B
Bob Moore 已提交
68
	ACPI_FUNCTION_TRACE(acpi_terminate);
L
Linus Torvalds 已提交
69

70 71 72 73 74 75 76 77 78 79 80 81 82
	/* Just exit if subsystem is already shutdown */

	if (acpi_gbl_shutdown) {
		ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated"));
		return_ACPI_STATUS(AE_OK);
	}

	/* Subsystem appears active, go ahead and shut it down */

	acpi_gbl_shutdown = TRUE;
	acpi_gbl_startup_flags = 0;
	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));

L
Linus Torvalds 已提交
83 84 85 86 87 88
	/* Terminate the AML Debugger if present */

	ACPI_DEBUGGER_EXEC(acpi_gbl_db_terminate_threads = TRUE);

	/* Shutdown and free all resources */

L
Len Brown 已提交
89
	acpi_ut_subsystem_shutdown();
L
Linus Torvalds 已提交
90 91 92

	/* Free the mutex objects */

L
Len Brown 已提交
93
	acpi_ut_mutex_terminate();
L
Linus Torvalds 已提交
94 95 96 97 98

#ifdef ACPI_DEBUGGER

	/* Shut down the debugger */

L
Len Brown 已提交
99
	acpi_db_terminate();
L
Linus Torvalds 已提交
100 101 102 103
#endif

	/* Now we can shutdown the OS-dependent layer */

L
Len Brown 已提交
104 105
	status = acpi_os_terminate();
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
106 107
}

108
ACPI_EXPORT_SYMBOL_INIT(acpi_terminate)
109

110
#ifndef ACPI_ASL_COMPILER
L
Linus Torvalds 已提交
111
#ifdef ACPI_FUTURE_USAGE
R
Robert Moore 已提交
112
/*******************************************************************************
L
Linus Torvalds 已提交
113 114 115 116 117 118 119 120
 *
 * FUNCTION:    acpi_subsystem_status
 *
 * PARAMETERS:  None
 *
 * RETURN:      Status of the ACPI subsystem
 *
 * DESCRIPTION: Other drivers that use the ACPI subsystem should call this
R
Robert Moore 已提交
121 122
 *              before making any other calls, to ensure the subsystem
 *              initialized successfully.
L
Linus Torvalds 已提交
123
 *
R
Robert Moore 已提交
124
 ******************************************************************************/
L
Len Brown 已提交
125
acpi_status acpi_subsystem_status(void)
L
Linus Torvalds 已提交
126
{
R
Robert Moore 已提交
127

L
Linus Torvalds 已提交
128 129
	if (acpi_gbl_startup_flags & ACPI_INITIALIZED_OK) {
		return (AE_OK);
L
Len Brown 已提交
130
	} else {
L
Linus Torvalds 已提交
131 132 133 134
		return (AE_ERROR);
	}
}

B
Bob Moore 已提交
135 136
ACPI_EXPORT_SYMBOL(acpi_subsystem_status)

R
Robert Moore 已提交
137
/*******************************************************************************
L
Linus Torvalds 已提交
138 139 140
 *
 * FUNCTION:    acpi_get_system_info
 *
R
Robert Moore 已提交
141 142
 * PARAMETERS:  out_buffer      - A buffer to receive the resources for the
 *                                device
L
Linus Torvalds 已提交
143
 *
144
 * RETURN:      status          - the status of the call
L
Linus Torvalds 已提交
145 146
 *
 * DESCRIPTION: This function is called to get information about the current
147
 *              state of the ACPI subsystem. It will return system information
L
Linus Torvalds 已提交
148 149 150 151 152 153
 *              in the out_buffer.
 *
 *              If the function fails an appropriate status will be returned
 *              and the value of out_buffer is undefined.
 *
 ******************************************************************************/
L
Len Brown 已提交
154
acpi_status acpi_get_system_info(struct acpi_buffer * out_buffer)
L
Linus Torvalds 已提交
155
{
L
Len Brown 已提交
156 157
	struct acpi_system_info *info_ptr;
	acpi_status status;
L
Linus Torvalds 已提交
158

B
Bob Moore 已提交
159
	ACPI_FUNCTION_TRACE(acpi_get_system_info);
L
Linus Torvalds 已提交
160 161 162

	/* Parameter validation */

L
Len Brown 已提交
163 164 165
	status = acpi_ut_validate_buffer(out_buffer);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
166 167 168 169
	}

	/* Validate/Allocate/Clear caller buffer */

L
Len Brown 已提交
170 171 172 173 174
	status =
	    acpi_ut_initialize_buffer(out_buffer,
				      sizeof(struct acpi_system_info));
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
175 176 177 178 179
	}

	/*
	 * Populate the return buffer
	 */
L
Len Brown 已提交
180
	info_ptr = (struct acpi_system_info *)out_buffer->pointer;
L
Linus Torvalds 已提交
181

L
Len Brown 已提交
182
	info_ptr->acpi_ca_version = ACPI_CA_VERSION;
L
Linus Torvalds 已提交
183 184 185

	/* System flags (ACPI capabilities) */

L
Len Brown 已提交
186
	info_ptr->flags = ACPI_SYS_MODE_ACPI;
L
Linus Torvalds 已提交
187 188 189

	/* Timer resolution - 24 or 32 bits  */

190
	if (acpi_gbl_FADT.flags & ACPI_FADT_32BIT_TIMER) {
L
Linus Torvalds 已提交
191
		info_ptr->timer_resolution = 24;
L
Len Brown 已提交
192
	} else {
L
Linus Torvalds 已提交
193 194 195 196 197
		info_ptr->timer_resolution = 32;
	}

	/* Clear the reserved fields */

L
Len Brown 已提交
198 199
	info_ptr->reserved1 = 0;
	info_ptr->reserved2 = 0;
L
Linus Torvalds 已提交
200 201 202

	/* Current debug levels */

L
Len Brown 已提交
203 204
	info_ptr->debug_layer = acpi_dbg_layer;
	info_ptr->debug_level = acpi_dbg_level;
L
Linus Torvalds 已提交
205

L
Len Brown 已提交
206
	return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
207 208
}

B
Bob Moore 已提交
209
ACPI_EXPORT_SYMBOL(acpi_get_system_info)
L
Linus Torvalds 已提交
210

L
Lv Zheng 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
/*******************************************************************************
 *
 * FUNCTION:    acpi_get_statistics
 *
 * PARAMETERS:  stats           - Where the statistics are returned
 *
 * RETURN:      status          - the status of the call
 *
 * DESCRIPTION: Get the contents of the various system counters
 *
 ******************************************************************************/
acpi_status acpi_get_statistics(struct acpi_statistics *stats)
{
	ACPI_FUNCTION_TRACE(acpi_get_statistics);

	/* Parameter validation */

	if (!stats) {
		return_ACPI_STATUS(AE_BAD_PARAMETER);
	}

	/* Various interrupt-based event counters */

	stats->sci_count = acpi_sci_count;
	stats->gpe_count = acpi_gpe_count;

237 238
	memcpy(stats->fixed_event_count, acpi_fixed_event_count,
	       sizeof(acpi_fixed_event_count));
L
Lv Zheng 已提交
239 240 241 242 243 244 245 246 247 248

	/* Other counters */

	stats->method_count = acpi_method_count;

	return_ACPI_STATUS(AE_OK);
}

ACPI_EXPORT_SYMBOL(acpi_get_statistics)

L
Linus Torvalds 已提交
249 250 251 252
/*****************************************************************************
 *
 * FUNCTION:    acpi_install_initialization_handler
 *
253 254
 * PARAMETERS:  handler             - Callback procedure
 *              function            - Not (currently) used, see below
L
Linus Torvalds 已提交
255 256 257 258 259 260 261 262 263
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Install an initialization handler
 *
 * TBD: When a second function is added, must save the Function also.
 *
 ****************************************************************************/
acpi_status
L
Len Brown 已提交
264
acpi_install_initialization_handler(acpi_init_handler handler, u32 function)
L
Linus Torvalds 已提交
265 266 267 268 269 270 271 272 273 274 275
{

	if (!handler) {
		return (AE_BAD_PARAMETER);
	}

	if (acpi_gbl_init_handler) {
		return (AE_ALREADY_EXISTS);
	}

	acpi_gbl_init_handler = handler;
276
	return (AE_OK);
L
Linus Torvalds 已提交
277 278
}

B
Bob Moore 已提交
279
ACPI_EXPORT_SYMBOL(acpi_install_initialization_handler)
L
Len Brown 已提交
280
#endif				/*  ACPI_FUTURE_USAGE  */
281

L
Linus Torvalds 已提交
282 283 284 285 286 287 288 289 290 291 292
/*****************************************************************************
 *
 * FUNCTION:    acpi_purge_cached_objects
 *
 * PARAMETERS:  None
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Empty all caches (delete the cached objects)
 *
 ****************************************************************************/
L
Len Brown 已提交
293
acpi_status acpi_purge_cached_objects(void)
L
Linus Torvalds 已提交
294
{
B
Bob Moore 已提交
295
	ACPI_FUNCTION_TRACE(acpi_purge_cached_objects);
L
Linus Torvalds 已提交
296

L
Len Brown 已提交
297 298 299 300
	(void)acpi_os_purge_cache(acpi_gbl_state_cache);
	(void)acpi_os_purge_cache(acpi_gbl_operand_cache);
	(void)acpi_os_purge_cache(acpi_gbl_ps_node_cache);
	(void)acpi_os_purge_cache(acpi_gbl_ps_node_ext_cache);
301

L
Len Brown 已提交
302
	return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
303
}
B
Bob Moore 已提交
304 305

ACPI_EXPORT_SYMBOL(acpi_purge_cached_objects)
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324

/*****************************************************************************
 *
 * FUNCTION:    acpi_install_interface
 *
 * PARAMETERS:  interface_name      - The interface to install
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Install an _OSI interface to the global list
 *
 ****************************************************************************/
acpi_status acpi_install_interface(acpi_string interface_name)
{
	acpi_status status;
	struct acpi_interface_info *interface_info;

	/* Parameter validation */

325
	if (!interface_name || (strlen(interface_name) == 0)) {
326 327 328
		return (AE_BAD_PARAMETER);
	}

329 330 331 332
	status = acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
	if (ACPI_FAILURE(status)) {
		return (status);
	}
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376

	/* Check if the interface name is already in the global list */

	interface_info = acpi_ut_get_interface(interface_name);
	if (interface_info) {
		/*
		 * The interface already exists in the list. This is OK if the
		 * interface has been marked invalid -- just clear the bit.
		 */
		if (interface_info->flags & ACPI_OSI_INVALID) {
			interface_info->flags &= ~ACPI_OSI_INVALID;
			status = AE_OK;
		} else {
			status = AE_ALREADY_EXISTS;
		}
	} else {
		/* New interface name, install into the global list */

		status = acpi_ut_install_interface(interface_name);
	}

	acpi_os_release_mutex(acpi_gbl_osi_mutex);
	return (status);
}

ACPI_EXPORT_SYMBOL(acpi_install_interface)

/*****************************************************************************
 *
 * FUNCTION:    acpi_remove_interface
 *
 * PARAMETERS:  interface_name      - The interface to remove
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Remove an _OSI interface from the global list
 *
 ****************************************************************************/
acpi_status acpi_remove_interface(acpi_string interface_name)
{
	acpi_status status;

	/* Parameter validation */

377
	if (!interface_name || (strlen(interface_name) == 0)) {
378 379 380
		return (AE_BAD_PARAMETER);
	}

381 382 383 384
	status = acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
	if (ACPI_FAILURE(status)) {
		return (status);
	}
385 386 387 388 389 390 391 392 393 394 395 396 397

	status = acpi_ut_remove_interface(interface_name);

	acpi_os_release_mutex(acpi_gbl_osi_mutex);
	return (status);
}

ACPI_EXPORT_SYMBOL(acpi_remove_interface)

/*****************************************************************************
 *
 * FUNCTION:    acpi_install_interface_handler
 *
398
 * PARAMETERS:  handler             - The _OSI interface handler to install
399 400 401 402 403 404 405 406 407 408 409
 *                                    NULL means "remove existing handler"
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Install a handler for the predefined _OSI ACPI method.
 *              invoked during execution of the internal implementation of
 *              _OSI. A NULL handler simply removes any existing handler.
 *
 ****************************************************************************/
acpi_status acpi_install_interface_handler(acpi_interface_handler handler)
{
410
	acpi_status status;
411

412 413 414 415
	status = acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
	if (ACPI_FAILURE(status)) {
		return (status);
	}
416 417 418 419 420 421 422 423 424 425 426 427

	if (handler && acpi_gbl_interface_handler) {
		status = AE_ALREADY_EXISTS;
	} else {
		acpi_gbl_interface_handler = handler;
	}

	acpi_os_release_mutex(acpi_gbl_osi_mutex);
	return (status);
}

ACPI_EXPORT_SYMBOL(acpi_install_interface_handler)
428

429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456
/*****************************************************************************
 *
 * FUNCTION:    acpi_update_interfaces
 *
 * PARAMETERS:  action              - Actions to be performed during the
 *                                    update
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
 *              string or/and feature group strings.
 *
 ****************************************************************************/
acpi_status acpi_update_interfaces(u8 action)
{
	acpi_status status;

	status = acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
	if (ACPI_FAILURE(status)) {
		return (status);
	}

	status = acpi_ut_update_interfaces(action);

	acpi_os_release_mutex(acpi_gbl_osi_mutex);
	return (status);
}

457 458 459 460 461
/*****************************************************************************
 *
 * FUNCTION:    acpi_check_address_range
 *
 * PARAMETERS:  space_id            - Address space ID
462 463 464
 *              address             - Start address
 *              length              - Length
 *              warn                - TRUE if warning on overlap desired
465 466 467 468 469 470 471
 *
 * RETURN:      Count of the number of conflicts detected.
 *
 * DESCRIPTION: Check if the input address range overlaps any of the
 *              ASL operation region address ranges.
 *
 ****************************************************************************/
472

473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493
u32
acpi_check_address_range(acpi_adr_space_type space_id,
			 acpi_physical_address address,
			 acpi_size length, u8 warn)
{
	u32 overlaps;
	acpi_status status;

	status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
	if (ACPI_FAILURE(status)) {
		return (0);
	}

	overlaps = acpi_ut_check_address_range(space_id, address,
					       (u32)length, warn);

	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
	return (overlaps);
}

ACPI_EXPORT_SYMBOL(acpi_check_address_range)
494
#endif				/* !ACPI_ASL_COMPILER */
495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
/*******************************************************************************
 *
 * FUNCTION:    acpi_decode_pld_buffer
 *
 * PARAMETERS:  in_buffer           - Buffer returned by _PLD method
 *              length              - Length of the in_buffer
 *              return_buffer       - Where the decode buffer is returned
 *
 * RETURN:      Status and the decoded _PLD buffer. User must deallocate
 *              the buffer via ACPI_FREE.
 *
 * DESCRIPTION: Decode the bit-packed buffer returned by the _PLD method into
 *              a local struct that is much more useful to an ACPI driver.
 *
 ******************************************************************************/
acpi_status
acpi_decode_pld_buffer(u8 *in_buffer,
		       acpi_size length, struct acpi_pld_info ** return_buffer)
{
	struct acpi_pld_info *pld_info;
	u32 *buffer = ACPI_CAST_PTR(u32, in_buffer);
	u32 dword;

	/* Parameter validation */

520 521
	if (!in_buffer || !return_buffer
	    || (length < ACPI_PLD_REV1_BUFFER_SIZE)) {
522 523 524 525 526 527 528 529 530 531 532 533 534
		return (AE_BAD_PARAMETER);
	}

	pld_info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_pld_info));
	if (!pld_info) {
		return (AE_NO_MEMORY);
	}

	/* First 32-bit DWord */

	ACPI_MOVE_32_TO_32(&dword, &buffer[0]);
	pld_info->revision = ACPI_PLD_GET_REVISION(&dword);
	pld_info->ignore_color = ACPI_PLD_GET_IGNORE_COLOR(&dword);
535 536 537
	pld_info->red = ACPI_PLD_GET_RED(&dword);
	pld_info->green = ACPI_PLD_GET_GREEN(&dword);
	pld_info->blue = ACPI_PLD_GET_BLUE(&dword);
538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570

	/* Second 32-bit DWord */

	ACPI_MOVE_32_TO_32(&dword, &buffer[1]);
	pld_info->width = ACPI_PLD_GET_WIDTH(&dword);
	pld_info->height = ACPI_PLD_GET_HEIGHT(&dword);

	/* Third 32-bit DWord */

	ACPI_MOVE_32_TO_32(&dword, &buffer[2]);
	pld_info->user_visible = ACPI_PLD_GET_USER_VISIBLE(&dword);
	pld_info->dock = ACPI_PLD_GET_DOCK(&dword);
	pld_info->lid = ACPI_PLD_GET_LID(&dword);
	pld_info->panel = ACPI_PLD_GET_PANEL(&dword);
	pld_info->vertical_position = ACPI_PLD_GET_VERTICAL(&dword);
	pld_info->horizontal_position = ACPI_PLD_GET_HORIZONTAL(&dword);
	pld_info->shape = ACPI_PLD_GET_SHAPE(&dword);
	pld_info->group_orientation = ACPI_PLD_GET_ORIENTATION(&dword);
	pld_info->group_token = ACPI_PLD_GET_TOKEN(&dword);
	pld_info->group_position = ACPI_PLD_GET_POSITION(&dword);
	pld_info->bay = ACPI_PLD_GET_BAY(&dword);

	/* Fourth 32-bit DWord */

	ACPI_MOVE_32_TO_32(&dword, &buffer[3]);
	pld_info->ejectable = ACPI_PLD_GET_EJECTABLE(&dword);
	pld_info->ospm_eject_required = ACPI_PLD_GET_OSPM_EJECT(&dword);
	pld_info->cabinet_number = ACPI_PLD_GET_CABINET(&dword);
	pld_info->card_cage_number = ACPI_PLD_GET_CARD_CAGE(&dword);
	pld_info->reference = ACPI_PLD_GET_REFERENCE(&dword);
	pld_info->rotation = ACPI_PLD_GET_ROTATION(&dword);
	pld_info->order = ACPI_PLD_GET_ORDER(&dword);

571
	if (length >= ACPI_PLD_REV2_BUFFER_SIZE) {
572 573 574 575 576 577 578 579 580 581 582 583 584

		/* Fifth 32-bit DWord (Revision 2 of _PLD) */

		ACPI_MOVE_32_TO_32(&dword, &buffer[4]);
		pld_info->vertical_offset = ACPI_PLD_GET_VERT_OFFSET(&dword);
		pld_info->horizontal_offset = ACPI_PLD_GET_HORIZ_OFFSET(&dword);
	}

	*return_buffer = pld_info;
	return (AE_OK);
}

ACPI_EXPORT_SYMBOL(acpi_decode_pld_buffer)