To correctly track states and color management changes.
Signed-off-by: Melissa Wen <[email protected]>
---
drivers/gpu/drm/drm_atomic_uapi.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c
b/drivers/gpu/drm/drm_atomic_uapi.c
index 0ee44976031e..5cb860cb7da4 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -1374,7 +1374,6 @@ int drm_atomic_set_property(struct drm_atomic_commit
*state,
break;
}
case DRM_MODE_OBJECT_COLOROP: {
- struct drm_plane_state *plane_state;
struct drm_colorop *colorop = obj_to_colorop(obj);
struct drm_colorop_state *colorop_state;
bool replaced = false;
@@ -1391,12 +1390,26 @@ int drm_atomic_set_property(struct drm_atomic_commit
*state,
if (ret || !replaced)
break;
- plane_state = drm_atomic_get_plane_state(state, colorop->plane);
- if (IS_ERR(plane_state)) {
- ret = PTR_ERR(plane_state);
- break;
+ if (colorop->plane) {
+ struct drm_plane_state *plane_state;
+
+ plane_state = drm_atomic_get_plane_state(state,
colorop->plane);
+ if (IS_ERR(plane_state)) {
+ ret = PTR_ERR(plane_state);
+ break;
+ }
+ plane_state->color_mgmt_changed |= replaced;
+ } else if (colorop->crtc) {
+ struct drm_crtc_state *crtc_state;
+
+ crtc_state = drm_atomic_get_crtc_state(state,
colorop->crtc);
+ if (IS_ERR(crtc_state)) {
+ ret = PTR_ERR(crtc_state);
+ break;
+ }
+ crtc_state->color_mgmt_changed |= replaced;
+
}
- plane_state->color_mgmt_changed |= replaced;
break;
}
--
2.53.0