diff options
author | Dave Airlie <airlied@redhat.com> | 2016-11-02 20:17:50 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-11-02 20:17:50 -0400 |
commit | e676717a12ca8a7a7f9bf4a5ccde16eed308bcfd (patch) | |
tree | 786a8730b38a2302747880330242d13d52b56692 | |
parent | eed6f0eda0a009c282bcdd828c273e1239ae0cac (diff) | |
parent | 86126748cd5063aa888ce252f16b89b35e7d4707 (diff) |
Merge tag 'imx-drm-fixes-20161021' of git://git.pengutronix.de/pza/linux into drm-fixes
imx-drm plane, build warning, and error handling fixes
- some fixes for active plane reconfiguration support
- hide unused label in case of disabled CONFIG_DRM_FBDEV_EMULATION,
which caused a build warning
- fixed error handling in imx_drm_bind
- disallow odd x/y plane offsets for chroma subsampled formats
- disable local alpha when switching from a format with alpha
channel to an opaque format
* tag 'imx-drm-fixes-20161021' of git://git.pengutronix.de/pza/linux:
drm/imx: ipuv3-plane: disable local alpha for planes without alpha channel
drm/imx: ipuv3-plane: make sure x/y offsets are even in case of chroma subsampling
drm/imx: ipuv3-plane: Access old u/vbo properly in ->atomic_check for YU12/YV12
drm/imx: drm_dev_alloc() returns error pointers
drm/imx: ipuv3-plane: Skip setting u/vbo only when we don't need modeset
drm/imx: ipuv3-plane: Switch EBA buffer only when we don't need modeset
gpu: ipu-v3: Use ERR_CAST instead of ERR_PTR(PTR_ERR())
drm/imx: hide an unused label
-rw-r--r-- | drivers/gpu/drm/imx/imx-drm-core.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/ipuv3-plane.c | 28 | ||||
-rw-r--r-- | drivers/gpu/ipu-v3/ipu-image-convert.c | 2 |
3 files changed, 26 insertions, 10 deletions
diff --git a/drivers/gpu/drm/imx/imx-drm-core.c b/drivers/gpu/drm/imx/imx-drm-core.c index 98df09c2b388..9672b579f950 100644 --- a/drivers/gpu/drm/imx/imx-drm-core.c +++ b/drivers/gpu/drm/imx/imx-drm-core.c | |||
@@ -357,8 +357,8 @@ static int imx_drm_bind(struct device *dev) | |||
357 | int ret; | 357 | int ret; |
358 | 358 | ||
359 | drm = drm_dev_alloc(&imx_drm_driver, dev); | 359 | drm = drm_dev_alloc(&imx_drm_driver, dev); |
360 | if (!drm) | 360 | if (IS_ERR(drm)) |
361 | return -ENOMEM; | 361 | return PTR_ERR(drm); |
362 | 362 | ||
363 | imxdrm = devm_kzalloc(dev, sizeof(*imxdrm), GFP_KERNEL); | 363 | imxdrm = devm_kzalloc(dev, sizeof(*imxdrm), GFP_KERNEL); |
364 | if (!imxdrm) { | 364 | if (!imxdrm) { |
@@ -436,9 +436,11 @@ static int imx_drm_bind(struct device *dev) | |||
436 | 436 | ||
437 | err_fbhelper: | 437 | err_fbhelper: |
438 | drm_kms_helper_poll_fini(drm); | 438 | drm_kms_helper_poll_fini(drm); |
439 | #if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION) | ||
439 | if (imxdrm->fbhelper) | 440 | if (imxdrm->fbhelper) |
440 | drm_fbdev_cma_fini(imxdrm->fbhelper); | 441 | drm_fbdev_cma_fini(imxdrm->fbhelper); |
441 | err_unbind: | 442 | err_unbind: |
443 | #endif | ||
442 | component_unbind_all(drm->dev, drm); | 444 | component_unbind_all(drm->dev, drm); |
443 | err_vblank: | 445 | err_vblank: |
444 | drm_vblank_cleanup(drm); | 446 | drm_vblank_cleanup(drm); |
diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c index ce22d0a0ddc8..d5864ed4d772 100644 --- a/drivers/gpu/drm/imx/ipuv3-plane.c +++ b/drivers/gpu/drm/imx/ipuv3-plane.c | |||
@@ -103,11 +103,11 @@ drm_plane_state_to_vbo(struct drm_plane_state *state) | |||
103 | (state->src_x >> 16) / 2 - eba; | 103 | (state->src_x >> 16) / 2 - eba; |
104 | } | 104 | } |
105 | 105 | ||
106 | static void ipu_plane_atomic_set_base(struct ipu_plane *ipu_plane, | 106 | static void ipu_plane_atomic_set_base(struct ipu_plane *ipu_plane) |
107 | struct drm_plane_state *old_state) | ||
108 | { | 107 | { |
109 | struct drm_plane *plane = &ipu_plane->base; | 108 | struct drm_plane *plane = &ipu_plane->base; |
110 | struct drm_plane_state *state = plane->state; | 109 | struct drm_plane_state *state = plane->state; |
110 | struct drm_crtc_state *crtc_state = state->crtc->state; | ||
111 | struct drm_framebuffer *fb = state->fb; | 111 | struct drm_framebuffer *fb = state->fb; |
112 | unsigned long eba, ubo, vbo; | 112 | unsigned long eba, ubo, vbo; |
113 | int active; | 113 | int active; |
@@ -117,7 +117,7 @@ static void ipu_plane_atomic_set_base(struct ipu_plane *ipu_plane, | |||
117 | switch (fb->pixel_format) { | 117 | switch (fb->pixel_format) { |
118 | case DRM_FORMAT_YUV420: | 118 | case DRM_FORMAT_YUV420: |
119 | case DRM_FORMAT_YVU420: | 119 | case DRM_FORMAT_YVU420: |
120 | if (old_state->fb) | 120 | if (!drm_atomic_crtc_needs_modeset(crtc_state)) |
121 | break; | 121 | break; |
122 | 122 | ||
123 | /* | 123 | /* |
@@ -149,7 +149,7 @@ static void ipu_plane_atomic_set_base(struct ipu_plane *ipu_plane, | |||
149 | break; | 149 | break; |
150 | } | 150 | } |
151 | 151 | ||
152 | if (old_state->fb) { | 152 | if (!drm_atomic_crtc_needs_modeset(crtc_state)) { |
153 | active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch); | 153 | active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch); |
154 | ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba); | 154 | ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba); |
155 | ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active); | 155 | ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active); |
@@ -259,6 +259,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane, | |||
259 | struct drm_framebuffer *fb = state->fb; | 259 | struct drm_framebuffer *fb = state->fb; |
260 | struct drm_framebuffer *old_fb = old_state->fb; | 260 | struct drm_framebuffer *old_fb = old_state->fb; |
261 | unsigned long eba, ubo, vbo, old_ubo, old_vbo; | 261 | unsigned long eba, ubo, vbo, old_ubo, old_vbo; |
262 | int hsub, vsub; | ||
262 | 263 | ||
263 | /* Ok to disable */ | 264 | /* Ok to disable */ |
264 | if (!fb) | 265 | if (!fb) |
@@ -355,7 +356,9 @@ static int ipu_plane_atomic_check(struct drm_plane *plane, | |||
355 | if ((ubo > 0xfffff8) || (vbo > 0xfffff8)) | 356 | if ((ubo > 0xfffff8) || (vbo > 0xfffff8)) |
356 | return -EINVAL; | 357 | return -EINVAL; |
357 | 358 | ||
358 | if (old_fb) { | 359 | if (old_fb && |
360 | (old_fb->pixel_format == DRM_FORMAT_YUV420 || | ||
361 | old_fb->pixel_format == DRM_FORMAT_YVU420)) { | ||
359 | old_ubo = drm_plane_state_to_ubo(old_state); | 362 | old_ubo = drm_plane_state_to_ubo(old_state); |
360 | old_vbo = drm_plane_state_to_vbo(old_state); | 363 | old_vbo = drm_plane_state_to_vbo(old_state); |
361 | if (ubo != old_ubo || vbo != old_vbo) | 364 | if (ubo != old_ubo || vbo != old_vbo) |
@@ -370,6 +373,16 @@ static int ipu_plane_atomic_check(struct drm_plane *plane, | |||
370 | 373 | ||
371 | if (old_fb && old_fb->pitches[1] != fb->pitches[1]) | 374 | if (old_fb && old_fb->pitches[1] != fb->pitches[1]) |
372 | crtc_state->mode_changed = true; | 375 | crtc_state->mode_changed = true; |
376 | |||
377 | /* | ||
378 | * The x/y offsets must be even in case of horizontal/vertical | ||
379 | * chroma subsampling. | ||
380 | */ | ||
381 | hsub = drm_format_horz_chroma_subsampling(fb->pixel_format); | ||
382 | vsub = drm_format_vert_chroma_subsampling(fb->pixel_format); | ||
383 | if (((state->src_x >> 16) & (hsub - 1)) || | ||
384 | ((state->src_y >> 16) & (vsub - 1))) | ||
385 | return -EINVAL; | ||
373 | } | 386 | } |
374 | 387 | ||
375 | return 0; | 388 | return 0; |
@@ -392,7 +405,7 @@ static void ipu_plane_atomic_update(struct drm_plane *plane, | |||
392 | struct drm_crtc_state *crtc_state = state->crtc->state; | 405 | struct drm_crtc_state *crtc_state = state->crtc->state; |
393 | 406 | ||
394 | if (!drm_atomic_crtc_needs_modeset(crtc_state)) { | 407 | if (!drm_atomic_crtc_needs_modeset(crtc_state)) { |
395 | ipu_plane_atomic_set_base(ipu_plane, old_state); | 408 | ipu_plane_atomic_set_base(ipu_plane); |
396 | return; | 409 | return; |
397 | } | 410 | } |
398 | } | 411 | } |
@@ -424,6 +437,7 @@ static void ipu_plane_atomic_update(struct drm_plane *plane, | |||
424 | ipu_dp_set_global_alpha(ipu_plane->dp, false, 0, false); | 437 | ipu_dp_set_global_alpha(ipu_plane->dp, false, 0, false); |
425 | break; | 438 | break; |
426 | default: | 439 | default: |
440 | ipu_dp_set_global_alpha(ipu_plane->dp, true, 0, true); | ||
427 | break; | 441 | break; |
428 | } | 442 | } |
429 | } | 443 | } |
@@ -437,7 +451,7 @@ static void ipu_plane_atomic_update(struct drm_plane *plane, | |||
437 | ipu_cpmem_set_high_priority(ipu_plane->ipu_ch); | 451 | ipu_cpmem_set_high_priority(ipu_plane->ipu_ch); |
438 | ipu_idmac_set_double_buffer(ipu_plane->ipu_ch, 1); | 452 | ipu_idmac_set_double_buffer(ipu_plane->ipu_ch, 1); |
439 | ipu_cpmem_set_stride(ipu_plane->ipu_ch, state->fb->pitches[0]); | 453 | ipu_cpmem_set_stride(ipu_plane->ipu_ch, state->fb->pitches[0]); |
440 | ipu_plane_atomic_set_base(ipu_plane, old_state); | 454 | ipu_plane_atomic_set_base(ipu_plane); |
441 | ipu_plane_enable(ipu_plane); | 455 | ipu_plane_enable(ipu_plane); |
442 | } | 456 | } |
443 | 457 | ||
diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c b/drivers/gpu/ipu-v3/ipu-image-convert.c index 2ba7d437a2af..805b6fa7b5f4 100644 --- a/drivers/gpu/ipu-v3/ipu-image-convert.c +++ b/drivers/gpu/ipu-v3/ipu-image-convert.c | |||
@@ -1617,7 +1617,7 @@ ipu_image_convert(struct ipu_soc *ipu, enum ipu_ic_task ic_task, | |||
1617 | ctx = ipu_image_convert_prepare(ipu, ic_task, in, out, rot_mode, | 1617 | ctx = ipu_image_convert_prepare(ipu, ic_task, in, out, rot_mode, |
1618 | complete, complete_context); | 1618 | complete, complete_context); |
1619 | if (IS_ERR(ctx)) | 1619 | if (IS_ERR(ctx)) |
1620 | return ERR_PTR(PTR_ERR(ctx)); | 1620 | return ERR_CAST(ctx); |
1621 | 1621 | ||
1622 | run = kzalloc(sizeof(*run), GFP_KERNEL); | 1622 | run = kzalloc(sizeof(*run), GFP_KERNEL); |
1623 | if (!run) { | 1623 | if (!run) { |