Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp4819948imu; Tue, 8 Jan 2019 06:55:06 -0800 (PST) X-Google-Smtp-Source: ALg8bN5qLOGqElzw3GOG4V9DRwTU+QWc5p+XxeMQZE655TxRueXxZ4RyQXYP/HbnUBkNtU+GOa5W X-Received: by 2002:a17:902:6113:: with SMTP id t19mr2014375plj.248.1546959306089; Tue, 08 Jan 2019 06:55:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546959306; cv=none; d=google.com; s=arc-20160816; b=u/hxMZxUA2lb0CiZJ+syUnaeKRP6lnXer0fsKWWo1Hd7qF9j4exsFfomVdDtU24SPU LT7v6P1uYsxhCpkhfaI8LjL/5+IOuudl+swDYDdP1DqaIAFsVHrxVLwg6nctT0oC3UCJ XUYFHNBeOYwOmkLzQiEshadjoHVJVBup6ZlQ+5qTHVCGjSN9Rzo/zpF8PaV2rUJ46Ltq RfQwUFILb62Glv3Le882WsttxxIomxLBkj9srVccsU9JI1iONQrzK4jelxpf0hl6Kk5S +hfc3sXM++SYUzFBRkXXd27Ifg1mSOMjkQIvkeO3eSbx7LiIVv5hV/YPB1Ng0L8tq3LZ rG9Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=WjbQEm32PdolNBB9vWXU1gPtemk8usYvbzQ89iW22As=; b=I40GAZKYI9HZ0CM/1/SEHwnsKpS+RQAPWZvve+jMvu1qIvI3akfFZAFvD/vzw2O6x3 3w2zOADdGY2KQvdJ4j5Wsh9Uf+GCJ0+Ahb3MVXBvvoZvLhf9Sb5FaYhtG6XdiqcsH1qa tlsOOMtSkXVUDTf8Menvqr+TUx/cusHLLFaaLuslFbmZhLQhr1ZHbVAPmWI3br0DvQ78 QVARdP/YfSExlGMCOz5JVSgC5AArO6O5lmlguwzHJZm8xztm671HoiS3ELMxjHIKhwn2 9m4UyGQe0RyeqIWtPzuP7I+KrEvA1skF62Cq3TjLWGs2aGwNzrnXAUMgAaX00utOWXPc Qv4A== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b11si62324889pgb.536.2019.01.08.06.54.50; Tue, 08 Jan 2019 06:55:06 -0800 (PST) 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728984AbfAHOvs (ORCPT + 99 others); Tue, 8 Jan 2019 09:51:48 -0500 Received: from mail.bootlin.com ([62.4.15.54]:41360 "EHLO mail.bootlin.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728127AbfAHOvS (ORCPT ); Tue, 8 Jan 2019 09:51:18 -0500 Received: by mail.bootlin.com (Postfix, from userid 110) id A0D68209EF; Tue, 8 Jan 2019 15:51:15 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mail.bootlin.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,SHORTCIRCUIT, URIBL_BLOCKED shortcircuit=ham autolearn=disabled version=3.4.2 Received: from localhost.localdomain (aaubervilliers-681-1-45-241.w90-88.abo.wanadoo.fr [90.88.163.241]) by mail.bootlin.com (Postfix) with ESMTPSA id 5AC0F2078C; Tue, 8 Jan 2019 15:51:15 +0100 (CET) From: Paul Kocialkowski To: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: Eric Anholt , David Airlie , Maxime Ripard , Thomas Petazzoni , Eben Upton , Daniel Vetter , Boris Brezillon , Paul Kocialkowski Subject: [PATCH v3 1/4] drm/vc4: Wait for display list synchronization when completing commit Date: Tue, 8 Jan 2019 15:50:53 +0100 Message-Id: <20190108145056.2276-2-paul.kocialkowski@bootlin.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190108145056.2276-1-paul.kocialkowski@bootlin.com> References: <20190108145056.2276-1-paul.kocialkowski@bootlin.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org During an atomic commit, the HVS is configured with a display list for the channel matching the associated CRTC. The Pixel Valve (CRTC) and encoder are also configured for the new setup at that time. While the Pixel Valve and encoder are reconfigured synchronously, the HVS is only reconfigured after the display list address (DISPLIST) has been updated to the current display list address (DISPLACTX), which is the responsibility of the hardware. The time frame during which the HVS is still running on its previous configuration but the CRTC and encoder have been reconfigured already can lead to a number of synchronization issues. They will eventually cause errors reported on the FIFOs, such as underruns. With underrun detection enabled (from Boris Brezillon's series), this leads to unreliable underrun detection with random false positives. To ensure a coherent state, wait for each enabled channel of the HVS to synchronize its current display list address. This fixes the issue of random underrun reporting on commits. Signed-off-by: Paul Kocialkowski --- drivers/gpu/drm/vc4/vc4_drv.h | 1 + drivers/gpu/drm/vc4/vc4_hvs.c | 17 +++++++++++++++++ drivers/gpu/drm/vc4/vc4_kms.c | 2 ++ drivers/gpu/drm/vc4/vc4_regs.h | 2 ++ 4 files changed, 22 insertions(+) diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h index c24b078f0593..955f157f5ad0 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.h +++ b/drivers/gpu/drm/vc4/vc4_drv.h @@ -772,6 +772,7 @@ void vc4_irq_reset(struct drm_device *dev); extern struct platform_driver vc4_hvs_driver; void vc4_hvs_dump_state(struct drm_device *dev); int vc4_hvs_debugfs_regs(struct seq_file *m, void *unused); +void vc4_hvs_sync_dlist(struct drm_device *dev); /* vc4_kms.c */ int vc4_kms_load(struct drm_device *dev); diff --git a/drivers/gpu/drm/vc4/vc4_hvs.c b/drivers/gpu/drm/vc4/vc4_hvs.c index 5d8c749c9749..1ba60b8e0c2d 100644 --- a/drivers/gpu/drm/vc4/vc4_hvs.c +++ b/drivers/gpu/drm/vc4/vc4_hvs.c @@ -166,6 +166,23 @@ static int vc4_hvs_upload_linear_kernel(struct vc4_hvs *hvs, return 0; } +void vc4_hvs_sync_dlist(struct drm_device *dev) +{ + struct vc4_dev *vc4 = to_vc4_dev(dev); + unsigned int i; + int ret; + + for (i = 0; i < SCALER_CHANNELS_COUNT; i++) { + if (!(HVS_READ(SCALER_DISPCTRLX(i)) & SCALER_DISPCTRLX_ENABLE)) + continue; + + ret = wait_for(HVS_READ(SCALER_DISPLACTX(i)) == + HVS_READ(SCALER_DISPLISTX(i)), 1000); + WARN(ret, "Timeout waiting for channel %d display list sync\n", + i); + } +} + static int vc4_hvs_bind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c index 0490edb192a1..2d66a2b57a91 100644 --- a/drivers/gpu/drm/vc4/vc4_kms.c +++ b/drivers/gpu/drm/vc4/vc4_kms.c @@ -155,6 +155,8 @@ vc4_atomic_complete_commit(struct drm_atomic_state *state) drm_atomic_helper_commit_hw_done(state); + vc4_hvs_sync_dlist(dev); + drm_atomic_helper_wait_for_flip_done(dev, state); drm_atomic_helper_cleanup_planes(dev, state); diff --git a/drivers/gpu/drm/vc4/vc4_regs.h b/drivers/gpu/drm/vc4/vc4_regs.h index 931088014272..50c653309aec 100644 --- a/drivers/gpu/drm/vc4/vc4_regs.h +++ b/drivers/gpu/drm/vc4/vc4_regs.h @@ -212,6 +212,8 @@ #define PV_HACT_ACT 0x30 +#define SCALER_CHANNELS_COUNT 3 + #define SCALER_DISPCTRL 0x00000000 /* Global register for clock gating the HVS */ # define SCALER_DISPCTRL_ENABLE BIT(31) -- 2.20.1