Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp328873pxb; Mon, 16 Aug 2021 06:26:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyGPWGHQ8OXPrXTDOu4JqbbzQf6UIF/v3hTdcpQfLF1HD1nTbcY2/npFkqBFXCRtMW2nLJQ X-Received: by 2002:a05:6402:4406:: with SMTP id y6mr709669eda.242.1629120412864; Mon, 16 Aug 2021 06:26:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629120412; cv=none; d=google.com; s=arc-20160816; b=rIlr8+J2NXJNa0wa/v3XUMktQ6V5siiijTLVZchiwqqmrNF6o+XegF9M6L8via9krp PUs0gMHArWXTZVkG+AGYMASDHvnQEaty7jv4GbVlWGNY2A3s0RUOp7vcfLS7rAU5s/Co 0hSgmxsqaL6IJLqW3UufOA0nOEbLUJ+udJjCwsujONjblQutuZ5qvFL3YFYS3XCK0z1f SsjlANVVkUn28SfBsX0I/9kPS9p/JQIG054Srhj9+nGWOaw4tAA8a5Bv4LgAbmP5LW2K bHy7oUjhuj47dhtDwRmDXk/4H7h6Wl4f+Zl66lS2tr0NaQhWVhvWO0Q1fdahg5cLOoNO JP4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=7+ipB1+Y7y3zzLbAl4wUxMFBkUsaO9uVMjaLx8tTSQI=; b=ZiDxNLehFijRajrB9gXfCcx3FemvMc2pqm4c6KGPoZLaGcWHpBo/BxaKf2qpnXVVOQ TE9PkShSIkQIWQ9W2KmQk5BmH4scd+RInMv5WNmbWQAqW9x2SDG6mmPHo1N8Wu7V8/vk 07Da64LRjsFCEQpa7wHqr720e+b9P0Op+i+gdHjcIuO2iJ/EVmtnETj7oCQSSsAKirbV aOj18gh7h4s/zhdpU9nsjb8MXuVYqW0kuelZAnl6roaVAuZPsG7s5eHHgWCs+x1s66Y5 llS9i0Z3Ku/0/B1J+c7b2RtDTdwkgjOZDw/WgTZQxCpJArL+EGdCI8aYdsvCywcTx5q1 nf/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=QHi84POy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c16si11090772edv.249.2021.08.16.06.26.30; Mon, 16 Aug 2021 06:26:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=QHi84POy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240165AbhHPNWq (ORCPT + 99 others); Mon, 16 Aug 2021 09:22:46 -0400 Received: from mail.kernel.org ([198.145.29.99]:39084 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239751AbhHPNOh (ORCPT ); Mon, 16 Aug 2021 09:14:37 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 4C483632A4; Mon, 16 Aug 2021 13:11:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1629119477; bh=rmNWyLLtszdwkcJs8/9MbZkMo4bPvmMeaFZUfCOLKxM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QHi84POyy1Y8mE02F0/ARD8YvNSuhHmD+X0Jd+TSCeRhktuTsZMg2CKM3eLmal+FI 1qDiOi09knSEFD/+co8+THpAxwVOehf4rV2I/H9HYKmT+BI+Q+MdyZamn7Lgwhsz4A 2ozCJJuylHyJDHdDyd1KJrR7bpzbXrjO/yHSlr28= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, "jason-jh.lin" , Enric Balletbo i Serra , Chun-Kuang Hu , Sasha Levin Subject: [PATCH 5.13 041/151] drm/mediatek: Fix cursor plane no update Date: Mon, 16 Aug 2021 15:01:11 +0200 Message-Id: <20210816125445.430473827@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210816125444.082226187@linuxfoundation.org> References: <20210816125444.082226187@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: jason-jh.lin [ Upstream commit 1a64a7aff8da352c9419de3d5c34343682916411 ] The cursor plane should use the current plane state in atomic_async_update because it would not be the new plane state in the global atomic state since _swap_state happened when those hook are run. Fix cursor plane issue by below modification: 1. Remove plane_helper_funcs->atomic_update(plane, state) in mtk_drm_crtc_async_update. 2. Add mtk_drm_update_new_state in to mtk_plane_atomic_async_update to update the cursor plane by current plane state hook and update others plane by the new_state. Fixes: 37418bf14c13 ("drm: Use state helper instead of the plane state pointer") Signed-off-by: jason-jh.lin Tested-by: Enric Balletbo i Serra Signed-off-by: Chun-Kuang Hu Signed-off-by: Sasha Levin --- drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 3 -- drivers/gpu/drm/mediatek/mtk_drm_plane.c | 60 ++++++++++++++---------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c index 474efb844249..735efe79f075 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c @@ -532,13 +532,10 @@ void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane, struct drm_atomic_state *state) { struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); - const struct drm_plane_helper_funcs *plane_helper_funcs = - plane->helper_private; if (!mtk_crtc->enabled) return; - plane_helper_funcs->atomic_update(plane, state); mtk_drm_crtc_update_config(mtk_crtc, false); } diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c index b5582dcf564c..e6dcb34d3052 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c @@ -110,6 +110,35 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane, true, true); } +static void mtk_plane_update_new_state(struct drm_plane_state *new_state, + struct mtk_plane_state *mtk_plane_state) +{ + struct drm_framebuffer *fb = new_state->fb; + struct drm_gem_object *gem; + struct mtk_drm_gem_obj *mtk_gem; + unsigned int pitch, format; + dma_addr_t addr; + + gem = fb->obj[0]; + mtk_gem = to_mtk_gem_obj(gem); + addr = mtk_gem->dma_addr; + pitch = fb->pitches[0]; + format = fb->format->format; + + addr += (new_state->src.x1 >> 16) * fb->format->cpp[0]; + addr += (new_state->src.y1 >> 16) * pitch; + + mtk_plane_state->pending.enable = true; + mtk_plane_state->pending.pitch = pitch; + mtk_plane_state->pending.format = format; + mtk_plane_state->pending.addr = addr; + mtk_plane_state->pending.x = new_state->dst.x1; + mtk_plane_state->pending.y = new_state->dst.y1; + mtk_plane_state->pending.width = drm_rect_width(&new_state->dst); + mtk_plane_state->pending.height = drm_rect_height(&new_state->dst); + mtk_plane_state->pending.rotation = new_state->rotation; +} + static void mtk_plane_atomic_async_update(struct drm_plane *plane, struct drm_atomic_state *state) { @@ -126,8 +155,10 @@ static void mtk_plane_atomic_async_update(struct drm_plane *plane, plane->state->src_h = new_state->src_h; plane->state->src_w = new_state->src_w; swap(plane->state->fb, new_state->fb); - new_plane_state->pending.async_dirty = true; + mtk_plane_update_new_state(new_state, new_plane_state); + wmb(); /* Make sure the above parameters are set before update */ + new_plane_state->pending.async_dirty = true; mtk_drm_crtc_async_update(new_state->crtc, plane, state); } @@ -189,14 +220,8 @@ static void mtk_plane_atomic_update(struct drm_plane *plane, struct drm_plane_state *new_state = drm_atomic_get_new_plane_state(state, plane); struct mtk_plane_state *mtk_plane_state = to_mtk_plane_state(new_state); - struct drm_crtc *crtc = new_state->crtc; - struct drm_framebuffer *fb = new_state->fb; - struct drm_gem_object *gem; - struct mtk_drm_gem_obj *mtk_gem; - unsigned int pitch, format; - dma_addr_t addr; - if (!crtc || WARN_ON(!fb)) + if (!new_state->crtc || WARN_ON(!new_state->fb)) return; if (!new_state->visible) { @@ -204,24 +229,7 @@ static void mtk_plane_atomic_update(struct drm_plane *plane, return; } - gem = fb->obj[0]; - mtk_gem = to_mtk_gem_obj(gem); - addr = mtk_gem->dma_addr; - pitch = fb->pitches[0]; - format = fb->format->format; - - addr += (new_state->src.x1 >> 16) * fb->format->cpp[0]; - addr += (new_state->src.y1 >> 16) * pitch; - - mtk_plane_state->pending.enable = true; - mtk_plane_state->pending.pitch = pitch; - mtk_plane_state->pending.format = format; - mtk_plane_state->pending.addr = addr; - mtk_plane_state->pending.x = new_state->dst.x1; - mtk_plane_state->pending.y = new_state->dst.y1; - mtk_plane_state->pending.width = drm_rect_width(&new_state->dst); - mtk_plane_state->pending.height = drm_rect_height(&new_state->dst); - mtk_plane_state->pending.rotation = new_state->rotation; + mtk_plane_update_new_state(new_state, mtk_plane_state); wmb(); /* Make sure the above parameters are set before update */ mtk_plane_state->pending.dirty = true; } -- 2.30.2