2018-03-15 06:13:07 +07:00
|
|
|
// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
|
2005-04-17 05:20:36 +07:00
|
|
|
/*******************************************************************************
|
|
|
|
*
|
|
|
|
* Module Name: nsalloc - Namespace allocation and deletion utilities
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
#include <acpi/acpi.h>
|
2009-01-09 12:30:03 +07:00
|
|
|
#include "accommon.h"
|
|
|
|
#include "acnamesp.h"
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
#define _COMPONENT ACPI_NAMESPACE
|
2005-08-05 11:44:28 +07:00
|
|
|
ACPI_MODULE_NAME("nsalloc")
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
*
|
|
|
|
* FUNCTION: acpi_ns_create_node
|
|
|
|
*
|
2012-07-12 08:40:10 +07:00
|
|
|
* PARAMETERS: name - Name of the new node (4 char ACPI name)
|
2005-04-17 05:20:36 +07:00
|
|
|
*
|
2005-04-19 09:49:35 +07:00
|
|
|
* RETURN: New namespace node (Null on failure)
|
2005-04-17 05:20:36 +07:00
|
|
|
*
|
|
|
|
* DESCRIPTION: Create a namespace node
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
2005-08-05 11:44:28 +07:00
|
|
|
struct acpi_namespace_node *acpi_ns_create_node(u32 name)
|
2005-04-17 05:20:36 +07:00
|
|
|
{
|
2005-08-05 11:44:28 +07:00
|
|
|
struct acpi_namespace_node *node;
|
2007-02-02 23:48:23 +07:00
|
|
|
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
|
|
|
u32 temp;
|
|
|
|
#endif
|
2005-04-17 05:20:36 +07:00
|
|
|
|
ACPI: ACPICA 20060421
Removed a device initialization optimization introduced in
20051216 where the _STA method was not run unless an _INI
was also present for the same device. This optimization
could cause problems because it could allow _INI methods
to be run within a not-present device subtree (If a
not-present device had no _INI, _STA would not be run,
the not-present status would not be discovered, and the
children of the device would be incorrectly traversed.)
Implemented a new _STA optimization where namespace
subtrees that do not contain _INI are identified and
ignored during device initialization. Selectively running
_STA can significantly improve boot time on large machines
(with assistance from Len Brown.)
Implemented support for the device initialization case
where the returned _STA flags indicate a device not-present
but functioning. In this case, _INI is not run, but the
device children are examined for presence, as per the
ACPI specification.
Implemented an additional change to the IndexField support
in order to conform to MS behavior. The value written to
the Index Register is not simply a byte offset, it is a
byte offset in units of the access width of the parent
Index Field. (Fiodor Suietov)
Defined and deployed a new OSL interface,
acpi_os_validate_address(). This interface is called during
the creation of all AML operation regions, and allows
the host OS to exert control over what addresses it will
allow the AML code to access. Operation Regions whose
addresses are disallowed will cause a runtime exception
when they are actually accessed (will not affect or abort
table loading.)
Defined and deployed a new OSL interface,
acpi_os_validate_interface(). This interface allows the host OS
to match the various "optional" interface/behavior strings
for the _OSI predefined control method as appropriate
(with assistance from Bjorn Helgaas.)
Restructured and corrected various problems in the
exception handling code paths within DsCallControlMethod
and DsTerminateControlMethod in dsmethod (with assistance
from Takayoshi Kochi.)
Modified the Linux source converter to ignore quoted string
literals while converting identifiers from mixed to lower
case. This will correct problems with the disassembler
and other areas where such strings must not be modified.
The ACPI_FUNCTION_* macros no longer require quotes around
the function name. This allows the Linux source converter
to convert the names, now that the converter ignores
quoted strings.
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
2006-04-22 04:15:00 +07:00
|
|
|
ACPI_FUNCTION_TRACE(ns_create_node);
|
2005-04-17 05:20:36 +07:00
|
|
|
|
2006-03-18 04:44:00 +07:00
|
|
|
node = acpi_os_acquire_object(acpi_gbl_namespace_cache);
|
2005-04-17 05:20:36 +07:00
|
|
|
if (!node) {
|
2005-08-05 11:44:28 +07:00
|
|
|
return_PTR(NULL);
|
2005-04-17 05:20:36 +07:00
|
|
|
}
|
|
|
|
|
2005-08-05 11:44:28 +07:00
|
|
|
ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_allocated++);
|
2005-04-17 05:20:36 +07:00
|
|
|
|
2007-02-02 23:48:23 +07:00
|
|
|
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
2009-03-06 09:05:18 +07:00
|
|
|
temp = acpi_gbl_ns_node_list->total_allocated -
|
2007-02-02 23:48:23 +07:00
|
|
|
acpi_gbl_ns_node_list->total_freed;
|
|
|
|
if (temp > acpi_gbl_ns_node_list->max_occupied) {
|
|
|
|
acpi_gbl_ns_node_list->max_occupied = temp;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2005-08-05 11:44:28 +07:00
|
|
|
node->name.integer = name;
|
|
|
|
ACPI_SET_DESCRIPTOR_TYPE(node, ACPI_DESC_TYPE_NAMED);
|
|
|
|
return_PTR(node);
|
2005-04-17 05:20:36 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
*
|
|
|
|
* FUNCTION: acpi_ns_delete_node
|
|
|
|
*
|
2012-07-12 08:40:10 +07:00
|
|
|
* PARAMETERS: node - Node to be deleted
|
2005-04-17 05:20:36 +07:00
|
|
|
*
|
|
|
|
* RETURN: None
|
|
|
|
*
|
2009-06-29 12:43:27 +07:00
|
|
|
* DESCRIPTION: Delete a namespace node. All node deletions must come through
|
|
|
|
* here. Detaches any attached objects, including any attached
|
|
|
|
* data. If a handler is associated with attached data, it is
|
|
|
|
* invoked before the node is deleted.
|
2005-04-17 05:20:36 +07:00
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
|
2005-08-05 11:44:28 +07:00
|
|
|
void acpi_ns_delete_node(struct acpi_namespace_node *node)
|
2009-06-29 12:43:27 +07:00
|
|
|
{
|
|
|
|
union acpi_operand_object *obj_desc;
|
2013-11-21 11:19:55 +07:00
|
|
|
union acpi_operand_object *next_desc;
|
2009-06-29 12:43:27 +07:00
|
|
|
|
|
|
|
ACPI_FUNCTION_NAME(ns_delete_node);
|
|
|
|
|
2019-04-09 03:42:29 +07:00
|
|
|
if (!node) {
|
|
|
|
return_VOID;
|
|
|
|
}
|
|
|
|
|
2009-06-29 12:43:27 +07:00
|
|
|
/* Detach an object if there is one */
|
|
|
|
|
|
|
|
acpi_ns_detach_object(node);
|
|
|
|
|
|
|
|
/*
|
2013-11-21 11:19:55 +07:00
|
|
|
* Delete an attached data object list if present (objects that were
|
|
|
|
* attached via acpi_attach_data). Note: After any normal object is
|
|
|
|
* detached above, the only possible remaining object(s) are data
|
|
|
|
* objects, in a linked list.
|
2009-06-29 12:43:27 +07:00
|
|
|
*/
|
|
|
|
obj_desc = node->object;
|
2013-11-21 11:19:55 +07:00
|
|
|
while (obj_desc && (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) {
|
2009-06-29 12:43:27 +07:00
|
|
|
|
|
|
|
/* Invoke the attached data deletion handler if present */
|
|
|
|
|
|
|
|
if (obj_desc->data.handler) {
|
|
|
|
obj_desc->data.handler(node, obj_desc->data.pointer);
|
|
|
|
}
|
|
|
|
|
2013-11-21 11:19:55 +07:00
|
|
|
next_desc = obj_desc->common.next_object;
|
2009-06-29 12:43:27 +07:00
|
|
|
acpi_ut_remove_reference(obj_desc);
|
2013-11-21 11:19:55 +07:00
|
|
|
obj_desc = next_desc;
|
2009-06-29 12:43:27 +07:00
|
|
|
}
|
|
|
|
|
2013-11-21 11:20:06 +07:00
|
|
|
/* Special case for the statically allocated root node */
|
|
|
|
|
|
|
|
if (node == acpi_gbl_root_node) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2009-06-29 12:43:27 +07:00
|
|
|
/* Now we can delete the node */
|
|
|
|
|
|
|
|
(void)acpi_os_release_object(acpi_gbl_namespace_cache, node);
|
|
|
|
|
|
|
|
ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_freed++);
|
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "Node %p, Remaining %X\n",
|
|
|
|
node, acpi_gbl_current_node_count));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
*
|
|
|
|
* FUNCTION: acpi_ns_remove_node
|
|
|
|
*
|
2012-07-12 08:40:10 +07:00
|
|
|
* PARAMETERS: node - Node to be removed/deleted
|
2009-06-29 12:43:27 +07:00
|
|
|
*
|
|
|
|
* RETURN: None
|
|
|
|
*
|
|
|
|
* DESCRIPTION: Remove (unlink) and delete a namespace node
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
void acpi_ns_remove_node(struct acpi_namespace_node *node)
|
2005-04-17 05:20:36 +07:00
|
|
|
{
|
2005-08-05 11:44:28 +07:00
|
|
|
struct acpi_namespace_node *parent_node;
|
|
|
|
struct acpi_namespace_node *prev_node;
|
|
|
|
struct acpi_namespace_node *next_node;
|
2005-04-17 05:20:36 +07:00
|
|
|
|
2009-06-29 12:43:27 +07:00
|
|
|
ACPI_FUNCTION_TRACE_PTR(ns_remove_node, node);
|
2005-04-17 05:20:36 +07:00
|
|
|
|
2010-05-26 10:53:07 +07:00
|
|
|
parent_node = node->parent;
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
prev_node = NULL;
|
|
|
|
next_node = parent_node->child;
|
|
|
|
|
|
|
|
/* Find the node that is the previous peer in the parent's child list */
|
|
|
|
|
|
|
|
while (next_node != node) {
|
|
|
|
prev_node = next_node;
|
2010-05-26 10:53:07 +07:00
|
|
|
next_node = next_node->peer;
|
2005-04-17 05:20:36 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (prev_node) {
|
2006-10-02 11:00:00 +07:00
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
/* Node is not first child, unlink it */
|
|
|
|
|
2010-05-26 10:53:07 +07:00
|
|
|
prev_node->peer = node->peer;
|
2005-08-05 11:44:28 +07:00
|
|
|
} else {
|
2010-05-26 10:53:07 +07:00
|
|
|
/*
|
|
|
|
* Node is first child (has no previous peer).
|
|
|
|
* Link peer list to parent
|
|
|
|
*/
|
|
|
|
parent_node->child = node->peer;
|
2005-04-17 05:20:36 +07:00
|
|
|
}
|
|
|
|
|
2009-06-29 12:43:27 +07:00
|
|
|
/* Delete the node and any attached objects */
|
2009-03-06 09:05:18 +07:00
|
|
|
|
2009-06-29 12:43:27 +07:00
|
|
|
acpi_ns_delete_node(node);
|
2005-04-17 05:20:36 +07:00
|
|
|
return_VOID;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
*
|
|
|
|
* FUNCTION: acpi_ns_install_node
|
|
|
|
*
|
|
|
|
* PARAMETERS: walk_state - Current state of the walk
|
|
|
|
* parent_node - The parent of the new Node
|
2012-07-12 08:40:10 +07:00
|
|
|
* node - The new Node to install
|
|
|
|
* type - ACPI object type of the new Node
|
2005-04-17 05:20:36 +07:00
|
|
|
*
|
|
|
|
* RETURN: None
|
|
|
|
*
|
|
|
|
* DESCRIPTION: Initialize a new namespace node and install it amongst
|
|
|
|
* its peers.
|
|
|
|
*
|
2005-07-30 05:15:00 +07:00
|
|
|
* Note: Current namespace lookup is linear search. This appears
|
|
|
|
* to be sufficient as namespace searches consume only a small
|
|
|
|
* fraction of the execution time of the ACPI subsystem.
|
2005-04-17 05:20:36 +07:00
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
|
2005-08-05 11:44:28 +07:00
|
|
|
void acpi_ns_install_node(struct acpi_walk_state *walk_state, struct acpi_namespace_node *parent_node, /* Parent */
|
|
|
|
struct acpi_namespace_node *node, /* New Child */
|
|
|
|
acpi_object_type type)
|
2005-04-17 05:20:36 +07:00
|
|
|
{
|
2005-08-05 11:44:28 +07:00
|
|
|
acpi_owner_id owner_id = 0;
|
|
|
|
struct acpi_namespace_node *child_node;
|
2005-04-17 05:20:36 +07:00
|
|
|
|
ACPI: ACPICA 20060421
Removed a device initialization optimization introduced in
20051216 where the _STA method was not run unless an _INI
was also present for the same device. This optimization
could cause problems because it could allow _INI methods
to be run within a not-present device subtree (If a
not-present device had no _INI, _STA would not be run,
the not-present status would not be discovered, and the
children of the device would be incorrectly traversed.)
Implemented a new _STA optimization where namespace
subtrees that do not contain _INI are identified and
ignored during device initialization. Selectively running
_STA can significantly improve boot time on large machines
(with assistance from Len Brown.)
Implemented support for the device initialization case
where the returned _STA flags indicate a device not-present
but functioning. In this case, _INI is not run, but the
device children are examined for presence, as per the
ACPI specification.
Implemented an additional change to the IndexField support
in order to conform to MS behavior. The value written to
the Index Register is not simply a byte offset, it is a
byte offset in units of the access width of the parent
Index Field. (Fiodor Suietov)
Defined and deployed a new OSL interface,
acpi_os_validate_address(). This interface is called during
the creation of all AML operation regions, and allows
the host OS to exert control over what addresses it will
allow the AML code to access. Operation Regions whose
addresses are disallowed will cause a runtime exception
when they are actually accessed (will not affect or abort
table loading.)
Defined and deployed a new OSL interface,
acpi_os_validate_interface(). This interface allows the host OS
to match the various "optional" interface/behavior strings
for the _OSI predefined control method as appropriate
(with assistance from Bjorn Helgaas.)
Restructured and corrected various problems in the
exception handling code paths within DsCallControlMethod
and DsTerminateControlMethod in dsmethod (with assistance
from Takayoshi Kochi.)
Modified the Linux source converter to ignore quoted string
literals while converting identifiers from mixed to lower
case. This will correct problems with the disassembler
and other areas where such strings must not be modified.
The ACPI_FUNCTION_* macros no longer require quotes around
the function name. This allows the Linux source converter
to convert the names, now that the converter ignores
quoted strings.
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
2006-04-22 04:15:00 +07:00
|
|
|
ACPI_FUNCTION_TRACE(ns_install_node);
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
if (walk_state) {
|
2010-05-26 12:59:51 +07:00
|
|
|
/*
|
|
|
|
* Get the owner ID from the Walk state. The owner ID is used to
|
|
|
|
* track table deletion and deletion of objects created by methods.
|
|
|
|
*/
|
2005-04-17 05:20:36 +07:00
|
|
|
owner_id = walk_state->owner_id;
|
2010-05-26 12:59:51 +07:00
|
|
|
|
|
|
|
if ((walk_state->method_desc) &&
|
|
|
|
(parent_node != walk_state->method_node)) {
|
|
|
|
/*
|
|
|
|
* A method is creating a new node that is not a child of the
|
|
|
|
* method (it is non-local). Mark the executing method as having
|
|
|
|
* modified the namespace. This is used for cleanup when the
|
|
|
|
* method exits.
|
|
|
|
*/
|
2011-01-12 08:19:43 +07:00
|
|
|
walk_state->method_desc->method.info_flags |=
|
|
|
|
ACPI_METHOD_MODIFIED_NAMESPACE;
|
2010-05-26 12:59:51 +07:00
|
|
|
}
|
2005-04-17 05:20:36 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Link the new entry into the parent and existing children */
|
|
|
|
|
2010-05-26 10:53:07 +07:00
|
|
|
node->peer = NULL;
|
|
|
|
node->parent = parent_node;
|
2005-04-17 05:20:36 +07:00
|
|
|
child_node = parent_node->child;
|
2010-05-26 10:53:07 +07:00
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
if (!child_node) {
|
|
|
|
parent_node->child = node;
|
2005-08-05 11:44:28 +07:00
|
|
|
} else {
|
2010-05-26 10:53:07 +07:00
|
|
|
/* Add node to the end of the peer list */
|
|
|
|
|
|
|
|
while (child_node->peer) {
|
2005-04-17 05:20:36 +07:00
|
|
|
child_node = child_node->peer;
|
|
|
|
}
|
|
|
|
|
|
|
|
child_node->peer = node;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Init the new entry */
|
|
|
|
|
|
|
|
node->owner_id = owner_id;
|
|
|
|
node->type = (u8) type;
|
|
|
|
|
2005-08-05 11:44:28 +07:00
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
|
2019-08-17 04:43:21 +07:00
|
|
|
"%4.4s (%s) [Node %p Owner %3.3X] added to %4.4s (%s) [Node %p]\n",
|
2005-08-05 11:44:28 +07:00
|
|
|
acpi_ut_get_node_name(node),
|
|
|
|
acpi_ut_get_type_name(node->type), node, owner_id,
|
|
|
|
acpi_ut_get_node_name(parent_node),
|
|
|
|
acpi_ut_get_type_name(parent_node->type),
|
|
|
|
parent_node));
|
ACPI: ACPICA 20060331
Implemented header file support for the following
additional ACPI tables: ASF!, BOOT, CPEP, DBGP, MCFG, SPCR,
SPMI, TCPA, and WDRT. With this support, all current and
known ACPI tables are now defined in the ACPICA headers and
are available for use by device drivers and other software.
Implemented support to allow tables that contain ACPI
names with invalid characters to be loaded. Previously,
this would cause the table load to fail, but since
there are several known cases of such tables on
existing machines, this change was made to enable
ACPI support for them. Also, this matches the
behavior of the Microsoft ACPI implementation.
https://bugzilla.novell.com/show_bug.cgi?id=147621
Fixed a couple regressions introduced during the memory
optimization in the 20060317 release. The namespace
node definition required additional reorganization and
an internal datatype that had been changed to 8-bit was
restored to 32-bit. (Valery Podrezov)
Fixed a problem where a null pointer passed to
acpi_ut_delete_generic_state() could be passed through
to acpi_os_release_object which is unexpected. Such
null pointers are now trapped and ignored, matching
the behavior of the previous implementation before the
deployment of acpi_os_release_object(). (Valery Podrezov,
Fiodor Suietov)
Fixed a memory mapping leak during the deletion of
a SystemMemory operation region where a cached memory
mapping was not deleted. This became a noticeable problem
for operation regions that are defined within frequently
used control methods. (Dana Meyers)
Reorganized the ACPI table header files into two main
files: one for the ACPI tables consumed by the ACPICA core,
and another for the miscellaneous ACPI tables that are
consumed by the drivers and other software. The various
FADT definitions were merged into one common section and
three different tables (ACPI 1.0, 1.0+, and 2.0)
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
2006-03-31 12:00:00 +07:00
|
|
|
|
|
|
|
return_VOID;
|
2005-04-17 05:20:36 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
*
|
|
|
|
* FUNCTION: acpi_ns_delete_children
|
|
|
|
*
|
|
|
|
* PARAMETERS: parent_node - Delete this objects children
|
|
|
|
*
|
|
|
|
* RETURN: None.
|
|
|
|
*
|
|
|
|
* DESCRIPTION: Delete all children of the parent object. In other words,
|
|
|
|
* deletes a "scope".
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
|
2005-08-05 11:44:28 +07:00
|
|
|
void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
|
2005-04-17 05:20:36 +07:00
|
|
|
{
|
2005-08-05 11:44:28 +07:00
|
|
|
struct acpi_namespace_node *next_node;
|
2010-05-26 10:53:07 +07:00
|
|
|
struct acpi_namespace_node *node_to_delete;
|
2005-04-17 05:20:36 +07:00
|
|
|
|
ACPI: ACPICA 20060421
Removed a device initialization optimization introduced in
20051216 where the _STA method was not run unless an _INI
was also present for the same device. This optimization
could cause problems because it could allow _INI methods
to be run within a not-present device subtree (If a
not-present device had no _INI, _STA would not be run,
the not-present status would not be discovered, and the
children of the device would be incorrectly traversed.)
Implemented a new _STA optimization where namespace
subtrees that do not contain _INI are identified and
ignored during device initialization. Selectively running
_STA can significantly improve boot time on large machines
(with assistance from Len Brown.)
Implemented support for the device initialization case
where the returned _STA flags indicate a device not-present
but functioning. In this case, _INI is not run, but the
device children are examined for presence, as per the
ACPI specification.
Implemented an additional change to the IndexField support
in order to conform to MS behavior. The value written to
the Index Register is not simply a byte offset, it is a
byte offset in units of the access width of the parent
Index Field. (Fiodor Suietov)
Defined and deployed a new OSL interface,
acpi_os_validate_address(). This interface is called during
the creation of all AML operation regions, and allows
the host OS to exert control over what addresses it will
allow the AML code to access. Operation Regions whose
addresses are disallowed will cause a runtime exception
when they are actually accessed (will not affect or abort
table loading.)
Defined and deployed a new OSL interface,
acpi_os_validate_interface(). This interface allows the host OS
to match the various "optional" interface/behavior strings
for the _OSI predefined control method as appropriate
(with assistance from Bjorn Helgaas.)
Restructured and corrected various problems in the
exception handling code paths within DsCallControlMethod
and DsTerminateControlMethod in dsmethod (with assistance
from Takayoshi Kochi.)
Modified the Linux source converter to ignore quoted string
literals while converting identifiers from mixed to lower
case. This will correct problems with the disassembler
and other areas where such strings must not be modified.
The ACPI_FUNCTION_* macros no longer require quotes around
the function name. This allows the Linux source converter
to convert the names, now that the converter ignores
quoted strings.
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
2006-04-22 04:15:00 +07:00
|
|
|
ACPI_FUNCTION_TRACE_PTR(ns_delete_children, parent_node);
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
if (!parent_node) {
|
|
|
|
return_VOID;
|
|
|
|
}
|
|
|
|
|
2009-03-06 09:05:18 +07:00
|
|
|
/* Deallocate all children at this level */
|
|
|
|
|
2010-05-26 10:53:07 +07:00
|
|
|
next_node = parent_node->child;
|
|
|
|
while (next_node) {
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
/* Grandchildren should have all been deleted already */
|
|
|
|
|
2010-05-26 10:53:07 +07:00
|
|
|
if (next_node->child) {
|
2006-01-28 04:43:00 +07:00
|
|
|
ACPI_ERROR((AE_INFO, "Found a grandchild! P=%p C=%p",
|
2010-05-26 10:53:07 +07:00
|
|
|
parent_node, next_node));
|
2005-04-17 05:20:36 +07:00
|
|
|
}
|
|
|
|
|
2009-06-29 12:43:27 +07:00
|
|
|
/*
|
|
|
|
* Delete this child node and move on to the next child in the list.
|
|
|
|
* No need to unlink the node since we are deleting the entire branch.
|
|
|
|
*/
|
2010-05-26 10:53:07 +07:00
|
|
|
node_to_delete = next_node;
|
|
|
|
next_node = next_node->peer;
|
|
|
|
acpi_ns_delete_node(node_to_delete);
|
|
|
|
};
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
/* Clear the parent's child pointer */
|
|
|
|
|
|
|
|
parent_node->child = NULL;
|
|
|
|
return_VOID;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
*
|
|
|
|
* FUNCTION: acpi_ns_delete_namespace_subtree
|
|
|
|
*
|
|
|
|
* PARAMETERS: parent_node - Root of the subtree to be deleted
|
|
|
|
*
|
|
|
|
* RETURN: None.
|
|
|
|
*
|
2012-10-31 09:26:55 +07:00
|
|
|
* DESCRIPTION: Delete a subtree of the namespace. This includes all objects
|
2005-04-17 05:20:36 +07:00
|
|
|
* stored within the subtree.
|
|
|
|
*
|
|
|
|
******************************************************************************/
|
|
|
|
|
2005-08-05 11:44:28 +07:00
|
|
|
void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
|
2005-04-17 05:20:36 +07:00
|
|
|
{
|
2005-08-05 11:44:28 +07:00
|
|
|
struct acpi_namespace_node *child_node = NULL;
|
|
|
|
u32 level = 1;
|
2011-01-12 08:09:31 +07:00
|
|
|
acpi_status status;
|
2005-04-17 05:20:36 +07:00
|
|
|
|
ACPI: ACPICA 20060421
Removed a device initialization optimization introduced in
20051216 where the _STA method was not run unless an _INI
was also present for the same device. This optimization
could cause problems because it could allow _INI methods
to be run within a not-present device subtree (If a
not-present device had no _INI, _STA would not be run,
the not-present status would not be discovered, and the
children of the device would be incorrectly traversed.)
Implemented a new _STA optimization where namespace
subtrees that do not contain _INI are identified and
ignored during device initialization. Selectively running
_STA can significantly improve boot time on large machines
(with assistance from Len Brown.)
Implemented support for the device initialization case
where the returned _STA flags indicate a device not-present
but functioning. In this case, _INI is not run, but the
device children are examined for presence, as per the
ACPI specification.
Implemented an additional change to the IndexField support
in order to conform to MS behavior. The value written to
the Index Register is not simply a byte offset, it is a
byte offset in units of the access width of the parent
Index Field. (Fiodor Suietov)
Defined and deployed a new OSL interface,
acpi_os_validate_address(). This interface is called during
the creation of all AML operation regions, and allows
the host OS to exert control over what addresses it will
allow the AML code to access. Operation Regions whose
addresses are disallowed will cause a runtime exception
when they are actually accessed (will not affect or abort
table loading.)
Defined and deployed a new OSL interface,
acpi_os_validate_interface(). This interface allows the host OS
to match the various "optional" interface/behavior strings
for the _OSI predefined control method as appropriate
(with assistance from Bjorn Helgaas.)
Restructured and corrected various problems in the
exception handling code paths within DsCallControlMethod
and DsTerminateControlMethod in dsmethod (with assistance
from Takayoshi Kochi.)
Modified the Linux source converter to ignore quoted string
literals while converting identifiers from mixed to lower
case. This will correct problems with the disassembler
and other areas where such strings must not be modified.
The ACPI_FUNCTION_* macros no longer require quotes around
the function name. This allows the Linux source converter
to convert the names, now that the converter ignores
quoted strings.
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
2006-04-22 04:15:00 +07:00
|
|
|
ACPI_FUNCTION_TRACE(ns_delete_namespace_subtree);
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
if (!parent_node) {
|
|
|
|
return_VOID;
|
|
|
|
}
|
|
|
|
|
2011-01-12 08:09:31 +07:00
|
|
|
/* Lock namespace for possible update */
|
|
|
|
|
|
|
|
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
|
return_VOID;
|
|
|
|
}
|
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
/*
|
|
|
|
* Traverse the tree of objects until we bubble back up
|
|
|
|
* to where we started.
|
|
|
|
*/
|
|
|
|
while (level > 0) {
|
2006-10-02 11:00:00 +07:00
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
/* Get the next node in this scope (NULL if none) */
|
|
|
|
|
2009-05-21 09:27:51 +07:00
|
|
|
child_node = acpi_ns_get_next_node(parent_node, child_node);
|
2005-04-17 05:20:36 +07:00
|
|
|
if (child_node) {
|
2006-10-02 11:00:00 +07:00
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
/* Found a child node - detach any attached object */
|
|
|
|
|
2005-08-05 11:44:28 +07:00
|
|
|
acpi_ns_detach_object(child_node);
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
/* Check if this node has any children */
|
|
|
|
|
2009-05-21 09:27:51 +07:00
|
|
|
if (child_node->child) {
|
2005-04-17 05:20:36 +07:00
|
|
|
/*
|
|
|
|
* There is at least one child of this node,
|
|
|
|
* visit the node
|
|
|
|
*/
|
|
|
|
level++;
|
|
|
|
parent_node = child_node;
|
|
|
|
child_node = NULL;
|
|
|
|
}
|
2005-08-05 11:44:28 +07:00
|
|
|
} else {
|
2005-04-17 05:20:36 +07:00
|
|
|
/*
|
|
|
|
* No more children of this parent node.
|
|
|
|
* Move up to the grandparent.
|
|
|
|
*/
|
|
|
|
level--;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Now delete all of the children of this parent
|
|
|
|
* all at the same time.
|
|
|
|
*/
|
2005-08-05 11:44:28 +07:00
|
|
|
acpi_ns_delete_children(parent_node);
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
/* New "last child" is this parent node */
|
|
|
|
|
|
|
|
child_node = parent_node;
|
|
|
|
|
|
|
|
/* Move up the tree to the grandparent */
|
|
|
|
|
2010-05-26 10:53:07 +07:00
|
|
|
parent_node = parent_node->parent;
|
2005-04-17 05:20:36 +07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-12 08:09:31 +07:00
|
|
|
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
2005-04-17 05:20:36 +07:00
|
|
|
return_VOID;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
*
|
|
|
|
* FUNCTION: acpi_ns_delete_namespace_by_owner
|
|
|
|
*
|
|
|
|
* PARAMETERS: owner_id - All nodes with this owner will be deleted
|
|
|
|
*
|
|
|
|
* RETURN: Status
|
|
|
|
*
|
|
|
|
* DESCRIPTION: Delete entries within the namespace that are owned by a
|
2012-10-31 09:26:55 +07:00
|
|
|
* specific ID. Used to delete entire ACPI tables. All
|
2005-04-17 05:20:36 +07:00
|
|
|
* reference counts are updated.
|
|
|
|
*
|
2006-07-08 07:44:38 +07:00
|
|
|
* MUTEX: Locks namespace during deletion walk.
|
|
|
|
*
|
2005-04-17 05:20:36 +07:00
|
|
|
******************************************************************************/
|
|
|
|
|
2005-08-05 11:44:28 +07:00
|
|
|
void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
|
2005-04-17 05:20:36 +07:00
|
|
|
{
|
2005-08-05 11:44:28 +07:00
|
|
|
struct acpi_namespace_node *child_node;
|
|
|
|
struct acpi_namespace_node *deletion_node;
|
|
|
|
struct acpi_namespace_node *parent_node;
|
2006-07-08 07:44:38 +07:00
|
|
|
u32 level;
|
|
|
|
acpi_status status;
|
2005-04-17 05:20:36 +07:00
|
|
|
|
ACPI: ACPICA 20060421
Removed a device initialization optimization introduced in
20051216 where the _STA method was not run unless an _INI
was also present for the same device. This optimization
could cause problems because it could allow _INI methods
to be run within a not-present device subtree (If a
not-present device had no _INI, _STA would not be run,
the not-present status would not be discovered, and the
children of the device would be incorrectly traversed.)
Implemented a new _STA optimization where namespace
subtrees that do not contain _INI are identified and
ignored during device initialization. Selectively running
_STA can significantly improve boot time on large machines
(with assistance from Len Brown.)
Implemented support for the device initialization case
where the returned _STA flags indicate a device not-present
but functioning. In this case, _INI is not run, but the
device children are examined for presence, as per the
ACPI specification.
Implemented an additional change to the IndexField support
in order to conform to MS behavior. The value written to
the Index Register is not simply a byte offset, it is a
byte offset in units of the access width of the parent
Index Field. (Fiodor Suietov)
Defined and deployed a new OSL interface,
acpi_os_validate_address(). This interface is called during
the creation of all AML operation regions, and allows
the host OS to exert control over what addresses it will
allow the AML code to access. Operation Regions whose
addresses are disallowed will cause a runtime exception
when they are actually accessed (will not affect or abort
table loading.)
Defined and deployed a new OSL interface,
acpi_os_validate_interface(). This interface allows the host OS
to match the various "optional" interface/behavior strings
for the _OSI predefined control method as appropriate
(with assistance from Bjorn Helgaas.)
Restructured and corrected various problems in the
exception handling code paths within DsCallControlMethod
and DsTerminateControlMethod in dsmethod (with assistance
from Takayoshi Kochi.)
Modified the Linux source converter to ignore quoted string
literals while converting identifiers from mixed to lower
case. This will correct problems with the disassembler
and other areas where such strings must not be modified.
The ACPI_FUNCTION_* macros no longer require quotes around
the function name. This allows the Linux source converter
to convert the names, now that the converter ignores
quoted strings.
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
2006-04-22 04:15:00 +07:00
|
|
|
ACPI_FUNCTION_TRACE_U32(ns_delete_namespace_by_owner, owner_id);
|
2005-04-17 05:20:36 +07:00
|
|
|
|
2005-07-30 05:15:00 +07:00
|
|
|
if (owner_id == 0) {
|
|
|
|
return_VOID;
|
|
|
|
}
|
|
|
|
|
2006-07-08 07:44:38 +07:00
|
|
|
/* Lock namespace for possible update */
|
|
|
|
|
|
|
|
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
|
return_VOID;
|
|
|
|
}
|
|
|
|
|
2006-03-18 04:44:00 +07:00
|
|
|
deletion_node = NULL;
|
2005-08-05 11:44:28 +07:00
|
|
|
parent_node = acpi_gbl_root_node;
|
|
|
|
child_node = NULL;
|
|
|
|
level = 1;
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Traverse the tree of nodes until we bubble back up
|
|
|
|
* to where we started.
|
|
|
|
*/
|
|
|
|
while (level > 0) {
|
|
|
|
/*
|
|
|
|
* Get the next child of this parent node. When child_node is NULL,
|
|
|
|
* the first child of the parent is returned
|
|
|
|
*/
|
2009-05-21 09:27:51 +07:00
|
|
|
child_node = acpi_ns_get_next_node(parent_node, child_node);
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
if (deletion_node) {
|
2006-03-18 04:44:00 +07:00
|
|
|
acpi_ns_delete_children(deletion_node);
|
2009-06-29 12:43:27 +07:00
|
|
|
acpi_ns_remove_node(deletion_node);
|
2005-04-17 05:20:36 +07:00
|
|
|
deletion_node = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (child_node) {
|
|
|
|
if (child_node->owner_id == owner_id) {
|
2006-10-02 11:00:00 +07:00
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
/* Found a matching child node - detach any attached object */
|
|
|
|
|
2005-08-05 11:44:28 +07:00
|
|
|
acpi_ns_detach_object(child_node);
|
2005-04-17 05:20:36 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Check if this node has any children */
|
|
|
|
|
2009-05-21 09:27:51 +07:00
|
|
|
if (child_node->child) {
|
2005-04-17 05:20:36 +07:00
|
|
|
/*
|
|
|
|
* There is at least one child of this node,
|
|
|
|
* visit the node
|
|
|
|
*/
|
|
|
|
level++;
|
|
|
|
parent_node = child_node;
|
|
|
|
child_node = NULL;
|
2005-08-05 11:44:28 +07:00
|
|
|
} else if (child_node->owner_id == owner_id) {
|
2005-04-17 05:20:36 +07:00
|
|
|
deletion_node = child_node;
|
|
|
|
}
|
2005-08-05 11:44:28 +07:00
|
|
|
} else {
|
2005-04-17 05:20:36 +07:00
|
|
|
/*
|
|
|
|
* No more children of this parent node.
|
|
|
|
* Move up to the grandparent.
|
|
|
|
*/
|
|
|
|
level--;
|
|
|
|
if (level != 0) {
|
|
|
|
if (parent_node->owner_id == owner_id) {
|
|
|
|
deletion_node = parent_node;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* New "last child" is this parent node */
|
|
|
|
|
|
|
|
child_node = parent_node;
|
|
|
|
|
|
|
|
/* Move up the tree to the grandparent */
|
|
|
|
|
2010-05-26 10:53:07 +07:00
|
|
|
parent_node = parent_node->parent;
|
2005-04-17 05:20:36 +07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-07-08 07:44:38 +07:00
|
|
|
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
2005-04-17 05:20:36 +07:00
|
|
|
return_VOID;
|
|
|
|
}
|