CHROMIUM: drm/evdi: Do not reuse crtc.mode_changed to signal painter client needs full modeset
Although both variables are similar their purpose is different.
This fixes few issues where crtc.mode_changed was modified in
evdi_atomic_check when crtc_state->allow_modeset was false
BUG=None
TEST=Build and test on various affected systems
Change-Id: I55801d0a6136685946c23ec79ec68eca6da9039c
Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk@synaptics.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/3450237
Reviewed-by: Dominik Behr <dbehr@chromium.org>
diff --git a/drivers/gpu/drm/evdi/evdi_modeset.c b/drivers/gpu/drm/evdi/evdi_modeset.c
index fea77e3..8f60767 100644
--- a/drivers/gpu/drm/evdi/evdi_modeset.c
+++ b/drivers/gpu/drm/evdi/evdi_modeset.c
@@ -52,6 +52,8 @@
struct drm_crtc_state *state = crtc->state;
struct evdi_device *evdi = crtc->dev->dev_private;
unsigned long flags;
+ bool notify_mode_changed;
+ bool notify_dpms;
if (state->event) {
spin_lock_irqsave(&crtc->dev->event_lock, flags);
@@ -59,10 +61,15 @@
state->event = NULL;
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
}
- if (state->mode_changed && state->active)
+ notify_mode_changed = state->active &&
+ (state->mode_changed || evdi_painter_needs_full_modeset(evdi));
+ notify_dpms = state->active_changed ||
+ evdi_painter_needs_full_modeset(evdi);
+
+ if (notify_mode_changed)
evdi_painter_mode_changed_notify(evdi, &state->adjusted_mode);
- if (state->active_changed)
+ if (notify_dpms)
evdi_painter_dpms_notify(evdi,
state->active ? DRM_MODE_DPMS_ON : DRM_MODE_DPMS_OFF);
@@ -345,30 +352,11 @@
return 0;
}
-int evdi_atomic_check(struct drm_device *dev,
- struct drm_atomic_state *state) {
- struct drm_crtc *crtc;
- struct drm_crtc_state *crtc_state;
- int i;
- struct evdi_device *evdi = dev->dev_private;
-
-
- if (evdi_painter_needs_full_modeset(evdi)) {
- for_each_crtc_in_state(state, crtc, crtc_state, i) {
- crtc_state->active_changed = true;
- crtc_state->mode_changed = true;
- }
- }
-
- return drm_atomic_helper_check(dev, state);
-}
-
-
static const struct drm_mode_config_funcs evdi_mode_funcs = {
.fb_create = evdi_fb_user_fb_create,
.output_poll_changed = NULL,
.atomic_commit = drm_atomic_helper_commit,
- .atomic_check = evdi_atomic_check
+ .atomic_check = drm_atomic_helper_check
};
void evdi_modeset_init(struct drm_device *dev)