1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: tbfind   - find table
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8281075Sdim * Copyright (C) 2000 - 2015, 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
44193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193341Sjkim#include <contrib/dev/acpica/include/actables.h>
47167802Sjkim
48167802Sjkim#define _COMPONENT          ACPI_TABLES
49167802Sjkim        ACPI_MODULE_NAME    ("tbfind")
50167802Sjkim
51167802Sjkim
52167802Sjkim/*******************************************************************************
53167802Sjkim *
54167802Sjkim * FUNCTION:    AcpiTbFindTable
55167802Sjkim *
56167802Sjkim * PARAMETERS:  Signature           - String with ACPI table signature
57167802Sjkim *              OemId               - String with the table OEM ID
58167802Sjkim *              OemTableId          - String with the OEM Table ID
59167802Sjkim *              TableIndex          - Where the table index is returned
60167802Sjkim *
61167802Sjkim * RETURN:      Status and table index
62167802Sjkim *
63167802Sjkim * DESCRIPTION: Find an ACPI table (in the RSDT/XSDT) that matches the
64167802Sjkim *              Signature, OEM ID and OEM Table ID. Returns an index that can
65167802Sjkim *              be used to get the table header or entire table.
66167802Sjkim *
67167802Sjkim ******************************************************************************/
68167802Sjkim
69167802SjkimACPI_STATUS
70167802SjkimAcpiTbFindTable (
71167802Sjkim    char                    *Signature,
72167802Sjkim    char                    *OemId,
73167802Sjkim    char                    *OemTableId,
74193267Sjkim    UINT32                  *TableIndex)
75167802Sjkim{
76193267Sjkim    UINT32                  i;
77167802Sjkim    ACPI_STATUS             Status;
78193267Sjkim    ACPI_TABLE_HEADER       Header;
79167802Sjkim
80167802Sjkim
81167802Sjkim    ACPI_FUNCTION_TRACE (TbFindTable);
82167802Sjkim
83167802Sjkim
84193267Sjkim    /* Normalize the input strings */
85193267Sjkim
86193267Sjkim    ACPI_MEMSET (&Header, 0, sizeof (ACPI_TABLE_HEADER));
87241973Sjkim    ACPI_MOVE_NAME (Header.Signature, Signature);
88193267Sjkim    ACPI_STRNCPY (Header.OemId, OemId, ACPI_OEM_ID_SIZE);
89193267Sjkim    ACPI_STRNCPY (Header.OemTableId, OemTableId, ACPI_OEM_TABLE_ID_SIZE);
90193267Sjkim
91193267Sjkim    /* Search for the table */
92193267Sjkim
93207344Sjkim    for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
94167802Sjkim    {
95167802Sjkim        if (ACPI_MEMCMP (&(AcpiGbl_RootTableList.Tables[i].Signature),
96193267Sjkim                            Header.Signature, ACPI_NAME_SIZE))
97167802Sjkim        {
98167802Sjkim            /* Not the requested table */
99167802Sjkim
100167802Sjkim            continue;
101167802Sjkim        }
102167802Sjkim
103167802Sjkim        /* Table with matching signature has been found */
104167802Sjkim
105167802Sjkim        if (!AcpiGbl_RootTableList.Tables[i].Pointer)
106167802Sjkim        {
107167802Sjkim            /* Table is not currently mapped, map it */
108167802Sjkim
109281075Sdim            Status = AcpiTbValidateTable (&AcpiGbl_RootTableList.Tables[i]);
110167802Sjkim            if (ACPI_FAILURE (Status))
111167802Sjkim            {
112167802Sjkim                return_ACPI_STATUS (Status);
113167802Sjkim            }
114167802Sjkim
115167802Sjkim            if (!AcpiGbl_RootTableList.Tables[i].Pointer)
116167802Sjkim            {
117167802Sjkim                continue;
118167802Sjkim            }
119167802Sjkim        }
120167802Sjkim
121167802Sjkim        /* Check for table match on all IDs */
122167802Sjkim
123167802Sjkim        if (!ACPI_MEMCMP (AcpiGbl_RootTableList.Tables[i].Pointer->Signature,
124193267Sjkim                            Header.Signature, ACPI_NAME_SIZE) &&
125167802Sjkim            (!OemId[0] ||
126167802Sjkim             !ACPI_MEMCMP (AcpiGbl_RootTableList.Tables[i].Pointer->OemId,
127193267Sjkim                             Header.OemId, ACPI_OEM_ID_SIZE)) &&
128167802Sjkim            (!OemTableId[0] ||
129167802Sjkim             !ACPI_MEMCMP (AcpiGbl_RootTableList.Tables[i].Pointer->OemTableId,
130193267Sjkim                             Header.OemTableId, ACPI_OEM_TABLE_ID_SIZE)))
131167802Sjkim        {
132167802Sjkim            *TableIndex = i;
133167802Sjkim
134167802Sjkim            ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Found table [%4.4s]\n",
135193267Sjkim                Header.Signature));
136167802Sjkim            return_ACPI_STATUS (AE_OK);
137167802Sjkim        }
138167802Sjkim    }
139167802Sjkim
140167802Sjkim    return_ACPI_STATUS (AE_NOT_FOUND);
141167802Sjkim}
142