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