Message ID | 1432647408-32166-1-git-send-email-daniels@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, May 26, 2015 at 02:36:48PM +0100, Daniel Stone wrote: > Add a new helper, to be used later for blob property management, that > sets the mode for a CRTC state, as well as updating the CRTC enable/active > state at the same time. > > v2: Do not touch active/mode_changed in CRTC state. Document return > value. Remove stray drm_atomic_set_mode_prop_for_crtc declaration. > > v3: Remove i915 changes, and leave it directly bashing crtc_state->mode > for the meantime. > > Signed-off-by: Daniel Stone <daniels@collabora.com> > Tested-by: Sean Paul <seanpaul@chromium.org> Pulled in all the patches from this series, thanks. -Daniel > --- > drivers/gpu/drm/drm_atomic.c | 36 ++++++++++++++++++++++++++++++++++++ > drivers/gpu/drm/drm_atomic_helper.c | 11 ++++++++--- > drivers/gpu/drm/drm_crtc_helper.c | 5 +++-- > include/drm/drm_atomic.h | 3 +++ > 4 files changed, 50 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index 3134f50..e749287 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -290,6 +290,42 @@ drm_atomic_get_crtc_state(struct drm_atomic_state *state, > EXPORT_SYMBOL(drm_atomic_get_crtc_state); > > /** > + * drm_atomic_set_mode_for_crtc - set mode for CRTC > + * @state: the CRTC whose incoming state to update > + * @mode: kernel-internal mode to use for the CRTC, or NULL to disable > + * > + * Set a mode (originating from the kernel) on the desired CRTC state. Does > + * not change any other state properties, including enable, active, or > + * mode_changed. > + * > + * RETURNS: > + * Zero on success, error code on failure. Cannot return -EDEADLK. > + */ > +int drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state, > + struct drm_display_mode *mode) > +{ > + /* Early return for no change. */ > + if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0) > + return 0; > + > + if (mode) { > + drm_mode_copy(&state->mode, mode); > + state->enable = true; > + DRM_DEBUG_ATOMIC("Set [MODE:%s] for CRTC state %p\n", > + mode->name, state); > + } else { > + memset(&state->mode, 0, sizeof(state->mode)); > + state->enable = false; > + DRM_DEBUG_ATOMIC("Set [NOMODE] for CRTC state %p\n", > + state); > + } > + > + return 0; > +} > +EXPORT_SYMBOL(drm_atomic_set_mode_for_crtc); > + > + > +/** > * drm_atomic_crtc_set_property - set property on CRTC > * @crtc: the drm CRTC to set a property on > * @state: the state object to update with the new property value > diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c > index a64bacd..e69d484 100644 > --- a/drivers/gpu/drm/drm_atomic_helper.c > +++ b/drivers/gpu/drm/drm_atomic_helper.c > @@ -1607,7 +1607,10 @@ retry: > WARN_ON(set->fb); > WARN_ON(set->num_connectors); > > - crtc_state->enable = false; > + ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL); > + if (ret != 0) > + goto fail; > + > crtc_state->active = false; > > ret = drm_atomic_set_crtc_for_plane(primary_state, NULL); > @@ -1622,9 +1625,11 @@ retry: > WARN_ON(!set->fb); > WARN_ON(!set->num_connectors); > > - crtc_state->enable = true; > + ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode); > + if (ret != 0) > + goto fail; > + > crtc_state->active = true; > - drm_mode_copy(&crtc_state->mode, set->mode); > > ret = drm_atomic_set_crtc_for_plane(primary_state, crtc); > if (ret != 0) > diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c > index 9297a61..393114d 100644 > --- a/drivers/gpu/drm/drm_crtc_helper.c > +++ b/drivers/gpu/drm/drm_crtc_helper.c > @@ -937,10 +937,11 @@ int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mod > crtc_state->crtc = crtc; > } > > - crtc_state->enable = true; > crtc_state->planes_changed = true; > crtc_state->mode_changed = true; > - drm_mode_copy(&crtc_state->mode, mode); > + ret = drm_atomic_set_mode_for_crtc(crtc_state, mode); > + if (ret) > + goto out; > drm_mode_copy(&crtc_state->adjusted_mode, adjusted_mode); > > if (crtc_funcs->atomic_check) { > diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h > index e89db0c..1e8c61f 100644 > --- a/include/drm/drm_atomic.h > +++ b/include/drm/drm_atomic.h > @@ -110,6 +110,9 @@ drm_atomic_get_existing_connector_state(struct drm_atomic_state *state, > } > > int __must_check > +drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state, > + struct drm_display_mode *mode); > +int __must_check > drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state, > struct drm_crtc *crtc); > void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state, > -- > 2.4.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 3134f50..e749287 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -290,6 +290,42 @@ drm_atomic_get_crtc_state(struct drm_atomic_state *state, EXPORT_SYMBOL(drm_atomic_get_crtc_state); /** + * drm_atomic_set_mode_for_crtc - set mode for CRTC + * @state: the CRTC whose incoming state to update + * @mode: kernel-internal mode to use for the CRTC, or NULL to disable + * + * Set a mode (originating from the kernel) on the desired CRTC state. Does + * not change any other state properties, including enable, active, or + * mode_changed. + * + * RETURNS: + * Zero on success, error code on failure. Cannot return -EDEADLK. + */ +int drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state, + struct drm_display_mode *mode) +{ + /* Early return for no change. */ + if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0) + return 0; + + if (mode) { + drm_mode_copy(&state->mode, mode); + state->enable = true; + DRM_DEBUG_ATOMIC("Set [MODE:%s] for CRTC state %p\n", + mode->name, state); + } else { + memset(&state->mode, 0, sizeof(state->mode)); + state->enable = false; + DRM_DEBUG_ATOMIC("Set [NOMODE] for CRTC state %p\n", + state); + } + + return 0; +} +EXPORT_SYMBOL(drm_atomic_set_mode_for_crtc); + + +/** * drm_atomic_crtc_set_property - set property on CRTC * @crtc: the drm CRTC to set a property on * @state: the state object to update with the new property value diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index a64bacd..e69d484 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -1607,7 +1607,10 @@ retry: WARN_ON(set->fb); WARN_ON(set->num_connectors); - crtc_state->enable = false; + ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL); + if (ret != 0) + goto fail; + crtc_state->active = false; ret = drm_atomic_set_crtc_for_plane(primary_state, NULL); @@ -1622,9 +1625,11 @@ retry: WARN_ON(!set->fb); WARN_ON(!set->num_connectors); - crtc_state->enable = true; + ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode); + if (ret != 0) + goto fail; + crtc_state->active = true; - drm_mode_copy(&crtc_state->mode, set->mode); ret = drm_atomic_set_crtc_for_plane(primary_state, crtc); if (ret != 0) diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index 9297a61..393114d 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c @@ -937,10 +937,11 @@ int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mod crtc_state->crtc = crtc; } - crtc_state->enable = true; crtc_state->planes_changed = true; crtc_state->mode_changed = true; - drm_mode_copy(&crtc_state->mode, mode); + ret = drm_atomic_set_mode_for_crtc(crtc_state, mode); + if (ret) + goto out; drm_mode_copy(&crtc_state->adjusted_mode, adjusted_mode); if (crtc_funcs->atomic_check) { diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h index e89db0c..1e8c61f 100644 --- a/include/drm/drm_atomic.h +++ b/include/drm/drm_atomic.h @@ -110,6 +110,9 @@ drm_atomic_get_existing_connector_state(struct drm_atomic_state *state, } int __must_check +drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state, + struct drm_display_mode *mode); +int __must_check drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state, struct drm_crtc *crtc); void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state,