From patchwork Thu Sep 19 15:33:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Paul X-Patchwork-Id: 11152819 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 637C71747 for ; Thu, 19 Sep 2019 15:34:24 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4B7A9206C2 for ; Thu, 19 Sep 2019 15:34:24 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4B7A9206C2 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=poorly.run Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 661256F801; Thu, 19 Sep 2019 15:34:23 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-yb1-xb44.google.com (mail-yb1-xb44.google.com [IPv6:2607:f8b0:4864:20::b44]) by gabe.freedesktop.org (Postfix) with ESMTPS id 018926F801 for ; Thu, 19 Sep 2019 15:34:21 +0000 (UTC) Received: by mail-yb1-xb44.google.com with SMTP id f1so1291687ybq.11 for ; Thu, 19 Sep 2019 08:34:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=aSl6O438ik2qNZ2q/ljXyaCulp7QLqjlnCWYpyJjxZ8=; b=kuRNpJmV/7y0NllJ05VKloT0gIAVs7oNvTtjnQFyaGbBBZWgfSGFsudiwWARWW9B1g 9Eq0KcO9F890u76rFB+acaqxIDClTPHsURR0EnKuC2sHCbjWRcxWJo5J/EZVuK5sfonc /ggN7FgZkWotUyiBI3DdcSSPFGdVoIHo8HjdRrDLrO4TQzys+KnI8GG8/ifQKrOVgZFz 2wAoSLlPEf61RPspipCzcyn/W7EaGOLIXidhl/0k9TSYG32/FN106JM56ePU2I/EY+Hi vbNqwEvZ/y8525w8hFgUzeWlfSMa51xQHW9p3XZ72GbBBFVb+HWSrlEqEclT1stbiJKQ Lghg== X-Gm-Message-State: APjAAAVgtcTdzXF99eYNpF+kSBG3DP66mbohIzCZ5zDnOacIa2rnjPV5 /l872RAXmyBPL/Co/2mAOklPAAFpf9Ykow== X-Google-Smtp-Source: APXvYqwTjuw6SNlZMnm7XmNwe+dbcTjDqbrsparOwY/kbsC2juaSgQeztIwC5xF5g6IvbxNFYCqFyA== X-Received: by 2002:a5b:291:: with SMTP id x17mr7266997ybl.130.1568907260921; Thu, 19 Sep 2019 08:34:20 -0700 (PDT) Received: from rosewood.cam.corp.google.com ([2620:0:1013:11:89c6:2139:5435:371d]) by smtp.gmail.com with ESMTPSA id v143sm1917822ywa.57.2019.09.19.08.34.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Sep 2019 08:34:20 -0700 (PDT) From: Sean Paul To: dri-devel@lists.freedesktop.org Subject: [PATCH v3 3/3] drm: Add self_refresh_state debugfs entry Date: Thu, 19 Sep 2019 11:33:58 -0400 Message-Id: <20190919153419.131821-1-sean@poorly.run> X-Mailer: git-send-email 2.23.0.237.gc6a4ce50a0-goog In-Reply-To: References: MIME-Version: 1.0 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=poorly.run; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=aSl6O438ik2qNZ2q/ljXyaCulp7QLqjlnCWYpyJjxZ8=; b=PMPS06m2rCt7ctk6UsFbaGGtRMMZ537gqFZh4IR1CH+py4Ri175p9B35grPgVdFM9Y 7sIFObXEEiEcbmBL2qMdTKhMDfXVLmGRT2syqlnVQ9rNFsk6imiWjybxSqgZkTPEg9Hl IWFIYW/I9WX/u3kku2buMRmUIROsepmRFmAgUvXZPazmV7zw4CzqrNsCqrR/MQZZC3Uh LU2Y0ygAGzaQUr6Vg+oFkHriZJkR6IcgHy6G9rXLbSwarODbASAC//HPb3PW5EDVJ4mJ hDUCtK3ftskd2JbvfZ9IT/yxdrmpLUR0Wh3vL4CVC3BOUx3B/0vONOr2Q8yE1w8Az66m YVPg== X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Airlie , Sean Paul , jekarl@iki.fi, Sean Paul Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Sean Paul This patch adds a debugfs entry to surface the entry and exit times as well as the calculated delay. Suggested-by: Daniel Vetter Signed-off-by: Sean Paul Link to v2: https://patchwork.freedesktop.org/patch/msgid/20190918200734.149876-3-sean@poorly.run Changes in v2: - Added to the set Changes in v3: - Move the debugfs out of core and into driver (Daniel) - Place a debugfs entry per crtc (Daniel) --- Here's the per-crtc version of this, mostly as an rfc since it still feels rough (particularly grabbing drm_minor from crtc->dev->primary). We should also probably introduce some drm_debugfs helpers for crtc entries instead of opencoding debugfs goo here and in debugfs_crc. I've got to switch over to MST-related stuff for the moment, but will get back to this once we have a clear picture of what we want to do. drivers/gpu/drm/drm_self_refresh_helper.c | 63 ++++++++++++++++++++- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 14 +++++ include/drm/drm_self_refresh_helper.h | 5 ++ 3 files changed, 80 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_self_refresh_helper.c b/drivers/gpu/drm/drm_self_refresh_helper.c index 68f4765a58964..4be7348e105c6 100644 --- a/drivers/gpu/drm/drm_self_refresh_helper.c +++ b/drivers/gpu/drm/drm_self_refresh_helper.c @@ -14,7 +14,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -167,6 +169,16 @@ void drm_self_refresh_helper_update_avg_times(struct drm_atomic_state *state, } EXPORT_SYMBOL(drm_self_refresh_helper_update_avg_times); +static unsigned int +drm_self_refresh_calc_idle_delay(struct drm_self_refresh_data *sr_data) +{ + if (WARN_ON(!mutex_is_locked(&sr_data->avg_mutex))) + return SELF_REFRESH_AVG_SEED_MS * 4; + + return (ewma_psr_time_read(&sr_data->entry_avg_ms) + + ewma_psr_time_read(&sr_data->exit_avg_ms)) * 2; +} + /** * drm_self_refresh_helper_alter_state - Alters the atomic state for SR exit * @state: the state currently being checked @@ -209,8 +221,7 @@ void drm_self_refresh_helper_alter_state(struct drm_atomic_state *state) continue; mutex_lock(&sr_data->avg_mutex); - delay = (ewma_psr_time_read(&sr_data->entry_avg_ms) + - ewma_psr_time_read(&sr_data->exit_avg_ms)) * 2; + delay = drm_self_refresh_calc_idle_delay(sr_data); mutex_unlock(&sr_data->avg_mutex); mod_delayed_work(system_wq, &sr_data->entry_work, @@ -275,3 +286,51 @@ void drm_self_refresh_helper_cleanup(struct drm_crtc *crtc) kfree(sr_data); } EXPORT_SYMBOL(drm_self_refresh_helper_cleanup); + +#ifdef CONFIG_DEBUG_FS + +static int drm_self_refresh_debugfs_show(struct seq_file *m, void *data) +{ + struct drm_crtc *crtc = m->private; + struct drm_self_refresh_data *sr_data = crtc->self_refresh_data; + struct drm_printer p = drm_seq_file_printer(m); + + if (!sr_data) + return 0; + + mutex_lock(&sr_data->avg_mutex); + drm_printf(&p, "entry_avg_ms=%lu\n", + ewma_psr_time_read(&sr_data->entry_avg_ms)); + drm_printf(&p, "exit_avg_ms=%lu\n", + ewma_psr_time_read(&sr_data->exit_avg_ms)); + drm_printf(&p, "idle_delay=%u\n", + drm_self_refresh_calc_idle_delay(sr_data)); + mutex_unlock(&sr_data->avg_mutex); + return 0; +} + +static int drm_self_refresh_debugfs_open(struct inode *inode, struct file *file) +{ + struct drm_crtc *crtc = inode->i_private; + + return single_open(file, drm_self_refresh_debugfs_show, crtc); +} + +static const struct file_operations drm_self_refresh_debugfs_fops = { + .owner = THIS_MODULE, + .open = drm_self_refresh_debugfs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +int drm_self_refresh_debugfs_init(struct drm_crtc *crtc) +{ + debugfs_create_file("self_refresh_state", S_IFREG | S_IRUGO, + crtc->debugfs_entry, crtc, + &drm_self_refresh_debugfs_fops); + return 0; +} +EXPORT_SYMBOL(drm_self_refresh_debugfs_init); + +#endif diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 613404f86668d..181873b7146ac 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -1303,6 +1303,19 @@ static struct drm_connector *vop_get_edp_connector(struct vop *vop) return NULL; } +static int vop_crtc_late_register(struct drm_crtc *crtc) +{ + int ret; +#if defined(CONFIG_DRM_KMS_HELPER) + ret = drm_self_refresh_debugfs_init(crtc); + if (ret) { + DRM_ERROR("Failed to init self refresh debugfs\n"); + return ret; + } +#endif + return ret; +} + static int vop_crtc_set_crc_source(struct drm_crtc *crtc, const char *source_name) { @@ -1359,6 +1372,7 @@ static const struct drm_crtc_funcs vop_crtc_funcs = { .atomic_destroy_state = vop_crtc_destroy_state, .enable_vblank = vop_crtc_enable_vblank, .disable_vblank = vop_crtc_disable_vblank, + .late_register = vop_crtc_late_register, .set_crc_source = vop_crtc_set_crc_source, .verify_crc_source = vop_crtc_verify_crc_source, }; diff --git a/include/drm/drm_self_refresh_helper.h b/include/drm/drm_self_refresh_helper.h index 5b79d253fb46e..3ed54ce102f1b 100644 --- a/include/drm/drm_self_refresh_helper.h +++ b/include/drm/drm_self_refresh_helper.h @@ -17,4 +17,9 @@ void drm_self_refresh_helper_update_avg_times(struct drm_atomic_state *state, int drm_self_refresh_helper_init(struct drm_crtc *crtc); void drm_self_refresh_helper_cleanup(struct drm_crtc *crtc); + +#ifdef CONFIG_DEBUG_FS +int drm_self_refresh_debugfs_init(struct drm_crtc *crtc); +#endif + #endif