aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorLiu Ying <gnuiyl@gmail.com>2016-08-26 03:30:44 -0400
committerPhilipp Zabel <p.zabel@pengutronix.de>2016-08-29 06:45:05 -0400
commit1780999ced6df8ce833232852dc6854a388fc248 (patch)
tree8a582a74d4806afeff284b8e1197102319c33a5a /drivers/gpu/drm
parent5f4df0c769a9c3cc731464112ddeb0e61c9386d8 (diff)
drm/imx: Add active plane reconfiguration support
We don't support configuring active plane on-the-fly for imx-drm. The relevant CRTC should be disabled before the plane configuration. Of course, the plane itself should be disabled as well. This patch adds active plane reconfiguration support by forcing CRTC mode change in plane's ->atomic_check callback so that the CRTC will be disabled before the plane configuration. Suggested-by: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Philipp Zabel <p.zabel@pengutronix.de> Cc: David Airlie <airlied@linux.ie> Cc: Russell King <linux@armlinux.org.uk> Cc: Peter Senna Tschudin <peter.senna@gmail.com> Cc: Lucas Stach <l.stach@pengutronix.de> Signed-off-by: Liu Ying <gnuiyl@gmail.com> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/imx/imx-drm-core.c26
-rw-r--r--drivers/gpu/drm/imx/ipuv3-plane.c13
2 files changed, 33 insertions, 6 deletions
diff --git a/drivers/gpu/drm/imx/imx-drm-core.c b/drivers/gpu/drm/imx/imx-drm-core.c
index 99fff6c7bb4a..75f35eaffb78 100644
--- a/drivers/gpu/drm/imx/imx-drm-core.c
+++ b/drivers/gpu/drm/imx/imx-drm-core.c
@@ -146,10 +146,34 @@ static void imx_drm_output_poll_changed(struct drm_device *drm)
146 drm_fbdev_cma_hotplug_event(imxdrm->fbhelper); 146 drm_fbdev_cma_hotplug_event(imxdrm->fbhelper);
147} 147}
148 148
149static int imx_drm_atomic_check(struct drm_device *dev,
150 struct drm_atomic_state *state)
151{
152 int ret;
153
154 ret = drm_atomic_helper_check_modeset(dev, state);
155 if (ret)
156 return ret;
157
158 ret = drm_atomic_helper_check_planes(dev, state);
159 if (ret)
160 return ret;
161
162 /*
163 * Check modeset again in case crtc_state->mode_changed is
164 * updated in plane's ->atomic_check callback.
165 */
166 ret = drm_atomic_helper_check_modeset(dev, state);
167 if (ret)
168 return ret;
169
170 return ret;
171}
172
149static const struct drm_mode_config_funcs imx_drm_mode_config_funcs = { 173static const struct drm_mode_config_funcs imx_drm_mode_config_funcs = {
150 .fb_create = drm_fb_cma_create, 174 .fb_create = drm_fb_cma_create,
151 .output_poll_changed = imx_drm_output_poll_changed, 175 .output_poll_changed = imx_drm_output_poll_changed,
152 .atomic_check = drm_atomic_helper_check, 176 .atomic_check = imx_drm_atomic_check,
153 .atomic_commit = drm_atomic_helper_commit, 177 .atomic_commit = drm_atomic_helper_commit,
154}; 178};
155 179
diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c
index 6a481476734b..3c4f6894443c 100644
--- a/drivers/gpu/drm/imx/ipuv3-plane.c
+++ b/drivers/gpu/drm/imx/ipuv3-plane.c
@@ -319,13 +319,16 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
319 return -EINVAL; 319 return -EINVAL;
320 320
321 /* 321 /*
322 * since we cannot touch active IDMAC channels, we do not support 322 * We support resizing active plane or changing its format by
323 * resizing the enabled plane or changing its format 323 * forcing CRTC mode change in plane's ->atomic_check callback
324 * and disabling all affected active planes in CRTC's ->atomic_disable
325 * callback. The planes will be reenabled in plane's ->atomic_update
326 * callback.
324 */ 327 */
325 if (old_fb && (state->src_w != old_state->src_w || 328 if (old_fb && (state->src_w != old_state->src_w ||
326 state->src_h != old_state->src_h || 329 state->src_h != old_state->src_h ||
327 fb->pixel_format != old_fb->pixel_format)) 330 fb->pixel_format != old_fb->pixel_format))
328 return -EINVAL; 331 crtc_state->mode_changed = true;
329 332
330 eba = drm_plane_state_to_eba(state); 333 eba = drm_plane_state_to_eba(state);
331 334
@@ -336,7 +339,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
336 return -EINVAL; 339 return -EINVAL;
337 340
338 if (old_fb && fb->pitches[0] != old_fb->pitches[0]) 341 if (old_fb && fb->pitches[0] != old_fb->pitches[0])
339 return -EINVAL; 342 crtc_state->mode_changed = true;
340 343
341 switch (fb->pixel_format) { 344 switch (fb->pixel_format) {
342 case DRM_FORMAT_YUV420: 345 case DRM_FORMAT_YUV420:
@@ -372,7 +375,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
372 return -EINVAL; 375 return -EINVAL;
373 376
374 if (old_fb && old_fb->pitches[1] != fb->pitches[1]) 377 if (old_fb && old_fb->pitches[1] != fb->pitches[1])
375 return -EINVAL; 378 crtc_state->mode_changed = true;
376 } 379 }
377 380
378 return 0; 381 return 0;