From patchwork Wed Mar 8 14:58:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrzej Hajda X-Patchwork-Id: 9611365 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 45ECC6046A for ; Wed, 8 Mar 2017 14:59:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1DA6E285BE for ; Wed, 8 Mar 2017 14:59:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1262A285C0; Wed, 8 Mar 2017 14:59:08 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 50FB62857B for ; Wed, 8 Mar 2017 14:59:07 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C352A6E95B; Wed, 8 Mar 2017 14:59:06 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout3.w1.samsung.com (mailout3.w1.samsung.com [210.118.77.13]) by gabe.freedesktop.org (Postfix) with ESMTPS id 537196E95B for ; Wed, 8 Mar 2017 14:59:05 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout3.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OMI003G14AE2YA0@mailout3.w1.samsung.com> for dri-devel@lists.freedesktop.org; Wed, 08 Mar 2017 14:59:02 +0000 (GMT) Received: from eusmges2.samsung.com (unknown [203.254.199.241]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20170308145901eucas1p2175f928872bde3c32ee6c72f2557a424~p8Bj9Fwv62372023720eucas1p2H; Wed, 8 Mar 2017 14:59:01 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges2.samsung.com (EUCPMTA) with SMTP id 9E.BB.30614.53C10C85; Wed, 8 Mar 2017 14:59:01 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20170308145901eucas1p21056f416d8a34fc5af4a4b89ed48ad5a~p8BjMmg3l2371623716eucas1p2S; Wed, 8 Mar 2017 14:59:01 +0000 (GMT) X-AuditID: cbfec7f1-f793f6d000007796-59-58c01c35d006 Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 51.F4.06687.59C10C85; Wed, 8 Mar 2017 15:00:37 +0000 (GMT) Received: from AMDC2768.DIGITAL.local ([106.120.43.17]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OMI0059P4AC5T30@eusync3.samsung.com>; Wed, 08 Mar 2017 14:59:01 +0000 (GMT) From: Andrzej Hajda To: Inki Dae Subject: [PATCH v2 01/12] drm/exynos: move crtc event handling to drivers callbacks Date: Wed, 08 Mar 2017 15:58:35 +0100 Message-id: <1488985126-25288-2-git-send-email-a.hajda@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1488985126-25288-1-git-send-email-a.hajda@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrLIsWRmVeSWpSXmKPExsWy7djPc7qmMgciDD6e07C4te4cq8XGGetZ La58fc9mMen+BBaLN2/XMFmcP7+B3WLG+X1MFmuP3GV34PDYtKqTzeN+93Emjy39d9k9+ras YvT4vEkugDWKyyYlNSezLLVI3y6BK+PqunVMBd91Kj7vUm5gfKTWxcjJISFgIvH6028WCFtM 4sK99WwgtpDAUkaJezuMuxi5gOzPjBIn2k+ywzRM7V3FAlG0jFHi5wRViKL/jBI9kxYygiTY BDQl/m6+CTZJREBZYtW+dnaQImaBDUwSN2c/Byri4BAWCJXYcVwGpIZFQFXi49FWsF5eAWeJ hg1trBDL5CRunutkBrE5BVwk+j5OZgaZIyHwm03izLzrTCBzJARkJTYdYIaod5H4ePYI1DfC Eq+Ob4E6Wkais+MgE0RvN6PEp/4T7BDOFEaJfx9mQHVbSxw+fhFsM7MAn8SkbdOZIRbwSnS0 CUGUeEgc3XcWaoGjxPUr65khvp/OKDFz1iOmCYwyCxgZVjGKpJYW56anFhvpFSfmFpfmpesl 5+duYgRG8ul/xz/uYHx/wuoQowAHoxIPr4DwgQgh1sSy4srcQ4wSHMxKIrwXvu6PEOJNSays Si3Kjy8qzUktPsQozcGiJM67Z8GVcCGB9MSS1OzU1ILUIpgsEwenVANjN4PK2u/Xw2b6bT60 YPuv/ayrhbP9jI1m809omjbP2+THZ42L+zxyf/u2zsmo/HvpSvX9pBs3rptV/jnMVbxmco/d rak3Gp9ZZTG8mBL+c4fjt+mHma8sXF/8+Ci/cjz3Qnf1S/Vn3zLsFgzR9BLZ96RMw7B2wtmq jsBZK0IsPONs3VT+m7l1K7EUZyQaajEXFScCAL0hCDfgAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNLMWRmVeSWpSXmKPExsVy+t/xq7pTZQ5EGDQ80rG4te4cq8XGGetZ La58fc9mMen+BBaLN2/XMFmcP7+B3WLG+X1MFmuP3GV34PDYtKqTzeN+93Emjy39d9k9+ras YvT4vEkugDXKzSYjNTEltUghNS85PyUzL91WKTTETddCSSEvMTfVVilC1zckSEmhLDGnFMgz MkADDs4B7sFK+nYJbhlX161jKviuU/F5l3ID4yO1LkZODgkBE4mpvatYIGwxiQv31rOB2EIC SxglbpwV7GLkArIbmSR+3d7JCpJgE9CU+Lv5JliRiICyxKp97ewgRcwCG5gk7vadBCri4BAW CJXYcVwGpIZFQFXi49FWRhCbV8BZomFDGyvEMjmJm+c6mUFsTgEXib6Pk5lBWoWAapb260xg 5F3AyLCKUSS1tDg3PbfYUK84Mbe4NC9dLzk/dxMjMKC3Hfu5eQfjpY3BhxgFOBiVeHgFhA9E CLEmlhVX5h5ilOBgVhLhvfB1f4QQb0piZVVqUX58UWlOavEhRlOgmyYyS4km5wOjLa8k3tDE 0NzS0MjYwsLcyEhJnLfkw5VwIYH0xJLU7NTUgtQimD4mDk6pBkbnm/pXeh0Di+Zd8+He9yJ8 fptF/Z3JYqvXRXn4a0qEce3tYXfOrIyb/llqwRpp72krxd8fU5Tif6EdzSrpZ/dLeXvraf11 SwozblwyXbT7rbsxV154wh+rh6uuLo7LWnNauKvR5thbhY1CmQv037xbtmbLUX3f4PL0H+tf Xnowh4V5sXHVV00lluKMREMt5qLiRACWvXFSfgIAAA== X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170308145901eucas1p21056f416d8a34fc5af4a4b89ed48ad5a X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?QW5kcnplaiBIYWpkYRtTUlBPTC1LZXJuZWwgKFRQKRvsgrw=?= =?UTF-8?B?7ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?QW5kcnplaiBIYWpkYRtTUlBPTC1LZXJuZWwgKFRQKRtTYW1z?= =?UTF-8?B?dW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20170308145901eucas1p21056f416d8a34fc5af4a4b89ed48ad5a X-RootMTR: 20170308145901eucas1p21056f416d8a34fc5af4a4b89ed48ad5a References: <1488985126-25288-1-git-send-email-a.hajda@samsung.com> Cc: Javier Martinez Canillas , linux-samsung-soc@vger.kernel.org, Bartlomiej Zolnierkiewicz , Krzysztof Kozlowski , dri-devel@lists.freedesktop.org, Marek Szyprowski X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP CRTC event is currently send with next vblank, or instantly in case crtc is being disabled. This approach usually works, but in corner cases it can result in premature event generation. Only device driver is able to verify if the event can be sent. This patch is a first step in that direction - it moves event handling to the drivers. Signed-off-by: Andrzej Hajda --- drivers/gpu/drm/exynos/exynos5433_drm_decon.c | 1 + drivers/gpu/drm/exynos/exynos7_drm_decon.c | 1 + drivers/gpu/drm/exynos/exynos_drm_crtc.c | 29 +++++++++++++++------------ drivers/gpu/drm/exynos/exynos_drm_crtc.h | 2 ++ drivers/gpu/drm/exynos/exynos_drm_fimd.c | 2 ++ drivers/gpu/drm/exynos/exynos_drm_vidi.c | 1 + drivers/gpu/drm/exynos/exynos_mixer.c | 1 + 7 files changed, 24 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c index 0fd6f7a..147911e 100644 --- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c @@ -378,6 +378,7 @@ static void decon_atomic_flush(struct exynos_drm_crtc *crtc) if (ctx->out_type & IFTYPE_I80) set_bit(BIT_WIN_UPDATED, &ctx->flags); + exynos_crtc_handle_event(crtc); } static void decon_swreset(struct decon_context *ctx) diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c index f9ab19e..4881180 100644 --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c @@ -526,6 +526,7 @@ static void decon_atomic_flush(struct exynos_drm_crtc *crtc) for (i = 0; i < WINDOWS_NR; i++) decon_shadow_protect_win(ctx, i, false); + exynos_crtc_handle_event(crtc); } static void decon_init(struct decon_context *ctx) diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index fa32091..0620d3c 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c @@ -85,16 +85,28 @@ static void exynos_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state *old_crtc_state) { struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); - struct drm_pending_vblank_event *event; - unsigned long flags; if (exynos_crtc->ops->atomic_flush) exynos_crtc->ops->atomic_flush(exynos_crtc); +} + +static const struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = { + .enable = exynos_drm_crtc_enable, + .disable = exynos_drm_crtc_disable, + .mode_set_nofb = exynos_drm_crtc_mode_set_nofb, + .atomic_check = exynos_crtc_atomic_check, + .atomic_begin = exynos_crtc_atomic_begin, + .atomic_flush = exynos_crtc_atomic_flush, +}; + +void exynos_crtc_handle_event(struct exynos_drm_crtc *exynos_crtc) +{ + struct drm_crtc *crtc = &exynos_crtc->base; + struct drm_pending_vblank_event *event = crtc->state->event; + unsigned long flags; - event = crtc->state->event; if (event) { crtc->state->event = NULL; - spin_lock_irqsave(&crtc->dev->event_lock, flags); if (drm_crtc_vblank_get(crtc) == 0) drm_crtc_arm_vblank_event(crtc, event); @@ -105,15 +117,6 @@ static void exynos_crtc_atomic_flush(struct drm_crtc *crtc, } -static const struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = { - .enable = exynos_drm_crtc_enable, - .disable = exynos_drm_crtc_disable, - .mode_set_nofb = exynos_drm_crtc_mode_set_nofb, - .atomic_check = exynos_crtc_atomic_check, - .atomic_begin = exynos_crtc_atomic_begin, - .atomic_flush = exynos_crtc_atomic_flush, -}; - static void exynos_drm_crtc_destroy(struct drm_crtc *crtc) { struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.h b/drivers/gpu/drm/exynos/exynos_drm_crtc.h index 4e986ba..9634fe5 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.h +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.h @@ -38,4 +38,6 @@ int exynos_drm_crtc_get_pipe_from_type(struct drm_device *drm_dev, */ void exynos_drm_crtc_te_handler(struct drm_crtc *crtc); +void exynos_crtc_handle_event(struct exynos_drm_crtc *exynos_crtc); + #endif diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index a9fa444..69ebed0 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -723,6 +723,8 @@ static void fimd_atomic_flush(struct exynos_drm_crtc *crtc) for (i = 0; i < WINDOWS_NR; i++) fimd_shadow_protect_win(ctx, i, false); + + exynos_crtc_handle_event(crtc); } static void fimd_update_plane(struct exynos_drm_crtc *crtc, diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index 57fe514..5d9a62a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c @@ -170,6 +170,7 @@ static const struct exynos_drm_crtc_ops vidi_crtc_ops = { .enable_vblank = vidi_enable_vblank, .disable_vblank = vidi_disable_vblank, .update_plane = vidi_update_plane, + .atomic_flush = exynos_crtc_handle_event, }; static void vidi_fake_vblank_timer(unsigned long arg) diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 72143ac..25edb63 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c @@ -1012,6 +1012,7 @@ static void mixer_atomic_flush(struct exynos_drm_crtc *crtc) return; mixer_vsync_set_update(mixer_ctx, true); + exynos_crtc_handle_event(crtc); } static void mixer_enable(struct exynos_drm_crtc *crtc)