Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6595 serge 1
/******************************************************************************
2
 *
3
 * Module Name: tbfind   - find table
4
 *
5
 *****************************************************************************/
6
 
7
/*
8
 * Copyright (C) 2000 - 2015, Intel Corp.
9
 * All rights reserved.
10
 *
11
 * Redistribution and use in source and binary forms, with or without
12
 * modification, are permitted provided that the following conditions
13
 * are met:
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.
25
 *
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.
29
 *
30
 * NO WARRANTY
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.
42
 */
43
 
44
#include 
45
#include "accommon.h"
46
#include "actables.h"
47
 
48
#define _COMPONENT          ACPI_TABLES
49
ACPI_MODULE_NAME("tbfind")
50
 
51
/*******************************************************************************
52
 *
53
 * FUNCTION:    acpi_tb_find_table
54
 *
55
 * PARAMETERS:  signature           - String with ACPI table signature
56
 *              oem_id              - String with the table OEM ID
57
 *              oem_table_id        - String with the OEM Table ID
58
 *              table_index         - Where the table index is returned
59
 *
60
 * RETURN:      Status and table index
61
 *
62
 * DESCRIPTION: Find an ACPI table (in the RSDT/XSDT) that matches the
63
 *              Signature, OEM ID and OEM Table ID. Returns an index that can
64
 *              be used to get the table header or entire table.
65
 *
66
 ******************************************************************************/
67
acpi_status
68
acpi_tb_find_table(char *signature,
69
		   char *oem_id, char *oem_table_id, u32 *table_index)
70
{
71
	acpi_status status;
72
	struct acpi_table_header header;
73
	u32 i;
74
 
75
	ACPI_FUNCTION_TRACE(tb_find_table);
76
 
77
	/* Validate the input table signature */
78
 
79
	if (!acpi_is_valid_signature(signature)) {
80
		return_ACPI_STATUS(AE_BAD_SIGNATURE);
81
	}
82
 
83
	/* Don't allow the OEM strings to be too long */
84
 
85
	if ((strlen(oem_id) > ACPI_OEM_ID_SIZE) ||
86
	    (strlen(oem_table_id) > ACPI_OEM_TABLE_ID_SIZE)) {
87
		return_ACPI_STATUS(AE_AML_STRING_LIMIT);
88
	}
89
 
90
	/* Normalize the input strings */
91
 
92
	memset(&header, 0, sizeof(struct acpi_table_header));
93
	ACPI_MOVE_NAME(header.signature, signature);
94
	strncpy(header.oem_id, oem_id, ACPI_OEM_ID_SIZE);
95
	strncpy(header.oem_table_id, oem_table_id, ACPI_OEM_TABLE_ID_SIZE);
96
 
97
	/* Search for the table */
98
 
99
	for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) {
100
		if (memcmp(&(acpi_gbl_root_table_list.tables[i].signature),
101
			   header.signature, ACPI_NAME_SIZE)) {
102
 
103
			/* Not the requested table */
104
 
105
			continue;
106
		}
107
 
108
		/* Table with matching signature has been found */
109
 
110
		if (!acpi_gbl_root_table_list.tables[i].pointer) {
111
 
112
			/* Table is not currently mapped, map it */
113
 
114
			status =
115
			    acpi_tb_validate_table(&acpi_gbl_root_table_list.
116
						   tables[i]);
117
			if (ACPI_FAILURE(status)) {
118
				return_ACPI_STATUS(status);
119
			}
120
 
121
			if (!acpi_gbl_root_table_list.tables[i].pointer) {
122
				continue;
123
			}
124
		}
125
 
126
		/* Check for table match on all IDs */
127
 
128
		if (!memcmp
129
		    (acpi_gbl_root_table_list.tables[i].pointer->signature,
130
		     header.signature, ACPI_NAME_SIZE) && (!oem_id[0]
131
							   ||
132
							   !memcmp
133
							   (acpi_gbl_root_table_list.
134
							    tables[i].pointer->
135
							    oem_id,
136
							    header.oem_id,
137
							    ACPI_OEM_ID_SIZE))
138
		    && (!oem_table_id[0]
139
			|| !memcmp(acpi_gbl_root_table_list.tables[i].pointer->
140
				   oem_table_id, header.oem_table_id,
141
				   ACPI_OEM_TABLE_ID_SIZE))) {
142
			*table_index = i;
143
 
144
			ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
145
					  "Found table [%4.4s]\n",
146
					  header.signature));
147
			return_ACPI_STATUS(AE_OK);
148
		}
149
	}
150
 
151
	return_ACPI_STATUS(AE_NOT_FOUND);
152
}