11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: utmisc - common utility procedures 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 877848130e53b06c22fe37a7b6acbb82bb3e9bfbaBob Moore * Copyright (C) 2000 - 2012, Intel Corp. 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All rights reserved. 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or without 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modification, are permitted provided that the following conditions 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are met: 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Redistributions of source code must retain the above copyright 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * notice, this list of conditions, and the following disclaimer, 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * without modification. 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Redistributions in binary form must reproduce at minimum a disclaimer 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * substantially similar to the "NO WARRANTY" disclaimer below 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ("Disclaimer") and any redistribution must be conditioned upon 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * including a substantially similar Disclaimer requirement for further 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * binary redistribution. 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3. Neither the names of the above-listed copyright holders nor the names 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of any contributors may be used to endorse or promote products derived 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * from this software without specific prior written permission. 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alternatively, this software may be distributed under the terms of the 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License ("GPL") version 2 as published by the Free 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation. 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NO WARRANTY 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POSSIBILITY OF SUCH DAMAGES. 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 44be63c925a123b492fc05063c98ca7e9f7453a58aThomas Renninger#include <linux/module.h> 45be63c925a123b492fc05063c98ca7e9f7453a58aThomas Renninger 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/acpi.h> 47e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "accommon.h" 48e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acnamesp.h" 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT ACPI_UTILITIES 514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("utmisc") 5244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 5344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/******************************************************************************* 5444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * 5584fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * FUNCTION: acpi_ut_validate_exception 5684fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * 5784fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * PARAMETERS: Status - The acpi_status code to be formatted 5884fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * 5984fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * RETURN: A string containing the exception text. NULL if exception is 6084fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * not valid. 6184fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * 6284fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * DESCRIPTION: This function validates and translates an ACPI exception into 6384fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * an ASCII string. 6484fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * 6584fb2c97731c1631c5548c15f3698ad82c274245Bob Moore ******************************************************************************/ 6684fb2c97731c1631c5548c15f3698ad82c274245Bob Mooreconst char *acpi_ut_validate_exception(acpi_status status) 6784fb2c97731c1631c5548c15f3698ad82c274245Bob Moore{ 6811f2a61ab418305167f9a3f3a31a50449222f64bBob Moore u32 sub_status; 6984fb2c97731c1631c5548c15f3698ad82c274245Bob Moore const char *exception = NULL; 7084fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 7184fb2c97731c1631c5548c15f3698ad82c274245Bob Moore ACPI_FUNCTION_ENTRY(); 7284fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 7384fb2c97731c1631c5548c15f3698ad82c274245Bob Moore /* 7484fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * Status is composed of two parts, a "type" and an actual code 7584fb2c97731c1631c5548c15f3698ad82c274245Bob Moore */ 7684fb2c97731c1631c5548c15f3698ad82c274245Bob Moore sub_status = (status & ~AE_CODE_MASK); 7784fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 7884fb2c97731c1631c5548c15f3698ad82c274245Bob Moore switch (status & AE_CODE_MASK) { 7984fb2c97731c1631c5548c15f3698ad82c274245Bob Moore case AE_CODE_ENVIRONMENTAL: 8084fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 8184fb2c97731c1631c5548c15f3698ad82c274245Bob Moore if (sub_status <= AE_CODE_ENV_MAX) { 8284fb2c97731c1631c5548c15f3698ad82c274245Bob Moore exception = acpi_gbl_exception_names_env[sub_status]; 8384fb2c97731c1631c5548c15f3698ad82c274245Bob Moore } 8484fb2c97731c1631c5548c15f3698ad82c274245Bob Moore break; 8584fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 8684fb2c97731c1631c5548c15f3698ad82c274245Bob Moore case AE_CODE_PROGRAMMER: 8784fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 8884fb2c97731c1631c5548c15f3698ad82c274245Bob Moore if (sub_status <= AE_CODE_PGM_MAX) { 8911f2a61ab418305167f9a3f3a31a50449222f64bBob Moore exception = acpi_gbl_exception_names_pgm[sub_status]; 9084fb2c97731c1631c5548c15f3698ad82c274245Bob Moore } 9184fb2c97731c1631c5548c15f3698ad82c274245Bob Moore break; 9284fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 9384fb2c97731c1631c5548c15f3698ad82c274245Bob Moore case AE_CODE_ACPI_TABLES: 9484fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 9584fb2c97731c1631c5548c15f3698ad82c274245Bob Moore if (sub_status <= AE_CODE_TBL_MAX) { 9611f2a61ab418305167f9a3f3a31a50449222f64bBob Moore exception = acpi_gbl_exception_names_tbl[sub_status]; 9784fb2c97731c1631c5548c15f3698ad82c274245Bob Moore } 9884fb2c97731c1631c5548c15f3698ad82c274245Bob Moore break; 9984fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 10084fb2c97731c1631c5548c15f3698ad82c274245Bob Moore case AE_CODE_AML: 10184fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 10284fb2c97731c1631c5548c15f3698ad82c274245Bob Moore if (sub_status <= AE_CODE_AML_MAX) { 10311f2a61ab418305167f9a3f3a31a50449222f64bBob Moore exception = acpi_gbl_exception_names_aml[sub_status]; 10484fb2c97731c1631c5548c15f3698ad82c274245Bob Moore } 10584fb2c97731c1631c5548c15f3698ad82c274245Bob Moore break; 10684fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 10784fb2c97731c1631c5548c15f3698ad82c274245Bob Moore case AE_CODE_CONTROL: 10884fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 10984fb2c97731c1631c5548c15f3698ad82c274245Bob Moore if (sub_status <= AE_CODE_CTRL_MAX) { 11011f2a61ab418305167f9a3f3a31a50449222f64bBob Moore exception = acpi_gbl_exception_names_ctrl[sub_status]; 11184fb2c97731c1631c5548c15f3698ad82c274245Bob Moore } 11284fb2c97731c1631c5548c15f3698ad82c274245Bob Moore break; 11384fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 11484fb2c97731c1631c5548c15f3698ad82c274245Bob Moore default: 11584fb2c97731c1631c5548c15f3698ad82c274245Bob Moore break; 11684fb2c97731c1631c5548c15f3698ad82c274245Bob Moore } 11784fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 11884fb2c97731c1631c5548c15f3698ad82c274245Bob Moore return (ACPI_CAST_PTR(const char, exception)); 11984fb2c97731c1631c5548c15f3698ad82c274245Bob Moore} 12084fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 12184fb2c97731c1631c5548c15f3698ad82c274245Bob Moore/******************************************************************************* 12284fb2c97731c1631c5548c15f3698ad82c274245Bob Moore * 12315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * FUNCTION: acpi_ut_is_pci_root_bridge 12415b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * 12515b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * PARAMETERS: Id - The HID/CID in string format 12615b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * 12715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * RETURN: TRUE if the Id is a match for a PCI/PCI-Express Root Bridge 12815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * 12915b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * DESCRIPTION: Determine if the input ID is a PCI Root Bridge ID. 13015b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * 13115b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore ******************************************************************************/ 13215b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore 13315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Mooreu8 acpi_ut_is_pci_root_bridge(char *id) 13415b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore{ 13515b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore 13615b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore /* 13715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * Check if this is a PCI root bridge. 13815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * ACPI 3.0+: check for a PCI Express root also. 13915b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore */ 14015b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore if (!(ACPI_STRCMP(id, 14115b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore PCI_ROOT_HID_STRING)) || 14215b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore !(ACPI_STRCMP(id, PCI_EXPRESS_ROOT_HID_STRING))) { 14315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore return (TRUE); 14415b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore } 14515b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore 14615b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore return (FALSE); 14715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore} 14815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore 14915b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore/******************************************************************************* 15015b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * 151793c2388cae3fd023b3b5166354931752d42353cBob Moore * FUNCTION: acpi_ut_is_aml_table 152793c2388cae3fd023b3b5166354931752d42353cBob Moore * 153793c2388cae3fd023b3b5166354931752d42353cBob Moore * PARAMETERS: Table - An ACPI table 154793c2388cae3fd023b3b5166354931752d42353cBob Moore * 155793c2388cae3fd023b3b5166354931752d42353cBob Moore * RETURN: TRUE if table contains executable AML; FALSE otherwise 156793c2388cae3fd023b3b5166354931752d42353cBob Moore * 157793c2388cae3fd023b3b5166354931752d42353cBob Moore * DESCRIPTION: Check ACPI Signature for a table that contains AML code. 158793c2388cae3fd023b3b5166354931752d42353cBob Moore * Currently, these are DSDT,SSDT,PSDT. All other table types are 159793c2388cae3fd023b3b5166354931752d42353cBob Moore * data tables that do not contain AML code. 160793c2388cae3fd023b3b5166354931752d42353cBob Moore * 161793c2388cae3fd023b3b5166354931752d42353cBob Moore ******************************************************************************/ 16284fb2c97731c1631c5548c15f3698ad82c274245Bob Moore 163793c2388cae3fd023b3b5166354931752d42353cBob Mooreu8 acpi_ut_is_aml_table(struct acpi_table_header *table) 164793c2388cae3fd023b3b5166354931752d42353cBob Moore{ 165793c2388cae3fd023b3b5166354931752d42353cBob Moore 166f6dd9221dddb3550e60d32aee688588ec208312cBob Moore /* These are the only tables that contain executable AML */ 167793c2388cae3fd023b3b5166354931752d42353cBob Moore 168f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (ACPI_COMPARE_NAME(table->signature, ACPI_SIG_DSDT) || 169f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_COMPARE_NAME(table->signature, ACPI_SIG_PSDT) || 170f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_COMPARE_NAME(table->signature, ACPI_SIG_SSDT)) { 171793c2388cae3fd023b3b5166354931752d42353cBob Moore return (TRUE); 172793c2388cae3fd023b3b5166354931752d42353cBob Moore } 173793c2388cae3fd023b3b5166354931752d42353cBob Moore 174793c2388cae3fd023b3b5166354931752d42353cBob Moore return (FALSE); 175793c2388cae3fd023b3b5166354931752d42353cBob Moore} 176793c2388cae3fd023b3b5166354931752d42353cBob Moore 177793c2388cae3fd023b3b5166354931752d42353cBob Moore/******************************************************************************* 178793c2388cae3fd023b3b5166354931752d42353cBob Moore * 179f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * FUNCTION: acpi_ut_allocate_owner_id 180f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * 181f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * PARAMETERS: owner_id - Where the new owner ID is returned 182f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * 1830c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * RETURN: Status 1840c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * 1850c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * DESCRIPTION: Allocate a table or method owner ID. The owner ID is used to 1860c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * track objects created by the table or method, to be deleted 1870c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * when the method exits or the table is unloaded. 188f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * 189f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore ******************************************************************************/ 190793c2388cae3fd023b3b5166354931752d42353cBob Moore 1914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id) 192f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore{ 19367a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 i; 19467a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 j; 19567a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 k; 1964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 197f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 198b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_allocate_owner_id); 199f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 200aff8c2777d1a9edf97f26bf60579f9c931443eb1Robert Moore /* Guard against multiple allocations of ID to the same location */ 201aff8c2777d1a9edf97f26bf60579f9c931443eb1Robert Moore 202aff8c2777d1a9edf97f26bf60579f9c931443eb1Robert Moore if (*owner_id) { 203f6a22b0bc417042e83117f52ab1a03696af185abBob Moore ACPI_ERROR((AE_INFO, "Owner ID [0x%2.2X] already exists", 204b8e4d89357fc434618a59c1047cac72641191805Bob Moore *owner_id)); 205aff8c2777d1a9edf97f26bf60579f9c931443eb1Robert Moore return_ACPI_STATUS(AE_ALREADY_EXISTS); 206aff8c2777d1a9edf97f26bf60579f9c931443eb1Robert Moore } 207aff8c2777d1a9edf97f26bf60579f9c931443eb1Robert Moore 2080c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore /* Mutex for the global ID mask */ 2090c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore 2104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_acquire_mutex(ACPI_MTX_CACHES); 2114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 2124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 213f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore } 214f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 215c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore /* 216c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * Find a free owner ID, cycle through all possible IDs on repeated 21728f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have 21828f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore * to be scanned twice. 219c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore */ 22028f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore for (i = 0, j = acpi_gbl_last_owner_id_index; 22128f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore i < (ACPI_NUM_OWNERID_MASKS + 1); i++, j++) { 22228f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore if (j >= ACPI_NUM_OWNERID_MASKS) { 22328f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore j = 0; /* Wraparound to start of mask array */ 224c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore } 225c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 22628f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore for (k = acpi_gbl_next_owner_id_offset; k < 32; k++) { 22728f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore if (acpi_gbl_owner_id_mask[j] == ACPI_UINT32_MAX) { 22852fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 22928f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore /* There are no free IDs in this mask */ 23028f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore 23128f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore break; 23228f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore } 23328f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore 23428f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore if (!(acpi_gbl_owner_id_mask[j] & (1 << k))) { 23528f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore /* 23628f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore * Found a free ID. The actual ID is the bit index plus one, 23728f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore * making zero an invalid Owner ID. Save this as the last ID 23828f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore * allocated and update the global ID mask. 23928f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore */ 24028f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore acpi_gbl_owner_id_mask[j] |= (1 << k); 24128f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore 24228f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore acpi_gbl_last_owner_id_index = (u8) j; 24328f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore acpi_gbl_next_owner_id_offset = (u8) (k + 1); 24428f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore 24528f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore /* 24628f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore * Construct encoded ID from the index and bit position 24728f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore * 24828f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore * Note: Last [j].k (bit 255) is never used and is marked 24928f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore * permanently allocated (prevents +1 overflow) 25028f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore */ 25128f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore *owner_id = 25228f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore (acpi_owner_id) ((k + 1) + ACPI_MUL_32(j)); 25328f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore 25428f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore ACPI_DEBUG_PRINT((ACPI_DB_VALUES, 255b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore "Allocated OwnerId: %2.2X\n", 25628f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore (unsigned int)*owner_id)); 25728f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore goto exit; 25828f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore } 259f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore } 26028f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore 26128f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore acpi_gbl_next_owner_id_offset = 0; 262f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore } 263f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 264f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore /* 265c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * All owner_ids have been allocated. This typically should 266f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * not happen since the IDs are reused after deallocation. The IDs are 267f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * allocated upon table load (one per table) and method execution, and 268f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * they are released when a table is unloaded or a method completes 269f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * execution. 270c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 271c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * If this error happens, there may be very deep nesting of invoked control 272c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * methods, or there may be a bug where the IDs are not released. 273f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore */ 274f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore status = AE_OWNER_ID_LIMIT; 275b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, 276b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore "Could not allocate new OwnerId (255 max), AE_OWNER_ID_LIMIT")); 277f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 2784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown exit: 2794be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (void)acpi_ut_release_mutex(ACPI_MTX_CACHES); 2804be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 281f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore} 282f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 283f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore/******************************************************************************* 284f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * 285f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * FUNCTION: acpi_ut_release_owner_id 286f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * 2870c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * PARAMETERS: owner_id_ptr - Pointer to a previously allocated owner_iD 288f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * 2890c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * RETURN: None. No error is returned because we are either exiting a 2900c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * control method or unloading a table. Either way, we would 2910c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * ignore any error anyway. 2920c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * 29328f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore * DESCRIPTION: Release a table or method owner ID. Valid IDs are 1 - 255 294f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * 295f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore ******************************************************************************/ 296f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 2974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownvoid acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr) 298f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore{ 2994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_owner_id owner_id = *owner_id_ptr; 3004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 30167a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 index; 30228f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore u32 bit; 303f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 304b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_U32(ut_release_owner_id, owner_id); 305f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 3060c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore /* Always clear the input owner_id (zero is an invalid ID) */ 3070c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore 3080c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore *owner_id_ptr = 0; 3090c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore 3100c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore /* Zero is not a valid owner_iD */ 3110c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore 312defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore if (owner_id == 0) { 313f6a22b0bc417042e83117f52ab1a03696af185abBob Moore ACPI_ERROR((AE_INFO, "Invalid OwnerId: 0x%2.2X", owner_id)); 3140c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore return_VOID; 3150c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore } 3160c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore 3170c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore /* Mutex for the global ID mask */ 3180c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore 3194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_acquire_mutex(ACPI_MTX_CACHES); 3204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 3210c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore return_VOID; 322f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore } 323f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 324aff8c2777d1a9edf97f26bf60579f9c931443eb1Robert Moore /* Normalize the ID to zero */ 325aff8c2777d1a9edf97f26bf60579f9c931443eb1Robert Moore 326aff8c2777d1a9edf97f26bf60579f9c931443eb1Robert Moore owner_id--; 3270c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore 32828f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore /* Decode ID to index/offset pair */ 32928f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore 33028f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore index = ACPI_DIV_32(owner_id); 33128f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore bit = 1 << ACPI_MOD_32(owner_id); 33228f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore 3330c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore /* Free the owner ID only if it is valid */ 334f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 33528f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore if (acpi_gbl_owner_id_mask[index] & bit) { 33628f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore acpi_gbl_owner_id_mask[index] ^= bit; 33728f55ebce5bd2fceec8adc7c8860953d3e4532a8Bob Moore } else { 338b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, 339f6a22b0bc417042e83117f52ab1a03696af185abBob Moore "Release of non-allocated OwnerId: 0x%2.2X", 340b8e4d89357fc434618a59c1047cac72641191805Bob Moore owner_id + 1)); 341f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore } 342f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 3434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (void)acpi_ut_release_mutex(ACPI_MTX_CACHES); 3440c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore return_VOID; 345f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore} 346f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 347f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore/******************************************************************************* 348f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore * 34944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * FUNCTION: acpi_ut_strupr (strupr) 35044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * 35144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: src_string - The source string to convert 35244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * 3530c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore * RETURN: None 35444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * 35544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * DESCRIPTION: Convert string to uppercase 35644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * 35744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * NOTE: This is not a POSIX function, so it appears here, not in utclib.c 35844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * 35944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/ 36044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 3614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownvoid acpi_ut_strupr(char *src_string) 36244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore{ 3634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown char *string; 36444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 3654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_ENTRY(); 36644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 36773459f73e5d1602c59ebec114fc45185521353c1Robert Moore if (!src_string) { 3680c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore return; 36973459f73e5d1602c59ebec114fc45185521353c1Robert Moore } 37073459f73e5d1602c59ebec114fc45185521353c1Robert Moore 37144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore /* Walk entire string, uppercasing the letters */ 37244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 37344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore for (string = src_string; *string; string++) { 3744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown *string = (char)ACPI_TOUPPER(*string); 37544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore } 37644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 3770c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore return; 37844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore} 37944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_print_string 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: String - Null terminated ASCII string 38544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * max_length - Maximum output length 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: None 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * sequences. 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownvoid acpi_ut_print_string(char *string, u8 max_length) 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 i; 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!string) { 3994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("<\"NULL STRING PTR\">"); 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\""); 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; string[i] && (i < max_length); i++) { 40552fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Escape sequences */ 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (string[i]) { 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x07: 4104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\\a"); /* BELL */ 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x08: 4144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\\b"); /* BACKSPACE */ 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x0C: 4184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\\f"); /* FORMFEED */ 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x0A: 4224be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\\n"); /* LINEFEED */ 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x0D: 4264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\\r"); /* CARRIAGE RETURN */ 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x09: 4304be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\\t"); /* HORIZONTAL TAB */ 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0x0B: 4344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\\v"); /* VERTICAL TAB */ 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4374be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown case '\'': /* Single Quote */ 4384be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown case '\"': /* Double Quote */ 4394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown case '\\': /* Backslash */ 4404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\\%c", (int)string[i]); 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Check for printable character or hex escape */ 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_IS_PRINT(string[i])) { 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* This is a normal character */ 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("%c", (int)string[i]); 4514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* All others will be Hex escapes */ 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\\x%2.2X", (s32) string[i]); 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\""); 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i == max_length && string[i]) { 4624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("..."); 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_dword_byte_swap 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: Value - Value to be converted 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 47244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * RETURN: u32 integer with bytes swapped 47344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Convert a 32-bit value to big-endian (swap the bytes) 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownu32 acpi_ut_dword_byte_swap(u32 value) 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds union { 4814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 value; 4824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 bytes[4]; 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } out; 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds union { 4854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 value; 4864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 bytes[4]; 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } in; 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_ENTRY(); 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds in.value = value; 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out.bytes[0] = in.bytes[3]; 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out.bytes[1] = in.bytes[2]; 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out.bytes[2] = in.bytes[1]; 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out.bytes[3] = in.bytes[0]; 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (out.value); 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_set_integer_width 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: Revision From DSDT header 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: None 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Set the global integer bit width based upon the revision 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the DSDT. For Revision 1 and 0, Integers are 32 bits. 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * For Revision 2 and above, Integers are 64 bits. Yes, this 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * makes a difference. 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5164be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownvoid acpi_ut_set_integer_width(u8 revision) 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 519f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (revision < 2) { 520f6dd9221dddb3550e60d32aee688588ec208312cBob Moore 521f6dd9221dddb3550e60d32aee688588ec208312cBob Moore /* 32-bit case */ 522f6dd9221dddb3550e60d32aee688588ec208312cBob Moore 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds acpi_gbl_integer_bit_width = 32; 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds acpi_gbl_integer_nybble_width = 8; 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds acpi_gbl_integer_byte_width = 4; 5264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 527f6dd9221dddb3550e60d32aee688588ec208312cBob Moore /* 64-bit case (ACPI 2.0+) */ 528f6dd9221dddb3550e60d32aee688588ec208312cBob Moore 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds acpi_gbl_integer_bit_width = 64; 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds acpi_gbl_integer_nybble_width = 16; 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds acpi_gbl_integer_byte_width = 8; 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef ACPI_DEBUG_OUTPUT 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_display_init_pathname 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 54044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: Type - Object type of the node 54144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * obj_handle - Handle whose pathname will be displayed 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Path - Additional path string to be appended. 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (NULL if no extra path) 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: acpi_status 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Display full pathname of an object, DEBUG ONLY 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid 5524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_display_init_pathname(u8 type, 5534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_namespace_node *obj_handle, 5544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown char *path) 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 5574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_buffer buffer; 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_ENTRY(); 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Only print the path if the appropriate debug level is enabled */ 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) { 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Get the full pathname to the node */ 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; 5704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ns_handle_to_pathname(obj_handle, &buffer); 5714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Print what we're doing */ 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (type) { 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_METHOD: 5794be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("Executing "); 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 5834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("Initializing "); 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Print the object type and pathname */ 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("%-12s %s", 5904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_get_type_name(type), (char *)buffer.pointer); 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Extra path is used to append names like _STA, _INI, etc. */ 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (path) { 5954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf(".%s", path); 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_os_printf("\n"); 5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5998313524a0d466f451a62709aaedf988d8257b21cBob Moore ACPI_FREE(buffer.pointer); 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 605793c2388cae3fd023b3b5166354931752d42353cBob Moore * FUNCTION: acpi_ut_valid_acpi_char 606793c2388cae3fd023b3b5166354931752d42353cBob Moore * 607793c2388cae3fd023b3b5166354931752d42353cBob Moore * PARAMETERS: Char - The character to be examined 608f6dd9221dddb3550e60d32aee688588ec208312cBob Moore * Position - Byte position (0-3) 609793c2388cae3fd023b3b5166354931752d42353cBob Moore * 610793c2388cae3fd023b3b5166354931752d42353cBob Moore * RETURN: TRUE if the character is valid, FALSE otherwise 611793c2388cae3fd023b3b5166354931752d42353cBob Moore * 612793c2388cae3fd023b3b5166354931752d42353cBob Moore * DESCRIPTION: Check for a valid ACPI character. Must be one of: 613793c2388cae3fd023b3b5166354931752d42353cBob Moore * 1) Upper case alpha 614793c2388cae3fd023b3b5166354931752d42353cBob Moore * 2) numeric 615793c2388cae3fd023b3b5166354931752d42353cBob Moore * 3) underscore 616793c2388cae3fd023b3b5166354931752d42353cBob Moore * 617793c2388cae3fd023b3b5166354931752d42353cBob Moore * We allow a '!' as the last character because of the ASF! table 618793c2388cae3fd023b3b5166354931752d42353cBob Moore * 619793c2388cae3fd023b3b5166354931752d42353cBob Moore ******************************************************************************/ 620793c2388cae3fd023b3b5166354931752d42353cBob Moore 62167a119f990063f5662574f6d6414fe9bc5ece86aBob Mooreu8 acpi_ut_valid_acpi_char(char character, u32 position) 622793c2388cae3fd023b3b5166354931752d42353cBob Moore{ 623793c2388cae3fd023b3b5166354931752d42353cBob Moore 624793c2388cae3fd023b3b5166354931752d42353cBob Moore if (!((character >= 'A' && character <= 'Z') || 625793c2388cae3fd023b3b5166354931752d42353cBob Moore (character >= '0' && character <= '9') || (character == '_'))) { 626793c2388cae3fd023b3b5166354931752d42353cBob Moore 627793c2388cae3fd023b3b5166354931752d42353cBob Moore /* Allow a '!' in the last position */ 628793c2388cae3fd023b3b5166354931752d42353cBob Moore 629793c2388cae3fd023b3b5166354931752d42353cBob Moore if (character == '!' && position == 3) { 630793c2388cae3fd023b3b5166354931752d42353cBob Moore return (TRUE); 631793c2388cae3fd023b3b5166354931752d42353cBob Moore } 632793c2388cae3fd023b3b5166354931752d42353cBob Moore 633793c2388cae3fd023b3b5166354931752d42353cBob Moore return (FALSE); 634793c2388cae3fd023b3b5166354931752d42353cBob Moore } 635793c2388cae3fd023b3b5166354931752d42353cBob Moore 636793c2388cae3fd023b3b5166354931752d42353cBob Moore return (TRUE); 637793c2388cae3fd023b3b5166354931752d42353cBob Moore} 638793c2388cae3fd023b3b5166354931752d42353cBob Moore 639793c2388cae3fd023b3b5166354931752d42353cBob Moore/******************************************************************************* 640793c2388cae3fd023b3b5166354931752d42353cBob Moore * 6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_valid_acpi_name 6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 64344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: Name - The name to be examined 6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 64544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * RETURN: TRUE if the name is valid, FALSE otherwise 6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Check for a valid ACPI name. Each character must be one of: 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1) Upper case alpha 6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2) numeric 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3) underscore 6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownu8 acpi_ut_valid_acpi_name(u32 name) 6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 65667a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 i; 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_ENTRY(); 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < ACPI_NAME_SIZE; i++) { 661793c2388cae3fd023b3b5166354931752d42353cBob Moore if (!acpi_ut_valid_acpi_char 662793c2388cae3fd023b3b5166354931752d42353cBob Moore ((ACPI_CAST_PTR(char, &name))[i], i)) { 6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (FALSE); 6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (TRUE); 6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 672793c2388cae3fd023b3b5166354931752d42353cBob Moore * FUNCTION: acpi_ut_repair_name 6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 674793c2388cae3fd023b3b5166354931752d42353cBob Moore * PARAMETERS: Name - The ACPI name to be repaired 6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 676793c2388cae3fd023b3b5166354931752d42353cBob Moore * RETURN: Repaired version of the name 6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 678793c2388cae3fd023b3b5166354931752d42353cBob Moore * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and 679793c2388cae3fd023b3b5166354931752d42353cBob Moore * return the new name. 6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6833d81b236a82a26fa8bdef9096829675d81890dc9Bob Mooreacpi_name acpi_ut_repair_name(char *name) 6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 68567a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 i; 6863d81b236a82a26fa8bdef9096829675d81890dc9Bob Moore char new_name[ACPI_NAME_SIZE]; 6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 688793c2388cae3fd023b3b5166354931752d42353cBob Moore for (i = 0; i < ACPI_NAME_SIZE; i++) { 6893d81b236a82a26fa8bdef9096829675d81890dc9Bob Moore new_name[i] = name[i]; 690793c2388cae3fd023b3b5166354931752d42353cBob Moore 691793c2388cae3fd023b3b5166354931752d42353cBob Moore /* 692793c2388cae3fd023b3b5166354931752d42353cBob Moore * Replace a bad character with something printable, yet technically 693793c2388cae3fd023b3b5166354931752d42353cBob Moore * still invalid. This prevents any collisions with existing "good" 694793c2388cae3fd023b3b5166354931752d42353cBob Moore * names in the namespace. 695793c2388cae3fd023b3b5166354931752d42353cBob Moore */ 6963d81b236a82a26fa8bdef9096829675d81890dc9Bob Moore if (!acpi_ut_valid_acpi_char(name[i], i)) { 697793c2388cae3fd023b3b5166354931752d42353cBob Moore new_name[i] = '*'; 698793c2388cae3fd023b3b5166354931752d42353cBob Moore } 699793c2388cae3fd023b3b5166354931752d42353cBob Moore } 7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7013d81b236a82a26fa8bdef9096829675d81890dc9Bob Moore return (*(u32 *) new_name); 7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_strtoul64 7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: String - Null terminated string 7094119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * Base - Radix of the string: 16 or ACPI_ANY_BASE; 7104119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * ACPI_ANY_BASE means 'in behalf of to_integer' 7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ret_integer - Where the converted integer is returned 7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status and Converted value 7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 715f6dd9221dddb3550e60d32aee688588ec208312cBob Moore * DESCRIPTION: Convert a string into an unsigned value. Performs either a 716f6dd9221dddb3550e60d32aee688588ec208312cBob Moore * 32-bit or 64-bit conversion, depending on the current mode 717f6dd9221dddb3550e60d32aee688588ec208312cBob Moore * of the interpreter. 7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTE: Does not support Octal strings, not needed. 7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7225df7e6cb42da36c7d878239bebc81907b15f3943Bob Mooreacpi_status acpi_ut_strtoul64(char *string, u32 base, u64 * ret_integer) 7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 this_digit = 0; 7255df7e6cb42da36c7d878239bebc81907b15f3943Bob Moore u64 return_value = 0; 7265df7e6cb42da36c7d878239bebc81907b15f3943Bob Moore u64 quotient; 7275df7e6cb42da36c7d878239bebc81907b15f3943Bob Moore u64 dividend; 7284119532c95547821dbe72d6916dfa1b2148475b3Bob Moore u32 to_integer_op = (base == ACPI_ANY_BASE); 7294119532c95547821dbe72d6916dfa1b2148475b3Bob Moore u32 mode32 = (acpi_gbl_integer_byte_width == 4); 7304119532c95547821dbe72d6916dfa1b2148475b3Bob Moore u8 valid_digits = 0; 7314119532c95547821dbe72d6916dfa1b2148475b3Bob Moore u8 sign_of0x = 0; 7324119532c95547821dbe72d6916dfa1b2148475b3Bob Moore u8 term = 0; 7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 734f6dd9221dddb3550e60d32aee688588ec208312cBob Moore ACPI_FUNCTION_TRACE_STR(ut_stroul64, string); 7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (base) { 7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_ANY_BASE: 7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 16: 7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Invalid Base */ 7434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_BAD_PARAMETER); 7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7464119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (!string) { 7474119532c95547821dbe72d6916dfa1b2148475b3Bob Moore goto error_exit; 7484119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 7494119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Skip over any white space in the buffer */ 7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7524119532c95547821dbe72d6916dfa1b2148475b3Bob Moore while ((*string) && (ACPI_IS_SPACE(*string) || *string == '\t')) { 7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds string++; 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7564119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (to_integer_op) { 7574119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* 7584119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * Base equal to ACPI_ANY_BASE means 'to_integer operation case'. 7594119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * We need to determine if it is decimal or hexadecimal. 7604119532c95547821dbe72d6916dfa1b2148475b3Bob Moore */ 7614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if ((*string == '0') && (ACPI_TOLOWER(*(string + 1)) == 'x')) { 7624119532c95547821dbe72d6916dfa1b2148475b3Bob Moore sign_of0x = 1; 7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds base = 16; 7644119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 7654119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Skip over the leading '0x' */ 7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds string += 2; 7674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds base = 10; 7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7724119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Any string left? Check that '0x' is not followed by white space. */ 7734119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 7744119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (!(*string) || ACPI_IS_SPACE(*string) || *string == '\t') { 7754119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (to_integer_op) { 7764119532c95547821dbe72d6916dfa1b2148475b3Bob Moore goto error_exit; 7774119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } else { 7784119532c95547821dbe72d6916dfa1b2148475b3Bob Moore goto all_done; 7794119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 782f6dd9221dddb3550e60d32aee688588ec208312cBob Moore /* 783f6dd9221dddb3550e60d32aee688588ec208312cBob Moore * Perform a 32-bit or 64-bit conversion, depending upon the current 784f6dd9221dddb3550e60d32aee688588ec208312cBob Moore * execution mode of the interpreter 785f6dd9221dddb3550e60d32aee688588ec208312cBob Moore */ 7864119532c95547821dbe72d6916dfa1b2148475b3Bob Moore dividend = (mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX; 7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 788f6dd9221dddb3550e60d32aee688588ec208312cBob Moore /* Main loop: convert the string to a 32- or 64-bit integer */ 7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (*string) { 7914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_IS_DIGIT(*string)) { 79252fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Convert ASCII 0-9 to Decimal value */ 7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown this_digit = ((u8) * string) - '0'; 7964119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } else if (base == 10) { 7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7984119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Digit is out of range; possible in to_integer case only */ 7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8004119532c95547821dbe72d6916dfa1b2148475b3Bob Moore term = 1; 8014119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } else { 8024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown this_digit = (u8) ACPI_TOUPPER(*string); 8034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_IS_XDIGIT((char)this_digit)) { 80452fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Convert ASCII Hex char to value */ 8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds this_digit = this_digit - 'A' + 10; 8084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 8094119532c95547821dbe72d6916dfa1b2148475b3Bob Moore term = 1; 8104119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 8114119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 8124119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 8134119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (term) { 8144119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (to_integer_op) { 8154119532c95547821dbe72d6916dfa1b2148475b3Bob Moore goto error_exit; 8164119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } else { 8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8194119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } else if ((valid_digits == 0) && (this_digit == 0) 8204119532c95547821dbe72d6916dfa1b2148475b3Bob Moore && !sign_of0x) { 8214119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 8224119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Skip zeros */ 8234119532c95547821dbe72d6916dfa1b2148475b3Bob Moore string++; 8244119532c95547821dbe72d6916dfa1b2148475b3Bob Moore continue; 8254119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 8264119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 8274119532c95547821dbe72d6916dfa1b2148475b3Bob Moore valid_digits++; 8284119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 829fd3509436fde38d4c854bf5a6b83d2c779904f8eLen Brown if (sign_of0x && ((valid_digits > 16) 830fd3509436fde38d4c854bf5a6b83d2c779904f8eLen Brown || ((valid_digits > 8) && mode32))) { 8314119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* 8324119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * This is to_integer operation case. 8334119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * No any restrictions for string-to-integer conversion, 8344119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * see ACPI spec. 8354119532c95547821dbe72d6916dfa1b2148475b3Bob Moore */ 8364119532c95547821dbe72d6916dfa1b2148475b3Bob Moore goto error_exit; 8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Divide the digit into the correct position */ 8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8415df7e6cb42da36c7d878239bebc81907b15f3943Bob Moore (void)acpi_ut_short_divide((dividend - (u64) this_digit), 8425df7e6cb42da36c7d878239bebc81907b15f3943Bob Moore base, "ient, NULL); 8434119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (return_value > quotient) { 8454119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (to_integer_op) { 8464119532c95547821dbe72d6916dfa1b2148475b3Bob Moore goto error_exit; 8474119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } else { 8484119532c95547821dbe72d6916dfa1b2148475b3Bob Moore break; 8494119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return_value *= base; 8531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return_value += this_digit; 8541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds string++; 8551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* All done, normal exit */ 8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8594119532c95547821dbe72d6916dfa1b2148475b3Bob Moore all_done: 8604119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 861f6dd9221dddb3550e60d32aee688588ec208312cBob Moore ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n", 862f6dd9221dddb3550e60d32aee688588ec208312cBob Moore ACPI_FORMAT_UINT64(return_value))); 863f6dd9221dddb3550e60d32aee688588ec208312cBob Moore 8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ret_integer = return_value; 8654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_OK); 8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown error_exit: 8681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Base was set/validated above */ 8691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (base == 10) { 8714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_BAD_DECIMAL_CONSTANT); 8724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 8734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_BAD_HEX_CONSTANT); 8741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_create_update_state_and_push 8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 88144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: Object - Object to be added to the new state 8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Action - Increment/Decrement 8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * state_list - List the state will be added to 8841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 88544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * RETURN: Status 8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Create a new state and push it 8881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 8901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 8924be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_create_update_state_and_push(union acpi_operand_object *object, 8934be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u16 action, 8944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state **state_list) 8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state; 8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_ENTRY(); 8991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Ignore null objects; these are expected */ 9011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!object) { 9031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_OK); 9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9064be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown state = acpi_ut_create_update_state(object, action); 9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!state) { 9081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_NO_MEMORY); 9091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_push_generic_state(state_list, state); 9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_OK); 9131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_walk_package_tree 9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 91944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: source_object - The package to walk 92044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * target_object - Target object (if package is being copied) 92144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * walk_callback - Called once for each package element 92244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * Context - Passed to the callback function 9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Walk through a package 9271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 9291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 9314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_walk_package_tree(union acpi_operand_object * source_object, 9324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown void *target_object, 9334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_pkg_callback walk_callback, void *context) 9341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 9364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state_list = NULL; 9374be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state; 9384be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 this_index; 9394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *this_source_obj; 9401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 941b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_walk_package_tree); 9421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown state = acpi_ut_create_pkg_state(source_object, target_object, 0); 9441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!state) { 9454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 9461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (state) { 94952fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 9501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Get one element of the package */ 9511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown this_index = state->pkg.index; 9531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds this_source_obj = (union acpi_operand_object *) 9544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown state->pkg.source_object->package.elements[this_index]; 9551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 9571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Check for: 9581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1) An uninitialized package element. It is completely 9591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * legal to declare a package and leave it uninitialized 9601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2) Not an internal object - can be a namespace node instead 9611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3) Any type other than a package. Packages are handled in else 9621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * case below. 9631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((!this_source_obj) || 9654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (ACPI_GET_DESCRIPTOR_TYPE(this_source_obj) != 9664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DESC_TYPE_OPERAND) 9673371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore || (this_source_obj->common.type != ACPI_TYPE_PACKAGE)) { 9684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 9694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_callback(ACPI_COPY_TYPE_SIMPLE, 9704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown this_source_obj, state, context); 9714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 9724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 9731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds state->pkg.index++; 9764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown while (state->pkg.index >= 9774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown state->pkg.source_object->package.count) { 9781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 9791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We've handled all of the objects at this level, This means 9801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * that we have just completed a package. That package may 9811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * have contained one or more packages itself. 9821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Delete this state and pop the previous state (package). 9841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_delete_generic_state(state); 9864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown state = acpi_ut_pop_generic_state(&state_list); 9871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Finished when there are no more states */ 9891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!state) { 9911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 9921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We have handled all of the objects in the top level 9931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * package just add the length of the package objects 9941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and exit 9951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_OK); 9971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 10001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Go back up a level and move the index past the just 10011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * completed package object. 10021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds state->pkg.index++; 10041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10054be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 10061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* This is a subobject of type package */ 10071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 10094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_callback(ACPI_COPY_TYPE_PACKAGE, 10104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown this_source_obj, state, context); 10114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 10124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 10131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 10161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Push the current state and create a new one 10171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The callback above returned a new target package object. 10181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_push_generic_state(&state_list, state); 10204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown state = acpi_ut_create_pkg_state(this_source_obj, 10214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown state->pkg. 10224be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown this_target_obj, 0); 10231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!state) { 1024cf058bd1c84df9921ecc517d8a8a413f4d6b5b45Lin Ming 1025cf058bd1c84df9921ecc517d8a8a413f4d6b5b45Lin Ming /* Free any stacked Update State objects */ 1026cf058bd1c84df9921ecc517d8a8a413f4d6b5b45Lin Ming 1027cf058bd1c84df9921ecc517d8a8a413f4d6b5b45Lin Ming while (state_list) { 1028cf058bd1c84df9921ecc517d8a8a413f4d6b5b45Lin Ming state = 1029cf058bd1c84df9921ecc517d8a8a413f4d6b5b45Lin Ming acpi_ut_pop_generic_state 1030cf058bd1c84df9921ecc517d8a8a413f4d6b5b45Lin Ming (&state_list); 1031cf058bd1c84df9921ecc517d8a8a413f4d6b5b45Lin Ming acpi_ut_delete_generic_state(state); 1032cf058bd1c84df9921ecc517d8a8a413f4d6b5b45Lin Ming } 10334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 10341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* We should never get here */ 10391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_AML_INTERNAL); 10411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1042