From patchwork Fri Dec 8 12:29:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Russell King (Oracle)" X-Patchwork-Id: 10104657 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 3F4B360235 for ; Mon, 11 Dec 2017 10:24:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2D3EE29524 for ; Mon, 11 Dec 2017 10:24:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 222DE2952B; Mon, 11 Dec 2017 10:24:12 +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.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID 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 9BB0729524 for ; Mon, 11 Dec 2017 10:24:11 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9915B6E2BA; Mon, 11 Dec 2017 10:21:33 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from pandora.armlinux.org.uk (pandora.armlinux.org.uk [IPv6:2001:4d48:ad52:3201:214:fdff:fe10:1be6]) by gabe.freedesktop.org (Postfix) with ESMTPS id D42046E8EF for ; Fri, 8 Dec 2017 12:29:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=armlinux.org.uk; s=pandora-2014; h=Date:Sender:Message-Id:Content-Type:Content-Transfer-Encoding:MIME-Version:Subject:Cc:To:From:References:In-Reply-To; bh=Lrst4YIyKyRodlRnKLu7OzbxW3m8wgy4J5xiQh+chYQ=; b=hjS8KEtUKCN+T/9zcmJoOQgPVUhooCW+8SNQAYys8qwTIG8G5Us67N9Qxp79ntJHmAZmnoffr8q0yBfS+bOFjE0wZCu17ur6uHf/QDF4GiKa8gLO6pcPJM24aFhodqgLq+LEk61nxkNv2guancTarncIjwvbcqYrqp3IA4cAylU=; Received: from e0022681537dd.dyn.armlinux.org.uk ([2001:4d48:ad52:3201:222:68ff:fe15:37dd]:37158 helo=rmk-PC.armlinux.org.uk) by pandora.armlinux.org.uk with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1eNHmN-00024E-67; Fri, 08 Dec 2017 12:29:23 +0000 Received: from rmk by rmk-PC.armlinux.org.uk with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1eNHmM-00074r-Cq; Fri, 08 Dec 2017 12:29:22 +0000 In-Reply-To: <20171208122754.GA20895@n2100.armlinux.org.uk> References: <20171208122754.GA20895@n2100.armlinux.org.uk> From: Russell King To: David Airlie Subject: [PATCH 05/25] drm/armada: wait and cancel any pending frame work at disable MIME-Version: 1.0 Content-Disposition: inline Message-Id: Date: Fri, 08 Dec 2017 12:29:22 +0000 X-Mailman-Approved-At: Mon, 11 Dec 2017 10:21:20 +0000 Cc: dri-devel@lists.freedesktop.org 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: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Wait for a second, and if we time out, cancel any pending work when disabling the primary plane. This ensures that any pending work is completed or cleaned up prior to the disable taking effect. Signed-off-by: Russell King --- drivers/gpu/drm/armada/armada_crtc.c | 28 ++++++++++++++++++++++------ drivers/gpu/drm/armada/armada_overlay.c | 2 -- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c index f10ab0275ce7..328f030ffbdc 100644 --- a/drivers/gpu/drm/armada/armada_crtc.c +++ b/drivers/gpu/drm/armada/armada_crtc.c @@ -273,18 +273,15 @@ void armada_drm_plane_work_cancel(struct armada_crtc *dcrtc, armada_drm_plane_work_call(dcrtc, work, work->cancel); } -static void armada_drm_crtc_complete_frame_work(struct armada_crtc *dcrtc, +static void armada_drm_crtc_finish_frame_work(struct armada_crtc *dcrtc, struct armada_plane_work *work) { struct armada_frame_work *fwork = container_of(work, struct armada_frame_work, work); - struct drm_device *dev = dcrtc->crtc.dev; unsigned long flags; - spin_lock_irqsave(&dcrtc->irq_lock, flags); - armada_drm_crtc_update_regs(dcrtc, fwork->regs); - spin_unlock_irqrestore(&dcrtc->irq_lock, flags); - if (fwork->event) { + struct drm_device *dev = dcrtc->crtc.dev; + spin_lock_irqsave(&dev->event_lock, flags); drm_crtc_send_vblank_event(&dcrtc->crtc, fwork->event); spin_unlock_irqrestore(&dev->event_lock, flags); @@ -295,6 +292,19 @@ static void armada_drm_crtc_complete_frame_work(struct armada_crtc *dcrtc, kfree(fwork); } +static void armada_drm_crtc_complete_frame_work(struct armada_crtc *dcrtc, + struct armada_plane_work *work) +{ + struct armada_frame_work *fwork = container_of(work, struct armada_frame_work, work); + unsigned long flags; + + spin_lock_irqsave(&dcrtc->irq_lock, flags); + armada_drm_crtc_update_regs(dcrtc, fwork->regs); + spin_unlock_irqrestore(&dcrtc->irq_lock, flags); + + armada_drm_crtc_finish_frame_work(dcrtc, work); +} + static struct armada_frame_work * armada_drm_crtc_alloc_frame_work(struct drm_plane *plane) { @@ -307,6 +317,7 @@ armada_drm_crtc_alloc_frame_work(struct drm_plane *plane) work->work.plane = plane; work->work.fn = armada_drm_crtc_complete_frame_work; + work->work.cancel = armada_drm_crtc_finish_frame_work; armada_reg_queue_end(work->regs, i); return work; @@ -752,6 +763,7 @@ static int armada_drm_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, void armada_drm_crtc_plane_disable(struct armada_crtc *dcrtc, struct drm_plane *plane) { + struct armada_plane *dplane = drm_to_armada_plane(plane); u32 sram_para1, dma_ctrl0_mask; /* @@ -775,6 +787,10 @@ void armada_drm_crtc_plane_disable(struct armada_crtc *dcrtc, dma_ctrl0_mask = CFG_DMA_ENA; } + /* Wait for any preceding work to complete, but don't wedge */ + if (WARN_ON(!armada_drm_plane_work_wait(dplane, HZ))) + armada_drm_plane_work_cancel(dcrtc, dplane); + spin_lock_irq(&dcrtc->irq_lock); armada_updatel(0, dma_ctrl0_mask, dcrtc->base + LCD_SPU_DMA_CTRL0); spin_unlock_irq(&dcrtc->irq_lock); diff --git a/drivers/gpu/drm/armada/armada_overlay.c b/drivers/gpu/drm/armada/armada_overlay.c index 1fa8ea8cb2de..cf8442583bfc 100644 --- a/drivers/gpu/drm/armada/armada_overlay.c +++ b/drivers/gpu/drm/armada/armada_overlay.c @@ -270,8 +270,6 @@ static int armada_ovl_plane_disable(struct drm_plane *plane, return 0; dcrtc = drm_to_armada_crtc(dplane->base.base.crtc); - - armada_drm_plane_work_cancel(dcrtc, &dplane->base); armada_drm_crtc_plane_disable(dcrtc, plane); dcrtc->plane = NULL;