From patchwork Mon Jan 16 09:13:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Inki Dae X-Patchwork-Id: 9518279 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 65CD0600C5 for ; Mon, 16 Jan 2017 09:14:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 37E4828342 for ; Mon, 16 Jan 2017 09:14:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2BFA228435; Mon, 16 Jan 2017 09:14:47 +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=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 64F6A28342 for ; Mon, 16 Jan 2017 09:14:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750981AbdAPJOc (ORCPT ); Mon, 16 Jan 2017 04:14:32 -0500 Received: from mailout2.samsung.com ([203.254.224.25]:32890 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750882AbdAPJNa (ORCPT ); Mon, 16 Jan 2017 04:13:30 -0500 Received: from epcas1p2.samsung.com (unknown [182.195.41.46]) by mailout2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OJV0309V8AFYZ70@mailout2.samsung.com> for linux-samsung-soc@vger.kernel.org; Mon, 16 Jan 2017 18:13:27 +0900 (KST) Received: from epsmges5p4.samsung.com (unknown [182.195.40.65]) by epcas1p3.samsung.com (KnoxPortal) with ESMTP id 20170116091327epcas1p303728bd0fe536771853bb7ac50595781~aNaRsahwk0036400364epcas1p3o; Mon, 16 Jan 2017 09:13:27 +0000 (GMT) Received: from epcas5p1.samsung.com ( [182.195.41.39]) by epsmges5p4.samsung.com (EPCPMTA) with SMTP id 4E.6A.22880.7BE8C785; Mon, 16 Jan 2017 18:13:27 +0900 (KST) Received: from epcpsbgm2new.samsung.com (u27.gpu120.samsung.co.kr [203.254.230.27]) by epcas5p1.samsung.com (KnoxPortal) with ESMTP id 20170116091327epcas5p11cf9bbd8abe89543df059688abc32fb7~aNaRecxl63103631036epcas5p1a; Mon, 16 Jan 2017 09:13:27 +0000 (GMT) X-AuditID: b6c32a58-f79946d000005960-de-587c8eb76b51 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2new.samsung.com (EPCPMTA) with SMTP id 47.F0.26370.7BE8C785; Mon, 16 Jan 2017 18:13:27 +0900 (KST) Received: from localhost.localdomain ([10.113.62.206]) by mmp1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OJV001508AECE30@mmp1.samsung.com>; Mon, 16 Jan 2017 18:13:27 +0900 (KST) From: Inki Dae To: dri-devel@lists.freedesktop.org Cc: airlied@linux.ie, linux-samsung-soc@vger.kernel.org, Inki Dae Subject: [PATCH] drm/exynos: use atomic helper commit Date: Mon, 16 Jan 2017 18:13:22 +0900 Message-id: <1484558003-18691-1-git-send-email-inki.dae@samsung.com> X-Mailer: git-send-email 1.9.1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrAKsWRmVeSWpSXmKPExsWy7bCmuu72vpoIg/0fpSx6z51ksrjy9T2b xaT7E1gsZpzfx+TA4rH92wNWj/vdx5k8+rasYvT4vEkugCUq1SYjNTEltUghNS85PyUzL91W yTs43jne1MzAUNfQ0sJcSSEvMTfVVsnFJ0DXLTMHaKWSQlliTilQKCCxuFhJ386mKL+0JFUh I7+4xFYp2tDQSM/QwFzPyMhIz8Q41srIFKgkITVj5Zyv7AUTzComXt/L1sDYq9fFyMkhIWAi sXzVWkYIW0ziwr31bF2MXBxCAksZJXZc/AjltDNJzOpuZYHpeHhuBVRiOaPEsp1v2CGcH4wS jSdAMpwcbAKqEhNX3AezRQSUJf5OXAW2g1kgSuLCpQlgtrCAqcSUp+uZQGwWoPqtO68xg9i8 Ai4Snya/YYLYJidx8thkVpAFEgJ72CSOT74AtI0DyJGV2HSAGcJ0kfiygw2iXFji1fEt7BC2 tMTfpbcYIVq7GSWu9/SwQTgdjBJ/O/9DvWMscf/BPWaI4/gken8/YYIYyivR0SYEUeIhsXP3 bqh7HCXOP+kCKxcSiJW4vvUs2wRG6QWMDKsYxVILinPTU4tNC0z0ihNzi0vz0vWS83M3MYJT h1bEDsZ/M4IOMQpwMCrx8FY8qI4QYk0sK67MPcQowcGsJMJb1VoTIcSbklhZlVqUH19UmpNa fIjRFBg0E5mlRJPzgWktryTe0MTM0MTIEgjNDc2VxHkXVFhHCAmkJ5akZqemFqQWwfQxcXBK NTAKnOxsc7nbKN66a+cZz0UBh+ydeWzq7vNv2anUqqBmx3z5UOC7tFUf3HP017ZPzjkirnWt TOjP721vVj0OKnOOe/mF4eQ1uXn78qICqiNC/qgdWbXyVBZr9d/DTrEvWy7fC4yQ/rUvYd+e 060qdYcrDt4XfO6+Tijnb467U/uxgGr2SJOi81OUWIozEg21mIuKEwEnMsf4MwMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrALMWRmVeSWpSXmKPExsVy+t9jAd3tfTURBmvaeS16z51ksrjy9T2b xaT7E1gsZpzfx+TA4rH92wNWj/vdx5k8+rasYvT4vEkugCXKzSYjNTEltUghNS85PyUzL91W KTTETddCSSEvMTfVVilC1zckSEmhLDGnFMgzMkADDs4B7sFK+nYJbhkr53xlL5hgVjHx+l62 BsZevS5GTg4JAROJh+dWsEHYYhIX7q0Hsrk4hASWMkqc+X2fBSQhJPCDUeLeSUMQm01AVWLi ivtgDSICyhJ/J65iBLGZBaIklh9eyg5iCwuYSkx5up4JxGYBqt+68xoziM0r4CLxafIbJohl chInj01mncDIvYCRYRWjRGpBckFxUnquUV5quV5xYm5xaV66XnJ+7iZGcOg9k97BeHiX+yFG AQ5GJR7eBTuqI4RYE8uKK3MPMUpwMCuJ8Fa11kQI8aYkVlalFuXHF5XmpBYfYjQFOmAis5Ro cj4wLvJK4g1NzE3MjQ0szC0tTYyUxHkbZz8LFxJITyxJzU5NLUgtgulj4uCUamDsvi/cG/h8 auZzX6/N5te1k4NLjGNTWy7tXWgtE9n13MkgQuThDstzufbf65dOmK+c8H//m2svxDUvNa77 d7rB0yOd9avnd/c/9duSNPgjGY2mGvwIS2D83r9AQGTHwj1xO+4aNqfrnrjtK9mQavEwY3vM lHX7ZEL5VRzvdFv2L3w2/aDcWlclluKMREMt5qLiRAAGkucYUwIAAA== X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170116091327epcas5p11cf9bbd8abe89543df059688abc32fb7 X-Msg-Generator: CA X-Sender-IP: 203.254.230.27 X-Local-Sender: =?UTF-8?B?64yA7J246riwG1RpemVuIFBsYXRmb3JtIExhYihTL1fshLw=?= =?UTF-8?B?7YSwKRvsgrzshLHsoITsnpAbUzUo7LGF7J6EKS/ssYXsnoQ=?= X-Global-Sender: =?UTF-8?B?SW5raSBEYWUbVGl6ZW4gUGxhdGZvcm0gTGFiLhtTYW1zdW5n?= =?UTF-8?B?IEVsZWN0cm9uaWNzG1M1L1NlbmlvciBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG1NUQUYbQzEwVjgxMTE=?= CMS-TYPE: 105P DLP-Filter: Pass X-CFilter-Loop: Reflected X-HopCount: 7 X-CMS-RootMailID: 20170116091327epcas5p11cf9bbd8abe89543df059688abc32fb7 X-RootMTR: 20170116091327epcas5p11cf9bbd8abe89543df059688abc32fb7 References: Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch relpaces specific atomic commit function with atomic helper commit one, which also includes atomic_commit_tail callback for Exynos SoC becasue crtc devices on Exynos SoC uses power domain device so drm_atomic_helper_commit_planes should be called after drm_atomic_helper_commit_modeset_enables. Signed-off-by: Inki Dae Reviewed-by: Gustavo Padovan --- drivers/gpu/drm/exynos/exynos_drm_crtc.c | 9 ++- drivers/gpu/drm/exynos/exynos_drm_drv.c | 110 +------------------------------ drivers/gpu/drm/exynos/exynos_drm_fb.c | 25 ++++++- 3 files changed, 33 insertions(+), 111 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index 2530bf5..47da612 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c @@ -39,6 +39,14 @@ static void exynos_drm_crtc_disable(struct drm_crtc *crtc) if (exynos_crtc->ops->disable) exynos_crtc->ops->disable(exynos_crtc); + + if (crtc->state->event && !crtc->state->active) { + spin_lock_irq(&crtc->dev->event_lock); + drm_crtc_send_vblank_event(crtc, crtc->state->event); + spin_unlock_irq(&crtc->dev->event_lock); + + crtc->state->event = NULL; + } } static void @@ -94,7 +102,6 @@ static void exynos_crtc_atomic_flush(struct drm_crtc *crtc, drm_crtc_send_vblank_event(crtc, event); spin_unlock_irqrestore(&crtc->dev->event_lock, flags); } - } static const struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = { diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 3ec0535..9d0df00 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -38,56 +38,6 @@ #define DRIVER_MAJOR 1 #define DRIVER_MINOR 0 -struct exynos_atomic_commit { - struct work_struct work; - struct drm_device *dev; - struct drm_atomic_state *state; - u32 crtcs; -}; - -static void exynos_atomic_commit_complete(struct exynos_atomic_commit *commit) -{ - struct drm_device *dev = commit->dev; - struct exynos_drm_private *priv = dev->dev_private; - struct drm_atomic_state *state = commit->state; - - drm_atomic_helper_commit_modeset_disables(dev, state); - - drm_atomic_helper_commit_modeset_enables(dev, state); - - /* - * Exynos can't update planes with CRTCs and encoders disabled, - * its updates routines, specially for FIMD, requires the clocks - * to be enabled. So it is necessary to handle the modeset operations - * *before* the commit_planes() step, this way it will always - * have the relevant clocks enabled to perform the update. - */ - - drm_atomic_helper_commit_planes(dev, state, 0); - - drm_atomic_helper_wait_for_vblanks(dev, state); - - drm_atomic_helper_cleanup_planes(dev, state); - - drm_atomic_state_put(state); - - spin_lock(&priv->lock); - priv->pending &= ~commit->crtcs; - spin_unlock(&priv->lock); - - wake_up_all(&priv->wait); - - kfree(commit); -} - -static void exynos_drm_atomic_work(struct work_struct *work) -{ - struct exynos_atomic_commit *commit = container_of(work, - struct exynos_atomic_commit, work); - - exynos_atomic_commit_complete(commit); -} - static struct device *exynos_drm_get_dma_device(void); static int exynos_drm_load(struct drm_device *dev, unsigned long flags) @@ -202,65 +152,6 @@ static void exynos_drm_unload(struct drm_device *dev) dev->dev_private = NULL; } -static int commit_is_pending(struct exynos_drm_private *priv, u32 crtcs) -{ - bool pending; - - spin_lock(&priv->lock); - pending = priv->pending & crtcs; - spin_unlock(&priv->lock); - - return pending; -} - -int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state, - bool nonblock) -{ - struct exynos_drm_private *priv = dev->dev_private; - struct exynos_atomic_commit *commit; - struct drm_crtc *crtc; - struct drm_crtc_state *crtc_state; - int i, ret; - - commit = kzalloc(sizeof(*commit), GFP_KERNEL); - if (!commit) - return -ENOMEM; - - ret = drm_atomic_helper_prepare_planes(dev, state); - if (ret) { - kfree(commit); - return ret; - } - - /* This is the point of no return */ - - INIT_WORK(&commit->work, exynos_drm_atomic_work); - commit->dev = dev; - commit->state = state; - - /* Wait until all affected CRTCs have completed previous commits and - * mark them as pending. - */ - for_each_crtc_in_state(state, crtc, crtc_state, i) - commit->crtcs |= drm_crtc_mask(crtc); - - wait_event(priv->wait, !commit_is_pending(priv, commit->crtcs)); - - spin_lock(&priv->lock); - priv->pending |= commit->crtcs; - spin_unlock(&priv->lock); - - drm_atomic_helper_swap_state(state, true); - - drm_atomic_state_get(state); - if (nonblock) - schedule_work(&commit->work); - else - exynos_atomic_commit_complete(commit); - - return 0; -} - int exynos_atomic_check(struct drm_device *dev, struct drm_atomic_state *state) { @@ -313,6 +204,7 @@ static void exynos_drm_preclose(struct drm_device *dev, list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) exynos_drm_crtc_cancel_page_flip(crtc, file); + } static void exynos_drm_postclose(struct drm_device *dev, struct drm_file *file) diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c index 68d4142..1e10b73 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c @@ -187,11 +187,33 @@ dma_addr_t exynos_drm_fb_dma_addr(struct drm_framebuffer *fb, int index) return exynos_fb->dma_addr[index]; } +static void exynos_drm_atomic_commit_tail(struct drm_atomic_state *state) +{ + struct drm_device *dev = state->dev; + + drm_atomic_helper_commit_modeset_disables(dev, state); + + drm_atomic_helper_commit_modeset_enables(dev, state); + + drm_atomic_helper_commit_planes(dev, state, + DRM_PLANE_COMMIT_ACTIVE_ONLY); + + drm_atomic_helper_commit_hw_done(state); + + drm_atomic_helper_wait_for_vblanks(dev, state); + + drm_atomic_helper_cleanup_planes(dev, state); +} + +static struct drm_mode_config_helper_funcs exynos_drm_mode_config_helpers = { + .atomic_commit_tail = exynos_drm_atomic_commit_tail, +}; + static const struct drm_mode_config_funcs exynos_drm_mode_config_funcs = { .fb_create = exynos_user_fb_create, .output_poll_changed = exynos_drm_output_poll_changed, .atomic_check = exynos_atomic_check, - .atomic_commit = exynos_atomic_commit, + .atomic_commit = drm_atomic_helper_commit, }; void exynos_drm_mode_config_init(struct drm_device *dev) @@ -208,4 +230,5 @@ void exynos_drm_mode_config_init(struct drm_device *dev) dev->mode_config.max_height = 4096; dev->mode_config.funcs = &exynos_drm_mode_config_funcs; + dev->mode_config.helper_private = &exynos_drm_mode_config_helpers; }