From patchwork Mon Jan 2 12:59:10 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomeu Vizoso X-Patchwork-Id: 89487 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp7579771qgi; Mon, 2 Jan 2017 05:00:13 -0800 (PST) X-Received: by 10.84.196.164 with SMTP id l33mr125921638pld.150.1483362013188; Mon, 02 Jan 2017 05:00:13 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p2si65640539pge.69.2017.01.02.05.00.12; Mon, 02 Jan 2017 05:00:13 -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; dkim=fail header.i=@gmail.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 dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932680AbdABM7w (ORCPT + 25 others); Mon, 2 Jan 2017 07:59:52 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:33702 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932325AbdABM7t (ORCPT ); Mon, 2 Jan 2017 07:59:49 -0500 Received: by mail-wm0-f66.google.com with SMTP id u144so81971672wmu.0 for ; Mon, 02 Jan 2017 04:59:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=WteIRVr0r0mvpjwxk3uqmIaAwB0InJw42qJX2gFnu34=; b=Ja8lYmuhwRHNoF1fxJveWz1jB6JkpDBjsjxhBJYl8KTlH9Dt4qx8UmUIavzgqiknmi 7F2iPFYqh4MW7ugpCukIa+No2zrRirdWXMu7JNXDN1FCD+6tJiOrFAtTyO8v5Xx4lrk1 FTKcEdW+7FF4/qgDtjMxJtph4DwwV742JBpXjyjTwVO6fbe191/rQT1tEHRxOrl6yaTO rchrNTM/aZTABwRbTS733ximc1vlnDQDk1QpRGGv2zj5WHxT7m9TkDI7rHw+o4m8puUB z2cqm04QjrBw+Kqi1mIqBPPmMQjdeJ+Bsj9tBMo/BA8XjYC3Zp1qWG3pI/Y4UKreXv8j I/sQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=WteIRVr0r0mvpjwxk3uqmIaAwB0InJw42qJX2gFnu34=; b=s3PTK86K40zuFAiAjaOjA9eCd+lGtlhJgGPLXuEjDsbXivgVt8LLRM30wjU12uLCGX buOtzVCAjK5XA+MAyHD6Xzu1DFI8s2a43cIXy630zOkFjRxdfkSYWZuW2T6qsAH7Ur7t TDZaUr7MUzJlhM9aZZefnZnNqKoEGNZfctYsdWug2pvzrGenJaK4ljA8df0GBHlX7BH5 HDwEWR8RJtwHtFU8te8wHgV9TOWdQXZmBzh40vjfCAARsyGpBQ4ojl4A6d7UmBwiR10i rTs71WTkcCpF9v+174dddU+vARUxf+q1SJGBoQSB5PKnVoAVL13GuIYLC5ELla7lbRq4 rrzA== X-Gm-Message-State: AIkVDXL7t6c5UzENPDMLr/E42a6vx7JkXzCkdgGKO/kCa2+WDFpqRVeVQ9t14vM+KNJeyw== X-Received: by 10.28.18.194 with SMTP id 185mr49068792wms.124.1483361987335; Mon, 02 Jan 2017 04:59:47 -0800 (PST) Received: from cizrna.lan ([109.72.12.216]) by smtp.gmail.com with ESMTPSA id f126sm84058006wme.22.2017.01.02.04.59.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 Jan 2017 04:59:46 -0800 (PST) From: Tomeu Vizoso To: linux-kernel@vger.kernel.org Cc: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , Sean Paul , Thierry Reding , Emil Velikov , Daniel Vetter , Jani Nikula , Tomeu Vizoso , dri-devel@lists.freedesktop.org, David Airlie Subject: [PATCH v14 2/4] drm: crc: Wait for a frame before returning from open() Date: Mon, 2 Jan 2017 13:59:10 +0100 Message-Id: <20170102125912.22305-3-tomeu.vizoso@collabora.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170102125912.22305-1-tomeu.vizoso@collabora.com> References: <20170102125912.22305-1-tomeu.vizoso@collabora.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Don't return from the open() call on the crc/data file until the HW has produced a first frame, as there's great variability in when the HW is able to do that and userspace shouldn't have to guess when this specific HW is ready to start giving frame CRCs. Signed-off-by: Tomeu Vizoso --- drivers/gpu/drm/drm_debugfs_crc.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) -- 2.9.3 diff --git a/drivers/gpu/drm/drm_debugfs_crc.c b/drivers/gpu/drm/drm_debugfs_crc.c index 68b171af237b..8b0eeeed4d78 100644 --- a/drivers/gpu/drm/drm_debugfs_crc.c +++ b/drivers/gpu/drm/drm_debugfs_crc.c @@ -125,6 +125,12 @@ static const struct file_operations drm_crtc_crc_control_fops = { .write = crc_control_write }; +static int crtc_crc_data_count(struct drm_crtc_crc *crc) +{ + assert_spin_locked(&crc->lock); + return CIRC_CNT(crc->head, crc->tail, DRM_CRC_ENTRIES_NR); +} + static int crtc_crc_open(struct inode *inode, struct file *filep) { struct drm_crtc *crtc = inode->i_private; @@ -160,8 +166,19 @@ static int crtc_crc_open(struct inode *inode, struct file *filep) crc->entries = entries; crc->values_cnt = values_cnt; crc->opened = true; + + /* + * Only return once we got a first frame, so userspace doesn't have to + * guess when this particular piece of HW will be ready to start + * generating CRCs. + */ + ret = wait_event_interruptible_lock_irq(crc->wq, + crtc_crc_data_count(crc), + crc->lock); spin_unlock_irq(&crc->lock); + WARN_ON(ret); + return 0; err_disable: @@ -189,12 +206,6 @@ static int crtc_crc_release(struct inode *inode, struct file *filep) return 0; } -static int crtc_crc_data_count(struct drm_crtc_crc *crc) -{ - assert_spin_locked(&crc->lock); - return CIRC_CNT(crc->head, crc->tail, DRM_CRC_ENTRIES_NR); -} - /* * 1 frame field of 10 chars plus a number of CRC fields of 10 chars each, space * separated, with a newline at the end and null-terminated.