Skip to contentSkip to conversation

ACPICA: New OSI interfaces

RFC PATCH In review Lin Ming 1 participant 2 messages Jul 28, 2010 – Aug 11, 2010

Subsystems (2)
lore
Share & tools
lore
author
#1 lore raw
Quoted 9 lines · Lin Ming

Hi, all

http://www.acpica.org/bugzilla/show_bug.cgi?id=836

This patch series is to implement new OSI interfaces to dynamically install/remove _OSI entries.

Thanks for any comment.
Lin Ming

Below is the updated version.
The ACPICA part change has been merged into ACPICA git repository.

Please have a look at the Linux OSL _OSI code change, say drivers/acpi/osl.c.

Thanks.

Subject: [PATCH] ACPICA/ACPI: Add new host interfaces for _OSI support

Adds install/remove interfaces so that the host can dynamically alter the global _OSI table. Also adds support for _OSI handlers. Additional support: new debugger command (osi), and test support in the acpiexec utility. Adds new file, utilities/utosi.c. ACPICA bugzilla 836.

The Linux OSL _OSI code is also changed.
acpi_osi_setup can't call acpi_install/remove_interface because ACPICA is not initialized yet at this early time.
So we just save the osi string in acpi_osi_setup and will handle it later in a new function acpi_osi_setup_late.

http://www.acpica.org/bugzilla/show_bug.cgi?id=836

---
 drivers/acpi/acpica/Makefile   |    3 +-
 drivers/acpi/acpica/acdebug.h  |    2 +
 drivers/acpi/acpica/acglobal.h |    6 +
 drivers/acpi/acpica/aclocal.h  |    5 +
 drivers/acpi/acpica/acutils.h  |   17 ++-
 drivers/acpi/acpica/uteval.c   |  147 ----------------
 drivers/acpi/acpica/utglobal.c |    2 +
 drivers/acpi/acpica/utinit.c   |    4 +
 drivers/acpi/acpica/utmutex.c  |    8 +
 drivers/acpi/acpica/utosi.c    |  379 ++++++++++++++++++++++++++++++++++++++++
 drivers/acpi/acpica/utxface.c  |  125 +++++++++++++-
 drivers/acpi/osl.c             |   88 +++++-----
 include/acpi/acpiosxf.h        |    3 -
 include/acpi/acpixf.h          |    6 +
 include/acpi/actypes.h         |    3 +
 15 files changed, 602 insertions(+), 196 deletions(-)
drivers/acpi/acpica/Makefile +2 -1
index d93cc06..262903e 100644
@@ -44,4 +44,5 @@ acpi-y += tbxface.o tbinstal.o tbutils.o tbfind.o tbfadt.o tbxfroot.o
 
 acpi-y += utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \
 		utcopy.o utdelete.o utglobal.o utmath.o utobject.o \
-		utstate.o utmutex.o utobject.o utresrc.o utlock.o utids.o
+		utstate.o utmutex.o utobject.o utresrc.o utlock.o utids.o \
+		utosi.o
drivers/acpi/acpica/acdebug.h +2 -0
index 48faf3e..72e9d5e 100644
@@ -105,6 +105,8 @@ void acpi_db_set_method_data(char *type_arg, char *index_arg, char *value_arg);
 acpi_status
 acpi_db_display_objects(char *obj_type_arg, char *display_count_arg);
 
+void acpi_db_display_interfaces(char *action_arg, char *interface_name_arg);
+
 acpi_status acpi_db_find_name_in_namespace(char *name_arg);
 
 void acpi_db_set_scope(char *name);
drivers/acpi/acpica/acglobal.h +6 -0
index 18e796f..ea2316d 100644
@@ -187,6 +187,10 @@ ACPI_EXTERN u8 acpi_gbl_integer_bit_width;
 ACPI_EXTERN u8 acpi_gbl_integer_byte_width;
 ACPI_EXTERN u8 acpi_gbl_integer_nybble_width;
 
+/* Mutex for _OSI support */
+
+ACPI_EXTERN acpi_mutex acpi_gbl_osi_mutex;
+
 /* Reader/Writer lock is used for namespace walk and dynamic table unload */
 
 ACPI_EXTERN struct acpi_rw_lock acpi_gbl_namespace_rw_lock;
@@ -255,6 +259,7 @@ ACPI_EXTERN acpi_init_handler acpi_gbl_init_handler;
 ACPI_EXTERN acpi_tbl_handler acpi_gbl_table_handler;
 ACPI_EXTERN void *acpi_gbl_table_handler_context;
 ACPI_EXTERN struct acpi_walk_state *acpi_gbl_breakpoint_walk;
+ACPI_EXTERN acpi_interface_handler acpi_gbl_interface_handler;
 
 /* Owner ID support */
 
@@ -275,6 +280,7 @@ ACPI_EXTERN u8 acpi_gbl_acpi_hardware_present;
 ACPI_EXTERN u8 acpi_gbl_events_initialized;
 ACPI_EXTERN u8 acpi_gbl_system_awake_and_running;
 ACPI_EXTERN u8 acpi_gbl_osi_data;
+ACPI_EXTERN struct acpi_interface_info *acpi_gbl_supported_interfaces;
 
 #ifndef DEFINE_ACPI_GLOBALS
 
drivers/acpi/acpica/aclocal.h +5 -0
index 1ee0bcf..e9cedae 100644
@@ -913,9 +913,14 @@ struct acpi_bit_register_info {
 
 struct acpi_interface_info {
 	char *name;
+	struct acpi_interface_info *next;
+	u8 flags;
 	u8 value;
 };
 
+#define ACPI_OSI_INVALID                0x01
+#define ACPI_OSI_DYNAMIC                0x02
+
 struct acpi_port_info {
 	char *name;
 	u16 start;
drivers/acpi/acpica/acutils.h +15 -2
index 35df755..78e0121 100644
@@ -312,8 +312,6 @@ void acpi_ut_delete_internal_object_list(union acpi_operand_object **obj_list);
 /*
  * uteval - object evaluation
  */
-acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state);
-
 acpi_status
 acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
 			char *path,
@@ -395,6 +393,21 @@ acpi_status
 acpi_ut_get_object_size(union acpi_operand_object *obj, acpi_size * obj_length);
 
 /*
+ * utosi - Support for the _OSI predefined control method
+ */
+acpi_status acpi_ut_initialize_interfaces(void);
+
+void acpi_ut_interface_terminate(void);
+
+acpi_status acpi_ut_install_interface(acpi_string interface_name);
+
+acpi_status acpi_ut_remove_interface(acpi_string interface_name);
+
+struct acpi_interface_info *acpi_ut_get_interface(acpi_string interface_name);
+
+acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state);
+
+/*
  * utstate - Generic state creation/cache routines
  */
 void
drivers/acpi/acpica/uteval.c +0 -147

153 lines not on this page · raw message

drivers/acpi/acpica/utglobal.c +2 -0
index 0558747..45f6334 100644
@@ -774,6 +774,7 @@ acpi_status acpi_ut_init_globals(void)
 	acpi_gbl_exception_handler = NULL;
 	acpi_gbl_init_handler = NULL;
 	acpi_gbl_table_handler = NULL;
+	acpi_gbl_interface_handler = NULL;
 
 	/* Global Lock support */
 
@@ -800,6 +801,7 @@ acpi_status acpi_ut_init_globals(void)
 	acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
 	acpi_gbl_db_output_flags = ACPI_DB_CONSOLE_OUTPUT;
 	acpi_gbl_osi_data = 0;
+	acpi_gbl_osi_mutex = NULL;
 
 	/* Hardware oriented */
 
drivers/acpi/acpica/utinit.c +4 -0
index a39c93d..c1b1c80 100644
@@ -117,6 +117,10 @@ void acpi_ut_subsystem_shutdown(void)
 	/* Close the acpi_event Handling */
 
 	acpi_ev_terminate();
+
+	/* Delete any dynamic _OSI interfaces */
+
+	acpi_ut_interface_terminate();
 #endif
 
 	/* Close the Namespace */
drivers/acpi/acpica/utmutex.c +8 -0
index 058b3df..ac7efa7 100644
@@ -86,6 +86,12 @@ acpi_status acpi_ut_mutex_initialize(void)
 	spin_lock_init(acpi_gbl_gpe_lock);
 	spin_lock_init(acpi_gbl_hardware_lock);
 
+	/* Mutex for _OSI support */
+	status = acpi_os_create_mutex(&acpi_gbl_osi_mutex);
+	if (ACPI_FAILURE(status)) {
+		return_ACPI_STATUS(status);
+	}
+
 	/* Create the reader/writer lock for namespace access */
 
 	status = acpi_ut_create_rw_lock(&acpi_gbl_namespace_rw_lock);
@@ -117,6 +123,8 @@ void acpi_ut_mutex_terminate(void)
 		acpi_ut_delete_mutex(i);
 	}
 
+	acpi_os_delete_mutex(acpi_gbl_osi_mutex);
+
 	/* Delete the spinlocks */
 
 	acpi_os_delete_lock(acpi_gbl_gpe_lock);
drivers/acpi/acpica/utosi.c new file +379 -0

379 lines not on this page · raw message

drivers/acpi/acpica/utxface.c +124 -1

140 lines not on this page · raw message

drivers/acpi/osl.c +46 -42

130 lines not on this page · raw message

include/acpi/acpiosxf.h +0 -3
index 5e22577..c29b0af 100644
@@ -239,9 +239,6 @@ acpi_os_derive_pci_id(acpi_handle device,
 /*
  * Miscellaneous
  */
-acpi_status acpi_os_validate_interface(char *interface);
-acpi_status acpi_osi_invalidate(char* interface);
-
 acpi_status
 acpi_os_validate_address(u8 space_id, acpi_physical_address address,
 			 acpi_size length, char *name);
include/acpi/acpixf.h +6 -0
index 81d4f3d..55164c7 100644
@@ -105,6 +105,10 @@ const char *acpi_format_exception(acpi_status exception);
 
 acpi_status acpi_purge_cached_objects(void);
 
+acpi_status acpi_install_interface(acpi_string interface_name);
+
+acpi_status acpi_remove_interface(acpi_string interface_name);
+
 /*
  * ACPI Memory management
  */
@@ -263,6 +267,8 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
 acpi_status acpi_install_exception_handler(acpi_exception_handler handler);
 #endif
 
+acpi_status acpi_install_interface_handler(acpi_interface_handler handler);
+
 /*
  * Event interfaces
  */
include/acpi/actypes.h +3 -0
index 5db8f47..332d076 100644
@@ -950,6 +950,9 @@ acpi_status(*acpi_walk_callback) (acpi_handle object,
 				  u32 nesting_level,
 				  void *context, void **return_value);
 
+typedef
+u32 (*acpi_interface_handler) (acpi_string interface_name, u32 supported);
+
 /* Interrupt handler return values */
 
 #define ACPI_INTERRUPT_NOT_HANDLED      0x00