Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.14-rc2 356 lines 10 kB view raw
1/****************************************************************************** 2 * 3 * Module Name: nsxfname - Public interfaces to the ACPI subsystem 4 * ACPI Namespace oriented interfaces 5 * 6 *****************************************************************************/ 7 8/* 9 * Copyright (C) 2000 - 2005, R. Byron Moore 10 * All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions, and the following disclaimer, 17 * without modification. 18 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19 * substantially similar to the "NO WARRANTY" disclaimer below 20 * ("Disclaimer") and any redistribution must be conditioned upon 21 * including a substantially similar Disclaimer requirement for further 22 * binary redistribution. 23 * 3. Neither the names of the above-listed copyright holders nor the names 24 * of any contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * Alternatively, this software may be distributed under the terms of the 28 * GNU General Public License ("GPL") version 2 as published by the Free 29 * Software Foundation. 30 * 31 * NO WARRANTY 32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42 * POSSIBILITY OF SUCH DAMAGES. 43 */ 44 45#include <linux/module.h> 46 47#include <acpi/acpi.h> 48#include <acpi/acnamesp.h> 49 50#define _COMPONENT ACPI_NAMESPACE 51ACPI_MODULE_NAME("nsxfname") 52 53/****************************************************************************** 54 * 55 * FUNCTION: acpi_get_handle 56 * 57 * PARAMETERS: Parent - Object to search under (search scope). 58 * Pathname - Pointer to an asciiz string containing the 59 * name 60 * ret_handle - Where the return handle is returned 61 * 62 * RETURN: Status 63 * 64 * DESCRIPTION: This routine will search for a caller specified name in the 65 * name space. The caller can restrict the search region by 66 * specifying a non NULL parent. The parent value is itself a 67 * namespace handle. 68 * 69 ******************************************************************************/ 70acpi_status 71acpi_get_handle(acpi_handle parent, 72 acpi_string pathname, acpi_handle * ret_handle) 73{ 74 acpi_status status; 75 struct acpi_namespace_node *node = NULL; 76 struct acpi_namespace_node *prefix_node = NULL; 77 78 ACPI_FUNCTION_ENTRY(); 79 80 /* Parameter Validation */ 81 82 if (!ret_handle || !pathname) { 83 return (AE_BAD_PARAMETER); 84 } 85 86 /* Convert a parent handle to a prefix node */ 87 88 if (parent) { 89 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 90 if (ACPI_FAILURE(status)) { 91 return (status); 92 } 93 94 prefix_node = acpi_ns_map_handle_to_node(parent); 95 if (!prefix_node) { 96 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 97 return (AE_BAD_PARAMETER); 98 } 99 100 status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 101 if (ACPI_FAILURE(status)) { 102 return (status); 103 } 104 } 105 106 /* Special case for root, since we can't search for it */ 107 108 if (ACPI_STRCMP(pathname, ACPI_NS_ROOT_PATH) == 0) { 109 *ret_handle = 110 acpi_ns_convert_entry_to_handle(acpi_gbl_root_node); 111 return (AE_OK); 112 } 113 114 /* 115 * Find the Node and convert to a handle 116 */ 117 status = 118 acpi_ns_get_node_by_path(pathname, prefix_node, ACPI_NS_NO_UPSEARCH, 119 &node); 120 121 *ret_handle = NULL; 122 if (ACPI_SUCCESS(status)) { 123 *ret_handle = acpi_ns_convert_entry_to_handle(node); 124 } 125 126 return (status); 127} 128 129EXPORT_SYMBOL(acpi_get_handle); 130 131/****************************************************************************** 132 * 133 * FUNCTION: acpi_get_name 134 * 135 * PARAMETERS: Handle - Handle to be converted to a pathname 136 * name_type - Full pathname or single segment 137 * Buffer - Buffer for returned path 138 * 139 * RETURN: Pointer to a string containing the fully qualified Name. 140 * 141 * DESCRIPTION: This routine returns the fully qualified name associated with 142 * the Handle parameter. This and the acpi_pathname_to_handle are 143 * complementary functions. 144 * 145 ******************************************************************************/ 146 147acpi_status 148acpi_get_name(acpi_handle handle, u32 name_type, struct acpi_buffer * buffer) 149{ 150 acpi_status status; 151 struct acpi_namespace_node *node; 152 153 /* Parameter validation */ 154 155 if (name_type > ACPI_NAME_TYPE_MAX) { 156 return (AE_BAD_PARAMETER); 157 } 158 159 status = acpi_ut_validate_buffer(buffer); 160 if (ACPI_FAILURE(status)) { 161 return (status); 162 } 163 164 if (name_type == ACPI_FULL_PATHNAME) { 165 /* Get the full pathname (From the namespace root) */ 166 167 status = acpi_ns_handle_to_pathname(handle, buffer); 168 return (status); 169 } 170 171 /* 172 * Wants the single segment ACPI name. 173 * Validate handle and convert to a namespace Node 174 */ 175 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 176 if (ACPI_FAILURE(status)) { 177 return (status); 178 } 179 180 node = acpi_ns_map_handle_to_node(handle); 181 if (!node) { 182 status = AE_BAD_PARAMETER; 183 goto unlock_and_exit; 184 } 185 186 /* Validate/Allocate/Clear caller buffer */ 187 188 status = acpi_ut_initialize_buffer(buffer, ACPI_PATH_SEGMENT_LENGTH); 189 if (ACPI_FAILURE(status)) { 190 goto unlock_and_exit; 191 } 192 193 /* Just copy the ACPI name from the Node and zero terminate it */ 194 195 ACPI_STRNCPY(buffer->pointer, acpi_ut_get_node_name(node), 196 ACPI_NAME_SIZE); 197 ((char *)buffer->pointer)[ACPI_NAME_SIZE] = 0; 198 status = AE_OK; 199 200 unlock_and_exit: 201 202 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 203 return (status); 204} 205 206EXPORT_SYMBOL(acpi_get_name); 207 208/****************************************************************************** 209 * 210 * FUNCTION: acpi_get_object_info 211 * 212 * PARAMETERS: Handle - Object Handle 213 * Buffer - Where the info is returned 214 * 215 * RETURN: Status 216 * 217 * DESCRIPTION: Returns information about an object as gleaned from the 218 * namespace node and possibly by running several standard 219 * control methods (Such as in the case of a device.) 220 * 221 ******************************************************************************/ 222 223acpi_status 224acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer) 225{ 226 acpi_status status; 227 struct acpi_namespace_node *node; 228 struct acpi_device_info *info; 229 struct acpi_device_info *return_info; 230 struct acpi_compatible_id_list *cid_list = NULL; 231 acpi_size size; 232 233 /* Parameter validation */ 234 235 if (!handle || !buffer) { 236 return (AE_BAD_PARAMETER); 237 } 238 239 status = acpi_ut_validate_buffer(buffer); 240 if (ACPI_FAILURE(status)) { 241 return (status); 242 } 243 244 info = ACPI_MEM_CALLOCATE(sizeof(struct acpi_device_info)); 245 if (!info) { 246 return (AE_NO_MEMORY); 247 } 248 249 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 250 if (ACPI_FAILURE(status)) { 251 goto cleanup; 252 } 253 254 node = acpi_ns_map_handle_to_node(handle); 255 if (!node) { 256 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 257 goto cleanup; 258 } 259 260 /* Init return structure */ 261 262 size = sizeof(struct acpi_device_info); 263 264 info->type = node->type; 265 info->name = node->name.integer; 266 info->valid = 0; 267 268 status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 269 if (ACPI_FAILURE(status)) { 270 goto cleanup; 271 } 272 273 /* If not a device, we are all done */ 274 275 if (info->type == ACPI_TYPE_DEVICE) { 276 /* 277 * Get extra info for ACPI Devices objects only: 278 * Run the Device _HID, _UID, _CID, _STA, _ADR and _sx_d methods. 279 * 280 * Note: none of these methods are required, so they may or may 281 * not be present for this device. The Info->Valid bitfield is used 282 * to indicate which methods were found and ran successfully. 283 */ 284 285 /* Execute the Device._HID method */ 286 287 status = acpi_ut_execute_HID(node, &info->hardware_id); 288 if (ACPI_SUCCESS(status)) { 289 info->valid |= ACPI_VALID_HID; 290 } 291 292 /* Execute the Device._UID method */ 293 294 status = acpi_ut_execute_UID(node, &info->unique_id); 295 if (ACPI_SUCCESS(status)) { 296 info->valid |= ACPI_VALID_UID; 297 } 298 299 /* Execute the Device._CID method */ 300 301 status = acpi_ut_execute_CID(node, &cid_list); 302 if (ACPI_SUCCESS(status)) { 303 size += ((acpi_size) cid_list->count - 1) * 304 sizeof(struct acpi_compatible_id); 305 info->valid |= ACPI_VALID_CID; 306 } 307 308 /* Execute the Device._STA method */ 309 310 status = acpi_ut_execute_STA(node, &info->current_status); 311 if (ACPI_SUCCESS(status)) { 312 info->valid |= ACPI_VALID_STA; 313 } 314 315 /* Execute the Device._ADR method */ 316 317 status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, node, 318 &info->address); 319 if (ACPI_SUCCESS(status)) { 320 info->valid |= ACPI_VALID_ADR; 321 } 322 323 /* Execute the Device._sx_d methods */ 324 325 status = acpi_ut_execute_sxds(node, info->highest_dstates); 326 if (ACPI_SUCCESS(status)) { 327 info->valid |= ACPI_VALID_SXDS; 328 } 329 } 330 331 /* Validate/Allocate/Clear caller buffer */ 332 333 status = acpi_ut_initialize_buffer(buffer, size); 334 if (ACPI_FAILURE(status)) { 335 goto cleanup; 336 } 337 338 /* Populate the return buffer */ 339 340 return_info = buffer->pointer; 341 ACPI_MEMCPY(return_info, info, sizeof(struct acpi_device_info)); 342 343 if (cid_list) { 344 ACPI_MEMCPY(&return_info->compatibility_id, cid_list, 345 cid_list->size); 346 } 347 348 cleanup: 349 ACPI_MEM_FREE(info); 350 if (cid_list) { 351 ACPI_MEM_FREE(cid_list); 352 } 353 return (status); 354} 355 356EXPORT_SYMBOL(acpi_get_object_info);