]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs
authorJason-JH.Lin <jason-jh.lin@mediatek.com>
Wed, 9 Oct 2024 03:46:46 +0000 (11:46 +0800)
committerChun-Kuang Hu <chunkuang.hu@kernel.org>
Tue, 22 Oct 2024 12:47:47 +0000 (12:47 +0000)
Since some SoCs support premultiplied pixel formats but some do not,
the blend_modes parameter is added to mtk_plane_init(), which is
obtained from the mtk_ddp_comp_get_blend_modes function implemented
in different blending supported components.

The blending supported components can use driver data to set the
blend mode capabilities for different SoCs.

Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: CK Hu <ck.hu@mediatek.com>
Link: https://patchwork.kernel.org/project/dri-devel/patch/20241009034646.13143-6-jason-jh.lin@mediatek.com/
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
drivers/gpu/drm/mediatek/mtk_crtc.c
drivers/gpu/drm/mediatek/mtk_ddp_comp.c
drivers/gpu/drm/mediatek/mtk_ddp_comp.h
drivers/gpu/drm/mediatek/mtk_disp_drv.h
drivers/gpu/drm/mediatek/mtk_disp_ovl.c
drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
drivers/gpu/drm/mediatek/mtk_ethdr.c
drivers/gpu/drm/mediatek/mtk_ethdr.h
drivers/gpu/drm/mediatek/mtk_plane.c
drivers/gpu/drm/mediatek/mtk_plane.h

index 175b00e5a25354c890d5617912a7b3af0ac96ddc..b65f196f201547068b725ed60696288add6f904a 100644 (file)
@@ -913,6 +913,7 @@ static int mtk_crtc_init_comp_planes(struct drm_device *drm_dev,
                                BIT(pipe),
                                mtk_crtc_plane_type(mtk_crtc->layer_nr, num_planes),
                                mtk_ddp_comp_supported_rotations(comp),
+                               mtk_ddp_comp_get_blend_modes(comp),
                                mtk_ddp_comp_get_formats(comp),
                                mtk_ddp_comp_get_num_formats(comp), i);
                if (ret)
index be66d94be361394993d0d72df8799034dba1eb4c..edc6417639e64286e809cc28b4a959a895a38fb6 100644 (file)
@@ -363,6 +363,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl = {
        .layer_config = mtk_ovl_layer_config,
        .bgclr_in_on = mtk_ovl_bgclr_in_on,
        .bgclr_in_off = mtk_ovl_bgclr_in_off,
+       .get_blend_modes = mtk_ovl_get_blend_modes,
        .get_formats = mtk_ovl_get_formats,
        .get_num_formats = mtk_ovl_get_num_formats,
 };
@@ -416,6 +417,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl_adaptor = {
        .disconnect = mtk_ovl_adaptor_disconnect,
        .add = mtk_ovl_adaptor_add_comp,
        .remove = mtk_ovl_adaptor_remove_comp,
+       .get_blend_modes = mtk_ovl_adaptor_get_blend_modes,
        .get_formats = mtk_ovl_adaptor_get_formats,
        .get_num_formats = mtk_ovl_adaptor_get_num_formats,
        .mode_valid = mtk_ovl_adaptor_mode_valid,
index ecf6dc283cd7c1079582ef07dde293c2aeda017a..39720b27f4e9eda8e4f3c31020d6ec7124638017 100644 (file)
@@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
        void (*ctm_set)(struct device *dev,
                        struct drm_crtc_state *state);
        struct device * (*dma_dev_get)(struct device *dev);
+       u32 (*get_blend_modes)(struct device *dev);
        const u32 *(*get_formats)(struct device *dev);
        size_t (*get_num_formats)(struct device *dev);
        void (*connect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
@@ -266,6 +267,15 @@ static inline struct device *mtk_ddp_comp_dma_dev_get(struct mtk_ddp_comp *comp)
        return comp->dev;
 }
 
+static inline
+u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
+{
+       if (comp->funcs && comp->funcs->get_blend_modes)
+               return comp->funcs->get_blend_modes(comp->dev);
+
+       return 0;
+}
+
 static inline
 const u32 *mtk_ddp_comp_get_formats(struct mtk_ddp_comp *comp)
 {
index 082ac18fe04aab331fcabf4e4d3877a58f9261f2..04154db9085c08a27c05c79b53346000cf8ac476 100644 (file)
@@ -103,6 +103,7 @@ void mtk_ovl_register_vblank_cb(struct device *dev,
 void mtk_ovl_unregister_vblank_cb(struct device *dev);
 void mtk_ovl_enable_vblank(struct device *dev);
 void mtk_ovl_disable_vblank(struct device *dev);
+u32 mtk_ovl_get_blend_modes(struct device *dev);
 const u32 *mtk_ovl_get_formats(struct device *dev);
 size_t mtk_ovl_get_num_formats(struct device *dev);
 
@@ -131,6 +132,7 @@ void mtk_ovl_adaptor_start(struct device *dev);
 void mtk_ovl_adaptor_stop(struct device *dev);
 unsigned int mtk_ovl_adaptor_layer_nr(struct device *dev);
 struct device *mtk_ovl_adaptor_dma_dev_get(struct device *dev);
+u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
 const u32 *mtk_ovl_adaptor_get_formats(struct device *dev);
 size_t mtk_ovl_adaptor_get_num_formats(struct device *dev);
 enum drm_mode_status mtk_ovl_adaptor_mode_valid(struct device *dev,
index fab23b1904bd1bdde9e7b8e2fe4bdfcb594aac51..9786ce94de0e679d65b48ded39e92e85f60ab89e 100644 (file)
@@ -215,6 +215,13 @@ void mtk_ovl_disable_vblank(struct device *dev)
        writel_relaxed(0x0, ovl->regs + DISP_REG_OVL_INTEN);
 }
 
+u32 mtk_ovl_get_blend_modes(struct device *dev)
+{
+       struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
+
+       return ovl->data->blend_modes;
+}
+
 const u32 *mtk_ovl_get_formats(struct device *dev)
 {
        struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
index c6768210b08b87414c9ab270af0f0a5837e7a783..bf2546c4681a15a20d85bd6a01323cea80aa53ef 100644 (file)
@@ -400,6 +400,13 @@ void mtk_ovl_adaptor_disable_vblank(struct device *dev)
        mtk_ethdr_disable_vblank(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
 }
 
+u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
+{
+       struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
+
+       return mtk_ethdr_get_blend_modes(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
+}
+
 const u32 *mtk_ovl_adaptor_get_formats(struct device *dev)
 {
        struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
index d1d9cf8b10e16d0b4db8a9e7e79592128735863e..0f22e7d337cb6779939a12c14e4dd31e5a4f2769 100644 (file)
@@ -145,6 +145,13 @@ static irqreturn_t mtk_ethdr_irq_handler(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
+u32 mtk_ethdr_get_blend_modes(struct device *dev)
+{
+       return BIT(DRM_MODE_BLEND_PREMULTI) |
+              BIT(DRM_MODE_BLEND_COVERAGE) |
+              BIT(DRM_MODE_BLEND_PIXEL_NONE);
+}
+
 void mtk_ethdr_layer_config(struct device *dev, unsigned int idx,
                            struct mtk_plane_state *state,
                            struct cmdq_pkt *cmdq_pkt)
index 81af9edea3f7400b15ef7107ba8ec12bb12bd0a5..a72aeee46829ad1ce9ad93a2f5f785848efccd2d 100644 (file)
@@ -13,6 +13,7 @@ void mtk_ethdr_clk_disable(struct device *dev);
 void mtk_ethdr_config(struct device *dev, unsigned int w,
                      unsigned int h, unsigned int vrefresh,
                      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
+u32 mtk_ethdr_get_blend_modes(struct device *dev);
 void mtk_ethdr_layer_config(struct device *dev, unsigned int idx,
                            struct mtk_plane_state *state,
                            struct cmdq_pkt *cmdq_pkt);
index 7d2cb4e0fafad1e4f31933cbbf83f7de9b954907..8a48b3b0a95676c9823daa2052aefb7f86f629ff 100644 (file)
@@ -320,8 +320,8 @@ static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = {
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
                   unsigned long possible_crtcs, enum drm_plane_type type,
-                  unsigned int supported_rotations, const u32 *formats,
-                  size_t num_formats, unsigned int plane_idx)
+                  unsigned int supported_rotations, const u32 blend_modes,
+                  const u32 *formats, size_t num_formats, unsigned int plane_idx)
 {
        int err;
 
@@ -366,12 +366,11 @@ int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
        if (err)
                DRM_ERROR("failed to create property: alpha\n");
 
-       err = drm_plane_create_blend_mode_property(plane,
-                                                  BIT(DRM_MODE_BLEND_PREMULTI) |
-                                                  BIT(DRM_MODE_BLEND_COVERAGE) |
-                                                  BIT(DRM_MODE_BLEND_PIXEL_NONE));
-       if (err)
-               DRM_ERROR("failed to create property: blend_mode\n");
+       if (blend_modes) {
+               err = drm_plane_create_blend_mode_property(plane, blend_modes);
+               if (err)
+                       DRM_ERROR("failed to create property: blend_mode\n");
+       }
 
        drm_plane_helper_add(plane, &mtk_plane_helper_funcs);
 
index 5b177eac67b7aa874229963d02ec3841bea6843d..3b13b89989c7e46449cc37b20283417642ae774d 100644 (file)
@@ -48,6 +48,6 @@ to_mtk_plane_state(struct drm_plane_state *state)
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
                   unsigned long possible_crtcs, enum drm_plane_type type,
-                  unsigned int supported_rotations, const u32 *formats,
-                  size_t num_formats, unsigned int plane_idx);
+                  unsigned int supported_rotations, const u32 blend_modes,
+                  const u32 *formats, size_t num_formats, unsigned int plane_idx);
 #endif