1 /******************************************************************************
 
   3  * Module Name: tbfind   - find table
 
   5  *****************************************************************************/
 
   8  * Copyright (C) 2000 - 2008, Intel Corp.
 
  11  * Redistribution and use in source and binary forms, with or without
 
  12  * modification, are permitted provided that the following conditions
 
  14  * 1. Redistributions of source code must retain the above copyright
 
  15  *    notice, this list of conditions, and the following disclaimer,
 
  16  *    without modification.
 
  17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 
  18  *    substantially similar to the "NO WARRANTY" disclaimer below
 
  19  *    ("Disclaimer") and any redistribution must be conditioned upon
 
  20  *    including a substantially similar Disclaimer requirement for further
 
  21  *    binary redistribution.
 
  22  * 3. Neither the names of the above-listed copyright holders nor the names
 
  23  *    of any contributors may be used to endorse or promote products derived
 
  24  *    from this software without specific prior written permission.
 
  26  * Alternatively, this software may be distributed under the terms of the
 
  27  * GNU General Public License ("GPL") version 2 as published by the Free
 
  28  * Software Foundation.
 
  31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 
  32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 
  33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 
  34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 
  35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
  36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 
  37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
  38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 
  39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 
  40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 
  41  * POSSIBILITY OF SUCH DAMAGES.
 
  44 #include <acpi/acpi.h>
 
  45 #include <acpi/actables.h>
 
  47 #define _COMPONENT          ACPI_TABLES
 
  48 ACPI_MODULE_NAME("tbfind")
 
  50 /*******************************************************************************
 
  52  * FUNCTION:    acpi_tb_find_table
 
  54  * PARAMETERS:  Signature           - String with ACPI table signature
 
  55  *              oem_id              - String with the table OEM ID
 
  56  *              oem_table_id        - String with the OEM Table ID
 
  57  *              table_index         - Where the table index is returned
 
  59  * RETURN:      Status and table index
 
  61  * DESCRIPTION: Find an ACPI table (in the RSDT/XSDT) that matches the
 
  62  *              Signature, OEM ID and OEM Table ID. Returns an index that can
 
  63  *              be used to get the table header or entire table.
 
  65  ******************************************************************************/
 
  67 acpi_tb_find_table(char *signature,
 
  68                    char *oem_id, char *oem_table_id, u32 *table_index)
 
  72         struct acpi_table_header header;
 
  74         ACPI_FUNCTION_TRACE(tb_find_table);
 
  76         /* Normalize the input strings */
 
  78         ACPI_MEMSET(&header, 0, sizeof(struct acpi_table_header));
 
  79         ACPI_STRNCPY(header.signature, signature, ACPI_NAME_SIZE);
 
  80         ACPI_STRNCPY(header.oem_id, oem_id, ACPI_OEM_ID_SIZE);
 
  81         ACPI_STRNCPY(header.oem_table_id, oem_table_id, ACPI_OEM_TABLE_ID_SIZE);
 
  83         /* Search for the table */
 
  85         for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {
 
  86                 if (ACPI_MEMCMP(&(acpi_gbl_root_table_list.tables[i].signature),
 
  87                                 header.signature, ACPI_NAME_SIZE)) {
 
  89                         /* Not the requested table */
 
  94                 /* Table with matching signature has been found */
 
  96                 if (!acpi_gbl_root_table_list.tables[i].pointer) {
 
  98                         /* Table is not currently mapped, map it */
 
 101                             acpi_tb_verify_table(&acpi_gbl_root_table_list.
 
 103                         if (ACPI_FAILURE(status)) {
 
 104                                 return_ACPI_STATUS(status);
 
 107                         if (!acpi_gbl_root_table_list.tables[i].pointer) {
 
 112                 /* Check for table match on all IDs */
 
 115                     (acpi_gbl_root_table_list.tables[i].pointer->signature,
 
 116                      header.signature, ACPI_NAME_SIZE) && (!oem_id[0]
 
 119                                                            (acpi_gbl_root_table_list.
 
 125                         || !ACPI_MEMCMP(acpi_gbl_root_table_list.tables[i].
 
 126                                         pointer->oem_table_id,
 
 128                                         ACPI_OEM_TABLE_ID_SIZE))) {
 
 131                         ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
 
 132                                           "Found table [%4.4s]\n",
 
 134                         return_ACPI_STATUS(AE_OK);
 
 138         return_ACPI_STATUS(AE_NOT_FOUND);