[Intel-gfx] [PATCH] usb/icl: Work around ACPI boottime crash
Imre Deak
imre.deak at intel.com
Mon Jul 2 13:57:56 UTC 2018
Work around the following boot time crash:
[ 10.456056] CPU: 1 PID: 220 Comm: systemd-udevd Tainted: G W 4.17.0-rc7-CI-CI_DRM_4040+ #182
[ 10.465828] Hardware name: Intel Corporation Ice Lake Client Platform/IceLake U DDR4 SODIMM PD RVP, BIOS
+ICLSFWR1.R00.2204.A00.1805172221 05/17/2018
[ 10.479168] RIP: 0010:acpi_ps_complete_this_op+0xa7/0x22a
[ 10.484627] RSP: 0018:ffffc900003a7578 EFLAGS: 00010202
[ 10.489881] RAX: 6b6b6b6b6b6b6b6b RBX: ffff8804abeda9c8 RCX: 0000000000000020
[ 10.497045] RDX: 0000000000000000 RSI: ffff88049e604a68 RDI: 0000000000000000
[ 10.504213] RBP: 0000000000000000 R08: ffff8804abeda9c8 R09: 0000000000000000
[ 10.511376] R10: 0000000000000000 R11: 0000000000000000 R12: 000000000000000e
[ 10.518542] R13: ffff88049e604a68 R14: ffff88049e604a68 R15: ffffffffa00263c2
[ 10.525713] FS: 00007ff6d85f18c0(0000) GS:ffff8804be880000(0000) knlGS:0000000000000000
[ 10.533839] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 10.539616] CR2: 00007ff6d73cff40 CR3: 000000049f794001 CR4: 0000000000760ee0
[ 10.546783] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 10.553949] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 10.561112] PKRU: 55555554
[ 10.563849] Call Trace:
[ 10.566323] acpi_ps_complete_op+0x49/0x3f1
[ 10.570537] acpi_ps_parse_loop+0x94c/0x9bb
[ 10.574754] ? acpi_ds_delete_walk_state+0x113/0x131
[ 10.579750] acpi_ps_parse_aml+0x1a2/0x4af
[ 10.583875] acpi_ps_execute_method+0x1e9/0x2a5
[ 10.588435] acpi_ns_evaluate+0x2e4/0x42c
[ 10.592473] acpi_evaluate_object+0x1fd/0x3a8
[ 10.596873] usb_acpi_find_companion+0xee/0x1f0 [usbcore]
[ 10.602319] acpi_platform_notify+0x33/0xa0
[ 10.606532] device_add+0x197/0x600
[ 10.610048] ? __init_waitqueue_head+0x36/0x50
[ 10.614529] usb_hub_create_port_device+0x11d/0x340 [usbcore]
[ 10.620314] hub_probe+0x9a5/0x1010 [usbcore]
[ 10.624701] ? _raw_spin_unlock_irqrestore+0x51/0x60
[ 10.629730] usb_probe_interface+0x13f/0x300 [usbcore]
[ 10.634900] driver_probe_device+0x302/0x470
[ 10.639198] ? __driver_attach+0xe0/0xe0
[ 10.643147] bus_for_each_drv+0x59/0x90
[ 10.647013] __device_attach+0xb7/0x130
[ 10.650878] bus_probe_device+0x9c/0xb0
[ 10.654745] device_add+0x3c5/0x600
[ 10.658270] usb_set_configuration+0x540/0x880 [usbcore]
[ 10.663621] generic_probe+0x28/0x80 [usbcore]
[ 10.668097] driver_probe_device+0x302/0x470
[ 10.672393] ? __driver_attach+0xe0/0xe0
[ 10.676346] bus_for_each_drv+0x59/0x90
[ 10.680211] __device_attach+0xb7/0x130
[ 10.684076] bus_probe_device+0x9c/0xb0
[ 10.687940] device_add+0x3c5/0x600
[ 10.691464] usb_new_device+0x269/0x490 [usbcore]
[ 10.696206] usb_add_hcd+0x558/0x850 [usbcore]
[ 10.700682] xhci_pci_probe+0x13d/0x240 [xhci_pci]
[ 10.705534] pci_device_probe+0xa1/0x130
[ 10.709484] driver_probe_device+0x302/0x470
[ 10.713784] __driver_attach+0xb9/0xe0
[ 10.717562] ? driver_probe_device+0x470/0x470
[ 10.722033] ? driver_probe_device+0x470/0x470
[ 10.726505] bus_for_each_dev+0x64/0x90
[ 10.730370] ? preempt_count_sub+0x92/0xd0
[ 10.734495] bus_add_driver+0x164/0x260
[ 10.738362] ? 0xffffffffa004e000
[ 10.741704] driver_register+0x57/0xc0
[ 10.745482] ? 0xffffffffa004e000
[ 10.748824] do_one_initcall+0x4a/0x350
[ 10.752690] ? do_init_module+0x22/0x20a
[ 10.756643] ? rcu_read_lock_sched_held+0x74/0x80
[ 10.761377] ? kmem_cache_alloc_trace+0x284/0x2e0
[ 10.766114] do_init_module+0x5b/0x20a
[ 10.769895] load_module+0x250d/0x2b20
[ 10.773678] ? kernel_read+0x2c/0x40
[ 10.777285] ? __se_sys_finit_module+0xaa/0xc0
[ 10.781759] __se_sys_finit_module+0xaa/0xc0
[ 10.786061] do_syscall_64+0x54/0x190
[ 10.789752] entry_SYSCALL_64_after_hwframe+0x49/0xbe
[ 10.794831] RIP: 0033:0x7ff6d74664d9
[ 10.798430] RSP: 002b:00007ffd91e7dd78 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ 10.806033] RAX: ffffffffffffffda RBX: 0000560519bfae20 RCX: 00007ff6d74664d9
[ 10.813195] RDX: 0000000000000000 RSI: 00007ff6d795ce23 RDI: 000000000000000e
[ 10.820360] RBP: 00007ff6d795ce23 R08: 0000000000000000 R09: 0000000000000000
[ 10.827523] R10: 000000000000000e R11: 0000000000000246 R12: 0000000000000000
[ 10.834690] R13: 0000560519bf9a30 R14: 0000000000020000 R15: 000000000aba9500
[ 10.841862] Code: c2 10 5f ea 81 48 c7 c6 f0 5e ea 81 bf 7c 00 00 00 e8 0d 7c 00 00 31 ed e9 88 01 00 00 48 8b 03 31 ed 48 85 c0
+0f 84 e9 00 00 00 <4c> 8b 60 28 4d 85 e4 0f 84 dc 00 00 00 0f b7 78 0a e8 62 fe ff
[ 10.860832] RIP: acpi_ps_complete_this_op+0xa7/0x22a RSP: ffffc900003a7578
[ 10.867907] ---[ end trace 3a0d2ee1129bc71e ]---
Cc: Chris Wilson <chris at chris-wilson.co.uk>
Signed-off-by: Imre Deak <imre.deak at intel.com>
---
drivers/usb/core/usb-acpi.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/drivers/usb/core/usb-acpi.c b/drivers/usb/core/usb-acpi.c
index e221861b3187..8424b3a27e7e 100644
--- a/drivers/usb/core/usb-acpi.c
+++ b/drivers/usb/core/usb-acpi.c
@@ -12,6 +12,7 @@
#include <linux/acpi.h>
#include <linux/pci.h>
#include <linux/usb/hcd.h>
+#include <linux/dmi.h>
#include "hub.h"
@@ -81,6 +82,20 @@ int usb_acpi_set_power_state(struct usb_device *hdev, int index, bool enable)
}
EXPORT_SYMBOL_GPL(usb_acpi_set_power_state);
+static const struct dmi_system_id intel_icl_broken_acpi[] = {
+ {
+ .ident = "ICL RVP",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "Ice Lake Client Platform"),
+ },
+ },
+
+ { }
+};
+
+static bool acpi_connection_type_broken;
+
static enum usb_port_connect_type usb_acpi_get_connect_type(acpi_handle handle,
struct acpi_pld_info *pld)
{
@@ -89,6 +104,10 @@ static enum usb_port_connect_type usb_acpi_get_connect_type(acpi_handle handle,
union acpi_object *upc;
acpi_status status;
+ /* Work around unknown ACPI instruction error on ICL RVP BIOSes. */
+ if (acpi_connection_type_broken)
+ return USB_PORT_CONNECT_TYPE_UNKNOWN;
+
/*
* According to 9.14 in ACPI Spec 6.2. _PLD indicates whether usb port
* is user visible and _UPC indicates whether it is connectable. If
@@ -235,6 +254,11 @@ static struct acpi_bus_type usb_acpi_bus = {
int usb_acpi_register(void)
{
+ if (dmi_check_system(intel_icl_broken_acpi)) {
+ pr_info("USB ACPI connection type broken.\n");
+ acpi_connection_type_broken = true;
+ }
+
return register_acpi_bus_type(&usb_acpi_bus);
}
--
2.13.2
More information about the Intel-gfx
mailing list