brintos

brintos / linux-shallow public Read only

0
0
Text · 9.4 KiB · 29d2977 Raw
365 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/******************************************************************************3 *4 * Module Name: utpredef - support functions for predefined names5 *6 * Copyright (C) 2000 - 2023, Intel Corp.7 *8 *****************************************************************************/9 10#include <acpi/acpi.h>11#include "accommon.h"12#include "acpredef.h"13 14#define _COMPONENT          ACPI_UTILITIES15ACPI_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_RTYPEs20 */21static 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_method32 *33 * PARAMETERS:  this_name           - Entry in the predefined method/name table34 *35 * RETURN:      Pointer to next entry in predefined table.36 *37 * DESCRIPTION: Get the next entry in the predefine method table. Handles the38 *              cases where a package info entry follows a method name that39 *              returns a package.40 *41 ******************************************************************************/42 43const union acpi_predefined_info *acpi_ut_get_next_predefined_method(const union44								     acpi_predefined_info45								     *this_name)46{47 48	/*49	 * Skip next entry in the table if this name returns a Package50	 * (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_method64 *65 * PARAMETERS:  name                - Name to find66 *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 73const 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_types100 *101 * PARAMETERS:  buffer              - Where the formatted string is returned102 *              expected_Btypes     - Bitfield of expected data types103 *104 * RETURN:      Formatted string in Buffer.105 *106 * DESCRIPTION: Format the expected object types into a printable string.107 *108 ******************************************************************************/109 110void 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 only141 *142 ******************************************************************************/143 144#if (defined ACPI_ASL_COMPILER || defined ACPI_HELP_APP)145 146/* Local prototypes */147 148static u32 acpi_ut_get_argument_types(char *buffer, u16 argument_types);149 150/* Types that can be returned externally by a predefined name */151 152static const char *ut_external_type_names[] =	/* Indexed by ACPI_TYPE_* */153{154	", Type_ANY",155	", Integer",156	", String",157	", Buffer",158	", Package"159};160 161/* Bit widths for resource descriptor predefined names */162 163static 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_name177 *178 * PARAMETERS:  name                - Name to find179 *180 * RETURN:      Pointer to entry in the resource table. NULL indicates not181 *              found.182 *183 * DESCRIPTION: Check an object name against the predefined resource184 *              descriptor object list.185 *186 ******************************************************************************/187 188const 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 must194	 * be underscore195	 */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_method217 *218 * PARAMETERS:  buffer              - Scratch buffer for this function219 *              this_name           - Entry in the predefined method/name table220 *              multi_line          - TRUE if output should be on >1 line221 *222 * RETURN:      None223 *224 * DESCRIPTION: Display information about a predefined method. Number and225 *              type of the input arguments, and expected type(s) for the226 *              return value, if any.227 *228 ******************************************************************************/229 230void231acpi_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 buffer239	 * containing all argument types240	 */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_types278 *279 * PARAMETERS:  buffer              - Where to return the formatted types280 *              argument_types      - Types field for this method281 *282 * RETURN:      count - the number of arguments required for this method283 *284 * DESCRIPTION: Format the required data types for this method (Integer,285 *              String, Buffer, or Package) and return the required argument286 *              count.287 *288 ******************************************************************************/289 290static 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 > METHOD_MAX_ARG_TYPE) {315			printf("**** Invalid argument type (%u) "316			       "in predefined info structure\n",317			       this_argument_type);318			return (arg_count);319		}320 321		strcat(buffer,322		       ut_external_type_names[this_argument_type] + sub_index);323		sub_index = 0;324	}325 326	return (arg_count);327}328 329/*******************************************************************************330 *331 * FUNCTION:    acpi_ut_get_resource_bit_width332 *333 * PARAMETERS:  buffer              - Where the formatted string is returned334 *              types               - Bitfield of expected data types335 *336 * RETURN:      Count of return types. Formatted string in Buffer.337 *338 * DESCRIPTION: Format the resource bit widths into a printable string.339 *340 ******************************************************************************/341 342u32 acpi_ut_get_resource_bit_width(char *buffer, u16 types)343{344	u32 i;345	u16 sub_index;346	u32 found;347 348	*buffer = 0;349	sub_index = 1;350	found = 0;351 352	for (i = 0; i < NUM_RESOURCE_WIDTHS; i++) {353		if (types & 1) {354			strcat(buffer, &(ut_resource_type_names[i][sub_index]));355			sub_index = 0;356			found++;357		}358 359		types >>= 1;360	}361 362	return (found);363}364#endif365