Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp12800999rwd; Fri, 23 Jun 2023 10:49:26 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6Q56bpee6j9c981QEgzWAvWG63XYWFWCEy4klSM7WjgqMJUuvTOw7/vNawjLj4nIncdfKv X-Received: by 2002:a05:6a00:2803:b0:666:ed9c:ccd with SMTP id bl3-20020a056a00280300b00666ed9c0ccdmr23293808pfb.0.1687542565760; Fri, 23 Jun 2023 10:49:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687542565; cv=none; d=google.com; s=arc-20160816; b=QE0JYk11L7QyxzrrcVV4v1qJp9bcEKT0OIv3aGEbzXw6sTcVXhn3/ArIqxtmLIlJyr qUAqGxUkYXDyQ06C/7JHurbkZlolvdM7E8XMvSplsYoTQ27eyKr4WqhWAY6gTNpvkw+J uN9oVB5Tzm3ho103iVjhOu6wsfhmUYcDG05MrLyfNA2JW30Z4Z3d8omPx5ryPRNrrXJr c6bPITBF0JPe1EkTLnETwcXDLWIg4hEjzbY7AyaO4B7YFXRQMidQfTLaXWU5znMUXM7e vs7MACOlSVIsBCAKK6Ync98KqDxsDZOydtRnhfNZv0uZl3uYyr7fPYt+Y7pvcyFyQjWF W88A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=GQBBw10+NR1D3zxUYQm2aRccVpvmWB3wHjx8G0KhV+I=; b=a+CLnIc/P+AXSOuFP9MD1kiCzNIzjIpM/1J3aop/iGQuk71DzShaJ8zxcNTWDoEB5Z HDQIbM58d8xW6i9/1qsG+NcchF+0aP+4i6OLIq33WVG9NyhIpli+QEPbchqGDwOEhdzr cZFrcg94Gwxpifi1STIhuOzjryd4iJVUAWuPuYFNPdW0x43d3XYFyOhEGhA3NVhx6mee ay0gqwm2hTfDI3JpG7q/eE9XRy/AALzgsfkSxUX89vXtOTIVBWWvrPWTl2edZHyBcC1J V5PRBsypUfdKEjAW2FJPtnM3oLx+QRQlfxSe9idiS/SIJ+stWxy3OE+HDogZ6pS+L6qd qtxQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=D4iBS40w; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e13-20020a056a0000cd00b006689097053csi7466443pfj.48.2023.06.23.10.49.13; Fri, 23 Jun 2023 10:49:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=D4iBS40w; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232136AbjFWRI6 (ORCPT + 99 others); Fri, 23 Jun 2023 13:08:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38936 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231667AbjFWRIb (ORCPT ); Fri, 23 Jun 2023 13:08:31 -0400 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3F7362D4C; Fri, 23 Jun 2023 10:08:11 -0700 (PDT) Received: from pendragon.ideasonboard.com (213-243-189-158.bb.dnainternet.fi [213.243.189.158]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 97F2E838; Fri, 23 Jun 2023 19:07:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1687540052; bh=gzhnbRo3G2xtBbekM1sXIop1Hs4168rGbYujQRn9E7s=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=D4iBS40w3cb+Oa10OPEU/i1vLanzf05nmwJssUUsDXv0ld6dQoGAUe++V52vmwXVd 6n3ye2DIFv0+7FN7zjd0XDfbyrO9ALZPuGYyB493Ifvoc8nwQgaI87DwBLChrD8BNX G0VolyY1zHKhxsbJhDgLJXFzCMU7s3kYRG9g5byE= Date: Fri, 23 Jun 2023 20:08:08 +0300 From: Laurent Pinchart To: Geert Uytterhoeven Cc: Kieran Bingham , David Airlie , Daniel Vetter , Thomas Zimmermann , Magnus Damm , dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 30/39] drm: renesas: shmobile: Wait for page flip when turning CRTC off Message-ID: <20230623170808.GH2112@pendragon.ideasonboard.com> References: <0b0cc2971b2abc8fe0fc55a9ae652a7b8a7235cd.1687423204.git.geert+renesas@glider.be> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <0b0cc2971b2abc8fe0fc55a9ae652a7b8a7235cd.1687423204.git.geert+renesas@glider.be> X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Geert, Thank you for the patch. On Thu, Jun 22, 2023 at 11:21:42AM +0200, Geert Uytterhoeven wrote: > Turning a CRTC off will prevent a queued page flip from ever completing, > potentially confusing userspace. Wait for queued page flips to complete > before turning the CRTC off to avoid this. > > Signed-off-by: Geert Uytterhoeven Given that you're duplicating the rcar-du page flip handling code, I have a feeling core helpers would be handy. It's not a blocker for this series though, so Reviewed-by: Laurent Pinchart > --- > .../gpu/drm/renesas/shmobile/shmob_drm_crtc.c | 37 +++++++++++++++++++ > .../gpu/drm/renesas/shmobile/shmob_drm_crtc.h | 3 ++ > 2 files changed, 40 insertions(+) > > diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.c > index 1d7fcf64bf2aab80..d2a0ac5f9368c11c 100644 > --- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.c > +++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.c > @@ -285,11 +285,40 @@ void shmob_drm_crtc_finish_page_flip(struct shmob_drm_crtc *scrtc) > scrtc->event = NULL; > if (event) { > drm_crtc_send_vblank_event(&scrtc->base, event); > + wake_up(&scrtc->flip_wait); > drm_crtc_vblank_put(&scrtc->base); > } > spin_unlock_irqrestore(&dev->event_lock, flags); > } > > +static bool shmob_drm_crtc_page_flip_pending(struct shmob_drm_crtc *scrtc) > +{ > + struct drm_device *dev = scrtc->base.dev; > + unsigned long flags; > + bool pending; > + > + spin_lock_irqsave(&dev->event_lock, flags); > + pending = scrtc->event != NULL; > + spin_unlock_irqrestore(&dev->event_lock, flags); > + > + return pending; > +} > + > +static void shmob_drm_crtc_wait_page_flip(struct shmob_drm_crtc *scrtc) > +{ > + struct drm_crtc *crtc = &scrtc->base; > + struct shmob_drm_device *sdev = to_shmob_device(crtc->dev); > + > + if (wait_event_timeout(scrtc->flip_wait, > + !shmob_drm_crtc_page_flip_pending(scrtc), > + msecs_to_jiffies(50))) > + return; > + > + dev_warn(sdev->dev, "page flip timeout\n"); > + > + shmob_drm_crtc_finish_page_flip(scrtc); > +} > + > /* ----------------------------------------------------------------------------- > * CRTC Functions > */ > @@ -302,6 +331,12 @@ static void shmob_drm_crtc_stop(struct shmob_drm_crtc *scrtc) > if (!scrtc->started) > return; > > + /* > + * Wait for page flip completion before stopping the CRTC as userspace > + * expects page flips to eventually complete. > + */ > + shmob_drm_crtc_wait_page_flip(scrtc); > + > /* Stop the LCDC. */ > shmob_drm_crtc_start_stop(scrtc, false); > > @@ -515,6 +550,8 @@ int shmob_drm_crtc_create(struct shmob_drm_device *sdev) > unsigned int i; > int ret; > > + init_waitqueue_head(&sdev->crtc.flip_wait); > + > sdev->crtc.dpms = DRM_MODE_DPMS_OFF; > > primary = shmob_drm_plane_create(sdev, 0); > diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.h b/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.h > index 2c6d7541427581a6..b9863e026e8a9b83 100644 > --- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.h > +++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.h > @@ -14,6 +14,8 @@ > #include > #include > > +#include > + > #include