linux/drivers/acpi/utils.c
<<
>>
Prefs
   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
  35ACPI_MODULE_NAME("utils");
  36
  37/* --------------------------------------------------------------------------
  38                            Object Evaluation Helpers
  39   -------------------------------------------------------------------------- */
  40static void
  41acpi_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
  54acpi_status
  55acpi_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
 280EXPORT_SYMBOL(acpi_extract_package);
 281
 282acpi_status
 283acpi_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
 314EXPORT_SYMBOL(acpi_evaluate_integer);
 315
 316acpi_status
 317acpi_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
 398EXPORT_SYMBOL(acpi_evaluate_reference);
 399
 400acpi_status
 401acpi_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
 427out:
 428        kfree(buffer.pointer);
 429        return status;
 430}
 431EXPORT_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 */
 444acpi_status
 445acpi_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}
 467EXPORT_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 */
 474static 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 */
 495void
 496acpi_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}
 512EXPORT_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 */
 523void
 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}
 541EXPORT_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 */
 551bool 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}
 557EXPORT_SYMBOL(acpi_has_method);
 558
 559acpi_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}
 569EXPORT_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 */
 577acpi_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 */
 597acpi_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 */
 628union acpi_object *
 629acpi_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}
 665EXPORT_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 */
 678bool 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}
 708EXPORT_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 */
 723bool 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}
 738EXPORT_SYMBOL(acpi_dev_found);
 739
 740struct 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
 747static 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 */
 793bool 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}
 805EXPORT_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 */
 818const char *
 819acpi_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}
 831EXPORT_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 */
 837char acpi_video_backlight_string[16];
 838EXPORT_SYMBOL(acpi_video_backlight_string);
 839
 840static 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 */
 855int 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}
 882EXPORT_SYMBOL(acpi_match_platform_list);
 883