Blame view

drivers/acpi/acpica/nsload.c 8.89 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
  /******************************************************************************
   *
   * Module Name: nsload - namespace loading/expanding/contracting procedures
   *
   *****************************************************************************/
  
  /*
75a44ce00   Len Brown   ACPICA: update In...
8
   * Copyright (C) 2000 - 2008, Intel Corp.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions, and the following disclaimer,
   *    without modification.
   * 2. Redistributions in binary form must reproduce at minimum a disclaimer
   *    substantially similar to the "NO WARRANTY" disclaimer below
   *    ("Disclaimer") and any redistribution must be conditioned upon
   *    including a substantially similar Disclaimer requirement for further
   *    binary redistribution.
   * 3. Neither the names of the above-listed copyright holders nor the names
   *    of any contributors may be used to endorse or promote products derived
   *    from this software without specific prior written permission.
   *
   * Alternatively, this software may be distributed under the terms of the
   * GNU General Public License ("GPL") version 2 as published by the Free
   * Software Foundation.
   *
   * NO WARRANTY
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
   * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
   * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGES.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
  #include <acpi/acpi.h>
e2f7a7772   Len Brown   ACPICA: hide priv...
44
45
46
47
  #include "accommon.h"
  #include "acnamesp.h"
  #include "acdispat.h"
  #include "actables.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  #define _COMPONENT          ACPI_NAMESPACE
4be44fcd3   Len Brown   [ACPI] Lindent al...
50
  ACPI_MODULE_NAME("nsload")
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51

44f6c0124   Robert Moore   ACPICA 20050408 f...
52
  /* Local prototypes */
44f6c0124   Robert Moore   ACPICA 20050408 f...
53
  #ifdef ACPI_FUTURE_IMPLEMENTATION
4be44fcd3   Len Brown   [ACPI] Lindent al...
54
  acpi_status acpi_ns_unload_namespace(acpi_handle handle);
44f6c0124   Robert Moore   ACPICA 20050408 f...
55

4be44fcd3   Len Brown   [ACPI] Lindent al...
56
  static acpi_status acpi_ns_delete_subtree(acpi_handle start_handle);
44f6c0124   Robert Moore   ACPICA 20050408 f...
57
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58

44f6c0124   Robert Moore   ACPICA 20050408 f...
59
  #ifndef ACPI_NO_METHOD_EXECUTION
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
62
63
  /*******************************************************************************
   *
   * FUNCTION:    acpi_ns_load_table
   *
f3d2e7865   Bob Moore   ACPICA: Implement...
64
   * PARAMETERS:  table_index     - Index for table to be loaded
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
66
67
68
69
70
71
72
73
   *              Node            - Owning NS node
   *
   * RETURN:      Status
   *
   * DESCRIPTION: Load one ACPI table into the namespace
   *
   ******************************************************************************/
  
  acpi_status
67a119f99   Bob Moore   ACPICA: Eliminate...
74
  acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  {
4be44fcd3   Len Brown   [ACPI] Lindent al...
76
  	acpi_status status;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77

b229cf92e   Bob Moore   ACPI: ACPICA 2006...
78
  	ACPI_FUNCTION_TRACE(ns_load_table);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
83
84
85
86
87
88
  	/*
  	 * Parse the table and load the namespace with all named
  	 * objects found within.  Control methods are NOT parsed
  	 * at this time.  In fact, the control methods cannot be
  	 * parsed until the entire namespace is loaded, because
  	 * if a control method makes a forward reference (call)
  	 * to another control method, we can't continue parsing
  	 * because we don't know how many arguments to parse next!
  	 */
f3d2e7865   Bob Moore   ACPICA: Implement...
89
90
91
92
93
94
95
96
97
98
99
  	status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
  	if (ACPI_FAILURE(status)) {
  		return_ACPI_STATUS(status);
  	}
  
  	/* If table already loaded into namespace, just return */
  
  	if (acpi_tb_is_table_loaded(table_index)) {
  		status = AE_ALREADY_EXISTS;
  		goto unlock;
  	}
4be44fcd3   Len Brown   [ACPI] Lindent al...
100
101
102
  	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
  			  "**** Loading table into namespace ****
  "));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
103

f3d2e7865   Bob Moore   ACPICA: Implement...
104
  	status = acpi_tb_allocate_owner_id(table_index);
4be44fcd3   Len Brown   [ACPI] Lindent al...
105
  	if (ACPI_FAILURE(status)) {
f3d2e7865   Bob Moore   ACPICA: Implement...
106
  		goto unlock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
  	}
7f4ac9f91   Bob Moore   ACPICA: Fix for L...
108
  	status = acpi_ns_parse_table(table_index, node);
f3d2e7865   Bob Moore   ACPICA: Implement...
109
110
111
  	if (ACPI_SUCCESS(status)) {
  		acpi_tb_set_table_loaded_flag(table_index, TRUE);
  	} else {
1d18c0582   Bob Moore   ACPICA: Cosmetic ...
112
  		(void)acpi_tb_release_owner_id(table_index);
f3d2e7865   Bob Moore   ACPICA: Implement...
113
114
115
  	}
  
        unlock:
4be44fcd3   Len Brown   [ACPI] Lindent al...
116
  	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117

4be44fcd3   Len Brown   [ACPI] Lindent al...
118
119
  	if (ACPI_FAILURE(status)) {
  		return_ACPI_STATUS(status);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
121
122
123
124
125
126
127
  	}
  
  	/*
  	 * Now we can parse the control methods.  We always parse
  	 * them here for a sanity check, and if configured for
  	 * just-in-time parsing, we delete the control method
  	 * parse trees.
  	 */
4be44fcd3   Len Brown   [ACPI] Lindent al...
128
  	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
d4913dc6d   Bob Moore   ACPICA: Formattin...
129
130
  			  "**** Begin Table Method Parsing and Object Initialization
  "));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131

f3d2e7865   Bob Moore   ACPICA: Implement...
132
  	status = acpi_ds_initialize_objects(table_index, node);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133

4be44fcd3   Len Brown   [ACPI] Lindent al...
134
  	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
d4913dc6d   Bob Moore   ACPICA: Formattin...
135
136
  			  "**** Completed Table Method Parsing and Object Initialization
  "));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137

4be44fcd3   Len Brown   [ACPI] Lindent al...
138
  	return_ACPI_STATUS(status);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
139
  }
f3d2e7865   Bob Moore   ACPICA: Implement...
140
  #ifdef ACPI_OBSOLETE_FUNCTIONS
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
142
143
144
145
146
147
148
149
150
151
152
  /*******************************************************************************
   *
   * FUNCTION:    acpi_load_namespace
   *
   * PARAMETERS:  None
   *
   * RETURN:      Status
   *
   * DESCRIPTION: Load the name space from what ever is pointed to by DSDT.
   *              (DSDT points to either the BIOS or a buffer.)
   *
   ******************************************************************************/
4be44fcd3   Len Brown   [ACPI] Lindent al...
153
  acpi_status acpi_ns_load_namespace(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
  {
4be44fcd3   Len Brown   [ACPI] Lindent al...
155
  	acpi_status status;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156

b229cf92e   Bob Moore   ACPI: ACPICA 2006...
157
  	ACPI_FUNCTION_TRACE(acpi_load_name_space);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
159
160
161
  
  	/* There must be at least a DSDT installed */
  
  	if (acpi_gbl_DSDT == NULL) {
b8e4d8935   Bob Moore   [ACPI] ACPICA 200...
162
  		ACPI_ERROR((AE_INFO, "DSDT is not in memory"));
4be44fcd3   Len Brown   [ACPI] Lindent al...
163
  		return_ACPI_STATUS(AE_NO_ACPI_TABLES);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
166
167
168
169
  	}
  
  	/*
  	 * Load the namespace.  The DSDT is required,
  	 * but the SSDT and PSDT tables are optional.
  	 */
b229cf92e   Bob Moore   ACPI: ACPICA 2006...
170
  	status = acpi_ns_load_table_by_type(ACPI_TABLE_ID_DSDT);
4be44fcd3   Len Brown   [ACPI] Lindent al...
171
172
  	if (ACPI_FAILURE(status)) {
  		return_ACPI_STATUS(status);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
174
175
  	}
  
  	/* Ignore exceptions from these */
b229cf92e   Bob Moore   ACPI: ACPICA 2006...
176
177
  	(void)acpi_ns_load_table_by_type(ACPI_TABLE_ID_SSDT);
  	(void)acpi_ns_load_table_by_type(ACPI_TABLE_ID_PSDT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178

4be44fcd3   Len Brown   [ACPI] Lindent al...
179
180
181
182
  	ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
  			      "ACPI Namespace successfully loaded at root %p
  ",
  			      acpi_gbl_root_node));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183

4be44fcd3   Len Brown   [ACPI] Lindent al...
184
  	return_ACPI_STATUS(status);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
  }
f3d2e7865   Bob Moore   ACPICA: Implement...
186
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187

44f6c0124   Robert Moore   ACPICA 20050408 f...
188
  #ifdef ACPI_FUTURE_IMPLEMENTATION
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
  /*******************************************************************************
   *
   * FUNCTION:    acpi_ns_delete_subtree
   *
   * PARAMETERS:  start_handle        - Handle in namespace where search begins
   *
   * RETURNS      Status
   *
   * DESCRIPTION: Walks the namespace starting at the given handle and deletes
   *              all objects, entries, and scopes in the entire subtree.
   *
   *              Namespace/Interpreter should be locked or the subsystem should
   *              be in shutdown before this routine is called.
   *
   ******************************************************************************/
4be44fcd3   Len Brown   [ACPI] Lindent al...
204
  static acpi_status acpi_ns_delete_subtree(acpi_handle start_handle)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205
  {
4be44fcd3   Len Brown   [ACPI] Lindent al...
206
207
208
209
210
211
  	acpi_status status;
  	acpi_handle child_handle;
  	acpi_handle parent_handle;
  	acpi_handle next_child_handle;
  	acpi_handle dummy;
  	u32 level;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212

b229cf92e   Bob Moore   ACPI: ACPICA 2006...
213
  	ACPI_FUNCTION_TRACE(ns_delete_subtree);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
214
215
216
  
  	parent_handle = start_handle;
  	child_handle = NULL;
4be44fcd3   Len Brown   [ACPI] Lindent al...
217
  	level = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
219
220
221
222
223
  
  	/*
  	 * Traverse the tree of objects until we bubble back up
  	 * to where we started.
  	 */
  	while (level > 0) {
52fc0b026   Bob Moore   [ACPI] ACPICA 200...
224

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225
  		/* Attempt to get the next object in this scope */
4be44fcd3   Len Brown   [ACPI] Lindent al...
226
227
  		status = acpi_get_next_object(ACPI_TYPE_ANY, parent_handle,
  					      child_handle, &next_child_handle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
229
230
231
  
  		child_handle = next_child_handle;
  
  		/* Did we get a new object? */
4be44fcd3   Len Brown   [ACPI] Lindent al...
232
  		if (ACPI_SUCCESS(status)) {
52fc0b026   Bob Moore   [ACPI] ACPICA 200...
233

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
  			/* Check if this object has any children */
4be44fcd3   Len Brown   [ACPI] Lindent al...
235
236
237
  			if (ACPI_SUCCESS
  			    (acpi_get_next_object
  			     (ACPI_TYPE_ANY, child_handle, NULL, &dummy))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
238
239
240
241
242
243
244
245
  				/*
  				 * There is at least one child of this object,
  				 * visit the object
  				 */
  				level++;
  				parent_handle = child_handle;
  				child_handle = NULL;
  			}
4be44fcd3   Len Brown   [ACPI] Lindent al...
246
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
247
248
249
250
251
252
253
  			/*
  			 * No more children in this object, go back up to
  			 * the object's parent
  			 */
  			level--;
  
  			/* Delete all children now */
4be44fcd3   Len Brown   [ACPI] Lindent al...
254
  			acpi_ns_delete_children(child_handle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
256
  
  			child_handle = parent_handle;
4be44fcd3   Len Brown   [ACPI] Lindent al...
257
258
259
  			status = acpi_get_parent(parent_handle, &parent_handle);
  			if (ACPI_FAILURE(status)) {
  				return_ACPI_STATUS(status);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
260
261
262
263
264
  			}
  		}
  	}
  
  	/* Now delete the starting object, and we are done */
8e4319c42   Bob Moore   ACPICA: Fix sever...
265
  	acpi_ns_remove_node(child_handle);
4be44fcd3   Len Brown   [ACPI] Lindent al...
266
  	return_ACPI_STATUS(AE_OK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
268
269
270
271
272
273
274
275
276
277
278
279
280
  /*******************************************************************************
   *
   *  FUNCTION:       acpi_ns_unload_name_space
   *
   *  PARAMETERS:     Handle          - Root of namespace subtree to be deleted
   *
   *  RETURN:         Status
   *
   *  DESCRIPTION:    Shrinks the namespace, typically in response to an undocking
   *                  event.  Deletes an entire subtree starting from (and
   *                  including) the given handle.
   *
   ******************************************************************************/
4be44fcd3   Len Brown   [ACPI] Lindent al...
281
  acpi_status acpi_ns_unload_namespace(acpi_handle handle)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
  {
4be44fcd3   Len Brown   [ACPI] Lindent al...
283
  	acpi_status status;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284

b229cf92e   Bob Moore   ACPI: ACPICA 2006...
285
  	ACPI_FUNCTION_TRACE(ns_unload_name_space);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
286
287
288
289
  
  	/* Parameter validation */
  
  	if (!acpi_gbl_root_node) {
4be44fcd3   Len Brown   [ACPI] Lindent al...
290
  		return_ACPI_STATUS(AE_NO_NAMESPACE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
291
292
293
  	}
  
  	if (!handle) {
4be44fcd3   Len Brown   [ACPI] Lindent al...
294
  		return_ACPI_STATUS(AE_BAD_PARAMETER);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
295
296
297
  	}
  
  	/* This function does the real work */
4be44fcd3   Len Brown   [ACPI] Lindent al...
298
  	status = acpi_ns_delete_subtree(handle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
299

4be44fcd3   Len Brown   [ACPI] Lindent al...
300
  	return_ACPI_STATUS(status);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
301
  }
44f6c0124   Robert Moore   ACPICA 20050408 f...
302
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
  #endif