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) { |
