Commit c2b2f02a authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2020-08-26' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

Fixes for v5.9-rc2:
- Take modeset bkl for legacy drivers.
- Allow null crtc in dp_mst.
- Omap locking state fix.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/7af1e52a-27de-8edc-d0b2-e23b01e8bc96@linux.intel.com
parents e0358037 7fd5b254
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <drm/drm_bridge.h> #include <drm/drm_bridge.h>
#include <drm/drm_damage_helper.h> #include <drm/drm_damage_helper.h>
#include <drm/drm_device.h> #include <drm/drm_device.h>
#include <drm/drm_drv.h>
#include <drm/drm_plane_helper.h> #include <drm/drm_plane_helper.h>
#include <drm/drm_print.h> #include <drm/drm_print.h>
#include <drm/drm_self_refresh_helper.h> #include <drm/drm_self_refresh_helper.h>
...@@ -3106,7 +3107,7 @@ void drm_atomic_helper_shutdown(struct drm_device *dev) ...@@ -3106,7 +3107,7 @@ void drm_atomic_helper_shutdown(struct drm_device *dev)
if (ret) if (ret)
DRM_ERROR("Disabling all crtc's during unload failed with %i\n", ret); DRM_ERROR("Disabling all crtc's during unload failed with %i\n", ret);
DRM_MODESET_LOCK_ALL_END(ctx, ret); DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
} }
EXPORT_SYMBOL(drm_atomic_helper_shutdown); EXPORT_SYMBOL(drm_atomic_helper_shutdown);
...@@ -3246,7 +3247,7 @@ struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev) ...@@ -3246,7 +3247,7 @@ struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev)
} }
unlock: unlock:
DRM_MODESET_LOCK_ALL_END(ctx, err); DRM_MODESET_LOCK_ALL_END(dev, ctx, err);
if (err) if (err)
return ERR_PTR(err); return ERR_PTR(err);
...@@ -3327,7 +3328,7 @@ int drm_atomic_helper_resume(struct drm_device *dev, ...@@ -3327,7 +3328,7 @@ int drm_atomic_helper_resume(struct drm_device *dev,
err = drm_atomic_helper_commit_duplicated_state(state, &ctx); err = drm_atomic_helper_commit_duplicated_state(state, &ctx);
DRM_MODESET_LOCK_ALL_END(ctx, err); DRM_MODESET_LOCK_ALL_END(dev, ctx, err);
drm_atomic_state_put(state); drm_atomic_state_put(state);
return err; return err;
......
...@@ -294,7 +294,7 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev, ...@@ -294,7 +294,7 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev,
crtc->gamma_size, &ctx); crtc->gamma_size, &ctx);
out: out:
DRM_MODESET_LOCK_ALL_END(ctx, ret); DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
return ret; return ret;
} }
......
...@@ -588,7 +588,6 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -588,7 +588,6 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
if (crtc_req->mode_valid && !drm_lease_held(file_priv, plane->base.id)) if (crtc_req->mode_valid && !drm_lease_held(file_priv, plane->base.id))
return -EACCES; return -EACCES;
mutex_lock(&crtc->dev->mode_config.mutex);
DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx,
DRM_MODESET_ACQUIRE_INTERRUPTIBLE, ret); DRM_MODESET_ACQUIRE_INTERRUPTIBLE, ret);
...@@ -756,8 +755,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -756,8 +755,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
fb = NULL; fb = NULL;
mode = NULL; mode = NULL;
DRM_MODESET_LOCK_ALL_END(ctx, ret); DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
mutex_unlock(&crtc->dev->mode_config.mutex);
return ret; return ret;
} }
......
...@@ -5040,8 +5040,8 @@ int drm_dp_mst_add_affected_dsc_crtcs(struct drm_atomic_state *state, struct drm ...@@ -5040,8 +5040,8 @@ int drm_dp_mst_add_affected_dsc_crtcs(struct drm_atomic_state *state, struct drm
crtc = conn_state->crtc; crtc = conn_state->crtc;
if (WARN_ON(!crtc)) if (!crtc)
return -EINVAL; continue;
if (!drm_dp_mst_dsc_aux_for_port(pos->port)) if (!drm_dp_mst_dsc_aux_for_port(pos->port))
continue; continue;
......
...@@ -428,7 +428,7 @@ int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data, ...@@ -428,7 +428,7 @@ int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
out_unref: out_unref:
drm_mode_object_put(obj); drm_mode_object_put(obj);
out: out:
DRM_MODESET_LOCK_ALL_END(ctx, ret); DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
return ret; return ret;
} }
...@@ -470,7 +470,7 @@ static int set_property_legacy(struct drm_mode_object *obj, ...@@ -470,7 +470,7 @@ static int set_property_legacy(struct drm_mode_object *obj,
break; break;
} }
drm_property_change_valid_put(prop, ref); drm_property_change_valid_put(prop, ref);
DRM_MODESET_LOCK_ALL_END(ctx, ret); DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
return ret; return ret;
} }
......
...@@ -792,7 +792,7 @@ static int setplane_internal(struct drm_plane *plane, ...@@ -792,7 +792,7 @@ static int setplane_internal(struct drm_plane *plane,
crtc_x, crtc_y, crtc_w, crtc_h, crtc_x, crtc_y, crtc_w, crtc_h,
src_x, src_y, src_w, src_h, &ctx); src_x, src_y, src_w, src_h, &ctx);
DRM_MODESET_LOCK_ALL_END(ctx, ret); DRM_MODESET_LOCK_ALL_END(plane->dev, ctx, ret);
return ret; return ret;
} }
......
...@@ -451,11 +451,12 @@ static void omap_crtc_atomic_enable(struct drm_crtc *crtc, ...@@ -451,11 +451,12 @@ static void omap_crtc_atomic_enable(struct drm_crtc *crtc,
if (omap_state->manually_updated) if (omap_state->manually_updated)
return; return;
spin_lock_irq(&crtc->dev->event_lock);
drm_crtc_vblank_on(crtc); drm_crtc_vblank_on(crtc);
ret = drm_crtc_vblank_get(crtc); ret = drm_crtc_vblank_get(crtc);
WARN_ON(ret != 0); WARN_ON(ret != 0);
spin_lock_irq(&crtc->dev->event_lock);
omap_crtc_arm_event(crtc); omap_crtc_arm_event(crtc);
spin_unlock_irq(&crtc->dev->event_lock); spin_unlock_irq(&crtc->dev->event_lock);
} }
......
...@@ -164,6 +164,8 @@ int drm_modeset_lock_all_ctx(struct drm_device *dev, ...@@ -164,6 +164,8 @@ int drm_modeset_lock_all_ctx(struct drm_device *dev,
* is 0, so no error checking is necessary * is 0, so no error checking is necessary
*/ */
#define DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, flags, ret) \ #define DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, flags, ret) \
if (!drm_drv_uses_atomic_modeset(dev)) \
mutex_lock(&dev->mode_config.mutex); \
drm_modeset_acquire_init(&ctx, flags); \ drm_modeset_acquire_init(&ctx, flags); \
modeset_lock_retry: \ modeset_lock_retry: \
ret = drm_modeset_lock_all_ctx(dev, &ctx); \ ret = drm_modeset_lock_all_ctx(dev, &ctx); \
...@@ -172,6 +174,7 @@ modeset_lock_retry: \ ...@@ -172,6 +174,7 @@ modeset_lock_retry: \
/** /**
* DRM_MODESET_LOCK_ALL_END - Helper to release and cleanup modeset locks * DRM_MODESET_LOCK_ALL_END - Helper to release and cleanup modeset locks
* @dev: drm device
* @ctx: local modeset acquire context, will be dereferenced * @ctx: local modeset acquire context, will be dereferenced
* @ret: local ret/err/etc variable to track error status * @ret: local ret/err/etc variable to track error status
* *
...@@ -188,7 +191,7 @@ modeset_lock_retry: \ ...@@ -188,7 +191,7 @@ modeset_lock_retry: \
* to that failure. In both of these cases the code between BEGIN/END will not * to that failure. In both of these cases the code between BEGIN/END will not
* be run, so the failure will reflect the inability to grab the locks. * be run, so the failure will reflect the inability to grab the locks.
*/ */
#define DRM_MODESET_LOCK_ALL_END(ctx, ret) \ #define DRM_MODESET_LOCK_ALL_END(dev, ctx, ret) \
modeset_lock_fail: \ modeset_lock_fail: \
if (ret == -EDEADLK) { \ if (ret == -EDEADLK) { \
ret = drm_modeset_backoff(&ctx); \ ret = drm_modeset_backoff(&ctx); \
...@@ -196,6 +199,8 @@ modeset_lock_fail: \ ...@@ -196,6 +199,8 @@ modeset_lock_fail: \
goto modeset_lock_retry; \ goto modeset_lock_retry; \
} \ } \
drm_modeset_drop_locks(&ctx); \ drm_modeset_drop_locks(&ctx); \
drm_modeset_acquire_fini(&ctx); drm_modeset_acquire_fini(&ctx); \
if (!drm_drv_uses_atomic_modeset(dev)) \
mutex_unlock(&dev->mode_config.mutex);
#endif /* DRM_MODESET_LOCK_H_ */ #endif /* DRM_MODESET_LOCK_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment