ACPICA: Update return value for intenal _OSI method
authorBob Moore <robert.moore@intel.com>
Wed, 7 Sep 2016 06:06:47 +0000 (14:06 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sat, 10 Sep 2016 00:43:02 +0000 (02:43 +0200)
ACPICA commit 82101009c7c04845edb3495e66a274a613758bca

Instead of 0xFFFFFFFF, _OSI is now defined to return "Ones".
This is for compatibility with Windows. The ACPI spec will
be updated to reflect this.

Link: https://github.com/acpica/acpica/commit/82101009
Reported-by: Daniel Drake <drake@endlessm.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/utosi.c

index 3f5fed670271cc4804d69427e0209ab2f4f8d10a..f0484b058c4493088ce63a5f685ec68bbada94a7 100644 (file)
@@ -390,11 +390,22 @@ struct acpi_interface_info *acpi_ut_get_interface(acpi_string interface_name)
  * PARAMETERS:  walk_state          - Current walk state
  *
  * RETURN:      Status
+ *              Integer: TRUE (0) if input string is matched
+ *                       FALSE (-1) if string is not matched
  *
  * DESCRIPTION: Implementation of the _OSI predefined control method. When
  *              an invocation of _OSI is encountered in the system AML,
  *              control is transferred to this function.
  *
+ * (August 2016)
+ * Note:  _OSI is now defined to return "Ones" to indicate a match, for
+ * compatibility with other ACPI implementations. On a 32-bit DSDT, Ones
+ * is 0xFFFFFFFF. On a 64-bit DSDT, Ones is 0xFFFFFFFFFFFFFFFF
+ * (ACPI_UINT64_MAX).
+ *
+ * This function always returns ACPI_UINT64_MAX for TRUE, and later code
+ * will truncate this to 32 bits if necessary.
+ *
  ******************************************************************************/
 
 acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
@@ -404,7 +415,7 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
        struct acpi_interface_info *interface_info;
        acpi_interface_handler interface_handler;
        acpi_status status;
-       u32 return_value;
+       u64 return_value;
 
        ACPI_FUNCTION_TRACE(ut_osi_implementation);
 
@@ -444,7 +455,7 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
                        acpi_gbl_osi_data = interface_info->value;
                }
 
-               return_value = ACPI_UINT32_MAX;
+               return_value = ACPI_UINT64_MAX;
        }
 
        acpi_os_release_mutex(acpi_gbl_osi_mutex);
@@ -456,9 +467,10 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
         */
        interface_handler = acpi_gbl_interface_handler;
        if (interface_handler) {
-               return_value =
-                   interface_handler(string_desc->string.pointer,
-                                     return_value);
+               if (interface_handler
+                   (string_desc->string.pointer, (u32)return_value)) {
+                       return_value = ACPI_UINT64_MAX;
+               }
        }
 
        ACPI_DEBUG_PRINT_RAW((ACPI_DB_INFO,