[RFC PATCH] drm/radeon: increase d3 delay to 20 ms during switcheroo poweron
Alex Deucher
alexdeucher at gmail.com
Fri Jan 4 07:34:23 PST 2013
On Wed, Jan 2, 2013 at 10:38 AM, Maarten Lankhorst
<maarten.lankhorst at canonical.com> wrote:
> vga-switcheroo with apple-gmux does not switch correctly on my system. The PCI
> configuration space is not restored correctly, resulting in MSI not working after switch.
>
> Only useful item in dmesg is:
>
> [ 33.922807] radeon 0000:01:00.0: Refused to change power state, currently in D3
>
> I did some testing, dumping the difference in ms between first succesful switch
> from D3 to D0, and it seems that there is slightly more than 20 ms difference when
> the device is re-enabled through vga-switcheroo.
>
> So bump the re-enable d3 delay to 20 ms to handle this, which fixes msi not working
> on my system after switcheroo-ing.
I guess if it fixes it... Has anyone seen similar problems on non-mac
systems? What is the delay normally set to? It seems pretty
innocuous other than potentially adding a little extra latency. Do
you think it makes sense to make it more like a quirk and only apply
it to problematic systems or just apply across the board?
Alex
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at canonical.com>
>
> ---
>
> This is a RFC patch since I feel what I'm doing is done in a hackish way,
> but it seems only the D3->D0 transition during switcheroo enable is affected,
> other transitions like suspend/resume and switcheroo poweroff seem unaffected.
>
> diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
> index 5515921..8816958 100644
> --- a/drivers/gpu/drm/radeon/radeon_device.c
> +++ b/drivers/gpu/drm/radeon/radeon_device.c
> @@ -910,10 +910,19 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero
> struct drm_device *dev = pci_get_drvdata(pdev);
> pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
> if (state == VGA_SWITCHEROO_ON) {
> + unsigned d3_delay = dev->pdev->d3_delay;
> +
> printk(KERN_INFO "radeon: switched on\n");
> /* don't suspend or resume card normally */
> dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
> +
> + if (dev->pdev->d3_delay < 20)
> + dev->pdev->d3_delay = 20;
> +
> radeon_resume_kms(dev);
> +
> + dev->pdev->d3_delay = d3_delay;
> +
> dev->switch_power_state = DRM_SWITCH_POWER_ON;
> drm_kms_helper_poll_enable(dev);
> } else {
>
More information about the dri-devel
mailing list