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