[Intel-gfx] [PATCH 2/2] drm/gma500: add locking to fixed panel edid probing

Patrik Jakobsson patrik.r.jakobsson at gmail.com
Sun Mar 23 14:51:07 CET 2014


On Fri, Mar 21, 2014 at 11:22 PM, Daniel Vetter <daniel.vetter at ffwll.ch>wrote:

> With the recent addition of locking checks in
>
> commit 62ff94a5492175759546f8bc61383189d6b49122
> Author:     Daniel Vetter <daniel.vetter at ffwll.ch>
> AuthorDate: Thu Jan 23 22:18:47 2014 +0100
>
>     drm/crtc-helper: remove LOCKING from kerneldoc
>
> drm_add_edid_modes started to WARN about the mode_config.mutex not
> being held in the lvds and dp initialization code.
>
> Now since this is init code locking is fairly redudant if it wouldn't
> be for the drm core registering sysfs files a bit early. And the
> locking WARNINGs nicely enforce that indeed all access to the mode
> lists are properly protected. And a full audit shows that only i915
> and gma500 touch the modes lists at init time.
>
> Hence I've opted to wrap up this entire mode detection sequence for
> fixed panels with the mode_config mutex for both lvds and edp outputs.
>
> Cc: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
>  drivers/gpu/drm/gma500/cdv_intel_lvds.c | 3 +++
>  drivers/gpu/drm/gma500/oaktrail_lvds.c  | 5 +++++
>  drivers/gpu/drm/gma500/psb_intel_lvds.c | 3 +++
>  3 files changed, 11 insertions(+)
>
> diff --git a/drivers/gpu/drm/gma500/cdv_intel_lvds.c
> b/drivers/gpu/drm/gma500/cdv_intel_lvds.c
> index 20e08e65d46c..66a41c026834 100644
> --- a/drivers/gpu/drm/gma500/cdv_intel_lvds.c
> +++ b/drivers/gpu/drm/gma500/cdv_intel_lvds.c
> @@ -712,6 +712,7 @@ void cdv_intel_lvds_init(struct drm_device *dev,
>          * Attempt to get the fixed panel mode from DDC.  Assume that the
>          * preferred mode is the right one.
>          */
> +       mutex_lock(&dev->mode_config.mutex);
>         psb_intel_ddc_get_modes(connector,
>                                 &gma_encoder->ddc_bus->adapter);
>         list_for_each_entry(scan, &connector->probed_modes, head) {
> @@ -772,10 +773,12 @@ void cdv_intel_lvds_init(struct drm_device *dev,
>         }
>
>  out:
> +       mutex_unlock(&dev->mode_config.mutex);
>         drm_sysfs_connector_add(connector);
>         return;
>
>  failed_find:
> +       mutex_unlock(&dev->mode_config.mutex);
>         printk(KERN_ERR "Failed find\n");
>         if (gma_encoder->ddc_bus)
>                 psb_intel_i2c_destroy(gma_encoder->ddc_bus);
> diff --git a/drivers/gpu/drm/gma500/oaktrail_lvds.c
> b/drivers/gpu/drm/gma500/oaktrail_lvds.c
> index 5e0697862736..9b099468a5db 100644
> --- a/drivers/gpu/drm/gma500/oaktrail_lvds.c
> +++ b/drivers/gpu/drm/gma500/oaktrail_lvds.c
> @@ -359,6 +359,7 @@ void oaktrail_lvds_init(struct drm_device *dev,
>          *    if closed, act like it's not there for now
>          */
>
> +       mutex_lock(&dev->mode_config.mutex);
>         i2c_adap = i2c_get_adapter(dev_priv->ops->i2c_bus);
>         if (i2c_adap == NULL)
>                 dev_err(dev->dev, "No ddc adapter available!\n");
> @@ -401,10 +402,14 @@ void oaktrail_lvds_init(struct drm_device *dev,
>         }
>
>  out:
> +       mutex_unlock(&dev->mode_config.mutex);
> +
>         drm_sysfs_connector_add(connector);
>         return;
>
>  failed_find:
> +       mutex_unlock(&dev->mode_config.mutex);
> +
>         dev_dbg(dev->dev, "No LVDS modes found, disabling.\n");
>         if (gma_encoder->ddc_bus)
>                 psb_intel_i2c_destroy(gma_encoder->ddc_bus);
> diff --git a/drivers/gpu/drm/gma500/psb_intel_lvds.c
> b/drivers/gpu/drm/gma500/psb_intel_lvds.c
> index 32342f6990d9..891a028a0826 100644
> --- a/drivers/gpu/drm/gma500/psb_intel_lvds.c
> +++ b/drivers/gpu/drm/gma500/psb_intel_lvds.c
> @@ -777,6 +777,7 @@ void psb_intel_lvds_init(struct drm_device *dev,
>          * Attempt to get the fixed panel mode from DDC.  Assume that the
>          * preferred mode is the right one.
>          */
> +       mutex_lock(&dev->mode_config.mutex);
>         psb_intel_ddc_get_modes(connector, &lvds_priv->ddc_bus->adapter);
>         list_for_each_entry(scan, &connector->probed_modes, head) {
>                 if (scan->type & DRM_MODE_TYPE_PREFERRED) {
> @@ -827,10 +828,12 @@ void psb_intel_lvds_init(struct drm_device *dev,
>          * actually having one.
>          */
>  out:
> +       mutex_unlock(&dev->mode_config.mutex);
>         drm_sysfs_connector_add(connector);
>         return;
>
>  failed_find:
> +       mutex_unlock(&dev->mode_config.mutex);
>         if (lvds_priv->ddc_bus)
>                 psb_intel_i2c_destroy(lvds_priv->ddc_bus);
>  failed_ddc:
> --
> 1.8.1.4
>
>
Looks good.

Acked-by: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20140323/55feefe8/attachment.html>


More information about the Intel-gfx mailing list