From: Liu Ying Date: Tue, 17 Sep 2019 01:44:58 +0000 (+0800) Subject: MLK-22600-5 drm/imx: dpu: plane: Support multiple pixel blend modes X-Git-Tag: rel_imx_4.19.35_1.1.0~42 X-Git-Url: https://git.somdevices.com/?a=commitdiff_plain;h=74bb3f20296c5e50588b85a44bc07f12644e9324;p=linux.git MLK-22600-5 drm/imx: dpu: plane: Support multiple pixel blend modes This patch adds mulitple pixel blend modes for DPU plane. The modes are "None", "Pre-multiplied" and "Coverage". Signed-off-by: Liu Ying (cherry picked from commit 1259fedbcf2a54f58b47e8531a09b35cc60a43f7) --- diff --git a/drivers/gpu/drm/imx/dpu/dpu-plane.c b/drivers/gpu/drm/imx/dpu/dpu-plane.c index 0292f25bf802..18e97f121a78 100644 --- a/drivers/gpu/drm/imx/dpu/dpu-plane.c +++ b/drivers/gpu/drm/imx/dpu/dpu-plane.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -81,9 +82,8 @@ static void dpu_plane_reset(struct drm_plane *plane) if (!state) return; - plane->state = &state->base; - plane->state->plane = plane; - plane->state->rotation = DRM_MODE_ROTATE_0; + __drm_atomic_helper_plane_reset(plane, &state->base); + plane->state->zpos = dpu_plane_get_default_zpos(plane->type); } @@ -655,7 +655,8 @@ again: fu->ops->set_src_stride(fu, src_w, src_x, mt_w, bpp, fb->pitches[0], baseaddr, use_prefetch); fu->ops->set_src_buf_dimensions(fu, src_w, src_h, 0, fb_is_interlaced); - fu->ops->set_pixel_blend_mode(fu, fb->format->format); + fu->ops->set_pixel_blend_mode(fu, state->pixel_blend_mode, + state->alpha, fb->format->format); fu->ops->set_fmt(fu, fb->format->format, fb_is_interlaced); fu->ops->enable_src_buf(fu); fu->ops->set_framedimensions(fu, src_w, src_h, fb_is_interlaced); @@ -800,7 +801,8 @@ again: layerblend_pixengcfg_dynamic_prim_sel(lb, stage); layerblend_pixengcfg_dynamic_sec_sel(lb, source); layerblend_control(lb, LB_BLEND); - layerblend_blendcontrol(lb, state->normalized_zpos); + layerblend_blendcontrol(lb, state->normalized_zpos, + state->pixel_blend_mode, state->alpha); layerblend_pixengcfg_clken(lb, CLKEN__AUTOMATIC); layerblend_position(lb, crtc_x, state->crtc_y); @@ -873,6 +875,17 @@ struct dpu_plane *dpu_plane_init(struct drm_device *drm, if (ret) goto err; + ret = drm_plane_create_alpha_property(plane); + if (ret) + goto err; + + ret = drm_plane_create_blend_mode_property(plane, + BIT(DRM_MODE_BLEND_PIXEL_NONE) | + BIT(DRM_MODE_BLEND_PREMULTI) | + BIT(DRM_MODE_BLEND_COVERAGE)); + if (ret) + goto err; + return dpu_plane; err: diff --git a/drivers/gpu/imx/dpu/dpu-fetchdecode.c b/drivers/gpu/imx/dpu/dpu-fetchdecode.c index 97685daabb7a..84b9f69b2d15 100644 --- a/drivers/gpu/imx/dpu/dpu-fetchdecode.c +++ b/drivers/gpu/imx/dpu/dpu-fetchdecode.c @@ -13,6 +13,7 @@ * for more details. */ +#include #include #include #include @@ -379,17 +380,24 @@ void fetchdecode_clipoffset(struct dpu_fetchunit *fu, unsigned int x, EXPORT_SYMBOL_GPL(fetchdecode_clipoffset); static void -fetchdecode_set_pixel_blend_mode(struct dpu_fetchunit *fu, u32 fb_format) +fetchdecode_set_pixel_blend_mode(struct dpu_fetchunit *fu, + unsigned int pixel_blend_mode, u16 alpha, + u32 fb_format) { - u32 val, mode = ALPHACONSTENABLE; - - switch (fb_format) { - case DRM_FORMAT_ARGB8888: - case DRM_FORMAT_ABGR8888: - case DRM_FORMAT_RGBA8888: - case DRM_FORMAT_BGRA8888: - mode |= ALPHASRCENABLE; - break; + u32 mode = 0, val; + + if (pixel_blend_mode == DRM_MODE_BLEND_PREMULTI || + pixel_blend_mode == DRM_MODE_BLEND_COVERAGE) { + mode = ALPHACONSTENABLE; + + switch (fb_format) { + case DRM_FORMAT_ARGB8888: + case DRM_FORMAT_ABGR8888: + case DRM_FORMAT_RGBA8888: + case DRM_FORMAT_BGRA8888: + mode |= ALPHASRCENABLE; + break; + } } mutex_lock(&fu->mutex); @@ -400,7 +408,7 @@ fetchdecode_set_pixel_blend_mode(struct dpu_fetchunit *fu, u32 fb_format) val = dpu_fu_read(fu, CONSTANTCOLOR0); val &= ~CONSTANTALPHA_MASK; - val |= CONSTANTALPHA(0xff); + val |= CONSTANTALPHA(alpha >> 8); dpu_fu_write(fu, val, CONSTANTCOLOR0); mutex_unlock(&fu->mutex); } diff --git a/drivers/gpu/imx/dpu/dpu-fetchunit.c b/drivers/gpu/imx/dpu/dpu-fetchunit.c index 7c5590963133..4f939f31b4bd 100644 --- a/drivers/gpu/imx/dpu/dpu-fetchunit.c +++ b/drivers/gpu/imx/dpu/dpu-fetchunit.c @@ -12,6 +12,7 @@ * for more details. */ +#include #include