From: Hsiao Chien Sung <shawn.s...@mediatek.com>

We found that IGT (Intel GPU Tool) will try to commit layers with
zero width or height and lead to undefined behaviors in hardware.
Disable the layers in such a situation.

Fixes: 777b7bc86a0a ("UPSTREAM: drm/mediatek: Add ovl_adaptor support for 
MT8195")
Fixes: fa97fe71f6f9 ("UPSTREAM: drm/mediatek: Add ETHDR support for MT8195")

Reviewed-by: CK Hu <ck...@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno 
<angelogioacchino.delre...@collabora.com>
Signed-off-by: Hsiao Chien Sung <shawn.s...@mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c | 2 +-
 drivers/gpu/drm/mediatek/mtk_ethdr.c            | 7 ++++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c 
b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
index 02dd7dcdfedb2..2b62d64759181 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
@@ -158,7 +158,7 @@ void mtk_ovl_adaptor_layer_config(struct device *dev, 
unsigned int idx,
        merge = ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_MERGE0 + idx];
        ethdr = ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0];
 
-       if (!pending->enable) {
+       if (!pending->enable || !pending->width || !pending->height) {
                mtk_merge_stop_cmdq(merge, cmdq_pkt);
                mtk_mdp_rdma_stop(rdma_l, cmdq_pkt);
                mtk_mdp_rdma_stop(rdma_r, cmdq_pkt);
diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.c 
b/drivers/gpu/drm/mediatek/mtk_ethdr.c
index 156c6ff547e86..4ffd0a0648613 100644
--- a/drivers/gpu/drm/mediatek/mtk_ethdr.c
+++ b/drivers/gpu/drm/mediatek/mtk_ethdr.c
@@ -160,7 +160,12 @@ void mtk_ethdr_layer_config(struct device *dev, unsigned 
int idx,
        if (idx >= 4)
                return;
 
-       if (!pending->enable) {
+       if (!pending->enable || !pending->width || !pending->height) {
+               /*
+                * instead of disabling layer with MIX_SRC_CON directly
+                * set the size to 0 to avoid screen shift due to mixer
+                * mode switch (hardware behavior)
+                */
                mtk_ddp_write(cmdq_pkt, 0, &mixer->cmdq_base, mixer->regs, 
MIX_L_SRC_SIZE(idx));
                return;
        }
-- 
2.18.0

Reply via email to