2006-11-15 15:27:51

by John Keller

[permalink] [raw]
Subject: [PATCH 3/3] - Add support for acpi_load_table/acpi_unload_table_id

This patch makes acpi_load_table() available
for use by removing it from the #ifdef ACPI_FUTURE_USAGE.

It also adds a new routine used to unload an ACPI table
of a given type and "id" - acpi_unload_table_id().
The implementation of this new routine was almost a direct
copy of existing routine acpi_unload_table() - only difference
being that it only removes a specific table id instead of
ALL tables of a given type.
The SN hotplug driver (sgi_hotplug.c) now uses both of these
interfaces to dynamically load and unload SSDT ACPI tables.

Also, a few other ACPI routines now used by the SN hotplug
driver are exported (since the driver can be a loadable module):

acpi_ns_map_handle_to_node
acpi_ns_convert_entry_to_handle
acpi_ns_get_next_node

Signed-off-by: Aaron Young <[email protected]>

---

drivers/acpi/namespace/nsutils.c | 4 ++
drivers/acpi/namespace/nswalk.c | 2 +
drivers/acpi/tables/tbxface.c | 47 ++++++++++++++++++++++++++++-
include/acpi/acpixf.h | 5 +--
4 files changed, 55 insertions(+), 3 deletions(-)


Index: linux-2.6/drivers/acpi/namespace/nsutils.c
===================================================================
--- linux-2.6.orig/drivers/acpi/namespace/nsutils.c 2006-10-23 08:48:15.836279420 -0500
+++ linux-2.6/drivers/acpi/namespace/nsutils.c 2006-10-23 09:17:33.930473274 -0500
@@ -701,6 +701,8 @@ struct acpi_namespace_node *acpi_ns_map_
return (ACPI_CAST_PTR(struct acpi_namespace_node, handle));
}

+ACPI_EXPORT_SYMBOL(acpi_ns_map_handle_to_node)
+
/*******************************************************************************
*
* FUNCTION: acpi_ns_convert_entry_to_handle
@@ -737,6 +739,8 @@ acpi_handle acpi_ns_convert_entry_to_han
------------------------------------------------------*/
}

+ACPI_EXPORT_SYMBOL(acpi_ns_convert_entry_to_handle)
+
/*******************************************************************************
*
* FUNCTION: acpi_ns_terminate
Index: linux-2.6/drivers/acpi/namespace/nswalk.c
===================================================================
--- linux-2.6.orig/drivers/acpi/namespace/nswalk.c 2006-10-23 08:48:15.836279420 -0500
+++ linux-2.6/drivers/acpi/namespace/nswalk.c 2006-10-23 09:17:33.930473274 -0500
@@ -119,6 +119,8 @@ struct acpi_namespace_node *acpi_ns_get_
return (NULL);
}

+ACPI_EXPORT_SYMBOL(acpi_ns_get_next_node)
+
/*******************************************************************************
*
* FUNCTION: acpi_ns_walk_namespace
Index: linux-2.6/drivers/acpi/tables/tbxface.c
===================================================================
--- linux-2.6.orig/drivers/acpi/tables/tbxface.c 2006-10-23 08:48:15.856281906 -0500
+++ linux-2.6/drivers/acpi/tables/tbxface.c 2006-10-23 09:17:33.934473770 -0500
@@ -123,7 +123,6 @@ acpi_status acpi_load_tables(void)

ACPI_EXPORT_SYMBOL(acpi_load_tables)

-#ifdef ACPI_FUTURE_USAGE
/*******************************************************************************
*
* FUNCTION: acpi_load_table
@@ -221,6 +220,52 @@ ACPI_EXPORT_SYMBOL(acpi_load_table)

/*******************************************************************************
*
+ * FUNCTION: acpi_unload_table_id
+ *
+ * PARAMETERS: table_type - Type of table to be unloaded
+ * id - Owner ID of the table to be removed.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This routine is used to force the unload of a table (by id)
+ *
+ ******************************************************************************/
+acpi_status acpi_unload_table_id(acpi_table_type table_type, acpi_owner_id id)
+{
+ struct acpi_table_desc *table_desc;
+
+ ACPI_FUNCTION_TRACE(acpi_unload_table);
+
+ /* Parameter validation */
+ if (table_type > ACPI_TABLE_ID_MAX)
+ return_ACPI_STATUS(AE_BAD_PARAMETER);
+
+ /* Find table from the requested type list */
+ table_desc = acpi_gbl_table_lists[table_type].next;
+ while (table_desc && table_desc->owner_id != id)
+ table_desc = table_desc->next;
+
+ if (!table_desc)
+ return_ACPI_STATUS(AE_NOT_EXIST);
+
+ /*
+ * Delete all namespace objects owned by this table. Note that these
+ * objects can appear anywhere in the namespace by virtue of the AML
+ * "Scope" operator. Thus, we need to track ownership by an ID, not
+ * simply a position within the hierarchy
+ */
+ acpi_ns_delete_namespace_by_owner(table_desc->owner_id);
+
+ (void)acpi_tb_uninstall_table(table_desc);
+
+ return_ACPI_STATUS(AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL(acpi_unload_table_id)
+
+#ifdef ACPI_FUTURE_USAGE
+/*******************************************************************************
+ *
* FUNCTION: acpi_unload_table
*
* PARAMETERS: table_type - Type of table to be unloaded
Index: linux-2.6/include/acpi/acpixf.h
===================================================================
--- linux-2.6.orig/include/acpi/acpixf.h 2006-10-23 08:48:18.364593597 -0500
+++ linux-2.6/include/acpi/acpixf.h 2006-10-23 09:17:33.934473770 -0500
@@ -97,11 +97,12 @@ acpi_find_root_pointer(u32 flags, struct

acpi_status acpi_load_tables(void);

-#ifdef ACPI_FUTURE_USAGE
acpi_status acpi_load_table(struct acpi_table_header *table_ptr);

-acpi_status acpi_unload_table(acpi_table_type table_type);
+acpi_status acpi_unload_table_id(acpi_table_type table_type, acpi_owner_id id);

+#ifdef ACPI_FUTURE_USAGE
+acpi_status acpi_unload_table(acpi_table_type table_type);
acpi_status
acpi_get_table_header(acpi_table_type table_type,
u32 instance, struct acpi_table_header *out_table_header);


2006-11-15 16:22:31

by Brown, Len

[permalink] [raw]
Subject: Re: [PATCH 3/3] - Add support for acpi_load_table/acpi_unload_table_id

On Wednesday 15 November 2006 10:27, John Keller wrote:
> This patch makes acpi_load_table() available
> for use by removing it from the #ifdef ACPI_FUTURE_USAGE.
>
> It also adds a new routine used to unload an ACPI table
> of a given type and "id" - acpi_unload_table_id().
> The implementation of this new routine was almost a direct
> copy of existing routine acpi_unload_table() - only difference
> being that it only removes a specific table id instead of
> ALL tables of a given type.
> The SN hotplug driver (sgi_hotplug.c) now uses both of these
> interfaces to dynamically load and unload SSDT ACPI tables.
>
> Also, a few other ACPI routines now used by the SN hotplug
> driver are exported (since the driver can be a loadable module):
>
> acpi_ns_map_handle_to_node
> acpi_ns_convert_entry_to_handle
> acpi_ns_get_next_node
>
> Signed-off-by: Aaron Young <[email protected]>
>
> ---
>
> drivers/acpi/namespace/nsutils.c | 4 ++
> drivers/acpi/namespace/nswalk.c | 2 +
> drivers/acpi/tables/tbxface.c | 47 ++++++++++++++++++++++++++++-
> include/acpi/acpixf.h | 5 +--
> 4 files changed, 55 insertions(+), 3 deletions(-)

John, Aaron,
acpi/namespace/* files come to Linux from ACPICA.
It is much easier for everybody if ACPICA changes make it in "upstream"
so that Linux doesn't diverge from the reference implementation.

If you grant Intel the license to distribute (a derivation) of your changes
under BOTH the GPL and BSD licenses appearing at the top of these files,
then we can do that. Basically what this means is that other operating
systems besides Linux will benefit from your changes too --
some of them are open source (eg. FreeBSD) and some are not (eg. HPUX).

Please let me know.

thanks,
-Len

>
> Index: linux-2.6/drivers/acpi/namespace/nsutils.c
> ===================================================================
> --- linux-2.6.orig/drivers/acpi/namespace/nsutils.c 2006-10-23 08:48:15.836279420 -0500
> +++ linux-2.6/drivers/acpi/namespace/nsutils.c 2006-10-23 09:17:33.930473274 -0500
> @@ -701,6 +701,8 @@ struct acpi_namespace_node *acpi_ns_map_
> return (ACPI_CAST_PTR(struct acpi_namespace_node, handle));
> }
>
> +ACPI_EXPORT_SYMBOL(acpi_ns_map_handle_to_node)
> +
> /*******************************************************************************
> *
> * FUNCTION: acpi_ns_convert_entry_to_handle
> @@ -737,6 +739,8 @@ acpi_handle acpi_ns_convert_entry_to_han
> ------------------------------------------------------*/
> }
>
> +ACPI_EXPORT_SYMBOL(acpi_ns_convert_entry_to_handle)
> +
> /*******************************************************************************
> *
> * FUNCTION: acpi_ns_terminate
> Index: linux-2.6/drivers/acpi/namespace/nswalk.c
> ===================================================================
> --- linux-2.6.orig/drivers/acpi/namespace/nswalk.c 2006-10-23 08:48:15.836279420 -0500
> +++ linux-2.6/drivers/acpi/namespace/nswalk.c 2006-10-23 09:17:33.930473274 -0500
> @@ -119,6 +119,8 @@ struct acpi_namespace_node *acpi_ns_get_
> return (NULL);
> }
>
> +ACPI_EXPORT_SYMBOL(acpi_ns_get_next_node)
> +
> /*******************************************************************************
> *
> * FUNCTION: acpi_ns_walk_namespace
> Index: linux-2.6/drivers/acpi/tables/tbxface.c
> ===================================================================
> --- linux-2.6.orig/drivers/acpi/tables/tbxface.c 2006-10-23 08:48:15.856281906 -0500
> +++ linux-2.6/drivers/acpi/tables/tbxface.c 2006-10-23 09:17:33.934473770 -0500
> @@ -123,7 +123,6 @@ acpi_status acpi_load_tables(void)
>
> ACPI_EXPORT_SYMBOL(acpi_load_tables)
>
> -#ifdef ACPI_FUTURE_USAGE
> /*******************************************************************************
> *
> * FUNCTION: acpi_load_table
> @@ -221,6 +220,52 @@ ACPI_EXPORT_SYMBOL(acpi_load_table)
>
> /*******************************************************************************
> *
> + * FUNCTION: acpi_unload_table_id
> + *
> + * PARAMETERS: table_type - Type of table to be unloaded
> + * id - Owner ID of the table to be removed.
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: This routine is used to force the unload of a table (by id)
> + *
> + ******************************************************************************/
> +acpi_status acpi_unload_table_id(acpi_table_type table_type, acpi_owner_id id)
> +{
> + struct acpi_table_desc *table_desc;
> +
> + ACPI_FUNCTION_TRACE(acpi_unload_table);
> +
> + /* Parameter validation */
> + if (table_type > ACPI_TABLE_ID_MAX)
> + return_ACPI_STATUS(AE_BAD_PARAMETER);
> +
> + /* Find table from the requested type list */
> + table_desc = acpi_gbl_table_lists[table_type].next;
> + while (table_desc && table_desc->owner_id != id)
> + table_desc = table_desc->next;
> +
> + if (!table_desc)
> + return_ACPI_STATUS(AE_NOT_EXIST);
> +
> + /*
> + * Delete all namespace objects owned by this table. Note that these
> + * objects can appear anywhere in the namespace by virtue of the AML
> + * "Scope" operator. Thus, we need to track ownership by an ID, not
> + * simply a position within the hierarchy
> + */
> + acpi_ns_delete_namespace_by_owner(table_desc->owner_id);
> +
> + (void)acpi_tb_uninstall_table(table_desc);
> +
> + return_ACPI_STATUS(AE_OK);
> +}
> +
> +ACPI_EXPORT_SYMBOL(acpi_unload_table_id)
> +
> +#ifdef ACPI_FUTURE_USAGE
> +/*******************************************************************************
> + *
> * FUNCTION: acpi_unload_table
> *
> * PARAMETERS: table_type - Type of table to be unloaded
> Index: linux-2.6/include/acpi/acpixf.h
> ===================================================================
> --- linux-2.6.orig/include/acpi/acpixf.h 2006-10-23 08:48:18.364593597 -0500
> +++ linux-2.6/include/acpi/acpixf.h 2006-10-23 09:17:33.934473770 -0500
> @@ -97,11 +97,12 @@ acpi_find_root_pointer(u32 flags, struct
>
> acpi_status acpi_load_tables(void);
>
> -#ifdef ACPI_FUTURE_USAGE
> acpi_status acpi_load_table(struct acpi_table_header *table_ptr);
>
> -acpi_status acpi_unload_table(acpi_table_type table_type);
> +acpi_status acpi_unload_table_id(acpi_table_type table_type, acpi_owner_id id);
>
> +#ifdef ACPI_FUTURE_USAGE
> +acpi_status acpi_unload_table(acpi_table_type table_type);
> acpi_status
> acpi_get_table_header(acpi_table_type table_type,
> u32 instance, struct acpi_table_header *out_table_header);
> -
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>

2006-11-30 23:04:20

by John Keller

[permalink] [raw]
Subject: Re: [PATCH 3/3] - Add support for acpi_load_table/acpi_unload_table_id


This patch makes acpi_load_table() available
for use by removing it from the #ifdef ACPI_FUTURE_USAGE.

It also adds a new routine used to unload an ACPI table
of a given type and "id" - acpi_unload_table_id().
The implementation of this new routine was almost a direct
copy of existing routine acpi_unload_table() - only difference
being that it only removes a specific table id instead of
ALL tables of a given type.
The SN hotplug driver (sgi_hotplug.c) now uses both of these
interfaces to dynamically load and unload SSDT ACPI tables.

Signed-off-by: Aaron Young <[email protected]>

---

Andrew,
Can you take this update and replace the current version in
your -mm tree:
add-support-for-acpi_load_table-acpi_unload_table_id.patch

Len,
What do we need to do to resolve any licensing issues related to
these changes?

Thanks.


Resend #2
Code has been improved to no longer use ACPI "internal" routines
(such as acpi_ns_get_next_node()). To this end, a new public interface
to obtain the owner_id for a handle was added (acpi_get_id()). It is
very similar to existing routine acpi_get_type().

Resend #1
Original send of this patch was outdated and did not have
acpi_ut_acquire_mutex() and acpi_ut_release_mutex() calls
in acpi_unload_table_id().


drivers/acpi/namespace/nsxfobj.c | 44 +++++++++++++++++++++++
drivers/acpi/tables/tbxface.c | 54 ++++++++++++++++++++++++++++-
include/acpi/acpixf.h | 7 ++-
3 files changed, 102 insertions(+), 3 deletions(-)

Index: release/drivers/acpi/tables/tbxface.c
===================================================================
--- release.orig/drivers/acpi/tables/tbxface.c 2006-11-29 14:14:23.532910707 -0600
+++ release/drivers/acpi/tables/tbxface.c 2006-11-29 14:15:04.173937975 -0600
@@ -123,7 +123,6 @@ acpi_status acpi_load_tables(void)

ACPI_EXPORT_SYMBOL(acpi_load_tables)

-#ifdef ACPI_FUTURE_USAGE
/*******************************************************************************
*
* FUNCTION: acpi_load_table
@@ -221,6 +220,59 @@ ACPI_EXPORT_SYMBOL(acpi_load_table)

/*******************************************************************************
*
+ * FUNCTION: acpi_unload_table_id
+ *
+ * PARAMETERS: table_type - Type of table to be unloaded
+ * id - Owner ID of the table to be removed.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This routine is used to force the unload of a table (by id)
+ *
+ ******************************************************************************/
+acpi_status acpi_unload_table_id(acpi_table_type table_type, acpi_owner_id id)
+{
+ struct acpi_table_desc *table_desc;
+ acpi_status status;
+
+ ACPI_FUNCTION_TRACE(acpi_unload_table);
+
+ /* Parameter validation */
+ if (table_type > ACPI_TABLE_ID_MAX)
+ return_ACPI_STATUS(AE_BAD_PARAMETER);
+
+ /* Find table from the requested type list */
+ table_desc = acpi_gbl_table_lists[table_type].next;
+ while (table_desc && table_desc->owner_id != id)
+ table_desc = table_desc->next;
+
+ if (!table_desc)
+ return_ACPI_STATUS(AE_NOT_EXIST);
+
+ /*
+ * Delete all namespace objects owned by this table. Note that these
+ * objects can appear anywhere in the namespace by virtue of the AML
+ * "Scope" operator. Thus, we need to track ownership by an ID, not
+ * simply a position within the hierarchy
+ */
+ acpi_ns_delete_namespace_by_owner(table_desc->owner_id);
+
+ status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
+ if (ACPI_FAILURE(status))
+ return_ACPI_STATUS(status);
+
+ (void)acpi_tb_uninstall_table(table_desc);
+
+ (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
+
+ return_ACPI_STATUS(AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL(acpi_unload_table_id)
+
+#ifdef ACPI_FUTURE_USAGE
+/*******************************************************************************
+ *
* FUNCTION: acpi_unload_table
*
* PARAMETERS: table_type - Type of table to be unloaded
Index: release/include/acpi/acpixf.h
===================================================================
--- release.orig/include/acpi/acpixf.h 2006-11-29 14:14:23.556913676 -0600
+++ release/include/acpi/acpixf.h 2006-11-29 14:18:55.966606388 -0600
@@ -97,11 +97,12 @@ acpi_find_root_pointer(u32 flags, struct

acpi_status acpi_load_tables(void);

-#ifdef ACPI_FUTURE_USAGE
acpi_status acpi_load_table(struct acpi_table_header *table_ptr);

-acpi_status acpi_unload_table(acpi_table_type table_type);
+acpi_status acpi_unload_table_id(acpi_table_type table_type, acpi_owner_id id);

+#ifdef ACPI_FUTURE_USAGE
+acpi_status acpi_unload_table(acpi_table_type table_type);
acpi_status
acpi_get_table_header(acpi_table_type table_type,
u32 instance, struct acpi_table_header *out_table_header);
@@ -180,6 +181,8 @@ acpi_get_next_object(acpi_object_type ty

acpi_status acpi_get_type(acpi_handle object, acpi_object_type * out_type);

+acpi_status acpi_get_id(acpi_handle object, acpi_owner_id * out_type);
+
acpi_status acpi_get_parent(acpi_handle object, acpi_handle * out_handle);

/*
Index: release/drivers/acpi/namespace/nsxfobj.c
===================================================================
--- release.orig/drivers/acpi/namespace/nsxfobj.c 2006-11-29 14:18:31.000000000 -0600
+++ release/drivers/acpi/namespace/nsxfobj.c 2006-11-29 14:19:18.709418875 -0600
@@ -50,6 +50,50 @@ ACPI_MODULE_NAME("nsxfobj")

/*******************************************************************************
*
+ * FUNCTION: acpi_get_id
+ *
+ * PARAMETERS: Handle - Handle of object whose id is desired
+ * ret_id - Where the id will be placed
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This routine returns the owner id associated with a handle
+ *
+ ******************************************************************************/
+acpi_status acpi_get_id(acpi_handle handle, acpi_owner_id * ret_id)
+{
+ struct acpi_namespace_node *node;
+ acpi_status status;
+
+ /* Parameter Validation */
+
+ if (!ret_id) {
+ return (AE_BAD_PARAMETER);
+ }
+
+ status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE(status)) {
+ return (status);
+ }
+
+ /* Convert and validate the handle */
+
+ node = acpi_ns_map_handle_to_node(handle);
+ if (!node) {
+ (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+ return (AE_BAD_PARAMETER);
+ }
+
+ *ret_id = node->owner_id;
+
+ status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+ return (status);
+}
+
+ACPI_EXPORT_SYMBOL(acpi_get_id)
+
+/*******************************************************************************
+ *
* FUNCTION: acpi_get_type
*
* PARAMETERS: Handle - Handle of object whose type is desired

2006-12-15 20:48:42

by Aaron Young

[permalink] [raw]
Subject: Re: [PATCH 3/3] - Add support for acpi_load_table/acpi_unload_table_id



Per Len's request:

I understand and agree this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely. I thereby license this patch to be
redistributed under any license (GPL or non-GPL) consistent
with the project.

PS. We'd like this to get into 2.6.20. If there's anything
we (John K. and I) can do to help, please let us know.

Thanks,

-Aaron Young

>
>
> This patch makes acpi_load_table() available
> for use by removing it from the #ifdef ACPI_FUTURE_USAGE.
>
> It also adds a new routine used to unload an ACPI table
> of a given type and "id" - acpi_unload_table_id().
> The implementation of this new routine was almost a direct
> copy of existing routine acpi_unload_table() - only difference
> being that it only removes a specific table id instead of
> ALL tables of a given type.
> The SN hotplug driver (sgi_hotplug.c) now uses both of these
> interfaces to dynamically load and unload SSDT ACPI tables.
>
> Signed-off-by: Aaron Young <[email protected]>
>
> ---
>
> Andrew,
> Can you take this update and replace the current version in
> your -mm tree:
> add-support-for-acpi_load_table-acpi_unload_table_id.patch
>
> Len,
> What do we need to do to resolve any licensing issues related to
> these changes?
>
> Thanks.
>
>
> Resend #2
> Code has been improved to no longer use ACPI "internal" routines
> (such as acpi_ns_get_next_node()). To this end, a new public interface
> to obtain the owner_id for a handle was added (acpi_get_id()). It is
> very similar to existing routine acpi_get_type().
>
> Resend #1
> Original send of this patch was outdated and did not have
> acpi_ut_acquire_mutex() and acpi_ut_release_mutex() calls
> in acpi_unload_table_id().
>
>
> drivers/acpi/namespace/nsxfobj.c | 44 +++++++++++++++++++++++
> drivers/acpi/tables/tbxface.c | 54 ++++++++++++++++++++++++++++-
> include/acpi/acpixf.h | 7 ++-
> 3 files changed, 102 insertions(+), 3 deletions(-)
>
> Index: release/drivers/acpi/tables/tbxface.c
> ===================================================================
> --- release.orig/drivers/acpi/tables/tbxface.c 2006-11-29 14:14:23.532910707 -0600
> +++ release/drivers/acpi/tables/tbxface.c 2006-11-29 14:15:04.173937975 -0600
> @@ -123,7 +123,6 @@ acpi_status acpi_load_tables(void)
>
> ACPI_EXPORT_SYMBOL(acpi_load_tables)
>
> -#ifdef ACPI_FUTURE_USAGE
> /*******************************************************************************
> *
> * FUNCTION: acpi_load_table
> @@ -221,6 +220,59 @@ ACPI_EXPORT_SYMBOL(acpi_load_table)
>
> /*******************************************************************************
> *
> + * FUNCTION: acpi_unload_table_id
> + *
> + * PARAMETERS: table_type - Type of table to be unloaded
> + * id - Owner ID of the table to be removed.
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: This routine is used to force the unload of a table (by id)
> + *
> + ******************************************************************************/
> +acpi_status acpi_unload_table_id(acpi_table_type table_type, acpi_owner_id id)
> +{
> + struct acpi_table_desc *table_desc;
> + acpi_status status;
> +
> + ACPI_FUNCTION_TRACE(acpi_unload_table);
> +
> + /* Parameter validation */
> + if (table_type > ACPI_TABLE_ID_MAX)
> + return_ACPI_STATUS(AE_BAD_PARAMETER);
> +
> + /* Find table from the requested type list */
> + table_desc = acpi_gbl_table_lists[table_type].next;
> + while (table_desc && table_desc->owner_id != id)
> + table_desc = table_desc->next;
> +
> + if (!table_desc)
> + return_ACPI_STATUS(AE_NOT_EXIST);
> +
> + /*
> + * Delete all namespace objects owned by this table. Note that these
> + * objects can appear anywhere in the namespace by virtue of the AML
> + * "Scope" operator. Thus, we need to track ownership by an ID, not
> + * simply a position within the hierarchy
> + */
> + acpi_ns_delete_namespace_by_owner(table_desc->owner_id);
> +
> + status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
> + if (ACPI_FAILURE(status))
> + return_ACPI_STATUS(status);
> +
> + (void)acpi_tb_uninstall_table(table_desc);
> +
> + (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
> +
> + return_ACPI_STATUS(AE_OK);
> +}
> +
> +ACPI_EXPORT_SYMBOL(acpi_unload_table_id)
> +
> +#ifdef ACPI_FUTURE_USAGE
> +/*******************************************************************************
> + *
> * FUNCTION: acpi_unload_table
> *
> * PARAMETERS: table_type - Type of table to be unloaded
> Index: release/include/acpi/acpixf.h
> ===================================================================
> --- release.orig/include/acpi/acpixf.h 2006-11-29 14:14:23.556913676 -0600
> +++ release/include/acpi/acpixf.h 2006-11-29 14:18:55.966606388 -0600
> @@ -97,11 +97,12 @@ acpi_find_root_pointer(u32 flags, struct
>
> acpi_status acpi_load_tables(void);
>
> -#ifdef ACPI_FUTURE_USAGE
> acpi_status acpi_load_table(struct acpi_table_header *table_ptr);
>
> -acpi_status acpi_unload_table(acpi_table_type table_type);
> +acpi_status acpi_unload_table_id(acpi_table_type table_type, acpi_owner_id id);
>
> +#ifdef ACPI_FUTURE_USAGE
> +acpi_status acpi_unload_table(acpi_table_type table_type);
> acpi_status
> acpi_get_table_header(acpi_table_type table_type,
> u32 instance, struct acpi_table_header *out_table_header);
> @@ -180,6 +181,8 @@ acpi_get_next_object(acpi_object_type ty
>
> acpi_status acpi_get_type(acpi_handle object, acpi_object_type * out_type);
>
> +acpi_status acpi_get_id(acpi_handle object, acpi_owner_id * out_type);
> +
> acpi_status acpi_get_parent(acpi_handle object, acpi_handle * out_handle);
>
> /*
> Index: release/drivers/acpi/namespace/nsxfobj.c
> ===================================================================
> --- release.orig/drivers/acpi/namespace/nsxfobj.c 2006-11-29 14:18:31.000000000 -0600
> +++ release/drivers/acpi/namespace/nsxfobj.c 2006-11-29 14:19:18.709418875 -0600
> @@ -50,6 +50,50 @@ ACPI_MODULE_NAME("nsxfobj")
>
> /*******************************************************************************
> *
> + * FUNCTION: acpi_get_id
> + *
> + * PARAMETERS: Handle - Handle of object whose id is desired
> + * ret_id - Where the id will be placed
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: This routine returns the owner id associated with a handle
> + *
> + ******************************************************************************/
> +acpi_status acpi_get_id(acpi_handle handle, acpi_owner_id * ret_id)
> +{
> + struct acpi_namespace_node *node;
> + acpi_status status;
> +
> + /* Parameter Validation */
> +
> + if (!ret_id) {
> + return (AE_BAD_PARAMETER);
> + }
> +
> + status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
> + if (ACPI_FAILURE(status)) {
> + return (status);
> + }
> +
> + /* Convert and validate the handle */
> +
> + node = acpi_ns_map_handle_to_node(handle);
> + if (!node) {
> + (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
> + return (AE_BAD_PARAMETER);
> + }
> +
> + *ret_id = node->owner_id;
> +
> + status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
> + return (status);
> +}
> +
> +ACPI_EXPORT_SYMBOL(acpi_get_id)
> +
> +/*******************************************************************************
> + *
> * FUNCTION: acpi_get_type
> *
> * PARAMETERS: Handle - Handle of object whose type is desired
>