Ver Fonte

adding acpica patches

Jake Day há 7 anos atrás
pai
commit
cc0392f443
3 ficheiros alterados com 789 adições e 0 exclusões
  1. 263 0
      patches/4.14/acpica.patch
  2. 263 0
      patches/4.15/acpica.patch
  3. 263 0
      patches/4.16/acpica.patch

+ 263 - 0
patches/4.14/acpica.patch

@@ -0,0 +1,263 @@
+diff --git a/drivers/acpi/acpica/dbdisply.c b/drivers/acpi/acpica/dbdisply.c
+index 5a606ea..7b5eb33 100644
+--- a/drivers/acpi/acpica/dbdisply.c
++++ b/drivers/acpi/acpica/dbdisply.c
+@@ -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],
+diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c
+index d3b6b31..37b0b4c 100644
+--- a/drivers/acpi/acpica/evevent.c
++++ b/drivers/acpi/acpica/evevent.c
+@@ -204,6 +204,7 @@ u32 acpi_ev_fixed_event_detect(void)
+ 	u32 fixed_status;
+ 	u32 fixed_enable;
+ 	u32 i;
++	acpi_status status;
+ 
+ 	ACPI_FUNCTION_NAME(ev_fixed_event_detect);
+ 
+@@ -211,8 +212,12 @@ u32 acpi_ev_fixed_event_detect(void)
+ 	 * Read the fixed feature status and enable registers, as all the cases
+ 	 * depend on their values. Ignore errors here.
+ 	 */
+-	(void)acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
+-	(void)acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
++	status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
++	status |=
++	    acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
++	if (ACPI_FAILURE(status)) {
++		return (int_status);
++	}
+ 
+ 	ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
+ 			  "Fixed Event Block: Enable %08X Status %08X\n",
+diff --git a/drivers/acpi/acpica/exdebug.c b/drivers/acpi/acpica/exdebug.c
+index a8191d2..2ad13d8 100644
+--- a/drivers/acpi/acpica/exdebug.c
++++ b/drivers/acpi/acpica/exdebug.c
+@@ -88,14 +88,13 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
+ 		return_VOID;
+ 	}
+ 
+-	/* Null string or newline -- don't emit the line header */
++	/* Newline -- don't emit the line header */
+ 
+ 	if (source_desc &&
+ 	    (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) &&
+ 	    (source_desc->common.type == ACPI_TYPE_STRING)) {
+-		if ((source_desc->string.length == 0) ||
+-		    ((source_desc->string.length == 1) &&
+-		     (*source_desc->string.pointer == '\n'))) {
++		if ((source_desc->string.length == 1) &&
++		    (*source_desc->string.pointer == '\n')) {
+ 			acpi_os_printf("\n");
+ 			return_VOID;
+ 		}
+diff --git a/drivers/acpi/acpica/nsdumpdv.c b/drivers/acpi/acpica/nsdumpdv.c
+index 5026594..573a5f3 100644
+--- a/drivers/acpi/acpica/nsdumpdv.c
++++ b/drivers/acpi/acpica/nsdumpdv.c
+@@ -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);
+ 	}
+ 
+diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c
+index 1069662..0a9c600 100644
+--- a/drivers/acpi/acpica/nsxfname.c
++++ b/drivers/acpi/acpica/nsxfname.c
+@@ -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)
+  *
+  ******************************************************************************/
+ 
+@@ -374,20 +375,8 @@ acpi_get_object_info(acpi_handle handle,
+ 		 * 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,
+diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c
+index eb9dfac..11ce4e5 100644
+--- a/drivers/acpi/acpica/psargs.c
++++ b/drivers/acpi/acpica/psargs.c
+@@ -890,6 +890,10 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
+ 						      ACPI_POSSIBLE_METHOD_CALL);
+ 
+ 			if (arg->common.aml_opcode == AML_INT_METHODCALL_OP) {
++
++				/* Free method call op and corresponding namestring sub-ob */
++
++				acpi_ps_free_op(arg->common.value.arg);
+ 				acpi_ps_free_op(arg);
+ 				arg = NULL;
+ 				walk_state->arg_count = 1;
+diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
+index b6d58cc..5c00e5e 100644
+--- a/drivers/acpi/bus.c
++++ b/drivers/acpi/bus.c
+@@ -135,6 +135,7 @@ acpi_status acpi_bus_get_status_handle(acpi_handle handle,
+ 	}
+ 	return status;
+ }
++EXPORT_SYMBOL_GPL(acpi_bus_get_status_handle);
+ 
+ int acpi_bus_get_status(struct acpi_device *device)
+ {
+@@ -146,6 +147,12 @@ int acpi_bus_get_status(struct acpi_device *device)
+ 		return 0;
+ 	}
+ 
++	/* Battery devices must have their deps met before calling _STA */
++	if (acpi_device_is_battery(device) && device->dep_unmet) {
++		acpi_set_device_status(device, 0);
++		return 0;
++	}
++
+ 	status = acpi_bus_get_status_handle(device->handle, &sta);
+ 	if (ACPI_FAILURE(status))
+ 		return -ENODEV;
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index b0fe527..4c1b90e 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -1565,6 +1565,8 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
+ 	device_initialize(&device->dev);
+ 	dev_set_uevent_suppress(&device->dev, true);
+ 	acpi_init_coherency(device);
++	/* Assume there are unmet deps until acpi_device_dep_initialize runs */
++	device->dep_unmet = 1;
+ }
+ 
+ void acpi_device_add_finalize(struct acpi_device *device)
+@@ -1588,6 +1590,14 @@ static int acpi_add_single_object(struct acpi_device **child,
+ 	}
+ 
+ 	acpi_init_device_object(device, handle, type, sta);
++	/*
++	 * For ACPI_BUS_TYPE_DEVICE getting the status is delayed till here so
++	 * that we can call acpi_bus_get_status and use its quirk handling.
++	 * Note this must be done before the get power-/wakeup_dev-flags calls.
++	 */
++	if (type == ACPI_BUS_TYPE_DEVICE)
++		acpi_bus_get_status(device);
++
+ 	acpi_bus_get_power_flags(device);
+ 	acpi_bus_get_wakeup_device_flags(device);
+ 
+@@ -1660,9 +1670,11 @@ static int acpi_bus_type_and_status(acpi_handle handle, int *type,
+ 			return -ENODEV;
+ 
+ 		*type = ACPI_BUS_TYPE_DEVICE;
+-		status = acpi_bus_get_status_handle(handle, sta);
+-		if (ACPI_FAILURE(status))
+-			*sta = 0;
++		/*
++		 * acpi_add_single_object updates this once we've an acpi_device
++		 * so that acpi_bus_get_status' quirk handling can be used.
++		 */
++		*sta = 0;
+ 		break;
+ 	case ACPI_TYPE_PROCESSOR:
+ 		*type = ACPI_BUS_TYPE_PROCESSOR;
+@@ -1760,6 +1772,8 @@ static void acpi_device_dep_initialize(struct acpi_device *adev)
+ 	acpi_status status;
+ 	int i;
+ 
++	adev->dep_unmet = 0;
++
+ 	if (!acpi_has_method(adev->handle, "_DEP"))
+ 		return;
+ 
+diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
+index 984c7e8..8472c4a 100644
+--- a/drivers/pci/hotplug/acpiphp_ibm.c
++++ b/drivers/pci/hotplug/acpiphp_ibm.c
+@@ -399,6 +399,7 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
+ 		u32 lvl, void *context, void **rv)
+ {
+ 	acpi_handle *phandle = (acpi_handle *)context;
++	unsigned long long current_status = 0;
+ 	acpi_status status;
+ 	struct acpi_device_info *info;
+ 	int retval = 0;
+@@ -410,7 +411,9 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
+ 		return retval;
+ 	}
+ 
+-	if (info->current_status && (info->valid & ACPI_VALID_HID) &&
++	acpi_bus_get_status_handle(handle, &current_status);
++
++	if (current_status && (info->valid & ACPI_VALID_HID) &&
+ 			(!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||
+ 			 !strcmp(info->hardware_id.string, IBM_HARDWARE_ID2))) {
+ 		pr_debug("found hardware: %s, handle: %p\n",
+diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
+index 4f077ed..220ef86 100644
+--- a/include/acpi/actypes.h
++++ b/include/acpi/actypes.h
+@@ -1191,7 +1191,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 */
+@@ -1205,7 +1204,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

+ 263 - 0
patches/4.15/acpica.patch

@@ -0,0 +1,263 @@
+diff --git a/drivers/acpi/acpica/dbdisply.c b/drivers/acpi/acpica/dbdisply.c
+index 5a606ea..7b5eb33 100644
+--- a/drivers/acpi/acpica/dbdisply.c
++++ b/drivers/acpi/acpica/dbdisply.c
+@@ -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],
+diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c
+index d3b6b31..37b0b4c 100644
+--- a/drivers/acpi/acpica/evevent.c
++++ b/drivers/acpi/acpica/evevent.c
+@@ -204,6 +204,7 @@ u32 acpi_ev_fixed_event_detect(void)
+ 	u32 fixed_status;
+ 	u32 fixed_enable;
+ 	u32 i;
++	acpi_status status;
+ 
+ 	ACPI_FUNCTION_NAME(ev_fixed_event_detect);
+ 
+@@ -211,8 +212,12 @@ u32 acpi_ev_fixed_event_detect(void)
+ 	 * Read the fixed feature status and enable registers, as all the cases
+ 	 * depend on their values. Ignore errors here.
+ 	 */
+-	(void)acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
+-	(void)acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
++	status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
++	status |=
++	    acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
++	if (ACPI_FAILURE(status)) {
++		return (int_status);
++	}
+ 
+ 	ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
+ 			  "Fixed Event Block: Enable %08X Status %08X\n",
+diff --git a/drivers/acpi/acpica/exdebug.c b/drivers/acpi/acpica/exdebug.c
+index a8191d2..2ad13d8 100644
+--- a/drivers/acpi/acpica/exdebug.c
++++ b/drivers/acpi/acpica/exdebug.c
+@@ -88,14 +88,13 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
+ 		return_VOID;
+ 	}
+ 
+-	/* Null string or newline -- don't emit the line header */
++	/* Newline -- don't emit the line header */
+ 
+ 	if (source_desc &&
+ 	    (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) &&
+ 	    (source_desc->common.type == ACPI_TYPE_STRING)) {
+-		if ((source_desc->string.length == 0) ||
+-		    ((source_desc->string.length == 1) &&
+-		     (*source_desc->string.pointer == '\n'))) {
++		if ((source_desc->string.length == 1) &&
++		    (*source_desc->string.pointer == '\n')) {
+ 			acpi_os_printf("\n");
+ 			return_VOID;
+ 		}
+diff --git a/drivers/acpi/acpica/nsdumpdv.c b/drivers/acpi/acpica/nsdumpdv.c
+index 5026594..573a5f3 100644
+--- a/drivers/acpi/acpica/nsdumpdv.c
++++ b/drivers/acpi/acpica/nsdumpdv.c
+@@ -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);
+ 	}
+ 
+diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c
+index 1069662..0a9c600 100644
+--- a/drivers/acpi/acpica/nsxfname.c
++++ b/drivers/acpi/acpica/nsxfname.c
+@@ -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)
+  *
+  ******************************************************************************/
+ 
+@@ -374,20 +375,8 @@ acpi_get_object_info(acpi_handle handle,
+ 		 * 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,
+diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c
+index eb9dfac..11ce4e5 100644
+--- a/drivers/acpi/acpica/psargs.c
++++ b/drivers/acpi/acpica/psargs.c
+@@ -890,6 +890,10 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
+ 						      ACPI_POSSIBLE_METHOD_CALL);
+ 
+ 			if (arg->common.aml_opcode == AML_INT_METHODCALL_OP) {
++
++				/* Free method call op and corresponding namestring sub-ob */
++
++				acpi_ps_free_op(arg->common.value.arg);
+ 				acpi_ps_free_op(arg);
+ 				arg = NULL;
+ 				walk_state->arg_count = 1;
+diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
+index b6d58cc..5c00e5e 100644
+--- a/drivers/acpi/bus.c
++++ b/drivers/acpi/bus.c
+@@ -135,6 +135,7 @@ acpi_status acpi_bus_get_status_handle(acpi_handle handle,
+ 	}
+ 	return status;
+ }
++EXPORT_SYMBOL_GPL(acpi_bus_get_status_handle);
+ 
+ int acpi_bus_get_status(struct acpi_device *device)
+ {
+@@ -146,6 +147,12 @@ int acpi_bus_get_status(struct acpi_device *device)
+ 		return 0;
+ 	}
+ 
++	/* Battery devices must have their deps met before calling _STA */
++	if (acpi_device_is_battery(device) && device->dep_unmet) {
++		acpi_set_device_status(device, 0);
++		return 0;
++	}
++
+ 	status = acpi_bus_get_status_handle(device->handle, &sta);
+ 	if (ACPI_FAILURE(status))
+ 		return -ENODEV;
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index b0fe527..4c1b90e 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -1565,6 +1565,8 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
+ 	device_initialize(&device->dev);
+ 	dev_set_uevent_suppress(&device->dev, true);
+ 	acpi_init_coherency(device);
++	/* Assume there are unmet deps until acpi_device_dep_initialize runs */
++	device->dep_unmet = 1;
+ }
+ 
+ void acpi_device_add_finalize(struct acpi_device *device)
+@@ -1588,6 +1590,14 @@ static int acpi_add_single_object(struct acpi_device **child,
+ 	}
+ 
+ 	acpi_init_device_object(device, handle, type, sta);
++	/*
++	 * For ACPI_BUS_TYPE_DEVICE getting the status is delayed till here so
++	 * that we can call acpi_bus_get_status and use its quirk handling.
++	 * Note this must be done before the get power-/wakeup_dev-flags calls.
++	 */
++	if (type == ACPI_BUS_TYPE_DEVICE)
++		acpi_bus_get_status(device);
++
+ 	acpi_bus_get_power_flags(device);
+ 	acpi_bus_get_wakeup_device_flags(device);
+ 
+@@ -1660,9 +1670,11 @@ static int acpi_bus_type_and_status(acpi_handle handle, int *type,
+ 			return -ENODEV;
+ 
+ 		*type = ACPI_BUS_TYPE_DEVICE;
+-		status = acpi_bus_get_status_handle(handle, sta);
+-		if (ACPI_FAILURE(status))
+-			*sta = 0;
++		/*
++		 * acpi_add_single_object updates this once we've an acpi_device
++		 * so that acpi_bus_get_status' quirk handling can be used.
++		 */
++		*sta = 0;
+ 		break;
+ 	case ACPI_TYPE_PROCESSOR:
+ 		*type = ACPI_BUS_TYPE_PROCESSOR;
+@@ -1760,6 +1772,8 @@ static void acpi_device_dep_initialize(struct acpi_device *adev)
+ 	acpi_status status;
+ 	int i;
+ 
++	adev->dep_unmet = 0;
++
+ 	if (!acpi_has_method(adev->handle, "_DEP"))
+ 		return;
+ 
+diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
+index 984c7e8..8472c4a 100644
+--- a/drivers/pci/hotplug/acpiphp_ibm.c
++++ b/drivers/pci/hotplug/acpiphp_ibm.c
+@@ -399,6 +399,7 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
+ 		u32 lvl, void *context, void **rv)
+ {
+ 	acpi_handle *phandle = (acpi_handle *)context;
++	unsigned long long current_status = 0;
+ 	acpi_status status;
+ 	struct acpi_device_info *info;
+ 	int retval = 0;
+@@ -410,7 +411,9 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
+ 		return retval;
+ 	}
+ 
+-	if (info->current_status && (info->valid & ACPI_VALID_HID) &&
++	acpi_bus_get_status_handle(handle, &current_status);
++
++	if (current_status && (info->valid & ACPI_VALID_HID) &&
+ 			(!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||
+ 			 !strcmp(info->hardware_id.string, IBM_HARDWARE_ID2))) {
+ 		pr_debug("found hardware: %s, handle: %p\n",
+diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
+index 4f077ed..220ef86 100644
+--- a/include/acpi/actypes.h
++++ b/include/acpi/actypes.h
+@@ -1191,7 +1191,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 */
+@@ -1205,7 +1204,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

+ 263 - 0
patches/4.16/acpica.patch

@@ -0,0 +1,263 @@
+diff --git a/drivers/acpi/acpica/dbdisply.c b/drivers/acpi/acpica/dbdisply.c
+index 5a606ea..7b5eb33 100644
+--- a/drivers/acpi/acpica/dbdisply.c
++++ b/drivers/acpi/acpica/dbdisply.c
+@@ -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],
+diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c
+index d3b6b31..37b0b4c 100644
+--- a/drivers/acpi/acpica/evevent.c
++++ b/drivers/acpi/acpica/evevent.c
+@@ -204,6 +204,7 @@ u32 acpi_ev_fixed_event_detect(void)
+ 	u32 fixed_status;
+ 	u32 fixed_enable;
+ 	u32 i;
++	acpi_status status;
+ 
+ 	ACPI_FUNCTION_NAME(ev_fixed_event_detect);
+ 
+@@ -211,8 +212,12 @@ u32 acpi_ev_fixed_event_detect(void)
+ 	 * Read the fixed feature status and enable registers, as all the cases
+ 	 * depend on their values. Ignore errors here.
+ 	 */
+-	(void)acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
+-	(void)acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
++	status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
++	status |=
++	    acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
++	if (ACPI_FAILURE(status)) {
++		return (int_status);
++	}
+ 
+ 	ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
+ 			  "Fixed Event Block: Enable %08X Status %08X\n",
+diff --git a/drivers/acpi/acpica/exdebug.c b/drivers/acpi/acpica/exdebug.c
+index a8191d2..2ad13d8 100644
+--- a/drivers/acpi/acpica/exdebug.c
++++ b/drivers/acpi/acpica/exdebug.c
+@@ -88,14 +88,13 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
+ 		return_VOID;
+ 	}
+ 
+-	/* Null string or newline -- don't emit the line header */
++	/* Newline -- don't emit the line header */
+ 
+ 	if (source_desc &&
+ 	    (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) &&
+ 	    (source_desc->common.type == ACPI_TYPE_STRING)) {
+-		if ((source_desc->string.length == 0) ||
+-		    ((source_desc->string.length == 1) &&
+-		     (*source_desc->string.pointer == '\n'))) {
++		if ((source_desc->string.length == 1) &&
++		    (*source_desc->string.pointer == '\n')) {
+ 			acpi_os_printf("\n");
+ 			return_VOID;
+ 		}
+diff --git a/drivers/acpi/acpica/nsdumpdv.c b/drivers/acpi/acpica/nsdumpdv.c
+index 5026594..573a5f3 100644
+--- a/drivers/acpi/acpica/nsdumpdv.c
++++ b/drivers/acpi/acpica/nsdumpdv.c
+@@ -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);
+ 	}
+ 
+diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c
+index 1069662..0a9c600 100644
+--- a/drivers/acpi/acpica/nsxfname.c
++++ b/drivers/acpi/acpica/nsxfname.c
+@@ -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)
+  *
+  ******************************************************************************/
+ 
+@@ -374,20 +375,8 @@ acpi_get_object_info(acpi_handle handle,
+ 		 * 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,
+diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c
+index eb9dfac..11ce4e5 100644
+--- a/drivers/acpi/acpica/psargs.c
++++ b/drivers/acpi/acpica/psargs.c
+@@ -890,6 +890,10 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
+ 						      ACPI_POSSIBLE_METHOD_CALL);
+ 
+ 			if (arg->common.aml_opcode == AML_INT_METHODCALL_OP) {
++
++				/* Free method call op and corresponding namestring sub-ob */
++
++				acpi_ps_free_op(arg->common.value.arg);
+ 				acpi_ps_free_op(arg);
+ 				arg = NULL;
+ 				walk_state->arg_count = 1;
+diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
+index b6d58cc..5c00e5e 100644
+--- a/drivers/acpi/bus.c
++++ b/drivers/acpi/bus.c
+@@ -135,6 +135,7 @@ acpi_status acpi_bus_get_status_handle(acpi_handle handle,
+ 	}
+ 	return status;
+ }
++EXPORT_SYMBOL_GPL(acpi_bus_get_status_handle);
+ 
+ int acpi_bus_get_status(struct acpi_device *device)
+ {
+@@ -146,6 +147,12 @@ int acpi_bus_get_status(struct acpi_device *device)
+ 		return 0;
+ 	}
+ 
++	/* Battery devices must have their deps met before calling _STA */
++	if (acpi_device_is_battery(device) && device->dep_unmet) {
++		acpi_set_device_status(device, 0);
++		return 0;
++	}
++
+ 	status = acpi_bus_get_status_handle(device->handle, &sta);
+ 	if (ACPI_FAILURE(status))
+ 		return -ENODEV;
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index b0fe527..4c1b90e 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -1565,6 +1565,8 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
+ 	device_initialize(&device->dev);
+ 	dev_set_uevent_suppress(&device->dev, true);
+ 	acpi_init_coherency(device);
++	/* Assume there are unmet deps until acpi_device_dep_initialize runs */
++	device->dep_unmet = 1;
+ }
+ 
+ void acpi_device_add_finalize(struct acpi_device *device)
+@@ -1588,6 +1590,14 @@ static int acpi_add_single_object(struct acpi_device **child,
+ 	}
+ 
+ 	acpi_init_device_object(device, handle, type, sta);
++	/*
++	 * For ACPI_BUS_TYPE_DEVICE getting the status is delayed till here so
++	 * that we can call acpi_bus_get_status and use its quirk handling.
++	 * Note this must be done before the get power-/wakeup_dev-flags calls.
++	 */
++	if (type == ACPI_BUS_TYPE_DEVICE)
++		acpi_bus_get_status(device);
++
+ 	acpi_bus_get_power_flags(device);
+ 	acpi_bus_get_wakeup_device_flags(device);
+ 
+@@ -1660,9 +1670,11 @@ static int acpi_bus_type_and_status(acpi_handle handle, int *type,
+ 			return -ENODEV;
+ 
+ 		*type = ACPI_BUS_TYPE_DEVICE;
+-		status = acpi_bus_get_status_handle(handle, sta);
+-		if (ACPI_FAILURE(status))
+-			*sta = 0;
++		/*
++		 * acpi_add_single_object updates this once we've an acpi_device
++		 * so that acpi_bus_get_status' quirk handling can be used.
++		 */
++		*sta = 0;
+ 		break;
+ 	case ACPI_TYPE_PROCESSOR:
+ 		*type = ACPI_BUS_TYPE_PROCESSOR;
+@@ -1760,6 +1772,8 @@ static void acpi_device_dep_initialize(struct acpi_device *adev)
+ 	acpi_status status;
+ 	int i;
+ 
++	adev->dep_unmet = 0;
++
+ 	if (!acpi_has_method(adev->handle, "_DEP"))
+ 		return;
+ 
+diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
+index 984c7e8..8472c4a 100644
+--- a/drivers/pci/hotplug/acpiphp_ibm.c
++++ b/drivers/pci/hotplug/acpiphp_ibm.c
+@@ -399,6 +399,7 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
+ 		u32 lvl, void *context, void **rv)
+ {
+ 	acpi_handle *phandle = (acpi_handle *)context;
++	unsigned long long current_status = 0;
+ 	acpi_status status;
+ 	struct acpi_device_info *info;
+ 	int retval = 0;
+@@ -410,7 +411,9 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
+ 		return retval;
+ 	}
+ 
+-	if (info->current_status && (info->valid & ACPI_VALID_HID) &&
++	acpi_bus_get_status_handle(handle, &current_status);
++
++	if (current_status && (info->valid & ACPI_VALID_HID) &&
+ 			(!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||
+ 			 !strcmp(info->hardware_id.string, IBM_HARDWARE_ID2))) {
+ 		pr_debug("found hardware: %s, handle: %p\n",
+diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
+index 4f077ed..220ef86 100644
+--- a/include/acpi/actypes.h
++++ b/include/acpi/actypes.h
+@@ -1191,7 +1191,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 */
+@@ -1205,7 +1204,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