diff options
author | Nicolas Chauvet <kwizart@gmail.com> | 2014-07-01 00:04:33 +0200 |
---|---|---|
committer | Nicolas Chauvet <kwizart@gmail.com> | 2014-07-07 16:21:57 +0200 |
commit | 892dd7f98230d1ed9886162f1593d314a48c91c1 (patch) | |
tree | ba9106b09f12338668f4f483d85739e6e185e880 /linux-arm-tagr-01_04-drm_fb-helper.patch | |
parent | 417cd071bef94967fbab21c95222b0f828a7189a (diff) | |
download | kernel-892dd7f98230d1ed9886162f1593d314a48c91c1.tar.gz kernel-892dd7f98230d1ed9886162f1593d314a48c91c1.tar.xz kernel-892dd7f98230d1ed9886162f1593d314a48c91c1.zip |
Add tagr drm patchez
Diffstat (limited to 'linux-arm-tagr-01_04-drm_fb-helper.patch')
-rw-r--r-- | linux-arm-tagr-01_04-drm_fb-helper.patch | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/linux-arm-tagr-01_04-drm_fb-helper.patch b/linux-arm-tagr-01_04-drm_fb-helper.patch new file mode 100644 index 00000000..4f882e9d --- /dev/null +++ b/linux-arm-tagr-01_04-drm_fb-helper.patch @@ -0,0 +1,143 @@ +From: Daniel Vetter <daniel.vetter@ffwll.ch> + +Some drivers need to be able to have a perfect race-free fbcon setup. +Current drivers only enable hotplug processing after the call to +drm_fb_helper_initial_config which leaves a tiny but important race. + +This race is especially noticable on embedded platforms where the +driver itself enables the voltage for the hdmi output, since only then +will monitors (after a bit of delay, as usual) respond by asserting +the hpd pin. + +Most of the infrastructure is already there with the split-out +drm_fb_helper_init. And drm_fb_helper_initial_config already has all +the required locking to handle concurrent hpd events since + +commit 53f1904bced78d7c00f5d874c662ec3ac85d0f9f +Author: Daniel Vetter <daniel.vetter@ffwll.ch> +Date: Thu Mar 20 14:26:35 2014 +0100 + + drm/fb-helper: improve drm_fb_helper_initial_config locking + +The only missing bit is making drm_fb_helper_hotplug_event save +against concurrent calls of drm_fb_helper_initial_config. The only +unprotected bit is the check for fb_helper->fb. + +With that drivers can first initialize the fb helper, then enabel +hotplug processing and then set up the initial config all in a +completely race-free manner. Update kerneldoc and convert i915 as a +proof of concept. + +Feature requested by Thierry since his tegra driver atm reliably boots +slowly enough to misses the hotplug event for an external hdmi screen, +but also reliably boots to quickly for the hpd pin to be asserted when +the fb helper calls into the hdmi ->detect function. + +Cc: Thierry Reding <treding@nvidia.com> +Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> +Signed-off-by: Thierry Reding <treding@nvidia.com> +--- +Changes in v3: +- remove an additional occurrence of i915's enable_hotplug_processing + that was introduced after the original patch + + drivers/gpu/drm/drm_fb_helper.c | 11 +++++------ + drivers/gpu/drm/i915/i915_dma.c | 3 --- + drivers/gpu/drm/i915/i915_drv.c | 2 -- + drivers/gpu/drm/i915/i915_drv.h | 1 - + drivers/gpu/drm/i915/i915_irq.c | 4 ---- + 5 files changed, 5 insertions(+), 16 deletions(-) + +diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c +index d5d8cea1a679..13a098c9af31 100644 +--- a/drivers/gpu/drm/drm_fb_helper.c ++++ b/drivers/gpu/drm/drm_fb_helper.c +@@ -1613,8 +1613,10 @@ EXPORT_SYMBOL(drm_fb_helper_initial_config); + * either the output polling work or a work item launched from the driver's + * hotplug interrupt). + * +- * Note that the driver must ensure that this is only called _after_ the fb has +- * been fully set up, i.e. after the call to drm_fb_helper_initial_config. ++ * Note that drivers may call this even before calling ++ * drm_fb_helper_initial_config but only aftert drm_fb_helper_init. This allows ++ * for a race-free fbcon setup and will make sure that the fbdev emulation will ++ * not miss any hotplug events. + * + * RETURNS: + * 0 on success and a non-zero error code otherwise. +@@ -1624,11 +1626,8 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) + struct drm_device *dev = fb_helper->dev; + u32 max_width, max_height; + +- if (!fb_helper->fb) +- return 0; +- + mutex_lock(&fb_helper->dev->mode_config.mutex); +- if (!drm_fb_helper_is_bound(fb_helper)) { ++ if (!fb_helper->fb || !drm_fb_helper_is_bound(fb_helper)) { + fb_helper->delayed_hotplug = true; + mutex_unlock(&fb_helper->dev->mode_config.mutex); + return 0; +diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c +index 5e583a1838f8..84b55665bd87 100644 +--- a/drivers/gpu/drm/i915/i915_dma.c ++++ b/drivers/gpu/drm/i915/i915_dma.c +@@ -1377,9 +1377,6 @@ static int i915_load_modeset_init(struct drm_device *dev) + */ + intel_fbdev_initial_config(dev); + +- /* Only enable hotplug handling once the fbdev is fully set up. */ +- dev_priv->enable_hotplug_processing = true; +- + drm_kms_helper_poll_init(dev); + + return 0; +diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c +index 6eb45ac7a7d5..b0955fffca98 100644 +--- a/drivers/gpu/drm/i915/i915_drv.c ++++ b/drivers/gpu/drm/i915/i915_drv.c +@@ -521,7 +521,6 @@ static int i915_drm_freeze(struct drm_device *dev) + } + + intel_runtime_pm_disable_interrupts(dev); +- dev_priv->enable_hotplug_processing = false; + + intel_suspend_gt_powersave(dev); + +@@ -659,7 +658,6 @@ static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings) + * notifications. + * */ + intel_hpd_init(dev); +- dev_priv->enable_hotplug_processing = true; + /* Config may have changed between suspend and resume */ + drm_helper_hpd_irq_event(dev); + } +diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h +index 8cea59649ef2..df6a98cd702f 100644 +--- a/drivers/gpu/drm/i915/i915_drv.h ++++ b/drivers/gpu/drm/i915/i915_drv.h +@@ -1404,7 +1404,6 @@ struct drm_i915_private { + u32 pipestat_irq_mask[I915_MAX_PIPES]; + + struct work_struct hotplug_work; +- bool enable_hotplug_processing; + struct { + unsigned long hpd_last_jiffies; + int hpd_cnt; +diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c +index 1c1ec22bc7ef..c0d7674c45cd 100644 +--- a/drivers/gpu/drm/i915/i915_irq.c ++++ b/drivers/gpu/drm/i915/i915_irq.c +@@ -1109,10 +1109,6 @@ static void i915_hotplug_work_func(struct work_struct *work) + bool changed = false; + u32 hpd_event_bits; + +- /* HPD irq before everything is fully set up. */ +- if (!dev_priv->enable_hotplug_processing) +- return; +- + mutex_lock(&mode_config->mutex); + DRM_DEBUG_KMS("running encoder hotplug functions\n"); + +-- +2.0.0 |