From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.0 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A352AC433E8 for ; Tue, 14 Jul 2020 09:55:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 87EA1221FD for ; Tue, 14 Jul 2020 09:55:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726375AbgGNJzp (ORCPT ); Tue, 14 Jul 2020 05:55:45 -0400 Received: from asavdk4.altibox.net ([109.247.116.15]:46660 "EHLO asavdk4.altibox.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725884AbgGNJzp (ORCPT ); Tue, 14 Jul 2020 05:55:45 -0400 Received: from ravnborg.org (unknown [188.228.123.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk4.altibox.net (Postfix) with ESMTPS id 52ECD804E0; Tue, 14 Jul 2020 11:55:39 +0200 (CEST) Date: Tue, 14 Jul 2020 11:55:37 +0200 From: Sam Ravnborg To: Daniel Vetter Cc: DRI Development , Alexandre Belloni , Boris Brezillon , linux-rdma@vger.kernel.org, Intel Graphics Development , Nicolas Ferre , Ludovic Desroches , Daniel Vetter , linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH] drm/atmel: Use drm_atomic_helper_commit Message-ID: <20200714095537.GA1573094@ravnborg.org> References: <20200707201229.472834-10-daniel.vetter@ffwll.ch> <20200707213137.482778-1-daniel.vetter@ffwll.ch> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200707213137.482778-1-daniel.vetter@ffwll.ch> X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=aP3eV41m c=1 sm=1 tr=0 a=S6zTFyMACwkrwXSdXUNehg==:117 a=S6zTFyMACwkrwXSdXUNehg==:17 a=kj9zAlcOel0A:10 a=QyXUC8HyAAAA:8 a=7gkXJVJtAAAA:8 a=VwQbUJbxAAAA:8 a=XYAwZIGsAAAA:8 a=P-IC7800AAAA:8 a=JfrnYn6hAAAA:8 a=e5mUnYsNAAAA:8 a=h6CN_4qJII8sBilvXN4A:9 a=CjuIK1q_8ugA:10 a=E9Po1WZjFZOl8hwRPBS3:22 a=AjGcO6oz07-iQ99wixmX:22 a=E8ToXWR_bxluHZ7gmE-Z:22 a=d3PnA9EDa4IxuAV0gXij:22 a=1CNFftbPRP8L7MoqJWF3:22 a=Vxmtnl_E_bksehYqCbjh:22 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org Hi Daniel. On Tue, Jul 07, 2020 at 11:31:37PM +0200, Daniel Vetter wrote: > One of these drivers that predates the nonblocking support in helpers, > and hand-rolled its own thing. Entirely not anything specific here, we > can just delete it all and replace it with the helper version. > > Could also perhaps use the drm_mode_config_helper_suspend/resume > stuff, for another few lines deleted. But I'm not looking at that > stuff, I'm just going through all the atomic commit functions and make > sure they have properly annotated dma-fence critical sections > everywhere. > > v2: > - Also delete the workqueue (Sam) > - drop the @commit kerneldoc, I missed that one. > > Signed-off-by: Daniel Vetter > Cc: Sam Ravnborg > Cc: Boris Brezillon > Cc: Nicolas Ferre > Cc: Alexandre Belloni > Cc: Ludovic Desroches > Cc: linux-arm-kernel@lists.infradead.org I did succeed getttign my board operational. But based on reading the code: Reviewed-by: Sam Ravnborg I assume you will apply it. Sam > --- > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 107 +------------------ > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h | 7 -- > 2 files changed, 2 insertions(+), 112 deletions(-) > > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > index 871293d1aeeb..03984932d174 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > @@ -557,103 +557,10 @@ static irqreturn_t atmel_hlcdc_dc_irq_handler(int irq, void *data) > return IRQ_HANDLED; > } > > -struct atmel_hlcdc_dc_commit { > - struct work_struct work; > - struct drm_device *dev; > - struct drm_atomic_state *state; > -}; > - > -static void > -atmel_hlcdc_dc_atomic_complete(struct atmel_hlcdc_dc_commit *commit) > -{ > - struct drm_device *dev = commit->dev; > - struct atmel_hlcdc_dc *dc = dev->dev_private; > - struct drm_atomic_state *old_state = commit->state; > - > - /* Apply the atomic update. */ > - drm_atomic_helper_commit_modeset_disables(dev, old_state); > - drm_atomic_helper_commit_planes(dev, old_state, 0); > - drm_atomic_helper_commit_modeset_enables(dev, old_state); > - > - drm_atomic_helper_wait_for_vblanks(dev, old_state); > - > - drm_atomic_helper_cleanup_planes(dev, old_state); > - > - drm_atomic_state_put(old_state); > - > - /* Complete the commit, wake up any waiter. */ > - spin_lock(&dc->commit.wait.lock); > - dc->commit.pending = false; > - wake_up_all_locked(&dc->commit.wait); > - spin_unlock(&dc->commit.wait.lock); > - > - kfree(commit); > -} > - > -static void atmel_hlcdc_dc_atomic_work(struct work_struct *work) > -{ > - struct atmel_hlcdc_dc_commit *commit = > - container_of(work, struct atmel_hlcdc_dc_commit, work); > - > - atmel_hlcdc_dc_atomic_complete(commit); > -} > - > -static int atmel_hlcdc_dc_atomic_commit(struct drm_device *dev, > - struct drm_atomic_state *state, > - bool async) > -{ > - struct atmel_hlcdc_dc *dc = dev->dev_private; > - struct atmel_hlcdc_dc_commit *commit; > - int ret; > - > - ret = drm_atomic_helper_prepare_planes(dev, state); > - if (ret) > - return ret; > - > - /* Allocate the commit object. */ > - commit = kzalloc(sizeof(*commit), GFP_KERNEL); > - if (!commit) { > - ret = -ENOMEM; > - goto error; > - } > - > - INIT_WORK(&commit->work, atmel_hlcdc_dc_atomic_work); > - commit->dev = dev; > - commit->state = state; > - > - spin_lock(&dc->commit.wait.lock); > - ret = wait_event_interruptible_locked(dc->commit.wait, > - !dc->commit.pending); > - if (ret == 0) > - dc->commit.pending = true; > - spin_unlock(&dc->commit.wait.lock); > - > - if (ret) > - goto err_free; > - > - /* We have our own synchronization through the commit lock. */ > - BUG_ON(drm_atomic_helper_swap_state(state, false) < 0); > - > - /* Swap state succeeded, this is the point of no return. */ > - drm_atomic_state_get(state); > - if (async) > - queue_work(dc->wq, &commit->work); > - else > - atmel_hlcdc_dc_atomic_complete(commit); > - > - return 0; > - > -err_free: > - kfree(commit); > -error: > - drm_atomic_helper_cleanup_planes(dev, state); > - return ret; > -} > - > static const struct drm_mode_config_funcs mode_config_funcs = { > .fb_create = drm_gem_fb_create, > .atomic_check = drm_atomic_helper_check, > - .atomic_commit = atmel_hlcdc_dc_atomic_commit, > + .atomic_commit = drm_atomic_helper_commit, > }; > > static int atmel_hlcdc_dc_modeset_init(struct drm_device *dev) > @@ -712,11 +619,6 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > if (!dc) > return -ENOMEM; > > - dc->wq = alloc_ordered_workqueue("atmel-hlcdc-dc", 0); > - if (!dc->wq) > - return -ENOMEM; > - > - init_waitqueue_head(&dc->commit.wait); > dc->desc = match->data; > dc->hlcdc = dev_get_drvdata(dev->dev->parent); > dev->dev_private = dc; > @@ -724,7 +626,7 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > ret = clk_prepare_enable(dc->hlcdc->periph_clk); > if (ret) { > dev_err(dev->dev, "failed to enable periph_clk\n"); > - goto err_destroy_wq; > + return ret; > } > > pm_runtime_enable(dev->dev); > @@ -761,9 +663,6 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > pm_runtime_disable(dev->dev); > clk_disable_unprepare(dc->hlcdc->periph_clk); > > -err_destroy_wq: > - destroy_workqueue(dc->wq); > - > return ret; > } > > @@ -771,7 +670,6 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev) > { > struct atmel_hlcdc_dc *dc = dev->dev_private; > > - flush_workqueue(dc->wq); > drm_kms_helper_poll_fini(dev); > drm_atomic_helper_shutdown(dev); > drm_mode_config_cleanup(dev); > @@ -784,7 +682,6 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev) > > pm_runtime_disable(dev->dev); > clk_disable_unprepare(dc->hlcdc->periph_clk); > - destroy_workqueue(dc->wq); > } > > static int atmel_hlcdc_dc_irq_postinstall(struct drm_device *dev) > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > index 469d4507e576..5b5c774e0edf 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > @@ -331,9 +331,7 @@ struct atmel_hlcdc_dc_desc { > * @crtc: CRTC provided by the display controller > * @planes: instantiated planes > * @layers: active HLCDC layers > - * @wq: display controller workqueue > * @suspend: used to store the HLCDC state when entering suspend > - * @commit: used for async commit handling > */ > struct atmel_hlcdc_dc { > const struct atmel_hlcdc_dc_desc *desc; > @@ -341,15 +339,10 @@ struct atmel_hlcdc_dc { > struct atmel_hlcdc *hlcdc; > struct drm_crtc *crtc; > struct atmel_hlcdc_layer *layers[ATMEL_HLCDC_MAX_LAYERS]; > - struct workqueue_struct *wq; > struct { > u32 imr; > struct drm_atomic_state *state; > } suspend; > - struct { > - wait_queue_head_t wait; > - bool pending; > - } commit; > }; > > extern struct atmel_hlcdc_formats atmel_hlcdc_plane_rgb_formats; > -- > 2.27.0 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5493CC433E0 for ; Tue, 14 Jul 2020 09:57:14 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1F4BF217A0 for ; Tue, 14 Jul 2020 09:57:14 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="hYk1EBhQ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1F4BF217A0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ravnborg.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=D3H55tUOvk7Pi1+V3nd9Xm3u7daG9DopVKLOv/rqBic=; b=hYk1EBhQq3N+xHldlJSBLarKF abNxVo0bNt8+TFQv9xOki7P78sttwpZow1VZwrSM7ONKGLwRNhExEb957qnywo6aXlkmfZZrbpn64 Po27BHBNzvTLNs15U6V0zqgS+kQNOA94xe0L/sPgFquRC6AqPtEhq0owfdNgn+8Q9cCNTXNJQ9SrX n+OIChPAfYzGIvP2FhOEmO810Ba9sLf10v7vqAka91BtEHtgeGTGxPq2JBbG6tmVllWS3U+7u/W9Y EVNv6eysEIXkcE+HCsasbONwXTmOqNoSoQU7GaYUcDAGYZn8uzDKIYTAf0NhSPyv66xVbsAV4+HTC uviyPMNmg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jvHfF-0001fC-JZ; Tue, 14 Jul 2020 09:55:53 +0000 Received: from asavdk4.altibox.net ([109.247.116.15]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jvHfB-0001b9-Qp for linux-arm-kernel@lists.infradead.org; Tue, 14 Jul 2020 09:55:51 +0000 Received: from ravnborg.org (unknown [188.228.123.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk4.altibox.net (Postfix) with ESMTPS id 52ECD804E0; Tue, 14 Jul 2020 11:55:39 +0200 (CEST) Date: Tue, 14 Jul 2020 11:55:37 +0200 From: Sam Ravnborg To: Daniel Vetter Subject: Re: [PATCH] drm/atmel: Use drm_atomic_helper_commit Message-ID: <20200714095537.GA1573094@ravnborg.org> References: <20200707201229.472834-10-daniel.vetter@ffwll.ch> <20200707213137.482778-1-daniel.vetter@ffwll.ch> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20200707213137.482778-1-daniel.vetter@ffwll.ch> X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=aP3eV41m c=1 sm=1 tr=0 a=S6zTFyMACwkrwXSdXUNehg==:117 a=S6zTFyMACwkrwXSdXUNehg==:17 a=kj9zAlcOel0A:10 a=QyXUC8HyAAAA:8 a=7gkXJVJtAAAA:8 a=VwQbUJbxAAAA:8 a=XYAwZIGsAAAA:8 a=P-IC7800AAAA:8 a=JfrnYn6hAAAA:8 a=e5mUnYsNAAAA:8 a=h6CN_4qJII8sBilvXN4A:9 a=CjuIK1q_8ugA:10 a=E9Po1WZjFZOl8hwRPBS3:22 a=AjGcO6oz07-iQ99wixmX:22 a=E8ToXWR_bxluHZ7gmE-Z:22 a=d3PnA9EDa4IxuAV0gXij:22 a=1CNFftbPRP8L7MoqJWF3:22 a=Vxmtnl_E_bksehYqCbjh:22 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200714_055550_186527_575A2134 X-CRM114-Status: GOOD ( 29.02 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Alexandre Belloni , Boris Brezillon , linux-rdma@vger.kernel.org, Intel Graphics Development , DRI Development , Ludovic Desroches , Daniel Vetter , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Daniel. On Tue, Jul 07, 2020 at 11:31:37PM +0200, Daniel Vetter wrote: > One of these drivers that predates the nonblocking support in helpers, > and hand-rolled its own thing. Entirely not anything specific here, we > can just delete it all and replace it with the helper version. > > Could also perhaps use the drm_mode_config_helper_suspend/resume > stuff, for another few lines deleted. But I'm not looking at that > stuff, I'm just going through all the atomic commit functions and make > sure they have properly annotated dma-fence critical sections > everywhere. > > v2: > - Also delete the workqueue (Sam) > - drop the @commit kerneldoc, I missed that one. > > Signed-off-by: Daniel Vetter > Cc: Sam Ravnborg > Cc: Boris Brezillon > Cc: Nicolas Ferre > Cc: Alexandre Belloni > Cc: Ludovic Desroches > Cc: linux-arm-kernel@lists.infradead.org I did succeed getttign my board operational. But based on reading the code: Reviewed-by: Sam Ravnborg I assume you will apply it. Sam > --- > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 107 +------------------ > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h | 7 -- > 2 files changed, 2 insertions(+), 112 deletions(-) > > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > index 871293d1aeeb..03984932d174 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > @@ -557,103 +557,10 @@ static irqreturn_t atmel_hlcdc_dc_irq_handler(int irq, void *data) > return IRQ_HANDLED; > } > > -struct atmel_hlcdc_dc_commit { > - struct work_struct work; > - struct drm_device *dev; > - struct drm_atomic_state *state; > -}; > - > -static void > -atmel_hlcdc_dc_atomic_complete(struct atmel_hlcdc_dc_commit *commit) > -{ > - struct drm_device *dev = commit->dev; > - struct atmel_hlcdc_dc *dc = dev->dev_private; > - struct drm_atomic_state *old_state = commit->state; > - > - /* Apply the atomic update. */ > - drm_atomic_helper_commit_modeset_disables(dev, old_state); > - drm_atomic_helper_commit_planes(dev, old_state, 0); > - drm_atomic_helper_commit_modeset_enables(dev, old_state); > - > - drm_atomic_helper_wait_for_vblanks(dev, old_state); > - > - drm_atomic_helper_cleanup_planes(dev, old_state); > - > - drm_atomic_state_put(old_state); > - > - /* Complete the commit, wake up any waiter. */ > - spin_lock(&dc->commit.wait.lock); > - dc->commit.pending = false; > - wake_up_all_locked(&dc->commit.wait); > - spin_unlock(&dc->commit.wait.lock); > - > - kfree(commit); > -} > - > -static void atmel_hlcdc_dc_atomic_work(struct work_struct *work) > -{ > - struct atmel_hlcdc_dc_commit *commit = > - container_of(work, struct atmel_hlcdc_dc_commit, work); > - > - atmel_hlcdc_dc_atomic_complete(commit); > -} > - > -static int atmel_hlcdc_dc_atomic_commit(struct drm_device *dev, > - struct drm_atomic_state *state, > - bool async) > -{ > - struct atmel_hlcdc_dc *dc = dev->dev_private; > - struct atmel_hlcdc_dc_commit *commit; > - int ret; > - > - ret = drm_atomic_helper_prepare_planes(dev, state); > - if (ret) > - return ret; > - > - /* Allocate the commit object. */ > - commit = kzalloc(sizeof(*commit), GFP_KERNEL); > - if (!commit) { > - ret = -ENOMEM; > - goto error; > - } > - > - INIT_WORK(&commit->work, atmel_hlcdc_dc_atomic_work); > - commit->dev = dev; > - commit->state = state; > - > - spin_lock(&dc->commit.wait.lock); > - ret = wait_event_interruptible_locked(dc->commit.wait, > - !dc->commit.pending); > - if (ret == 0) > - dc->commit.pending = true; > - spin_unlock(&dc->commit.wait.lock); > - > - if (ret) > - goto err_free; > - > - /* We have our own synchronization through the commit lock. */ > - BUG_ON(drm_atomic_helper_swap_state(state, false) < 0); > - > - /* Swap state succeeded, this is the point of no return. */ > - drm_atomic_state_get(state); > - if (async) > - queue_work(dc->wq, &commit->work); > - else > - atmel_hlcdc_dc_atomic_complete(commit); > - > - return 0; > - > -err_free: > - kfree(commit); > -error: > - drm_atomic_helper_cleanup_planes(dev, state); > - return ret; > -} > - > static const struct drm_mode_config_funcs mode_config_funcs = { > .fb_create = drm_gem_fb_create, > .atomic_check = drm_atomic_helper_check, > - .atomic_commit = atmel_hlcdc_dc_atomic_commit, > + .atomic_commit = drm_atomic_helper_commit, > }; > > static int atmel_hlcdc_dc_modeset_init(struct drm_device *dev) > @@ -712,11 +619,6 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > if (!dc) > return -ENOMEM; > > - dc->wq = alloc_ordered_workqueue("atmel-hlcdc-dc", 0); > - if (!dc->wq) > - return -ENOMEM; > - > - init_waitqueue_head(&dc->commit.wait); > dc->desc = match->data; > dc->hlcdc = dev_get_drvdata(dev->dev->parent); > dev->dev_private = dc; > @@ -724,7 +626,7 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > ret = clk_prepare_enable(dc->hlcdc->periph_clk); > if (ret) { > dev_err(dev->dev, "failed to enable periph_clk\n"); > - goto err_destroy_wq; > + return ret; > } > > pm_runtime_enable(dev->dev); > @@ -761,9 +663,6 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > pm_runtime_disable(dev->dev); > clk_disable_unprepare(dc->hlcdc->periph_clk); > > -err_destroy_wq: > - destroy_workqueue(dc->wq); > - > return ret; > } > > @@ -771,7 +670,6 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev) > { > struct atmel_hlcdc_dc *dc = dev->dev_private; > > - flush_workqueue(dc->wq); > drm_kms_helper_poll_fini(dev); > drm_atomic_helper_shutdown(dev); > drm_mode_config_cleanup(dev); > @@ -784,7 +682,6 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev) > > pm_runtime_disable(dev->dev); > clk_disable_unprepare(dc->hlcdc->periph_clk); > - destroy_workqueue(dc->wq); > } > > static int atmel_hlcdc_dc_irq_postinstall(struct drm_device *dev) > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > index 469d4507e576..5b5c774e0edf 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > @@ -331,9 +331,7 @@ struct atmel_hlcdc_dc_desc { > * @crtc: CRTC provided by the display controller > * @planes: instantiated planes > * @layers: active HLCDC layers > - * @wq: display controller workqueue > * @suspend: used to store the HLCDC state when entering suspend > - * @commit: used for async commit handling > */ > struct atmel_hlcdc_dc { > const struct atmel_hlcdc_dc_desc *desc; > @@ -341,15 +339,10 @@ struct atmel_hlcdc_dc { > struct atmel_hlcdc *hlcdc; > struct drm_crtc *crtc; > struct atmel_hlcdc_layer *layers[ATMEL_HLCDC_MAX_LAYERS]; > - struct workqueue_struct *wq; > struct { > u32 imr; > struct drm_atomic_state *state; > } suspend; > - struct { > - wait_queue_head_t wait; > - bool pending; > - } commit; > }; > > extern struct atmel_hlcdc_formats atmel_hlcdc_plane_rgb_formats; > -- > 2.27.0 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.0 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 09D52C433EB for ; Tue, 14 Jul 2020 09:55:49 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D8E4321897 for ; Tue, 14 Jul 2020 09:55:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D8E4321897 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ravnborg.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 503E56E7F5; Tue, 14 Jul 2020 09:55:45 +0000 (UTC) Received: from asavdk4.altibox.net (asavdk4.altibox.net [109.247.116.15]) by gabe.freedesktop.org (Postfix) with ESMTPS id ABDA16E7F1; Tue, 14 Jul 2020 09:55:43 +0000 (UTC) Received: from ravnborg.org (unknown [188.228.123.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk4.altibox.net (Postfix) with ESMTPS id 52ECD804E0; Tue, 14 Jul 2020 11:55:39 +0200 (CEST) Date: Tue, 14 Jul 2020 11:55:37 +0200 From: Sam Ravnborg To: Daniel Vetter Subject: Re: [PATCH] drm/atmel: Use drm_atomic_helper_commit Message-ID: <20200714095537.GA1573094@ravnborg.org> References: <20200707201229.472834-10-daniel.vetter@ffwll.ch> <20200707213137.482778-1-daniel.vetter@ffwll.ch> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20200707213137.482778-1-daniel.vetter@ffwll.ch> X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=aP3eV41m c=1 sm=1 tr=0 a=S6zTFyMACwkrwXSdXUNehg==:117 a=S6zTFyMACwkrwXSdXUNehg==:17 a=kj9zAlcOel0A:10 a=QyXUC8HyAAAA:8 a=7gkXJVJtAAAA:8 a=VwQbUJbxAAAA:8 a=XYAwZIGsAAAA:8 a=P-IC7800AAAA:8 a=JfrnYn6hAAAA:8 a=e5mUnYsNAAAA:8 a=h6CN_4qJII8sBilvXN4A:9 a=CjuIK1q_8ugA:10 a=E9Po1WZjFZOl8hwRPBS3:22 a=AjGcO6oz07-iQ99wixmX:22 a=E8ToXWR_bxluHZ7gmE-Z:22 a=d3PnA9EDa4IxuAV0gXij:22 a=1CNFftbPRP8L7MoqJWF3:22 a=Vxmtnl_E_bksehYqCbjh:22 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Alexandre Belloni , Boris Brezillon , linux-rdma@vger.kernel.org, Intel Graphics Development , Nicolas Ferre , DRI Development , Ludovic Desroches , Daniel Vetter , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Hi Daniel. On Tue, Jul 07, 2020 at 11:31:37PM +0200, Daniel Vetter wrote: > One of these drivers that predates the nonblocking support in helpers, > and hand-rolled its own thing. Entirely not anything specific here, we > can just delete it all and replace it with the helper version. > > Could also perhaps use the drm_mode_config_helper_suspend/resume > stuff, for another few lines deleted. But I'm not looking at that > stuff, I'm just going through all the atomic commit functions and make > sure they have properly annotated dma-fence critical sections > everywhere. > > v2: > - Also delete the workqueue (Sam) > - drop the @commit kerneldoc, I missed that one. > > Signed-off-by: Daniel Vetter > Cc: Sam Ravnborg > Cc: Boris Brezillon > Cc: Nicolas Ferre > Cc: Alexandre Belloni > Cc: Ludovic Desroches > Cc: linux-arm-kernel@lists.infradead.org I did succeed getttign my board operational. But based on reading the code: Reviewed-by: Sam Ravnborg I assume you will apply it. Sam > --- > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 107 +------------------ > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h | 7 -- > 2 files changed, 2 insertions(+), 112 deletions(-) > > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > index 871293d1aeeb..03984932d174 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > @@ -557,103 +557,10 @@ static irqreturn_t atmel_hlcdc_dc_irq_handler(int irq, void *data) > return IRQ_HANDLED; > } > > -struct atmel_hlcdc_dc_commit { > - struct work_struct work; > - struct drm_device *dev; > - struct drm_atomic_state *state; > -}; > - > -static void > -atmel_hlcdc_dc_atomic_complete(struct atmel_hlcdc_dc_commit *commit) > -{ > - struct drm_device *dev = commit->dev; > - struct atmel_hlcdc_dc *dc = dev->dev_private; > - struct drm_atomic_state *old_state = commit->state; > - > - /* Apply the atomic update. */ > - drm_atomic_helper_commit_modeset_disables(dev, old_state); > - drm_atomic_helper_commit_planes(dev, old_state, 0); > - drm_atomic_helper_commit_modeset_enables(dev, old_state); > - > - drm_atomic_helper_wait_for_vblanks(dev, old_state); > - > - drm_atomic_helper_cleanup_planes(dev, old_state); > - > - drm_atomic_state_put(old_state); > - > - /* Complete the commit, wake up any waiter. */ > - spin_lock(&dc->commit.wait.lock); > - dc->commit.pending = false; > - wake_up_all_locked(&dc->commit.wait); > - spin_unlock(&dc->commit.wait.lock); > - > - kfree(commit); > -} > - > -static void atmel_hlcdc_dc_atomic_work(struct work_struct *work) > -{ > - struct atmel_hlcdc_dc_commit *commit = > - container_of(work, struct atmel_hlcdc_dc_commit, work); > - > - atmel_hlcdc_dc_atomic_complete(commit); > -} > - > -static int atmel_hlcdc_dc_atomic_commit(struct drm_device *dev, > - struct drm_atomic_state *state, > - bool async) > -{ > - struct atmel_hlcdc_dc *dc = dev->dev_private; > - struct atmel_hlcdc_dc_commit *commit; > - int ret; > - > - ret = drm_atomic_helper_prepare_planes(dev, state); > - if (ret) > - return ret; > - > - /* Allocate the commit object. */ > - commit = kzalloc(sizeof(*commit), GFP_KERNEL); > - if (!commit) { > - ret = -ENOMEM; > - goto error; > - } > - > - INIT_WORK(&commit->work, atmel_hlcdc_dc_atomic_work); > - commit->dev = dev; > - commit->state = state; > - > - spin_lock(&dc->commit.wait.lock); > - ret = wait_event_interruptible_locked(dc->commit.wait, > - !dc->commit.pending); > - if (ret == 0) > - dc->commit.pending = true; > - spin_unlock(&dc->commit.wait.lock); > - > - if (ret) > - goto err_free; > - > - /* We have our own synchronization through the commit lock. */ > - BUG_ON(drm_atomic_helper_swap_state(state, false) < 0); > - > - /* Swap state succeeded, this is the point of no return. */ > - drm_atomic_state_get(state); > - if (async) > - queue_work(dc->wq, &commit->work); > - else > - atmel_hlcdc_dc_atomic_complete(commit); > - > - return 0; > - > -err_free: > - kfree(commit); > -error: > - drm_atomic_helper_cleanup_planes(dev, state); > - return ret; > -} > - > static const struct drm_mode_config_funcs mode_config_funcs = { > .fb_create = drm_gem_fb_create, > .atomic_check = drm_atomic_helper_check, > - .atomic_commit = atmel_hlcdc_dc_atomic_commit, > + .atomic_commit = drm_atomic_helper_commit, > }; > > static int atmel_hlcdc_dc_modeset_init(struct drm_device *dev) > @@ -712,11 +619,6 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > if (!dc) > return -ENOMEM; > > - dc->wq = alloc_ordered_workqueue("atmel-hlcdc-dc", 0); > - if (!dc->wq) > - return -ENOMEM; > - > - init_waitqueue_head(&dc->commit.wait); > dc->desc = match->data; > dc->hlcdc = dev_get_drvdata(dev->dev->parent); > dev->dev_private = dc; > @@ -724,7 +626,7 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > ret = clk_prepare_enable(dc->hlcdc->periph_clk); > if (ret) { > dev_err(dev->dev, "failed to enable periph_clk\n"); > - goto err_destroy_wq; > + return ret; > } > > pm_runtime_enable(dev->dev); > @@ -761,9 +663,6 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > pm_runtime_disable(dev->dev); > clk_disable_unprepare(dc->hlcdc->periph_clk); > > -err_destroy_wq: > - destroy_workqueue(dc->wq); > - > return ret; > } > > @@ -771,7 +670,6 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev) > { > struct atmel_hlcdc_dc *dc = dev->dev_private; > > - flush_workqueue(dc->wq); > drm_kms_helper_poll_fini(dev); > drm_atomic_helper_shutdown(dev); > drm_mode_config_cleanup(dev); > @@ -784,7 +682,6 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev) > > pm_runtime_disable(dev->dev); > clk_disable_unprepare(dc->hlcdc->periph_clk); > - destroy_workqueue(dc->wq); > } > > static int atmel_hlcdc_dc_irq_postinstall(struct drm_device *dev) > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > index 469d4507e576..5b5c774e0edf 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > @@ -331,9 +331,7 @@ struct atmel_hlcdc_dc_desc { > * @crtc: CRTC provided by the display controller > * @planes: instantiated planes > * @layers: active HLCDC layers > - * @wq: display controller workqueue > * @suspend: used to store the HLCDC state when entering suspend > - * @commit: used for async commit handling > */ > struct atmel_hlcdc_dc { > const struct atmel_hlcdc_dc_desc *desc; > @@ -341,15 +339,10 @@ struct atmel_hlcdc_dc { > struct atmel_hlcdc *hlcdc; > struct drm_crtc *crtc; > struct atmel_hlcdc_layer *layers[ATMEL_HLCDC_MAX_LAYERS]; > - struct workqueue_struct *wq; > struct { > u32 imr; > struct drm_atomic_state *state; > } suspend; > - struct { > - wait_queue_head_t wait; > - bool pending; > - } commit; > }; > > extern struct atmel_hlcdc_formats atmel_hlcdc_plane_rgb_formats; > -- > 2.27.0 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.0 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 037FFC433E5 for ; Tue, 14 Jul 2020 09:55:46 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D7203221F5 for ; Tue, 14 Jul 2020 09:55:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D7203221F5 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ravnborg.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3AC966E7F1; Tue, 14 Jul 2020 09:55:45 +0000 (UTC) Received: from asavdk4.altibox.net (asavdk4.altibox.net [109.247.116.15]) by gabe.freedesktop.org (Postfix) with ESMTPS id ABDA16E7F1; Tue, 14 Jul 2020 09:55:43 +0000 (UTC) Received: from ravnborg.org (unknown [188.228.123.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk4.altibox.net (Postfix) with ESMTPS id 52ECD804E0; Tue, 14 Jul 2020 11:55:39 +0200 (CEST) Date: Tue, 14 Jul 2020 11:55:37 +0200 From: Sam Ravnborg To: Daniel Vetter Message-ID: <20200714095537.GA1573094@ravnborg.org> References: <20200707201229.472834-10-daniel.vetter@ffwll.ch> <20200707213137.482778-1-daniel.vetter@ffwll.ch> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20200707213137.482778-1-daniel.vetter@ffwll.ch> X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=aP3eV41m c=1 sm=1 tr=0 a=S6zTFyMACwkrwXSdXUNehg==:117 a=S6zTFyMACwkrwXSdXUNehg==:17 a=kj9zAlcOel0A:10 a=QyXUC8HyAAAA:8 a=7gkXJVJtAAAA:8 a=VwQbUJbxAAAA:8 a=XYAwZIGsAAAA:8 a=P-IC7800AAAA:8 a=JfrnYn6hAAAA:8 a=e5mUnYsNAAAA:8 a=h6CN_4qJII8sBilvXN4A:9 a=CjuIK1q_8ugA:10 a=E9Po1WZjFZOl8hwRPBS3:22 a=AjGcO6oz07-iQ99wixmX:22 a=E8ToXWR_bxluHZ7gmE-Z:22 a=d3PnA9EDa4IxuAV0gXij:22 a=1CNFftbPRP8L7MoqJWF3:22 a=Vxmtnl_E_bksehYqCbjh:22 Subject: Re: [Intel-gfx] [PATCH] drm/atmel: Use drm_atomic_helper_commit X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Alexandre Belloni , Boris Brezillon , linux-rdma@vger.kernel.org, Intel Graphics Development , Nicolas Ferre , DRI Development , Ludovic Desroches , Daniel Vetter , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Hi Daniel. On Tue, Jul 07, 2020 at 11:31:37PM +0200, Daniel Vetter wrote: > One of these drivers that predates the nonblocking support in helpers, > and hand-rolled its own thing. Entirely not anything specific here, we > can just delete it all and replace it with the helper version. > > Could also perhaps use the drm_mode_config_helper_suspend/resume > stuff, for another few lines deleted. But I'm not looking at that > stuff, I'm just going through all the atomic commit functions and make > sure they have properly annotated dma-fence critical sections > everywhere. > > v2: > - Also delete the workqueue (Sam) > - drop the @commit kerneldoc, I missed that one. > > Signed-off-by: Daniel Vetter > Cc: Sam Ravnborg > Cc: Boris Brezillon > Cc: Nicolas Ferre > Cc: Alexandre Belloni > Cc: Ludovic Desroches > Cc: linux-arm-kernel@lists.infradead.org I did succeed getttign my board operational. But based on reading the code: Reviewed-by: Sam Ravnborg I assume you will apply it. Sam > --- > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 107 +------------------ > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h | 7 -- > 2 files changed, 2 insertions(+), 112 deletions(-) > > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > index 871293d1aeeb..03984932d174 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c > @@ -557,103 +557,10 @@ static irqreturn_t atmel_hlcdc_dc_irq_handler(int irq, void *data) > return IRQ_HANDLED; > } > > -struct atmel_hlcdc_dc_commit { > - struct work_struct work; > - struct drm_device *dev; > - struct drm_atomic_state *state; > -}; > - > -static void > -atmel_hlcdc_dc_atomic_complete(struct atmel_hlcdc_dc_commit *commit) > -{ > - struct drm_device *dev = commit->dev; > - struct atmel_hlcdc_dc *dc = dev->dev_private; > - struct drm_atomic_state *old_state = commit->state; > - > - /* Apply the atomic update. */ > - drm_atomic_helper_commit_modeset_disables(dev, old_state); > - drm_atomic_helper_commit_planes(dev, old_state, 0); > - drm_atomic_helper_commit_modeset_enables(dev, old_state); > - > - drm_atomic_helper_wait_for_vblanks(dev, old_state); > - > - drm_atomic_helper_cleanup_planes(dev, old_state); > - > - drm_atomic_state_put(old_state); > - > - /* Complete the commit, wake up any waiter. */ > - spin_lock(&dc->commit.wait.lock); > - dc->commit.pending = false; > - wake_up_all_locked(&dc->commit.wait); > - spin_unlock(&dc->commit.wait.lock); > - > - kfree(commit); > -} > - > -static void atmel_hlcdc_dc_atomic_work(struct work_struct *work) > -{ > - struct atmel_hlcdc_dc_commit *commit = > - container_of(work, struct atmel_hlcdc_dc_commit, work); > - > - atmel_hlcdc_dc_atomic_complete(commit); > -} > - > -static int atmel_hlcdc_dc_atomic_commit(struct drm_device *dev, > - struct drm_atomic_state *state, > - bool async) > -{ > - struct atmel_hlcdc_dc *dc = dev->dev_private; > - struct atmel_hlcdc_dc_commit *commit; > - int ret; > - > - ret = drm_atomic_helper_prepare_planes(dev, state); > - if (ret) > - return ret; > - > - /* Allocate the commit object. */ > - commit = kzalloc(sizeof(*commit), GFP_KERNEL); > - if (!commit) { > - ret = -ENOMEM; > - goto error; > - } > - > - INIT_WORK(&commit->work, atmel_hlcdc_dc_atomic_work); > - commit->dev = dev; > - commit->state = state; > - > - spin_lock(&dc->commit.wait.lock); > - ret = wait_event_interruptible_locked(dc->commit.wait, > - !dc->commit.pending); > - if (ret == 0) > - dc->commit.pending = true; > - spin_unlock(&dc->commit.wait.lock); > - > - if (ret) > - goto err_free; > - > - /* We have our own synchronization through the commit lock. */ > - BUG_ON(drm_atomic_helper_swap_state(state, false) < 0); > - > - /* Swap state succeeded, this is the point of no return. */ > - drm_atomic_state_get(state); > - if (async) > - queue_work(dc->wq, &commit->work); > - else > - atmel_hlcdc_dc_atomic_complete(commit); > - > - return 0; > - > -err_free: > - kfree(commit); > -error: > - drm_atomic_helper_cleanup_planes(dev, state); > - return ret; > -} > - > static const struct drm_mode_config_funcs mode_config_funcs = { > .fb_create = drm_gem_fb_create, > .atomic_check = drm_atomic_helper_check, > - .atomic_commit = atmel_hlcdc_dc_atomic_commit, > + .atomic_commit = drm_atomic_helper_commit, > }; > > static int atmel_hlcdc_dc_modeset_init(struct drm_device *dev) > @@ -712,11 +619,6 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > if (!dc) > return -ENOMEM; > > - dc->wq = alloc_ordered_workqueue("atmel-hlcdc-dc", 0); > - if (!dc->wq) > - return -ENOMEM; > - > - init_waitqueue_head(&dc->commit.wait); > dc->desc = match->data; > dc->hlcdc = dev_get_drvdata(dev->dev->parent); > dev->dev_private = dc; > @@ -724,7 +626,7 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > ret = clk_prepare_enable(dc->hlcdc->periph_clk); > if (ret) { > dev_err(dev->dev, "failed to enable periph_clk\n"); > - goto err_destroy_wq; > + return ret; > } > > pm_runtime_enable(dev->dev); > @@ -761,9 +663,6 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) > pm_runtime_disable(dev->dev); > clk_disable_unprepare(dc->hlcdc->periph_clk); > > -err_destroy_wq: > - destroy_workqueue(dc->wq); > - > return ret; > } > > @@ -771,7 +670,6 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev) > { > struct atmel_hlcdc_dc *dc = dev->dev_private; > > - flush_workqueue(dc->wq); > drm_kms_helper_poll_fini(dev); > drm_atomic_helper_shutdown(dev); > drm_mode_config_cleanup(dev); > @@ -784,7 +682,6 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev) > > pm_runtime_disable(dev->dev); > clk_disable_unprepare(dc->hlcdc->periph_clk); > - destroy_workqueue(dc->wq); > } > > static int atmel_hlcdc_dc_irq_postinstall(struct drm_device *dev) > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > index 469d4507e576..5b5c774e0edf 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > @@ -331,9 +331,7 @@ struct atmel_hlcdc_dc_desc { > * @crtc: CRTC provided by the display controller > * @planes: instantiated planes > * @layers: active HLCDC layers > - * @wq: display controller workqueue > * @suspend: used to store the HLCDC state when entering suspend > - * @commit: used for async commit handling > */ > struct atmel_hlcdc_dc { > const struct atmel_hlcdc_dc_desc *desc; > @@ -341,15 +339,10 @@ struct atmel_hlcdc_dc { > struct atmel_hlcdc *hlcdc; > struct drm_crtc *crtc; > struct atmel_hlcdc_layer *layers[ATMEL_HLCDC_MAX_LAYERS]; > - struct workqueue_struct *wq; > struct { > u32 imr; > struct drm_atomic_state *state; > } suspend; > - struct { > - wait_queue_head_t wait; > - bool pending; > - } commit; > }; > > extern struct atmel_hlcdc_formats atmel_hlcdc_plane_rgb_formats; > -- > 2.27.0 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx