acpi suspend debugging techniques?

Adrian Chadd adrian.chadd at gmail.com
Thu Sep 3 20:06:54 UTC 2015


oioo, would you please put that radeon patch into a review?

I have an older machine with a radeon card in it that doesn't yet
suspend/resume; I can now test it out!


-a


On 3 September 2015 at 10:50, Andriy Gapon <avg at freebsd.org> wrote:
> 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-x11 mailing list