Received: by 2002:a25:f815:0:0:0:0:0 with SMTP id u21csp4034957ybd; Tue, 25 Jun 2019 12:52:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqyiTX7zbrVbcxi3AjNLCmnaATOJR9nWbqIBnM3NTYUXN2TLMkaWo7vqfyIYkoKUtf3oeIiY X-Received: by 2002:a17:90a:898e:: with SMTP id v14mr590928pjn.119.1561492323352; Tue, 25 Jun 2019 12:52:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561492323; cv=none; d=google.com; s=arc-20160816; b=mmHDSum894acRbBKLp4esWfe53DWM7l7znmPAVOUJhDnU4UL1jbQISQeUgPp2N9Btz MDRJoZNbnPbAiLI/su0G0qcFV9PALKAU984ktel+ehzNRirgGLNcguVGqNIzK9rjnH2h eSM4bpiPybQW6aq0tlBCrbip6H5jbs78v0gHSd4KXoGKPJstHTuvx6HRMVWoEg0MHzoq 2I8o/fnn3iPYPPjXFvyYKb2xIUCOU9aaeQUV7aa52kR7YrqdDCIRjyPo+dsOl8gDmhCf NGY+6t2MXbXkGntUYMCGYktiUBOngSnofBr/YELppD1wavk1TBuwgpQXmQ8x7rfmctFt AFQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=IR+jDdYfLqNnpmJKee31J5tc02pforjnx7seubVXcgs=; b=qhcFndOuGx4/ISTWTUOke5MadMxiDP/uJ2KAcOg/pwMQs+AOKkIC969FXLM0xt/CtY LK2Co1MF1f6dfqPejUa8nLyquQIx0Gq1USQx31vthG5I9C5lBQWNrDQt4kzpRLVWX4gg 5Btb+WwU+7E4ATFnrP3e2+KEshFbRHYpnFqC82yKtVmU0lilGcjkBO4Bd0EOu0+AyL9g vsr9A6GWGvWwBS9yyRRkk8lZwNRAwjJADKH7lzhsw+B7sb/ozEzT/JklYFVhC/532dO0 r3k5AhfRUsz3Y3ge/OygCWXtwN8ap2RwHQPue4mvXahPPcXx9DpB3uGXr9lTyuPK05qy zqmg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r204si7322362pgr.243.2019.06.25.12.51.48; Tue, 25 Jun 2019 12:52:03 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732805AbfFYSCm (ORCPT + 99 others); Tue, 25 Jun 2019 14:02:42 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:58814 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728886AbfFYSCj (ORCPT ); Tue, 25 Jun 2019 14:02:39 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: bbeckett) with ESMTPSA id 8D2A6286276 From: Robert Beckett To: dri-devel@lists.freedesktop.org Cc: Maarten Lankhorst , Maxime Ripard , Sean Paul , David Airlie , Daniel Vetter , Philipp Zabel , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Robert Beckett Subject: [PATCH v3 3/4] drm/vblank: estimate vblank while disabling vblank if interrupt disabled Date: Tue, 25 Jun 2019 18:59:14 +0100 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If interrupts are disabled (e.g. via vblank_disable_fn) and we come to disable vblank, update the vblank count to best guess as to what it would be had the interrupts remained enabled, and update the timesamp to now. This avoids a stale vblank event being sent while disabling crtcs during atomic modeset. Fixes: 68036b08b91bc ("drm/vblank: Do not update vblank count if interrupts are already disabled.") Signed-off-by: Robert Beckett --- drivers/gpu/drm/drm_vblank.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c index 7dabb2bdb733..db68b8cbf797 100644 --- a/drivers/gpu/drm/drm_vblank.c +++ b/drivers/gpu/drm/drm_vblank.c @@ -375,9 +375,23 @@ void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe) * interrupts were enabled. This avoids calling the ->disable_vblank() * operation in atomic context with the hardware potentially runtime * suspended. + * If interrupts are disabled (e.g. via blank_disable_fn) then make + * best guess as to what it would be now and make sure we have an up + * to date timestamp. */ - if (!vblank->enabled) + if (!vblank->enabled) { + ktime_t now = ktime_get(); + u32 diff = 0; + if (vblank->framedur_ns) { + u64 diff_ns = ktime_to_ns(ktime_sub(now, vblank->time)); + diff = DIV_ROUND_CLOSEST_ULL(diff_ns, + vblank->framedur_ns); + } + + store_vblank(dev, pipe, diff, now, vblank->count); + goto out; + } /* * Update the count and timestamp to maintain the -- 2.18.0