linux-old/drivers/acpi/parser/psutils.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Module Name: psutils - Parser miscellaneous utilities (Parser only)
   4 *
   5 *****************************************************************************/
   6
   7/*
   8 * Copyright (C) 2000 - 2004, R. Byron Moore
   9 * All rights reserved.
  10 *
  11 * Redistribution and use in source and binary forms, with or without
  12 * modification, are permitted provided that the following conditions
  13 * are met:
  14 * 1. Redistributions of source code must retain the above copyright
  15 *    notice, this list of conditions, and the following disclaimer,
  16 *    without modification.
  17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  18 *    substantially similar to the "NO WARRANTY" disclaimer below
  19 *    ("Disclaimer") and any redistribution must be conditioned upon
  20 *    including a substantially similar Disclaimer requirement for further
  21 *    binary redistribution.
  22 * 3. Neither the names of the above-listed copyright holders nor the names
  23 *    of any contributors may be used to endorse or promote products derived
  24 *    from this software without specific prior written permission.
  25 *
  26 * Alternatively, this software may be distributed under the terms of the
  27 * GNU General Public License ("GPL") version 2 as published by the Free
  28 * Software Foundation.
  29 *
  30 * NO WARRANTY
  31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  41 * POSSIBILITY OF SUCH DAMAGES.
  42 */
  43
  44
  45#include <acpi/acpi.h>
  46#include <acpi/acparser.h>
  47#include <acpi/amlcode.h>
  48#include <acpi/acnamesp.h>
  49
  50#define _COMPONENT          ACPI_PARSER
  51         ACPI_MODULE_NAME    ("psutils")
  52
  53
  54/*******************************************************************************
  55 *
  56 * FUNCTION:    acpi_ps_create_scope_op
  57 *
  58 * PARAMETERS:  None
  59 *
  60 * RETURN:      scope_op
  61 *
  62 * DESCRIPTION: Create a Scope and associated namepath op with the root name
  63 *
  64 ******************************************************************************/
  65
  66union acpi_parse_object *
  67acpi_ps_create_scope_op (
  68        void)
  69{
  70        union acpi_parse_object         *scope_op;
  71
  72
  73        scope_op = acpi_ps_alloc_op (AML_SCOPE_OP);
  74        if (!scope_op) {
  75                return (NULL);
  76        }
  77
  78
  79        scope_op->named.name = ACPI_ROOT_NAME;
  80        return (scope_op);
  81}
  82
  83
  84/*******************************************************************************
  85 *
  86 * FUNCTION:    acpi_ps_init_op
  87 *
  88 * PARAMETERS:  Op              - A newly allocated Op object
  89 *              Opcode          - Opcode to store in the Op
  90 *
  91 * RETURN:      Status
  92 *
  93 * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
  94 *              opcode
  95 *
  96 ******************************************************************************/
  97
  98void
  99acpi_ps_init_op (
 100        union acpi_parse_object         *op,
 101        u16                             opcode)
 102{
 103        ACPI_FUNCTION_ENTRY ();
 104
 105
 106        op->common.data_type = ACPI_DESC_TYPE_PARSER;
 107        op->common.aml_opcode = opcode;
 108
 109        ACPI_DISASM_ONLY_MEMBERS (ACPI_STRNCPY (op->common.aml_op_name,
 110                        (acpi_ps_get_opcode_info (opcode))->name, sizeof (op->common.aml_op_name)));
 111}
 112
 113
 114/*******************************************************************************
 115 *
 116 * FUNCTION:    acpi_ps_alloc_op
 117 *
 118 * PARAMETERS:  Opcode          - Opcode that will be stored in the new Op
 119 *
 120 * RETURN:      Pointer to the new Op.
 121 *
 122 * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
 123 *              opcode.  A cache of opcodes is available for the pure
 124 *              GENERIC_OP, since this is by far the most commonly used.
 125 *
 126 ******************************************************************************/
 127
 128union acpi_parse_object*
 129acpi_ps_alloc_op (
 130        u16                             opcode)
 131{
 132        union acpi_parse_object         *op = NULL;
 133        u32                             size;
 134        u8                              flags;
 135        const struct acpi_opcode_info   *op_info;
 136
 137
 138        ACPI_FUNCTION_ENTRY ();
 139
 140
 141        op_info = acpi_ps_get_opcode_info (opcode);
 142
 143        /* Allocate the minimum required size object */
 144
 145        if (op_info->flags & AML_DEFER) {
 146                size = sizeof (struct acpi_parse_obj_named);
 147                flags = ACPI_PARSEOP_DEFERRED;
 148        }
 149        else if (op_info->flags & AML_NAMED) {
 150                size = sizeof (struct acpi_parse_obj_named);
 151                flags = ACPI_PARSEOP_NAMED;
 152        }
 153        else if (opcode == AML_INT_BYTELIST_OP) {
 154                size = sizeof (struct acpi_parse_obj_named);
 155                flags = ACPI_PARSEOP_BYTELIST;
 156        }
 157        else {
 158                size = sizeof (struct acpi_parse_obj_common);
 159                flags = ACPI_PARSEOP_GENERIC;
 160        }
 161
 162        if (size == sizeof (struct acpi_parse_obj_common)) {
 163                /*
 164                 * The generic op is by far the most common (16 to 1)
 165                 */
 166                op = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_PSNODE);
 167        }
 168        else {
 169                op = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_PSNODE_EXT);
 170        }
 171
 172        /* Initialize the Op */
 173
 174        if (op) {
 175                acpi_ps_init_op (op, opcode);
 176                op->common.flags = flags;
 177        }
 178
 179        return (op);
 180}
 181
 182
 183/*******************************************************************************
 184 *
 185 * FUNCTION:    acpi_ps_free_op
 186 *
 187 * PARAMETERS:  Op              - Op to be freed
 188 *
 189 * RETURN:      None.
 190 *
 191 * DESCRIPTION: Free an Op object.  Either put it on the GENERIC_OP cache list
 192 *              or actually free it.
 193 *
 194 ******************************************************************************/
 195
 196void
 197acpi_ps_free_op (
 198        union acpi_parse_object         *op)
 199{
 200        ACPI_FUNCTION_NAME ("ps_free_op");
 201
 202
 203        if (op->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
 204                ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Free retval op: %p\n", op));
 205        }
 206
 207        if (op->common.flags & ACPI_PARSEOP_GENERIC) {
 208                acpi_ut_release_to_cache (ACPI_MEM_LIST_PSNODE, op);
 209        }
 210        else {
 211                acpi_ut_release_to_cache (ACPI_MEM_LIST_PSNODE_EXT, op);
 212        }
 213}
 214
 215
 216/*******************************************************************************
 217 *
 218 * FUNCTION:    acpi_ps_delete_parse_cache
 219 *
 220 * PARAMETERS:  None
 221 *
 222 * RETURN:      None
 223 *
 224 * DESCRIPTION: Free all objects that are on the parse cache list.
 225 *
 226 ******************************************************************************/
 227
 228void
 229acpi_ps_delete_parse_cache (
 230        void)
 231{
 232        ACPI_FUNCTION_TRACE ("ps_delete_parse_cache");
 233
 234
 235        acpi_ut_delete_generic_cache (ACPI_MEM_LIST_PSNODE);
 236        acpi_ut_delete_generic_cache (ACPI_MEM_LIST_PSNODE_EXT);
 237        return_VOID;
 238}
 239
 240
 241/*******************************************************************************
 242 *
 243 * FUNCTION:    Utility functions
 244 *
 245 * DESCRIPTION: Low level character and object functions
 246 *
 247 ******************************************************************************/
 248
 249
 250/*
 251 * Is "c" a namestring lead character?
 252 */
 253u8
 254acpi_ps_is_leading_char (
 255        u32                             c)
 256{
 257        return ((u8) (c == '_' || (c >= 'A' && c <= 'Z')));
 258}
 259
 260
 261/*
 262 * Is "c" a namestring prefix character?
 263 */
 264u8
 265acpi_ps_is_prefix_char (
 266        u32                             c)
 267{
 268        return ((u8) (c == '\\' || c == '^'));
 269}
 270
 271
 272/*
 273 * Get op's name (4-byte name segment) or 0 if unnamed
 274 */
 275u32
 276acpi_ps_get_name (
 277        union acpi_parse_object         *op)
 278{
 279
 280
 281        /* The "generic" object has no name associated with it */
 282
 283        if (op->common.flags & ACPI_PARSEOP_GENERIC) {
 284                return (0);
 285        }
 286
 287        /* Only the "Extended" parse objects have a name */
 288
 289        return (op->named.name);
 290}
 291
 292
 293/*
 294 * Set op's name
 295 */
 296void
 297acpi_ps_set_name (
 298        union acpi_parse_object         *op,
 299        u32                             name)
 300{
 301
 302        /* The "generic" object has no name associated with it */
 303
 304        if (op->common.flags & ACPI_PARSEOP_GENERIC) {
 305                return;
 306        }
 307
 308        op->named.name = name;
 309}
 310
 311
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.