1 /* 2 * acpi_utils.c - ACPI Utility Functions ($Revision: 10 $) 3 * 4 * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> 5 * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> 6 * 7 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or (at 12 * your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, but 15 * WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * General Public License for more details. 18 * 19 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20 */ 21 22 #include <linux/kernel.h> 23 #include <linux/module.h> 24 #include <linux/slab.h> 25 #include <linux/init.h> 26 #include <linux/types.h> 27 #include <linux/hardirq.h> 28 #include <linux/acpi.h> 29 #include <linux/dynamic_debug.h> 30 31 #include "internal.h" 32 #include "sleep.h" 33 34 #define _COMPONENT ACPI_BUS_COMPONENT 35 ACPI_MODULE_NAME("utils"); 36 37 /* -------------------------------------------------------------------------- 38 Object Evaluation Helpers 39 -------------------------------------------------------------------------- */ 40 static void 41 acpi_util_eval_error(acpi_handle h, acpi_string p, acpi_status s) 42 { 43 #ifdef ACPI_DEBUG_OUTPUT 44 char prefix[80] = {'\0'}; 45 struct acpi_buffer buffer = {sizeof(prefix), prefix}; 46 acpi_get_name(h, ACPI_FULL_PATHNAME, &buffer); 47 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluate [%s.%s]: %s\n", 48 (char *) prefix, p, acpi_format_exception(s))); 49 #else 50 return; 51 #endif 52 } 53 54 acpi_status 55 acpi_extract_package(union acpi_object *package, 56 struct acpi_buffer *format, struct acpi_buffer *buffer) 57 { 58 u32 size_required = 0; 59 u32 tail_offset = 0; 60 char *format_string = NULL; 61 u32 format_count = 0; 62 u32 i = 0; 63 u8 *head = NULL; 64 u8 *tail = NULL; 65 66 67 if (!package || (package->type != ACPI_TYPE_PACKAGE) 68 || (package->package.count < 1)) { 69 printk(KERN_WARNING PREFIX "Invalid package argument\n"); 70 return AE_BAD_PARAMETER; 71 } 72 73 if (!format || !format->pointer || (format->length < 1)) { 74 printk(KERN_WARNING PREFIX "Invalid format argument\n"); 75 return AE_BAD_PARAMETER; 76 } 77 78 if (!buffer) { 79 printk(KERN_WARNING PREFIX "Invalid buffer argument\n"); 80 return AE_BAD_PARAMETER; 81 } 82 83 format_count = (format->length / sizeof(char)) - 1; 84 if (format_count > package->package.count) { 85 printk(KERN_WARNING PREFIX "Format specifies more objects [%d]" 86 " than exist in package [%d].\n", 87 format_count, package->package.count); 88 return AE_BAD_DATA; 89 } 90 91 format_string = format->pointer; 92 93 /* 94 * Calculate size_required. 95 */ 96 for (i = 0; i < format_count; i++) { 97 98 union acpi_object *element = &(package->package.elements[i]); 99 100 switch (element->type) { 101 102 case ACPI_TYPE_INTEGER: 103 switch (format_string[i]) { 104 case 'N': 105 size_required += sizeof(u64); 106 tail_offset += sizeof(u64); 107 break; 108 case 'S': 109 size_required += 110 sizeof(char *) + sizeof(u64) + 111 sizeof(char); 112 tail_offset += sizeof(char *); 113 break; 114 default: 115 printk(KERN_WARNING PREFIX "Invalid package element" 116 " [%d]: got number, expecting" 117 " [%c]\n", 118 i, format_string[i]); 119 return AE_BAD_DATA; 120 break; 121 } 122 break; 123 124 case ACPI_TYPE_STRING: 125 case ACPI_TYPE_BUFFER: 126 switch (format_string[i]) { 127 case 'S': 128 size_required += 129 sizeof(char *) + 130 (element->string.length * sizeof(char)) + 131 sizeof(char); 132 tail_offset += sizeof(char *); 133 break; 134 case 'B': 135 size_required += 136 sizeof(u8 *) + element->buffer.length; 137 tail_offset += sizeof(u8 *); 138 break; 139 default: 140 printk(KERN_WARNING PREFIX "Invalid package element" 141 " [%d] got string/buffer," 142 " expecting [%c]\n", 143 i, format_string[i]); 144 return AE_BAD_DATA; 145 break; 146 } 147 break; 148 case ACPI_TYPE_LOCAL_REFERENCE: 149 switch (format_string[i]) { 150 case 'R': 151 size_required += sizeof(void *); 152 tail_offset += sizeof(void *); 153 break; 154 default: 155 printk(KERN_WARNING PREFIX "Invalid package element" 156 " [%d] got reference," 157 " expecting [%c]\n", 158 i, format_string[i]); 159 return AE_BAD_DATA; 160 break; 161 } 162 break; 163 164 case ACPI_TYPE_PACKAGE: 165 default: 166 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 167 "Found unsupported element at index=%d\n", 168 i)); 169 /* TBD: handle nested packages... */ 170 return AE_SUPPORT; 171 break; 172 } 173 } 174 175 /* 176 * Validate output buffer. 177 */ 178 if (buffer->length == ACPI_ALLOCATE_BUFFER) { 179 buffer->pointer = ACPI_ALLOCATE_ZEROED(size_required); 180 if (!buffer->pointer) 181 return AE_NO_MEMORY; 182 buffer->length = size_required; 183 } else { 184 if (buffer->length < size_required) { 185 buffer->length = size_required; 186 return AE_BUFFER_OVERFLOW; 187 } else if (buffer->length != size_required || 188 !buffer->pointer) { 189 return AE_BAD_PARAMETER; 190 } 191 } 192 193 head = buffer->pointer; 194 tail = buffer->pointer + tail_offset; 195 196 /* 197 * Extract package data. 198 */ 199 for (i = 0; i < format_count; i++) { 200 201 u8 **pointer = NULL; 202 union acpi_object *element = &(package->package.elements[i]); 203 204 switch (element->type) { 205 206 case ACPI_TYPE_INTEGER: 207 switch (format_string[i]) { 208 case 'N': 209 *((u64 *) head) = 210 element->integer.value; 211 head += sizeof(u64); 212 break; 213 case 'S': 214 pointer = (u8 **) head; 215 *pointer = tail; 216 *((u64 *) tail) = 217 element->integer.value; 218 head += sizeof(u64 *); 219 tail += sizeof(u64); 220 /* NULL terminate string */ 221 *tail = (char)0; 222 tail += sizeof(char); 223 break; 224 default: 225 /* Should never get here */ 226 break; 227 } 228 break; 229 230 case ACPI_TYPE_STRING: 231 case ACPI_TYPE_BUFFER: 232 switch (format_string[i]) { 233 case 'S': 234 pointer = (u8 **) head; 235 *pointer = tail; 236 memcpy(tail, element->string.pointer, 237 element->string.length); 238 head += sizeof(char *); 239 tail += element->string.length * sizeof(char); 240 /* NULL terminate string */ 241 *tail = (char)0; 242 tail += sizeof(char); 243 break; 244 case 'B': 245 pointer = (u8 **) head; 246 *pointer = tail; 247 memcpy(tail, element->buffer.pointer, 248 element->buffer.length); 249 head += sizeof(u8 *); 250 tail += element->buffer.length; 251 break; 252 default: 253 /* Should never get here */ 254 break; 255 } 256 break; 257 case ACPI_TYPE_LOCAL_REFERENCE: 258 switch (format_string[i]) { 259 case 'R': 260 *(void **)head = 261 (void *)element->reference.handle; 262 head += sizeof(void *); 263 break; 264 default: 265 /* Should never get here */ 266 break; 267 } 268 break; 269 case ACPI_TYPE_PACKAGE: 270 /* TBD: handle nested packages... */ 271 default: 272 /* Should never get here */ 273 break; 274 } 275 } 276 277 return AE_OK; 278 } 279 280 EXPORT_SYMBOL(acpi_extract_package); 281 282 acpi_status 283 acpi_evaluate_integer(acpi_handle handle, 284 acpi_string pathname, 285 struct acpi_object_list *arguments, unsigned long long *data) 286 { 287 acpi_status status = AE_OK; 288 union acpi_object element; 289 struct acpi_buffer buffer = { 0, NULL }; 290 291 if (!data) 292 return AE_BAD_PARAMETER; 293 294 buffer.length = sizeof(union acpi_object); 295 buffer.pointer = &element; 296 status = acpi_evaluate_object(handle, pathname, arguments, &buffer); 297 if (ACPI_FAILURE(status)) { 298 acpi_util_eval_error(handle, pathname, status); 299 return status; 300 } 301 302 if (element.type != ACPI_TYPE_INTEGER) { 303 acpi_util_eval_error(handle, pathname, AE_BAD_DATA); 304 return AE_BAD_DATA; 305 } 306 307 *data = element.integer.value; 308 309 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%llu]\n", *data)); 310 311 return AE_OK; 312 } 313 314 EXPORT_SYMBOL(acpi_evaluate_integer); 315 316 acpi_status 317 acpi_evaluate_reference(acpi_handle handle, 318 acpi_string pathname, 319 struct acpi_object_list *arguments, 320 struct acpi_handle_list *list) 321 { 322 acpi_status status = AE_OK; 323 union acpi_object *package = NULL; 324 union acpi_object *element = NULL; 325 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 326 u32 i = 0; 327 328 329 if (!list) { 330 return AE_BAD_PARAMETER; 331 } 332 333 /* Evaluate object. */ 334 335 status = acpi_evaluate_object(handle, pathname, arguments, &buffer); 336 if (ACPI_FAILURE(status)) 337 goto end; 338 339 package = buffer.pointer; 340 341 if ((buffer.length == 0) || !package) { 342 status = AE_BAD_DATA; 343 acpi_util_eval_error(handle, pathname, status); 344 goto end; 345 } 346 if (package->type != ACPI_TYPE_PACKAGE) { 347 status = AE_BAD_DATA; 348 acpi_util_eval_error(handle, pathname, status); 349 goto end; 350 } 351 if (!package->package.count) { 352 status = AE_BAD_DATA; 353 acpi_util_eval_error(handle, pathname, status); 354 goto end; 355 } 356 357 if (package->package.count > ACPI_MAX_HANDLES) { 358 kfree(package); 359 return AE_NO_MEMORY; 360 } 361 list->count = package->package.count; 362 363 /* Extract package data. */ 364 365 for (i = 0; i < list->count; i++) { 366 367 element = &(package->package.elements[i]); 368 369 if (element->type != ACPI_TYPE_LOCAL_REFERENCE) { 370 status = AE_BAD_DATA; 371 acpi_util_eval_error(handle, pathname, status); 372 break; 373 } 374 375 if (!element->reference.handle) { 376 status = AE_NULL_ENTRY; 377 acpi_util_eval_error(handle, pathname, status); 378 break; 379 } 380 /* Get the acpi_handle. */ 381 382 list->handles[i] = element->reference.handle; 383 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found reference [%p]\n", 384 list->handles[i])); 385 } 386 387 end: 388 if (ACPI_FAILURE(status)) { 389 list->count = 0; 390 //kfree(list->handles); 391 } 392 393 kfree(buffer.pointer); 394 395 return status; 396 } 397 398 EXPORT_SYMBOL(acpi_evaluate_reference); 399 400 acpi_status 401 acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld) 402 { 403 acpi_status status; 404 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 405 union acpi_object *output; 406 407 status = acpi_evaluate_object(handle, "_PLD", NULL, &buffer); 408 409 if (ACPI_FAILURE(status)) 410 return status; 411 412 output = buffer.pointer; 413 414 if (!output || output->type != ACPI_TYPE_PACKAGE 415 || !output->package.count 416 || output->package.elements[0].type != ACPI_TYPE_BUFFER 417 || output->package.elements[0].buffer.length < ACPI_PLD_REV1_BUFFER_SIZE) { 418 status = AE_TYPE; 419 goto out; 420 } 421 422 status = acpi_decode_pld_buffer( 423 output->package.elements[0].buffer.pointer, 424 output->package.elements[0].buffer.length, 425 pld); 426 427 out: 428 kfree(buffer.pointer); 429 return status; 430 } 431 EXPORT_SYMBOL(acpi_get_physical_device_location); 432 433 /** 434 * acpi_evaluate_ost: Evaluate _OST for hotplug operations 435 * @handle: ACPI device handle 436 * @source_event: source event code 437 * @status_code: status code 438 * @status_buf: optional detailed information (NULL if none) 439 * 440 * Evaluate _OST for hotplug operations. All ACPI hotplug handlers 441 * must call this function when evaluating _OST for hotplug operations. 442 * When the platform does not support _OST, this function has no effect. 443 */ 444 acpi_status 445 acpi_evaluate_ost(acpi_handle handle, u32 source_event, u32 status_code, 446 struct acpi_buffer *status_buf) 447 { 448 union acpi_object params[3] = { 449 {.type = ACPI_TYPE_INTEGER,}, 450 {.type = ACPI_TYPE_INTEGER,}, 451 {.type = ACPI_TYPE_BUFFER,} 452 }; 453 struct acpi_object_list arg_list = {3, params}; 454 455 params[0].integer.value = source_event; 456 params[1].integer.value = status_code; 457 if (status_buf != NULL) { 458 params[2].buffer.pointer = status_buf->pointer; 459 params[2].buffer.length = status_buf->length; 460 } else { 461 params[2].buffer.pointer = NULL; 462 params[2].buffer.length = 0; 463 } 464 465 return acpi_evaluate_object(handle, "_OST", &arg_list, NULL); 466 } 467 EXPORT_SYMBOL(acpi_evaluate_ost); 468 469 /** 470 * acpi_handle_path: Return the object path of handle 471 * 472 * Caller must free the returned buffer 473 */ 474 static char *acpi_handle_path(acpi_handle handle) 475 { 476 struct acpi_buffer buffer = { 477 .length = ACPI_ALLOCATE_BUFFER, 478 .pointer = NULL 479 }; 480 481 if (in_interrupt() || 482 acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer) != AE_OK) 483 return NULL; 484 return buffer.pointer; 485 } 486 487 /** 488 * acpi_handle_printk: Print message with ACPI prefix and object path 489 * 490 * This function is called through acpi_handle_<level> macros and prints 491 * a message with ACPI prefix and object path. This function acquires 492 * the global namespace mutex to obtain an object path. In interrupt 493 * context, it shows the object path as <n/a>. 494 */ 495 void 496 acpi_handle_printk(const char *level, acpi_handle handle, const char *fmt, ...) 497 { 498 struct va_format vaf; 499 va_list args; 500 const char *path; 501 502 va_start(args, fmt); 503 vaf.fmt = fmt; 504 vaf.va = &args; 505 506 path = acpi_handle_path(handle); 507 printk("%sACPI: %s: %pV", level, path ? path : "<n/a>" , &vaf); 508 509 va_end(args); 510 kfree(path); 511 } 512 EXPORT_SYMBOL(acpi_handle_printk); 513 514 #if defined(CONFIG_DYNAMIC_DEBUG) 515 /** 516 * __acpi_handle_debug: pr_debug with ACPI prefix and object path 517 * 518 * This function is called through acpi_handle_debug macro and debug 519 * prints a message with ACPI prefix and object path. This function 520 * acquires the global namespace mutex to obtain an object path. In 521 * interrupt context, it shows the object path as <n/a>. 522 */ 523 void 524 __acpi_handle_debug(struct _ddebug *descriptor, acpi_handle handle, 525 const char *fmt, ...) 526 { 527 struct va_format vaf; 528 va_list args; 529 const char *path; 530 531 va_start(args, fmt); 532 vaf.fmt = fmt; 533 vaf.va = &args; 534 535 path = acpi_handle_path(handle); 536 __dynamic_pr_debug(descriptor, "ACPI: %s: %pV", path ? path : "<n/a>", &vaf); 537 538 va_end(args); 539 kfree(path); 540 } 541 EXPORT_SYMBOL(__acpi_handle_debug); 542 #endif 543 544 /** 545 * acpi_has_method: Check whether @handle has a method named @name 546 * @handle: ACPI device handle 547 * @name: name of object or method 548 * 549 * Check whether @handle has a method named @name. 550 */ 551 bool acpi_has_method(acpi_handle handle, char *name) 552 { 553 acpi_handle tmp; 554 555 return ACPI_SUCCESS(acpi_get_handle(handle, name, &tmp)); 556 } 557 EXPORT_SYMBOL(acpi_has_method); 558 559 acpi_status acpi_execute_simple_method(acpi_handle handle, char *method, 560 u64 arg) 561 { 562 union acpi_object obj = { .type = ACPI_TYPE_INTEGER }; 563 struct acpi_object_list arg_list = { .count = 1, .pointer = &obj, }; 564 565 obj.integer.value = arg; 566 567 return acpi_evaluate_object(handle, method, &arg_list, NULL); 568 } 569 EXPORT_SYMBOL(acpi_execute_simple_method); 570 571 /** 572 * acpi_evaluate_ej0: Evaluate _EJ0 method for hotplug operations 573 * @handle: ACPI device handle 574 * 575 * Evaluate device's _EJ0 method for hotplug operations. 576 */ 577 acpi_status acpi_evaluate_ej0(acpi_handle handle) 578 { 579 acpi_status status; 580 581 status = acpi_execute_simple_method(handle, "_EJ0", 1); 582 if (status == AE_NOT_FOUND) 583 acpi_handle_warn(handle, "No _EJ0 support for device\n"); 584 else if (ACPI_FAILURE(status)) 585 acpi_handle_warn(handle, "Eject failed (0x%x)\n", status); 586 587 return status; 588 } 589 590 /** 591 * acpi_evaluate_lck: Evaluate _LCK method to lock/unlock device 592 * @handle: ACPI device handle 593 * @lock: lock device if non-zero, otherwise unlock device 594 * 595 * Evaluate device's _LCK method if present to lock/unlock device 596 */ 597 acpi_status acpi_evaluate_lck(acpi_handle handle, int lock) 598 { 599 acpi_status status; 600 601 status = acpi_execute_simple_method(handle, "_LCK", !!lock); 602 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { 603 if (lock) 604 acpi_handle_warn(handle, 605 "Locking device failed (0x%x)\n", status); 606 else 607 acpi_handle_warn(handle, 608 "Unlocking device failed (0x%x)\n", status); 609 } 610 611 return status; 612 } 613 614 /** 615 * acpi_evaluate_dsm - evaluate device's _DSM method 616 * @handle: ACPI device handle 617 * @guid: GUID of requested functions, should be 16 bytes 618 * @rev: revision number of requested function 619 * @func: requested function number 620 * @argv4: the function specific parameter 621 * 622 * Evaluate device's _DSM method with specified GUID, revision id and 623 * function number. Caller needs to free the returned object. 624 * 625 * Though ACPI defines the fourth parameter for _DSM should be a package, 626 * some old BIOSes do expect a buffer or an integer etc. 627 */ 628 union acpi_object * 629 acpi_evaluate_dsm(acpi_handle handle, const guid_t *guid, u64 rev, u64 func, 630 union acpi_object *argv4) 631 { 632 acpi_status ret; 633 struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL}; 634 union acpi_object params[4]; 635 struct acpi_object_list input = { 636 .count = 4, 637 .pointer = params, 638 }; 639 640 params[0].type = ACPI_TYPE_BUFFER; 641 params[0].buffer.length = 16; 642 params[0].buffer.pointer = (u8 *)guid; 643 params[1].type = ACPI_TYPE_INTEGER; 644 params[1].integer.value = rev; 645 params[2].type = ACPI_TYPE_INTEGER; 646 params[2].integer.value = func; 647 if (argv4) { 648 params[3] = *argv4; 649 } else { 650 params[3].type = ACPI_TYPE_PACKAGE; 651 params[3].package.count = 0; 652 params[3].package.elements = NULL; 653 } 654 655 ret = acpi_evaluate_object(handle, "_DSM", &input, &buf); 656 if (ACPI_SUCCESS(ret)) 657 return (union acpi_object *)buf.pointer; 658 659 if (ret != AE_NOT_FOUND) 660 acpi_handle_warn(handle, 661 "failed to evaluate _DSM (0x%x)\n", ret); 662 663 return NULL; 664 } 665 EXPORT_SYMBOL(acpi_evaluate_dsm); 666 667 /** 668 * acpi_check_dsm - check if _DSM method supports requested functions. 669 * @handle: ACPI device handle 670 * @guid: GUID of requested functions, should be 16 bytes at least 671 * @rev: revision number of requested functions 672 * @funcs: bitmap of requested functions 673 * 674 * Evaluate device's _DSM method to check whether it supports requested 675 * functions. Currently only support 64 functions at maximum, should be 676 * enough for now. 677 */ 678 bool acpi_check_dsm(acpi_handle handle, const guid_t *guid, u64 rev, u64 funcs) 679 { 680 int i; 681 u64 mask = 0; 682 union acpi_object *obj; 683 684 if (funcs == 0) 685 return false; 686 687 obj = acpi_evaluate_dsm(handle, guid, rev, 0, NULL); 688 if (!obj) 689 return false; 690 691 /* For compatibility, old BIOSes may return an integer */ 692 if (obj->type == ACPI_TYPE_INTEGER) 693 mask = obj->integer.value; 694 else if (obj->type == ACPI_TYPE_BUFFER) 695 for (i = 0; i < obj->buffer.length && i < 8; i++) 696 mask |= (((u64)obj->buffer.pointer[i]) << (i * 8)); 697 ACPI_FREE(obj); 698 699 /* 700 * Bit 0 indicates whether there's support for any functions other than 701 * function 0 for the specified GUID and revision. 702 */ 703 if ((mask & 0x1) && (mask & funcs) == funcs) 704 return true; 705 706 return false; 707 } 708 EXPORT_SYMBOL(acpi_check_dsm); 709 710 /** 711 * acpi_dev_found - Detect presence of a given ACPI device in the namespace. 712 * @hid: Hardware ID of the device. 713 * 714 * Return %true if the device was present at the moment of invocation. 715 * Note that if the device is pluggable, it may since have disappeared. 716 * 717 * For this function to work, acpi_bus_scan() must have been executed 718 * which happens in the subsys_initcall() subsection. Hence, do not 719 * call from a subsys_initcall() or earlier (use acpi_get_devices() 720 * instead). Calling from module_init() is fine (which is synonymous 721 * with device_initcall()). 722 */ 723 bool acpi_dev_found(const char *hid) 724 { 725 struct acpi_device_bus_id *acpi_device_bus_id; 726 bool found = false; 727 728 mutex_lock(&acpi_device_lock); 729 list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) 730 if (!strcmp(acpi_device_bus_id->bus_id, hid)) { 731 found = true; 732 break; 733 } 734 mutex_unlock(&acpi_device_lock); 735 736 return found; 737 } 738 EXPORT_SYMBOL(acpi_dev_found); 739 740 struct acpi_dev_match_info { 741 const char *dev_name; 742 struct acpi_device_id hid[2]; 743 const char *uid; 744 s64 hrv; 745 }; 746 747 static int acpi_dev_match_cb(struct device *dev, void *data) 748 { 749 struct acpi_device *adev = to_acpi_device(dev); 750 struct acpi_dev_match_info *match = data; 751 unsigned long long hrv; 752 acpi_status status; 753 754 if (acpi_match_device_ids(adev, match->hid)) 755 return 0; 756 757 if (match->uid && (!adev->pnp.unique_id || 758 strcmp(adev->pnp.unique_id, match->uid))) 759 return 0; 760 761 match->dev_name = acpi_dev_name(adev); 762 763 if (match->hrv == -1) 764 return 1; 765 766 status = acpi_evaluate_integer(adev->handle, "_HRV", NULL, &hrv); 767 if (ACPI_FAILURE(status)) 768 return 0; 769 770 return hrv == match->hrv; 771 } 772 773 /** 774 * acpi_dev_present - Detect that a given ACPI device is present 775 * @hid: Hardware ID of the device. 776 * @uid: Unique ID of the device, pass NULL to not check _UID 777 * @hrv: Hardware Revision of the device, pass -1 to not check _HRV 778 * 779 * Return %true if a matching device was present at the moment of invocation. 780 * Note that if the device is pluggable, it may since have disappeared. 781 * 782 * Note that unlike acpi_dev_found() this function checks the status 783 * of the device. So for devices which are present in the dsdt, but 784 * which are disabled (their _STA callback returns 0) this function 785 * will return false. 786 * 787 * For this function to work, acpi_bus_scan() must have been executed 788 * which happens in the subsys_initcall() subsection. Hence, do not 789 * call from a subsys_initcall() or earlier (use acpi_get_devices() 790 * instead). Calling from module_init() is fine (which is synonymous 791 * with device_initcall()). 792 */ 793 bool acpi_dev_present(const char *hid, const char *uid, s64 hrv) 794 { 795 struct acpi_dev_match_info match = {}; 796 struct device *dev; 797 798 strlcpy(match.hid[0].id, hid, sizeof(match.hid[0].id)); 799 match.uid = uid; 800 match.hrv = hrv; 801 802 dev = bus_find_device(&acpi_bus_type, NULL, &match, acpi_dev_match_cb); 803 return !!dev; 804 } 805 EXPORT_SYMBOL(acpi_dev_present); 806 807 /** 808 * acpi_dev_get_first_match_name - Return name of first match of ACPI device 809 * @hid: Hardware ID of the device. 810 * @uid: Unique ID of the device, pass NULL to not check _UID 811 * @hrv: Hardware Revision of the device, pass -1 to not check _HRV 812 * 813 * Return device name if a matching device was present 814 * at the moment of invocation, or NULL otherwise. 815 * 816 * See additional information in acpi_dev_present() as well. 817 */ 818 const char * 819 acpi_dev_get_first_match_name(const char *hid, const char *uid, s64 hrv) 820 { 821 struct acpi_dev_match_info match = {}; 822 struct device *dev; 823 824 strlcpy(match.hid[0].id, hid, sizeof(match.hid[0].id)); 825 match.uid = uid; 826 match.hrv = hrv; 827 828 dev = bus_find_device(&acpi_bus_type, NULL, &match, acpi_dev_match_cb); 829 return dev ? match.dev_name : NULL; 830 } 831 EXPORT_SYMBOL(acpi_dev_get_first_match_name); 832 833 /* 834 * acpi_backlight= handling, this is done here rather then in video_detect.c 835 * because __setup cannot be used in modules. 836 */ 837 char acpi_video_backlight_string[16]; 838 EXPORT_SYMBOL(acpi_video_backlight_string); 839 840 static int __init acpi_backlight(char *str) 841 { 842 strlcpy(acpi_video_backlight_string, str, 843 sizeof(acpi_video_backlight_string)); 844 return 1; 845 } 846 __setup("acpi_backlight=", acpi_backlight); 847 848 /** 849 * acpi_match_platform_list - Check if the system matches with a given list 850 * @plat: pointer to acpi_platform_list table terminated by a NULL entry 851 * 852 * Return the matched index if the system is found in the platform list. 853 * Otherwise, return a negative error code. 854 */ 855 int acpi_match_platform_list(const struct acpi_platform_list *plat) 856 { 857 struct acpi_table_header hdr; 858 int idx = 0; 859 860 if (acpi_disabled) 861 return -ENODEV; 862 863 for (; plat->oem_id[0]; plat++, idx++) { 864 if (ACPI_FAILURE(acpi_get_table_header(plat->table, 0, &hdr))) 865 continue; 866 867 if (strncmp(plat->oem_id, hdr.oem_id, ACPI_OEM_ID_SIZE)) 868 continue; 869 870 if (strncmp(plat->oem_table_id, hdr.oem_table_id, ACPI_OEM_TABLE_ID_SIZE)) 871 continue; 872 873 if ((plat->pred == all_versions) || 874 (plat->pred == less_than_or_equal && hdr.oem_revision <= plat->oem_revision) || 875 (plat->pred == greater_than_or_equal && hdr.oem_revision >= plat->oem_revision) || 876 (plat->pred == equal && hdr.oem_revision == plat->oem_revision)) 877 return idx; 878 } 879 880 return -ENODEV; 881 } 882 EXPORT_SYMBOL(acpi_match_platform_list); 883