Patch "drm/nouveau: Fix drm poll_helper handling" has been added to the 4.9-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
drm/nouveau: Fix drm poll_helper handling
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-nouveau-fix-drm-poll_helper-handling.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Jun 15 15:00:52 CEST 2017
From: Peter Ujfalusi <[email protected]>
Date: Mon, 15 May 2017 12:04:31 +0300
Subject: drm/nouveau: Fix drm poll_helper handling
From: Peter Ujfalusi <[email protected]>
[ Upstream commit 9a2eba337cacefc95b97c2726e3efdd435b3460e ]
Commit cae9ff036eea effectively disabled the drm poll_helper by checking the wrong flag to see if the driver should enable the poll or not:
mode_config.poll_enabled is only set to true by poll_init and it is not indicating if the poll is enabled or not. nouveau_display_create() will initialize the poll and going to disable it right away. After poll_init() the mode_config.poll_enabled will be true, but the poll itself is disabled.
To avoid the race caused by calling the poll_enable() from different paths, this patch will enable the poll from one place, in the nouveau_display_hpd_work().
In case the pm_runtime is disabled we will enable the poll in nouveau_drm_load() once.
--- drivers/gpu/drm/nouveau/nouveau_display.c | 6 ++---- drivers/gpu/drm/nouveau/nouveau_drm.c | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-)
drivers/gpu/drm/nouveau/nouveau_display.c +2 -4
@@ -367,6 +367,8 @@ nouveau_display_hpd_work(struct work_strpm_runtime_get_sync (drm->dev->dev);drm_helper_hpd_irq_event (drm->dev); +/* enable polling for external displays */ +drm_kms_helper_poll_enable (drm->dev);pm_runtime_mark_last_busy (drm->dev->dev);pm_runtime_put_sync (drm->dev->dev);
@@ -420,10 +422,6 @@ nouveau_display_init(struct drm_device *if (ret)return ret; -/* enable polling for external displays */ -if (!dev->mode_config.poll_enabled) -drm_kms_helper_poll_enable (dev); -/* enable hotplug interrupts */ list_for_each_entry (connector, &dev->mode_config.connector_list, head) {struct nouveau_connector *conn =nouveau_connector (connector);
drivers/gpu/drm/nouveau/nouveau_drm.c +3 -3
@@ -483,6 +483,9 @@ nouveau_drm_load(struct drm_device *dev,pm_runtime_allow (dev->dev);pm_runtime_mark_last_busy (dev->dev);pm_runtime_put (dev->dev); + }else { +/* enable polling for external displays */ +drm_kms_helper_poll_enable (dev); }return 0 ;
@@ -762,9 +765,6 @@ nouveau_pmops_runtime_resume(struct devi ret =nouveau_do_resume (drm_dev, true); -if (!drm_dev->mode_config.poll_enabled) -drm_kms_helper_poll_enable (drm_dev); -/* do magic */ nvif_mask (&device->object,0x088488 , (1 <<25 ), (1 <<25 ));vga_switcheroo_set_dynamic_switch (pdev,VGA_SWITCHEROO_ON );
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/drm-nouveau-fix-drm-poll_helper-handling.patch