root/drivers/acpi/acpica/utpredef.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. acpi_ut_get_next_predefined_method
  2. acpi_ut_match_predefined_method
  3. acpi_ut_get_expected_return_types
  4. acpi_ut_match_resource_name
  5. acpi_ut_display_predefined_method
  6. acpi_ut_get_argument_types
  7. acpi_ut_get_resource_bit_width

   1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
   2 /******************************************************************************
   3  *
   4  * Module Name: utpredef - support functions for predefined names
   5  *
   6  * Copyright (C) 2000 - 2019, Intel Corp.
   7  *
   8  *****************************************************************************/
   9 
  10 #include <acpi/acpi.h>
  11 #include "accommon.h"
  12 #include "acpredef.h"
  13 
  14 #define _COMPONENT          ACPI_UTILITIES
  15 ACPI_MODULE_NAME("utpredef")
  16 
  17 /*
  18  * Names for the types that can be returned by the predefined objects.
  19  * Used for warning messages. Must be in the same order as the ACPI_RTYPEs
  20  */
  21 static const char *ut_rtype_names[] = {
  22         "/Integer",
  23         "/String",
  24         "/Buffer",
  25         "/Package",
  26         "/Reference",
  27 };
  28 
  29 /*******************************************************************************
  30  *
  31  * FUNCTION:    acpi_ut_get_next_predefined_method
  32  *
  33  * PARAMETERS:  this_name           - Entry in the predefined method/name table
  34  *
  35  * RETURN:      Pointer to next entry in predefined table.
  36  *
  37  * DESCRIPTION: Get the next entry in the predefine method table. Handles the
  38  *              cases where a package info entry follows a method name that
  39  *              returns a package.
  40  *
  41  ******************************************************************************/
  42 
  43 const union acpi_predefined_info *acpi_ut_get_next_predefined_method(const union
  44                                                                      acpi_predefined_info
  45                                                                      *this_name)
  46 {
  47 
  48         /*
  49          * Skip next entry in the table if this name returns a Package
  50          * (next entry contains the package info)
  51          */
  52         if ((this_name->info.expected_btypes & ACPI_RTYPE_PACKAGE) &&
  53             (this_name->info.expected_btypes != ACPI_RTYPE_ALL)) {
  54                 this_name++;
  55         }
  56 
  57         this_name++;
  58         return (this_name);
  59 }
  60 
  61 /*******************************************************************************
  62  *
  63  * FUNCTION:    acpi_ut_match_predefined_method
  64  *
  65  * PARAMETERS:  name                - Name to find
  66  *
  67  * RETURN:      Pointer to entry in predefined table. NULL indicates not found.
  68  *
  69  * DESCRIPTION: Check an object name against the predefined object list.
  70  *
  71  ******************************************************************************/
  72 
  73 const union acpi_predefined_info *acpi_ut_match_predefined_method(char *name)
  74 {
  75         const union acpi_predefined_info *this_name;
  76 
  77         /* Quick check for a predefined name, first character must be underscore */
  78 
  79         if (name[0] != '_') {
  80                 return (NULL);
  81         }
  82 
  83         /* Search info table for a predefined method/object name */
  84 
  85         this_name = acpi_gbl_predefined_methods;
  86         while (this_name->info.name[0]) {
  87                 if (ACPI_COMPARE_NAMESEG(name, this_name->info.name)) {
  88                         return (this_name);
  89                 }
  90 
  91                 this_name = acpi_ut_get_next_predefined_method(this_name);
  92         }
  93 
  94         return (NULL);          /* Not found */
  95 }
  96 
  97 /*******************************************************************************
  98  *
  99  * FUNCTION:    acpi_ut_get_expected_return_types
 100  *
 101  * PARAMETERS:  buffer              - Where the formatted string is returned
 102  *              expected_Btypes     - Bitfield of expected data types
 103  *
 104  * RETURN:      Formatted string in Buffer.
 105  *
 106  * DESCRIPTION: Format the expected object types into a printable string.
 107  *
 108  ******************************************************************************/
 109 
 110 void acpi_ut_get_expected_return_types(char *buffer, u32 expected_btypes)
 111 {
 112         u32 this_rtype;
 113         u32 i;
 114         u32 j;
 115 
 116         if (!expected_btypes) {
 117                 strcpy(buffer, "NONE");
 118                 return;
 119         }
 120 
 121         j = 1;
 122         buffer[0] = 0;
 123         this_rtype = ACPI_RTYPE_INTEGER;
 124 
 125         for (i = 0; i < ACPI_NUM_RTYPES; i++) {
 126 
 127                 /* If one of the expected types, concatenate the name of this type */
 128 
 129                 if (expected_btypes & this_rtype) {
 130                         strcat(buffer, &ut_rtype_names[i][j]);
 131                         j = 0;  /* Use name separator from now on */
 132                 }
 133 
 134                 this_rtype <<= 1;       /* Next Rtype */
 135         }
 136 }
 137 
 138 /*******************************************************************************
 139  *
 140  * The remaining functions are used by iASL and acpi_help only
 141  *
 142  ******************************************************************************/
 143 
 144 #if (defined ACPI_ASL_COMPILER || defined ACPI_HELP_APP)
 145 
 146 /* Local prototypes */
 147 
 148 static u32 acpi_ut_get_argument_types(char *buffer, u16 argument_types);
 149 
 150 /* Types that can be returned externally by a predefined name */
 151 
 152 static const char *ut_external_type_names[] =   /* Indexed by ACPI_TYPE_* */
 153 {
 154         ", UNSUPPORTED-TYPE",
 155         ", Integer",
 156         ", String",
 157         ", Buffer",
 158         ", Package"
 159 };
 160 
 161 /* Bit widths for resource descriptor predefined names */
 162 
 163 static const char *ut_resource_type_names[] = {
 164         "/1",
 165         "/2",
 166         "/3",
 167         "/8",
 168         "/16",
 169         "/32",
 170         "/64",
 171         "/variable",
 172 };
 173 
 174 /*******************************************************************************
 175  *
 176  * FUNCTION:    acpi_ut_match_resource_name
 177  *
 178  * PARAMETERS:  name                - Name to find
 179  *
 180  * RETURN:      Pointer to entry in the resource table. NULL indicates not
 181  *              found.
 182  *
 183  * DESCRIPTION: Check an object name against the predefined resource
 184  *              descriptor object list.
 185  *
 186  ******************************************************************************/
 187 
 188 const union acpi_predefined_info *acpi_ut_match_resource_name(char *name)
 189 {
 190         const union acpi_predefined_info *this_name;
 191 
 192         /*
 193          * Quick check for a predefined name, first character must
 194          * be underscore
 195          */
 196         if (name[0] != '_') {
 197                 return (NULL);
 198         }
 199 
 200         /* Search info table for a predefined method/object name */
 201 
 202         this_name = acpi_gbl_resource_names;
 203         while (this_name->info.name[0]) {
 204                 if (ACPI_COMPARE_NAMESEG(name, this_name->info.name)) {
 205                         return (this_name);
 206                 }
 207 
 208                 this_name++;
 209         }
 210 
 211         return (NULL);          /* Not found */
 212 }
 213 
 214 /*******************************************************************************
 215  *
 216  * FUNCTION:    acpi_ut_display_predefined_method
 217  *
 218  * PARAMETERS:  buffer              - Scratch buffer for this function
 219  *              this_name           - Entry in the predefined method/name table
 220  *              multi_line          - TRUE if output should be on >1 line
 221  *
 222  * RETURN:      None
 223  *
 224  * DESCRIPTION: Display information about a predefined method. Number and
 225  *              type of the input arguments, and expected type(s) for the
 226  *              return value, if any.
 227  *
 228  ******************************************************************************/
 229 
 230 void
 231 acpi_ut_display_predefined_method(char *buffer,
 232                                   const union acpi_predefined_info *this_name,
 233                                   u8 multi_line)
 234 {
 235         u32 arg_count;
 236 
 237         /*
 238          * Get the argument count and the string buffer
 239          * containing all argument types
 240          */
 241         arg_count = acpi_ut_get_argument_types(buffer,
 242                                                this_name->info.argument_list);
 243 
 244         if (multi_line) {
 245                 printf("      ");
 246         }
 247 
 248         printf("%4.4s    Requires %s%u argument%s",
 249                this_name->info.name,
 250                (this_name->info.argument_list & ARG_COUNT_IS_MINIMUM) ?
 251                "(at least) " : "", arg_count, arg_count != 1 ? "s" : "");
 252 
 253         /* Display the types for any arguments */
 254 
 255         if (arg_count > 0) {
 256                 printf(" (%s)", buffer);
 257         }
 258 
 259         if (multi_line) {
 260                 printf("\n    ");
 261         }
 262 
 263         /* Get the return value type(s) allowed */
 264 
 265         if (this_name->info.expected_btypes) {
 266                 acpi_ut_get_expected_return_types(buffer,
 267                                                   this_name->info.
 268                                                   expected_btypes);
 269                 printf("  Return value types: %s\n", buffer);
 270         } else {
 271                 printf("  No return value\n");
 272         }
 273 }
 274 
 275 /*******************************************************************************
 276  *
 277  * FUNCTION:    acpi_ut_get_argument_types
 278  *
 279  * PARAMETERS:  buffer              - Where to return the formatted types
 280  *              argument_types      - Types field for this method
 281  *
 282  * RETURN:      count - the number of arguments required for this method
 283  *
 284  * DESCRIPTION: Format the required data types for this method (Integer,
 285  *              String, Buffer, or Package) and return the required argument
 286  *              count.
 287  *
 288  ******************************************************************************/
 289 
 290 static u32 acpi_ut_get_argument_types(char *buffer, u16 argument_types)
 291 {
 292         u16 this_argument_type;
 293         u16 sub_index;
 294         u16 arg_count;
 295         u32 i;
 296 
 297         *buffer = 0;
 298         sub_index = 2;
 299 
 300         /* First field in the types list is the count of args to follow */
 301 
 302         arg_count = METHOD_GET_ARG_COUNT(argument_types);
 303         if (arg_count > METHOD_PREDEF_ARGS_MAX) {
 304                 printf("**** Invalid argument count (%u) "
 305                        "in predefined info structure\n", arg_count);
 306                 return (arg_count);
 307         }
 308 
 309         /* Get each argument from the list, convert to ascii, store to buffer */
 310 
 311         for (i = 0; i < arg_count; i++) {
 312                 this_argument_type = METHOD_GET_NEXT_TYPE(argument_types);
 313 
 314                 if (!this_argument_type
 315                     || (this_argument_type > METHOD_MAX_ARG_TYPE)) {
 316                         printf("**** Invalid argument type (%u) "
 317                                "in predefined info structure\n",
 318                                this_argument_type);
 319                         return (arg_count);
 320                 }
 321 
 322                 strcat(buffer,
 323                        ut_external_type_names[this_argument_type] + sub_index);
 324                 sub_index = 0;
 325         }
 326 
 327         return (arg_count);
 328 }
 329 
 330 /*******************************************************************************
 331  *
 332  * FUNCTION:    acpi_ut_get_resource_bit_width
 333  *
 334  * PARAMETERS:  buffer              - Where the formatted string is returned
 335  *              types               - Bitfield of expected data types
 336  *
 337  * RETURN:      Count of return types. Formatted string in Buffer.
 338  *
 339  * DESCRIPTION: Format the resource bit widths into a printable string.
 340  *
 341  ******************************************************************************/
 342 
 343 u32 acpi_ut_get_resource_bit_width(char *buffer, u16 types)
 344 {
 345         u32 i;
 346         u16 sub_index;
 347         u32 found;
 348 
 349         *buffer = 0;
 350         sub_index = 1;
 351         found = 0;
 352 
 353         for (i = 0; i < NUM_RESOURCE_WIDTHS; i++) {
 354                 if (types & 1) {
 355                         strcat(buffer, &(ut_resource_type_names[i][sub_index]));
 356                         sub_index = 0;
 357                         found++;
 358                 }
 359 
 360                 types >>= 1;
 361         }
 362 
 363         return (found);
 364 }
 365 #endif

/* [<][>][^][v][top][bottom][index][help] */