mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-19 02:04:19 +08:00
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 -----BEGIN PGP SIGNATURE----- iQI0BAABCAAeBQJYCbk/FxxwLnphYmVsQHBlbmd1dHJvbml4LmRlAAoJEFDCiBxw nmDrGMYQAJMx6LoCTJ7hfr59R4IvmST0tRcVTKO4Grux8JPfu7WtDaFNhfew4ltA Nt38lbawzBBJ3jmbayGzpHmeEDdZh8T0LbYqzqWNRjergQ5V0qCXcxLKuvrRW9NC H0QmJmbiZm9EDani7Xh1yOF51n1g37FVq7+qROr9J7oHz/xjJw523XwSiLAR9pgs QMmw5zrPNqu93pRCLtm5/4puVMOYQfHmE8l8WYV2zIvjck1D+rkRFv5+DJwpDZjO jpvq3ZrHSFHM12wk0S5jsLUwFs2cqHb16ETitGP9gB7MnkPZ7qwgTTfio3JDpuL8 orKpTcjDPVxPfVmbS5Hv/iNNq8YMz1VrJNp7y/ZCgTqNl/877f9nmeHKXdolMWMc xN5gDrd0atzHJKhsxp6bOYDhp861C1Nm+gtuNs2lRHsKANUa9SKh+gcyEC+CfqaU PdKx0E0lQcjjWjW2UYseQmjePjIclPzgCw1V6PHJOkOFBz8wQm8EHH4BcqBsx2zP v/ew3s/dk00IWi6e6/M7/hDM2vgXGIvw1AV8FHqMcBgSs/4GqVbGxJF+HIDqTX5s 257nDdm+23eA8yvg+XbtYqlP0G7r7XV1KQLiMoFNJEj8+OjFfHPotphhX0kh8eWu quhY4yKlrOrzrm7wrCEOXhfwSfKhO4BF1lgh3jzqKzfWYtckgXOh =lgaf -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
e676717a12
@ -357,8 +357,8 @@ static int imx_drm_bind(struct device *dev)
|
||||
int ret;
|
||||
|
||||
drm = drm_dev_alloc(&imx_drm_driver, dev);
|
||||
if (!drm)
|
||||
return -ENOMEM;
|
||||
if (IS_ERR(drm))
|
||||
return PTR_ERR(drm);
|
||||
|
||||
imxdrm = devm_kzalloc(dev, sizeof(*imxdrm), GFP_KERNEL);
|
||||
if (!imxdrm) {
|
||||
@ -436,9 +436,11 @@ static int imx_drm_bind(struct device *dev)
|
||||
|
||||
err_fbhelper:
|
||||
drm_kms_helper_poll_fini(drm);
|
||||
#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION)
|
||||
if (imxdrm->fbhelper)
|
||||
drm_fbdev_cma_fini(imxdrm->fbhelper);
|
||||
err_unbind:
|
||||
#endif
|
||||
component_unbind_all(drm->dev, drm);
|
||||
err_vblank:
|
||||
drm_vblank_cleanup(drm);
|
||||
|
@ -103,11 +103,11 @@ drm_plane_state_to_vbo(struct drm_plane_state *state)
|
||||
(state->src_x >> 16) / 2 - eba;
|
||||
}
|
||||
|
||||
static void ipu_plane_atomic_set_base(struct ipu_plane *ipu_plane,
|
||||
struct drm_plane_state *old_state)
|
||||
static void ipu_plane_atomic_set_base(struct ipu_plane *ipu_plane)
|
||||
{
|
||||
struct drm_plane *plane = &ipu_plane->base;
|
||||
struct drm_plane_state *state = plane->state;
|
||||
struct drm_crtc_state *crtc_state = state->crtc->state;
|
||||
struct drm_framebuffer *fb = state->fb;
|
||||
unsigned long eba, ubo, vbo;
|
||||
int active;
|
||||
@ -117,7 +117,7 @@ static void ipu_plane_atomic_set_base(struct ipu_plane *ipu_plane,
|
||||
switch (fb->pixel_format) {
|
||||
case DRM_FORMAT_YUV420:
|
||||
case DRM_FORMAT_YVU420:
|
||||
if (old_state->fb)
|
||||
if (!drm_atomic_crtc_needs_modeset(crtc_state))
|
||||
break;
|
||||
|
||||
/*
|
||||
@ -149,7 +149,7 @@ static void ipu_plane_atomic_set_base(struct ipu_plane *ipu_plane,
|
||||
break;
|
||||
}
|
||||
|
||||
if (old_state->fb) {
|
||||
if (!drm_atomic_crtc_needs_modeset(crtc_state)) {
|
||||
active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch);
|
||||
ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba);
|
||||
ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active);
|
||||
@ -259,6 +259,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
|
||||
struct drm_framebuffer *fb = state->fb;
|
||||
struct drm_framebuffer *old_fb = old_state->fb;
|
||||
unsigned long eba, ubo, vbo, old_ubo, old_vbo;
|
||||
int hsub, vsub;
|
||||
|
||||
/* Ok to disable */
|
||||
if (!fb)
|
||||
@ -355,7 +356,9 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
|
||||
if ((ubo > 0xfffff8) || (vbo > 0xfffff8))
|
||||
return -EINVAL;
|
||||
|
||||
if (old_fb) {
|
||||
if (old_fb &&
|
||||
(old_fb->pixel_format == DRM_FORMAT_YUV420 ||
|
||||
old_fb->pixel_format == DRM_FORMAT_YVU420)) {
|
||||
old_ubo = drm_plane_state_to_ubo(old_state);
|
||||
old_vbo = drm_plane_state_to_vbo(old_state);
|
||||
if (ubo != old_ubo || vbo != old_vbo)
|
||||
@ -370,6 +373,16 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
|
||||
|
||||
if (old_fb && old_fb->pitches[1] != fb->pitches[1])
|
||||
crtc_state->mode_changed = true;
|
||||
|
||||
/*
|
||||
* The x/y offsets must be even in case of horizontal/vertical
|
||||
* chroma subsampling.
|
||||
*/
|
||||
hsub = drm_format_horz_chroma_subsampling(fb->pixel_format);
|
||||
vsub = drm_format_vert_chroma_subsampling(fb->pixel_format);
|
||||
if (((state->src_x >> 16) & (hsub - 1)) ||
|
||||
((state->src_y >> 16) & (vsub - 1)))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -392,7 +405,7 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
|
||||
struct drm_crtc_state *crtc_state = state->crtc->state;
|
||||
|
||||
if (!drm_atomic_crtc_needs_modeset(crtc_state)) {
|
||||
ipu_plane_atomic_set_base(ipu_plane, old_state);
|
||||
ipu_plane_atomic_set_base(ipu_plane);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -424,6 +437,7 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
|
||||
ipu_dp_set_global_alpha(ipu_plane->dp, false, 0, false);
|
||||
break;
|
||||
default:
|
||||
ipu_dp_set_global_alpha(ipu_plane->dp, true, 0, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -437,7 +451,7 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
|
||||
ipu_cpmem_set_high_priority(ipu_plane->ipu_ch);
|
||||
ipu_idmac_set_double_buffer(ipu_plane->ipu_ch, 1);
|
||||
ipu_cpmem_set_stride(ipu_plane->ipu_ch, state->fb->pitches[0]);
|
||||
ipu_plane_atomic_set_base(ipu_plane, old_state);
|
||||
ipu_plane_atomic_set_base(ipu_plane);
|
||||
ipu_plane_enable(ipu_plane);
|
||||
}
|
||||
|
||||
|
@ -1617,7 +1617,7 @@ ipu_image_convert(struct ipu_soc *ipu, enum ipu_ic_task ic_task,
|
||||
ctx = ipu_image_convert_prepare(ipu, ic_task, in, out, rot_mode,
|
||||
complete, complete_context);
|
||||
if (IS_ERR(ctx))
|
||||
return ERR_PTR(PTR_ERR(ctx));
|
||||
return ERR_CAST(ctx);
|
||||
|
||||
run = kzalloc(sizeof(*run), GFP_KERNEL);
|
||||
if (!run) {
|
||||
|
Loading…
Reference in New Issue
Block a user