ACPICA: Add acpi_update_interfaces() public interface
authorLv Zheng <lv.zheng@intel.com>
Mon, 22 Jul 2013 08:08:16 +0000 (16:08 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 23 Jul 2013 02:06:03 +0000 (04:06 +0200)
Add new API to allow OSPM to disable/enable specific types of _OSI
interface strings.

ACPICA does not have the knowledge about whether an _OSI interface
string is an OS vendor string or a feature group string and there
isn't any API interface to allow OSPM to install a new interface
string as a feature group string.
This patch simply adds all feature group strings defined by ACPI
specification into the acpi_default_supported_interfaces with
ACPI_OSI_FEATURE flag set to fix this gap.  This patch also adds
codes to keep their default states as ACPI_OSI_INVALID before the
initialization and after the termination.

Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Reviewed-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Acked-by: Len Brown <len.brown@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Conflicts:
include/acpi/actypes.h (with commit 242b228)

drivers/acpi/acpica/aclocal.h
drivers/acpi/acpica/acutils.h
drivers/acpi/acpica/utosi.c
drivers/acpi/acpica/utxface.c
include/acpi/acpixf.h
include/acpi/actypes.h

index d4a4901..b0e3d15 100644 (file)
@@ -942,6 +942,9 @@ struct acpi_interface_info {
 
 #define ACPI_OSI_INVALID                0x01
 #define ACPI_OSI_DYNAMIC                0x02
+#define ACPI_OSI_FEATURE                0x04
+#define ACPI_OSI_DEFAULT_INVALID        0x08
+#define ACPI_OSI_OPTIONAL_FEATURE       (ACPI_OSI_FEATURE | ACPI_OSI_DEFAULT_INVALID | ACPI_OSI_INVALID)
 
 struct acpi_port_info {
        char *name;
index 4c081c4..d5a62a6 100644 (file)
@@ -470,6 +470,8 @@ acpi_status acpi_ut_install_interface(acpi_string interface_name);
 
 acpi_status acpi_ut_remove_interface(acpi_string interface_name);
 
+acpi_status acpi_ut_update_interfaces(u8 action);
+
 struct acpi_interface_info *acpi_ut_get_interface(acpi_string interface_name);
 
 acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state);
index 7e80772..8856bd3 100644 (file)
@@ -77,21 +77,20 @@ static struct acpi_interface_info acpi_default_supported_interfaces[] = {
 
        /* Feature Group Strings */
 
-       {"Extended Address Space Descriptor", NULL, 0, 0}
+       {"Extended Address Space Descriptor", NULL, ACPI_OSI_FEATURE, 0},
 
        /*
         * All "optional" feature group strings (features that are implemented
-        * by the host) should be dynamically added by the host via
-        * acpi_install_interface and should not be manually added here.
-        *
-        * Examples of optional feature group strings:
-        *
-        * "Module Device"
-        * "Processor Device"
-        * "3.0 Thermal Model"
-        * "3.0 _SCP Extensions"
-        * "Processor Aggregator Device"
+        * by the host) should be dynamically modified to VALID by the host via
+        * acpi_install_interface or acpi_update_interfaces. Such optional feature
+        * group strings are set as INVALID by default here.
         */
+
+       {"Module Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+       {"Processor Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+       {"3.0 Thermal Model", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+       {"3.0 _SCP Extensions", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+       {"Processor Aggregator Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0}
 };
 
 /*******************************************************************************
@@ -158,11 +157,20 @@ acpi_status acpi_ut_interface_terminate(void)
        while (next_interface) {
                acpi_gbl_supported_interfaces = next_interface->next;
 
-               /* Only interfaces added at runtime can be freed */
-
                if (next_interface->flags & ACPI_OSI_DYNAMIC) {
+
+                       /* Only interfaces added at runtime can be freed */
+
                        ACPI_FREE(next_interface->name);
                        ACPI_FREE(next_interface);
+               } else {
+                       /* Interface is in static list. Reset it to invalid or valid. */
+
+                       if (next_interface->flags & ACPI_OSI_DEFAULT_INVALID) {
+                               next_interface->flags |= ACPI_OSI_INVALID;
+                       } else {
+                               next_interface->flags &= ~ACPI_OSI_INVALID;
+                       }
                }
 
                next_interface = acpi_gbl_supported_interfaces;
@@ -278,6 +286,49 @@ acpi_status acpi_ut_remove_interface(acpi_string interface_name)
 
 /*******************************************************************************
  *
+ * FUNCTION:    acpi_ut_update_interfaces
+ *
+ * PARAMETERS:  action              - Actions to be performed during the
+ *                                    update
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
+ *              strings or/and feature group strings.
+ *              Caller MUST hold acpi_gbl_osi_mutex
+ *
+ ******************************************************************************/
+
+acpi_status acpi_ut_update_interfaces(u8 action)
+{
+       struct acpi_interface_info *next_interface;
+
+       next_interface = acpi_gbl_supported_interfaces;
+       while (next_interface) {
+               if (((next_interface->flags & ACPI_OSI_FEATURE) &&
+                    (action & ACPI_FEATURE_STRINGS)) ||
+                   (!(next_interface->flags & ACPI_OSI_FEATURE) &&
+                    (action & ACPI_VENDOR_STRINGS))) {
+                       if (action & ACPI_DISABLE_INTERFACES) {
+
+                               /* Mark the interfaces as invalid */
+
+                               next_interface->flags |= ACPI_OSI_INVALID;
+                       } else {
+                               /* Mark the interfaces as valid */
+
+                               next_interface->flags &= ~ACPI_OSI_INVALID;
+                       }
+               }
+
+               next_interface = next_interface->next;
+       }
+
+       return (AE_OK);
+}
+
+/*******************************************************************************
+ *
  * FUNCTION:    acpi_ut_get_interface
  *
  * PARAMETERS:  interface_name      - The interface to find
index 6505774..03a211e 100644 (file)
@@ -389,6 +389,34 @@ ACPI_EXPORT_SYMBOL(acpi_install_interface_handler)
 
 /*****************************************************************************
  *
+ * FUNCTION:    acpi_update_interfaces
+ *
+ * PARAMETERS:  action              - Actions to be performed during the
+ *                                    update
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
+ *              string or/and feature group strings.
+ *
+ ****************************************************************************/
+acpi_status acpi_update_interfaces(u8 action)
+{
+       acpi_status status;
+
+       status = acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
+       if (ACPI_FAILURE(status)) {
+               return (status);
+       }
+
+       status = acpi_ut_update_interfaces(action);
+
+       acpi_os_release_mutex(acpi_gbl_osi_mutex);
+       return (status);
+}
+
+/*****************************************************************************
+ *
  * FUNCTION:    acpi_check_address_range
  *
  * PARAMETERS:  space_id            - Address space ID
@@ -402,6 +430,7 @@ ACPI_EXPORT_SYMBOL(acpi_install_interface_handler)
  *              ASL operation region address ranges.
  *
  ****************************************************************************/
+
 u32
 acpi_check_address_range(acpi_adr_space_type space_id,
                         acpi_physical_address address,
index 292af0c..0dd03f2 100644 (file)
@@ -147,6 +147,8 @@ acpi_status acpi_install_interface(acpi_string interface_name);
 
 acpi_status acpi_remove_interface(acpi_string interface_name);
 
+acpi_status acpi_update_interfaces(u8 action);
+
 u32
 acpi_check_address_range(acpi_adr_space_type space_id,
                         acpi_physical_address address,
index 787a977..eae55fb 100644 (file)
@@ -1152,4 +1152,18 @@ struct acpi_memory_list {
 #define ACPI_OSI_WIN_7                  0x0B
 #define ACPI_OSI_WIN_8                  0x0C
 
+/* _OSI update actions */
+
+#define ACPI_VENDOR_STRINGS                 0x01
+#define ACPI_FEATURE_STRINGS                0x02
+#define ACPI_ENABLE_INTERFACES              0x00
+#define ACPI_DISABLE_INTERFACES             0x04
+
+#define ACPI_DISABLE_ALL_VENDOR_STRINGS     (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS)
+#define ACPI_DISABLE_ALL_FEATURE_STRINGS    (ACPI_DISABLE_INTERFACES | ACPI_FEATURE_STRINGS)
+#define ACPI_DISABLE_ALL_STRINGS            (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
+#define ACPI_ENABLE_ALL_VENDOR_STRINGS      (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS)
+#define ACPI_ENABLE_ALL_FEATURE_STRINGS     (ACPI_ENABLE_INTERFACES | ACPI_FEATURE_STRINGS)
+#define ACPI_ENABLE_ALL_STRINGS             (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
+
 #endif                         /* __ACTYPES_H__ */