linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH 3/3] - Add support for acpi_load_table/acpi_unload_table_id
@ 2006-11-30 23:04 John Keller
  2006-12-15 20:48 ` Aaron Young
  0 siblings, 1 reply; 4+ messages in thread
From: John Keller @ 2006-11-30 23:04 UTC (permalink / raw)
  To: linux-acpi
  Cc: akpm, len.brown, tony.luck, linux-ia64, pcihpd-discuss, gregkh,
	linux-kernel, ayoung, jes, John Keller


 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 <ayoung@sgi.com>

---

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 3/3] - Add support for acpi_load_table/acpi_unload_table_id
  2006-11-30 23:04 [PATCH 3/3] - Add support for acpi_load_table/acpi_unload_table_id John Keller
@ 2006-12-15 20:48 ` Aaron Young
  0 siblings, 0 replies; 4+ messages in thread
From: Aaron Young @ 2006-12-15 20:48 UTC (permalink / raw)
  To: John Keller
  Cc: linux-acpi, akpm, len.brown, tony.luck, linux-ia64,
	pcihpd-discuss, gregkh, linux-kernel, ayoung, jes, John Keller



  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 <ayoung@sgi.com>
> 
> ---
> 
> 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
> 


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 3/3] - Add support for acpi_load_table/acpi_unload_table_id
  2006-11-15 15:27 John Keller
@ 2006-11-15 16:24 ` Len Brown
  0 siblings, 0 replies; 4+ messages in thread
From: Len Brown @ 2006-11-15 16:24 UTC (permalink / raw)
  To: John Keller
  Cc: linux-acpi, akpm, tony.luck, linux-ia64, pcihpd-discuss, gregkh,
	linux-kernel, ayoung, jes, robert.moore

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 <ayoung@sgi.com>
> 
> ---
> 
>  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 majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 3/3] - Add support for acpi_load_table/acpi_unload_table_id
@ 2006-11-15 15:27 John Keller
  2006-11-15 16:24 ` Len Brown
  0 siblings, 1 reply; 4+ messages in thread
From: John Keller @ 2006-11-15 15:27 UTC (permalink / raw)
  To: linux-acpi
  Cc: akpm, len.brown, tony.luck, linux-ia64, pcihpd-discuss, gregkh,
	linux-kernel, ayoung, jes, John Keller

 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 <ayoung@sgi.com>

---

 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);

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2006-12-15 20:48 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-11-30 23:04 [PATCH 3/3] - Add support for acpi_load_table/acpi_unload_table_id John Keller
2006-12-15 20:48 ` Aaron Young
  -- strict thread matches above, loose matches on Subject: below --
2006-11-15 15:27 John Keller
2006-11-15 16:24 ` Len Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).