tbfind.c revision 217365
1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: tbfind   - find table
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp.
9167802Sjkim * All rights reserved.
10167802Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25167802Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29167802Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43167802Sjkim
44167802Sjkim#define __TBFIND_C__
45167802Sjkim
46193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
47193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
48193341Sjkim#include <contrib/dev/acpica/include/actables.h>
49167802Sjkim
50167802Sjkim#define _COMPONENT          ACPI_TABLES
51167802Sjkim        ACPI_MODULE_NAME    ("tbfind")
52167802Sjkim
53167802Sjkim
54167802Sjkim/*******************************************************************************
55167802Sjkim *
56167802Sjkim * FUNCTION:    AcpiTbFindTable
57167802Sjkim *
58167802Sjkim * PARAMETERS:  Signature           - String with ACPI table signature
59167802Sjkim *              OemId               - String with the table OEM ID
60167802Sjkim *              OemTableId          - String with the OEM Table ID
61167802Sjkim *              TableIndex          - Where the table index is returned
62167802Sjkim *
63167802Sjkim * RETURN:      Status and table index
64167802Sjkim *
65167802Sjkim * DESCRIPTION: Find an ACPI table (in the RSDT/XSDT) that matches the
66167802Sjkim *              Signature, OEM ID and OEM Table ID. Returns an index that can
67167802Sjkim *              be used to get the table header or entire table.
68167802Sjkim *
69167802Sjkim ******************************************************************************/
70167802Sjkim
71167802SjkimACPI_STATUS
72167802SjkimAcpiTbFindTable (
73167802Sjkim    char                    *Signature,
74167802Sjkim    char                    *OemId,
75167802Sjkim    char                    *OemTableId,
76193267Sjkim    UINT32                  *TableIndex)
77167802Sjkim{
78193267Sjkim    UINT32                  i;
79167802Sjkim    ACPI_STATUS             Status;
80193267Sjkim    ACPI_TABLE_HEADER       Header;
81167802Sjkim
82167802Sjkim
83167802Sjkim    ACPI_FUNCTION_TRACE (TbFindTable);
84167802Sjkim
85167802Sjkim
86193267Sjkim    /* Normalize the input strings */
87193267Sjkim
88193267Sjkim    ACPI_MEMSET (&Header, 0, sizeof (ACPI_TABLE_HEADER));
89193267Sjkim    ACPI_STRNCPY (Header.Signature, Signature, ACPI_NAME_SIZE);
90193267Sjkim    ACPI_STRNCPY (Header.OemId, OemId, ACPI_OEM_ID_SIZE);
91193267Sjkim    ACPI_STRNCPY (Header.OemTableId, OemTableId, ACPI_OEM_TABLE_ID_SIZE);
92193267Sjkim
93193267Sjkim    /* Search for the table */
94193267Sjkim
95207344Sjkim    for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
96167802Sjkim    {
97167802Sjkim        if (ACPI_MEMCMP (&(AcpiGbl_RootTableList.Tables[i].Signature),
98193267Sjkim                            Header.Signature, ACPI_NAME_SIZE))
99167802Sjkim        {
100167802Sjkim            /* Not the requested table */
101167802Sjkim
102167802Sjkim            continue;
103167802Sjkim        }
104167802Sjkim
105167802Sjkim        /* Table with matching signature has been found */
106167802Sjkim
107167802Sjkim        if (!AcpiGbl_RootTableList.Tables[i].Pointer)
108167802Sjkim        {
109167802Sjkim            /* Table is not currently mapped, map it */
110167802Sjkim
111167802Sjkim            Status = AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[i]);
112167802Sjkim            if (ACPI_FAILURE (Status))
113167802Sjkim            {
114167802Sjkim                return_ACPI_STATUS (Status);
115167802Sjkim            }
116167802Sjkim
117167802Sjkim            if (!AcpiGbl_RootTableList.Tables[i].Pointer)
118167802Sjkim            {
119167802Sjkim                continue;
120167802Sjkim            }
121167802Sjkim        }
122167802Sjkim
123167802Sjkim        /* Check for table match on all IDs */
124167802Sjkim
125167802Sjkim        if (!ACPI_MEMCMP (AcpiGbl_RootTableList.Tables[i].Pointer->Signature,
126193267Sjkim                            Header.Signature, ACPI_NAME_SIZE) &&
127167802Sjkim            (!OemId[0] ||
128167802Sjkim             !ACPI_MEMCMP (AcpiGbl_RootTableList.Tables[i].Pointer->OemId,
129193267Sjkim                             Header.OemId, ACPI_OEM_ID_SIZE)) &&
130167802Sjkim            (!OemTableId[0] ||
131167802Sjkim             !ACPI_MEMCMP (AcpiGbl_RootTableList.Tables[i].Pointer->OemTableId,
132193267Sjkim                             Header.OemTableId, ACPI_OEM_TABLE_ID_SIZE)))
133167802Sjkim        {
134167802Sjkim            *TableIndex = i;
135167802Sjkim
136167802Sjkim            ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Found table [%4.4s]\n",
137193267Sjkim                Header.Signature));
138167802Sjkim            return_ACPI_STATUS (AE_OK);
139167802Sjkim        }
140167802Sjkim    }
141167802Sjkim
142167802Sjkim    return_ACPI_STATUS (AE_NOT_FOUND);
143167802Sjkim}
144