ACPICA: Remove calling of _STA from acpi_get_object_info()
authorHans de Goede <hdegoede@redhat.com>
Wed, 14 Mar 2018 23:13:03 +0000 (16:13 -0700)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sun, 18 Mar 2018 17:52:00 +0000 (18:52 +0100)
As the documentatuon above its declaration indicates, acpi_get_object_info()
is intended for early probe usage and as such should not call any methods
which may rely on op_regions, before this commit it was also calling _STA,
which on some systems does rely on op_regions.

Calling _STA before things are ready leads to errors such as these
(under Linux, on some hardware):

[    0.123579] ACPI Error: No handler for Region [ECRM] (00000000ba9edc4c)
               [generic_serial_bus] (20170831/evregion-166)
[    0.123601] ACPI Error: Region generic_serial_bus (ID=9) has no handler
               (20170831/exfldio-299)
[    0.123618] ACPI Error: Method parse/execution failed
               \_SB.I2C1.BAT1._STA, AE_NOT_EXIST (20170831/psparse-550)

End 2015 support for the _SUB method was removed for exactly the same
reason. Removing current_status from struct acpi_device_info only has a limited
impact. Within ACPICA it is only used by 2 debug messages, both
of which are modified to no longer print it with this commit.

Outside of ACPICA, there was one user in Linux, which has been patched to
no longer use current_status in Torvald's current master.

I've not checked if free_BSD or others are using the current_status field.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Erik Schmauss <erik.schmauss@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/dbdisply.c
drivers/acpi/acpica/nsdumpdv.c
drivers/acpi/acpica/nsxfname.c
include/acpi/actypes.h

index 7df920cda77dd37fd122a281a6fe93c709293286..55d6f386c06306ee6e94f0265c5455dbc9906b17 100644 (file)
@@ -642,9 +642,8 @@ void acpi_db_display_object_type(char *object_arg)
                return;
        }
 
-       acpi_os_printf("ADR: %8.8X%8.8X, STA: %8.8X, Flags: %X\n",
-                      ACPI_FORMAT_UINT64(info->address),
-                      info->current_status, info->flags);
+       acpi_os_printf("ADR: %8.8X%8.8X, Flags: %X\n",
+                      ACPI_FORMAT_UINT64(info->address), info->flags);
 
        acpi_os_printf("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n",
                       info->highest_dstates[0], info->highest_dstates[1],
index 09ac00dee4506334e5088303246e68aaed48459f..4014a0d513bf2d21121b3c25f7e19791efa46baa 100644 (file)
@@ -88,10 +88,9 @@ acpi_ns_dump_one_device(acpi_handle obj_handle,
                }
 
                ACPI_DEBUG_PRINT_RAW((ACPI_DB_TABLES,
-                                     "    HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
+                                     "    HID: %s, ADR: %8.8X%8.8X\n",
                                      info->hardware_id.value,
-                                     ACPI_FORMAT_UINT64(info->address),
-                                     info->current_status));
+                                     ACPI_FORMAT_UINT64(info->address)));
                ACPI_FREE(info);
        }
 
index e9603fc9586ce7a9766ca1489f47636fa68fdbe2..c36975c1d1a96bc6e15ca311374ce0fa28f28a39 100644 (file)
@@ -241,7 +241,7 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
  *              namespace node and possibly by running several standard
  *              control methods (Such as in the case of a device.)
  *
- * For Device and Processor objects, run the Device _HID, _UID, _CID, _STA,
+ * For Device and Processor objects, run the Device _HID, _UID, _CID,
  * _CLS, _ADR, _sx_w, and _sx_d methods.
  *
  * Note: Allocates the return buffer, must be freed by the caller.
@@ -250,8 +250,9 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
  * discovery namespace traversal. Therefore, no complex methods can be
  * executed, especially those that access operation regions. Therefore, do
  * not add any additional methods that could cause problems in this area.
- * this was the fate of the _SUB method which was found to cause such
- * problems and was removed (11/2015).
+ * Because of this reason support for the following methods has been removed:
+ * 1) _SUB method was removed (11/2015)
+ * 2) _STA method was removed (02/2018)
  *
  ******************************************************************************/
 
@@ -369,25 +370,13 @@ acpi_get_object_info(acpi_handle handle,
        if ((type == ACPI_TYPE_DEVICE) || (type == ACPI_TYPE_PROCESSOR)) {
                /*
                 * Get extra info for ACPI Device/Processor objects only:
-                * Run the _STA, _ADR and, sx_w, and _sx_d methods.
+                * Run the _ADR and, sx_w, and _sx_d methods.
                 *
                 * Notes: none of these methods are required, so they may or may
                 * not be present for this device. The Info->Valid bitfield is used
                 * to indicate which methods were found and run successfully.
-                *
-                * For _STA, if the method does not exist, then (as per the ACPI
-                * specification), the returned current_status flags will indicate
-                * that the device is present/functional/enabled. Otherwise, the
-                * current_status flags reflect the value returned from _STA.
                 */
 
-               /* Execute the Device._STA method */
-
-               status = acpi_ut_execute_STA(node, &info->current_status);
-               if (ACPI_SUCCESS(status)) {
-                       valid |= ACPI_VALID_STA;
-               }
-
                /* Execute the Device._ADR method */
 
                status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, node,
index a894ea13dcba00fbe31a7531e5493a55cc19afc6..924e3526f50e1ca15b43a0a7da6785267b3f4cd6 100644 (file)
@@ -1194,7 +1194,6 @@ struct acpi_device_info {
        u8 flags;               /* Miscellaneous info */
        u8 highest_dstates[4];  /* _sx_d values: 0xFF indicates not valid */
        u8 lowest_dstates[5];   /* _sx_w values: 0xFF indicates not valid */
-       u32 current_status;     /* _STA value */
        u64 address;    /* _ADR value */
        struct acpi_pnp_device_id hardware_id;  /* _HID value */
        struct acpi_pnp_device_id unique_id;    /* _UID value */
@@ -1208,7 +1207,6 @@ struct acpi_device_info {
 
 /* Flags for Valid field above (acpi_get_object_info) */
 
-#define ACPI_VALID_STA                  0x0001
 #define ACPI_VALID_ADR                  0x0002
 #define ACPI_VALID_HID                  0x0004
 #define ACPI_VALID_UID                  0x0008