acpi suspend debugging techniques?
Andriy Gapon
avg at FreeBSD.org
Thu Sep 3 17:51:25 UTC 2015
On 31/08/2015 11:53, Adrian Chadd wrote:
> Try disabling hardware one at a time. Ie, unload usb; unload wifi;
> leave kms loaded for mostly obvious reasons.
Adrian, Garrett,
thank you very much for your tips.
Turned out that it was radeonkms that was causing the problem :-)
BTW, here is another tool for the toolkit: on sufficiently recent system devctl
suspend and devctl resume can be used to test individual drivers.
So, I noticed that I could suspend/resume drmn0 device just fine but with
vgapci0 I had a trouble suspending. One thing led to another and here is a
patch that seems to fix the problem for me:
-------------------------------------------------------------------------------
commit fecb5e8a90631f06600d87165cc8b6de3e035dfc
Author: Andriy Gapon <avg at icyb.net.ua>
Date: Thu Sep 3 17:24:23 2015 +0300
radeon_suspend_kms: don't mess with pci state that's managed by the bus
The pci bus driver handles the power state and configuration state saving
and restoring for its child devices.
diff --git a/sys/dev/drm2/radeon/radeon_device.c
b/sys/dev/drm2/radeon/radeon_device.c
index e5c676b11ed47..73b2f4c51ada2 100644
--- a/sys/dev/drm2/radeon/radeon_device.c
+++ b/sys/dev/drm2/radeon/radeon_device.c
@@ -1342,14 +1342,10 @@ int radeon_suspend_kms(struct drm_device *dev)
radeon_agp_suspend(rdev);
- pci_save_state(device_get_parent(dev->dev));
#ifdef FREEBSD_WIP
if (state.event == PM_EVENT_SUSPEND) {
/* Shut down the device */
pci_disable_device(dev->pdev);
-#endif /* FREEBSD_WIP */
- pci_set_powerstate(dev->dev, PCI_POWERSTATE_D3);
-#ifdef FREEBSD_WIP
}
console_lock();
#endif /* FREEBSD_WIP */
@@ -1380,10 +1376,6 @@ int radeon_resume_kms(struct drm_device *dev)
#ifdef FREEBSD_WIP
console_lock();
-#endif /* FREEBSD_WIP */
- pci_set_powerstate(device_get_parent(dev->dev), PCI_POWERSTATE_D0);
- pci_restore_state(device_get_parent(dev->dev));
-#ifdef FREEBSD_WIP
if (pci_enable_device(dev->pdev)) {
console_unlock();
return -1;
-------------------------------------------------------------------------------
However, I am not sure about an exact mechanism of the hard system hang that I
experienced without the patch.
BTW, I noticed that only very few drivers make explicit calls to
pci_set_powerstate and pci_save_state/pci_restore_state.
sys/dev/usb/controller/ohci_pci.c looks like a good use of pci_set_powerstate.
sys/dev/ixgbe/if_ix.c looks like an incorrect / redundant use of the functions.
--
Andriy Gapon
More information about the freebsd-current
mailing list