Hi, all:

 I'm sorry that I forgot to add a pair of brackets, and I'll send it again soon.

Best Regards,
Hongchi Peng

-----邮件原件-----
发件人: hongchi.peng <[email protected]> 
发送时间: 2024年8月21日 16:19
收件人: [email protected]
抄送: [email protected]; [email protected]; [email protected]; 
[email protected]; [email protected]; [email protected]; Peng 
Hongchi/彭洪驰 <[email protected]>
主题: [PATCH] drm: komeda: Fix an issue related to normalized zpos

We use komeda_crtc_normalize_zpos to normalize zpos of affected planes to their 
blending zorder in CU. If there's only one slave plane in affected planes and 
its layer_split property is enabled, order++ for its split layer, so that when 
calculating the normalized_zpos of master planes, the split layer of the slave 
plane is included, but the max_slave_zorder does not include the split layer 
and keep zero because there's only one slave plane in affacted planes, although 
we actually use two slave layers in this commit.

In most cases, this bug does not result in a commit failure, but assume the 
following situation:
    slave_layer 0: zpos = 0, layer split enabled, normalized_zpos =
    0;(use slave_layer 2 as its split layer)
    master_layer 0: zpos = 2, layer_split enabled, normalized_zpos =
    2;(use master_layer 2 as its split layer)
    master_layer 1: zpos = 4, normalized_zpos = 4;
    master_layer 3: zpos = 5, normalized_zpos = 5;
    kcrtc_st->max_slave_zorder = 0;
When we use master_layer 3 as a input of CU in function komeda_compiz_set_input 
and check it with function komeda_component_check_input, the parameter idx is 
equal to normailzed_zpos minus max_slave_zorder, the value of idx is 5 and is 
euqal to CU's max_active_inputs, so that komeda_component_check_input returns a 
-EINVAL value.

To fix the bug described above, when calculating the max_slave_zorder with the 
layer_split enabled, count the split layer in this calculation directly.

Signed-off-by: hongchi.peng <[email protected]>
---
 drivers/gpu/drm/arm/display/komeda/komeda_kms.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
index fe46b0ebefea..0554954c8cea 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
@@ -159,7 +159,7 @@ static int komeda_crtc_normalize_zpos(struct drm_crtc *crtc,
        struct drm_plane_state *plane_st;
        struct drm_plane *plane;
        struct list_head zorder_list;
-       int order = 0, err;
+       int order = 0, slave_zpos, err;
 
        DRM_DEBUG_ATOMIC("[CRTC:%d:%s] calculating normalized zpos values\n",
                         crtc->base.id, crtc->name);
@@ -200,9 +200,11 @@ static int komeda_crtc_normalize_zpos(struct drm_crtc 
*crtc,
 
                /* calculate max slave zorder */
                if (has_bit(drm_plane_index(plane), kcrtc->slave_planes))
+                       slave_zpos = plane_st->normalized_zpos;
+                       if (to_kplane_st(plane_st)->layer_split)
+                               slave_zpos++;
                        kcrtc_st->max_slave_zorder =
-                               max(plane_st->normalized_zpos,
-                                   kcrtc_st->max_slave_zorder);
+                               max(slave_zpos, kcrtc_st->max_slave_zorder);
        }
 
        crtc_st->zpos_changed = true;
--
2.34.1

Reply via email to