From patchwork Wed Sep 18 20:07:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Paul X-Patchwork-Id: 11151209 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 136C714E5 for ; Wed, 18 Sep 2019 20:07:48 +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 EE6A4222BD for ; Wed, 18 Sep 2019 20:07:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EE6A4222BD 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 2A6026FE8E; Wed, 18 Sep 2019 20:07:47 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-yw1-xc43.google.com (mail-yw1-xc43.google.com [IPv6:2607:f8b0:4864:20::c43]) by gabe.freedesktop.org (Postfix) with ESMTPS id 869276FE72 for ; Wed, 18 Sep 2019 20:07:45 +0000 (UTC) Received: by mail-yw1-xc43.google.com with SMTP id u65so422947ywe.4 for ; Wed, 18 Sep 2019 13:07:45 -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=IFddt5aY5GWw1a1vYL2Vgkxg3VWg+wMgNAktbc7+gy0=; b=tvU2jrbbl6CKQ1rS4kcUfkIeafKbWR3z1aTrVjc0Fptx55B9rIf6JgaCK3AUNHhuON L80YPGfXIgisuQoWKXHWp13MjtGYKND3VI0WRsvLpdZkyUFrBOoGi+aBVsizx1FFKz4N bKPSi+EV9BCw83X2MwllxHPXrrk3IQ4jj//1zyQizklZuTfz44Sb4Iq4rA73NTo1e/sp PhJSujf6srcZIrbLlReKaE08y+1y7LdflgFqrjjAiFmh4OEZBxPgRuVHzByZrLQ4qHsD UTbKWWNr6dVEK+UOsGmW9mxy5J/sdCk3EB/JCRnIrrtT7vP1dOt6xZpYUjGJcfSwuKkO avUg== X-Gm-Message-State: APjAAAVNFtdvrA/svQvvNv+xsjZEWbFxo5ZfIlHBdFsVe1ThJdVE5gjE xd1O62ooXdgEYW/3K706Y+UAD5Hg2LREtg== X-Google-Smtp-Source: APXvYqxx6fpI38iCQJlejNZPNwqNQZ7+iyBVr4ix/ZCRisXesWjyTEyjAZSmlkAtYQZHLNoqh0xnLA== X-Received: by 2002:a81:78d0:: with SMTP id t199mr4872346ywc.344.1568837264545; Wed, 18 Sep 2019 13:07:44 -0700 (PDT) Received: from rosewood.cam.corp.google.com ([2620:0:1013:11:89c6:2139:5435:371d]) by smtp.gmail.com with ESMTPSA id 207sm1429317ywu.106.2019.09.18.13.07.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Sep 2019 13:07:44 -0700 (PDT) From: Sean Paul To: dri-devel@lists.freedesktop.org Subject: [PATCH v2 3/3] drm: Add self_refresh_state debugfs entry Date: Wed, 18 Sep 2019 16:07:30 -0400 Message-Id: <20190918200734.149876-3-sean@poorly.run> X-Mailer: git-send-email 2.23.0.237.gc6a4ce50a0-goog In-Reply-To: <20190918200734.149876-1-sean@poorly.run> References: <20190918200734.149876-1-sean@poorly.run> 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=IFddt5aY5GWw1a1vYL2Vgkxg3VWg+wMgNAktbc7+gy0=; b=AuHENxD2UQLxiv5CKU7Nw7DwmXUXuT5depUWjTeFcK8q2+LPmsyS3lat8mEhGk7A9X lxFltrK/zMYuOz7jg2rlrlnjQc7iCtzqAa7oG40xCOyAbglLbxodW1sv0tEj1fSS5Ic9 bj3/j+FLyNjnKMmDY47V22qMRSlRSyTGRReDSvbDNBldH7MDU4eLVw2pxmUDL5AaI0gj vqXIjwoRoP2NPS5lm02wzEB0ULCj+jflZb6esxCsk36AAna8YxC//JIhG33/OX4AGRci tAfizqvtRXKrI8hfyJdHSVC8TjfveifXnVQpR/xA6lGbgnWmdgudWvoMNhI02nqYyT+z zPDw== 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: Maxime Ripard , 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 Changes in v2: - Added to the set --- Wasn't too sure how to initialize this, as calling the helper function from drm_debugfs.c seemed... wrong. However there weren't any other compelling solutions, so I figured I'd post this and learn something new. drivers/gpu/drm/drm_debugfs.c | 10 +++++ drivers/gpu/drm/drm_self_refresh_helper.c | 55 ++++++++++++++++++++++- include/drm/drm_self_refresh_helper.h | 6 +++ 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c index eab0f2687cd6..175c2451ae72 100644 --- a/drivers/gpu/drm/drm_debugfs.c +++ b/drivers/gpu/drm/drm_debugfs.c @@ -38,6 +38,9 @@ #include #include #include +#if defined(CONFIG_DRM_KMS_HELPER) +#include +#endif #include "drm_crtc_internal.h" #include "drm_internal.h" @@ -231,6 +234,13 @@ int drm_debugfs_init(struct drm_minor *minor, int minor_id, DRM_ERROR("Failed to create atomic debugfs files\n"); return ret; } +#if defined(CONFIG_DRM_KMS_HELPER) + ret = drm_self_refresh_debugfs_init(minor); + if (ret) { + DRM_ERROR("Failed to init self refresh debugfs\n"); + return ret; + } +#endif } if (drm_core_check_feature(dev, DRIVER_MODESET)) { diff --git a/drivers/gpu/drm/drm_self_refresh_helper.c b/drivers/gpu/drm/drm_self_refresh_helper.c index 68f4765a5896..e7544ae1e47b 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,43 @@ 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_state(struct seq_file *m, void *data) +{ + struct drm_info_node *node = (struct drm_info_node *) m->private; + struct drm_device *dev = node->minor->dev; + struct drm_printer p = drm_seq_file_printer(m); + struct drm_crtc *crtc; + + drm_for_each_crtc(crtc, dev) { + struct drm_self_refresh_data *sr_data = crtc->self_refresh_data; + if (!sr_data) + continue; + + mutex_lock(&sr_data->avg_mutex); + drm_printf(&p, "crtc[%u]: %s\n", crtc->base.id, crtc->name); + drm_printf(&p, "\tentry_avg_ms=%lu\n", + ewma_psr_time_read(&sr_data->entry_avg_ms)); + drm_printf(&p, "\texit_avg_ms=%lu\n", + ewma_psr_time_read(&sr_data->exit_avg_ms)); + drm_printf(&p, "\tidle_delay=%u\n", + drm_self_refresh_calc_idle_delay(sr_data)); + mutex_unlock(&sr_data->avg_mutex); + } + return 0; +} + +static const struct drm_info_list drm_atomic_debugfs_list[] = { + {"self_refresh_state", drm_self_refresh_debugfs_state, 0}, +}; + +int drm_self_refresh_debugfs_init(struct drm_minor *minor) +{ + return drm_debugfs_create_files(drm_atomic_debugfs_list, + ARRAY_SIZE(drm_atomic_debugfs_list), + minor->debugfs_root, minor); +} +EXPORT_SYMBOL(drm_self_refresh_debugfs_init); +#endif diff --git a/include/drm/drm_self_refresh_helper.h b/include/drm/drm_self_refresh_helper.h index 5b79d253fb46..779f81e035f1 100644 --- a/include/drm/drm_self_refresh_helper.h +++ b/include/drm/drm_self_refresh_helper.h @@ -17,4 +17,10 @@ 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 +struct drm_minor; +int drm_self_refresh_debugfs_init(struct drm_minor *minor); +#endif + #endif