Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp6499161imm; Mon, 27 Aug 2018 17:38:44 -0700 (PDT) X-Google-Smtp-Source: ANB0VdY4S6naqVNF66JrXkxSD1buhuuF/7Ah3Z5chNFiJjHKZIUBVnovdOI5DodhtkhSwFk6Z9Vx X-Received: by 2002:a63:1250:: with SMTP id 16-v6mr5542202pgs.299.1535416724142; Mon, 27 Aug 2018 17:38:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535416724; cv=none; d=google.com; s=arc-20160816; b=RK2x4nRKyPMwapc+YJouclHEcmFpAmYtkSmph2yP0I4w/zw10y2LHuNCG4uos3Bzxi zwYvtwLF1Ha2khvf9CV1r5a7qrT2C5UDffpHIQxtYRPc469vqnQWgChaf0/p16g1//bC zW9vMzPALJQRcCW3ugJ7NeLN661tCBrTIIgIeL8+LbBziefT9ms2cZU1sbQGmrUB72/S raxsAKVS3pumNPMF5Hp5cjKiO3V6qWN6hYk/j4RP23Xi5Gqv0UPURspvbPISCu9chGkQ Zw+UarD4/Y/KL9JCc2xi1GDfITIzpKFc16eex1NcdeuldM3/LAoWeujQvoP3wgq9vWQx UmEA== 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:arc-authentication-results; bh=n1mWUAvMD13XDLyy1Fc4m6XRhZZUj+wdDCslxX0/CQU=; b=Gs8OYQ/81QhgwNRGqf1gAGPLh6FNc/6q2ePQ6TEz4XQgpDmZ8hoepuhC05QggQ4LSB L3NfYdWI579H9eAa7sQ4zv5ghrpeo4kSTtOUVQyEUZBxyVoxmdMSaal64BXP+v9cVm5a LSYmo4HprzM2CZiWMhcE8TXj4t/CRIwttnxb0T+n0ZM5lC3wNfvJpPECelKEeIE2TeGE mLmpdm872lzNOV+quZMGd2AyKs8JsMavV4kzm94xbXXRMkkcYJ7NbRQKFujxazLmmKYV CwdC/9sRvi6sUrBkLCd6uF2MjJZ7UWdqIQOE928C8ZlcNphliw5Rj8E0fgazdiqsA9Wl piCw== 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=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p21-v6si638988plo.182.2018.08.27.17.38.29; Mon, 27 Aug 2018 17:38:44 -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=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727180AbeH1E0F (ORCPT + 99 others); Tue, 28 Aug 2018 00:26:05 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:45508 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726180AbeH1E0F (ORCPT ); Tue, 28 Aug 2018 00:26:05 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6AAC740006EC; Tue, 28 Aug 2018 00:37:04 +0000 (UTC) Received: from malachite.bss.redhat.com (dhcp-10-20-1-11.bss.redhat.com [10.20.1.11]) by smtp.corp.redhat.com (Postfix) with ESMTP id 20AE810EE6C6; Tue, 28 Aug 2018 00:37:04 +0000 (UTC) From: Lyude Paul To: dri-devel@lists.freedesktop.org Cc: Maarten Lankhorst , Daniel Stone , Gustavo Padovan , Sean Paul , David Airlie , linux-kernel@vger.kernel.org Subject: [PATCH 3/4] drm/dp_mst: Add dp_mst_status debugfs node for all drivers Date: Mon, 27 Aug 2018 20:36:26 -0400 Message-Id: <20180828003635.8200-4-lyude@redhat.com> In-Reply-To: <20180828003635.8200-1-lyude@redhat.com> References: <20180828003635.8200-1-lyude@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Tue, 28 Aug 2018 00:37:04 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Tue, 28 Aug 2018 00:37:04 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'lyude@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Originally I was just going to be adding dp_mst_status for nouveau until Daniel Stone pointed out that we should probably just make this so it's magically added for every DRM driver that's using the DRM DP MST helpers. So, let's do that! Signed-off-by: Lyude Paul Cc: Maarten Lankhorst Cc: Daniel Stone --- drivers/gpu/drm/drm_dp_mst_topology.c | 106 ++++++++++++++++++++++++++ include/drm/drm_dp_mst_helper.h | 14 ++++ 2 files changed, 120 insertions(+) diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index edba17073c7a..c12c2bfc3411 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -3154,6 +3155,104 @@ struct drm_dp_mst_topology_state *drm_atomic_get_mst_topology_state(struct drm_a } EXPORT_SYMBOL(drm_atomic_get_mst_topology_state); +#ifdef CONFIG_DEBUG_FS +static int drm_dp_mst_debugfs_state_show(struct seq_file *m, void *data) +{ + drm_dp_mst_dump_topology(m, m->private); + return 0; +} + +static int drm_dp_mst_debugfs_state_open(struct inode *inode, + struct file *file) +{ + struct drm_dp_mst_topology_mgr *mgr = inode->i_private; + + return single_open(file, drm_dp_mst_debugfs_state_show, mgr); +} + +static const struct file_operations drm_dp_mst_debugfs_state_fops = { + .owner = THIS_MODULE, + .open = drm_dp_mst_debugfs_state_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +struct drm_dp_mst_debugfs_init_data { + struct drm_dp_mst_topology_mgr *mgr; + char *connector_name; +}; + +static void +drm_dp_mst_debugfs_init(void *data) +{ + struct drm_dp_mst_debugfs_init_data *init_data = data; + struct drm_dp_mst_topology_mgr *mgr = init_data->mgr; + struct drm_minor *minor = mgr->dev->primary; + struct dentry *root; + bool put_ref = false; + + /* Create the dp_mst directory for this device if it doesn't exist + * already + */ + root = debugfs_lookup("dp_mst", minor->debugfs_root); + if (root) { + put_ref = true; + } else { + root = debugfs_create_dir("dp_mst", minor->debugfs_root); + if (!root || IS_ERR(root)) + return; + } + + mgr->debugfs = debugfs_create_dir(init_data->connector_name, root); + if (!mgr->debugfs) + goto out_dput; + + debugfs_create_file("state", 0444, mgr->debugfs, mgr, + &drm_dp_mst_debugfs_state_fops); + +out_dput: + if (put_ref) + dput(root); +} + +static void +drm_dp_mst_debugfs_cleanup_cb(void *data) +{ + struct drm_dp_mst_debugfs_init_data *init_data = data; + + init_data->mgr->debugfs_init_cb = NULL; + kfree(init_data->connector_name); + kfree(init_data); +} + +static void +drm_dp_mst_debugfs_register(struct drm_dp_mst_topology_mgr *mgr, + struct drm_connector *connector) +{ + struct drm_dp_mst_debugfs_init_data *init_data; + + if (!connector) + return; + + init_data = kmalloc(sizeof(*init_data), GFP_KERNEL); + if (!init_data) + return; + + init_data->mgr = mgr; + init_data->connector_name = kstrdup(connector->name, GFP_KERNEL); + if (!init_data->connector_name) { + kfree(init_data); + return; + } + + drm_debugfs_register_callback(mgr->dev->primary, + drm_dp_mst_debugfs_init, + drm_dp_mst_debugfs_cleanup_cb, + init_data, &mgr->debugfs_init_cb); +} +#endif + /** * drm_dp_mst_topology_mgr_init - initialise a topology manager * @mgr: manager struct to initialise @@ -3214,6 +3313,9 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr, drm_atomic_private_obj_init(&mgr->base, &mst_state->base, &mst_state_funcs); +#ifdef CONFIG_DEBUG_FS + drm_dp_mst_debugfs_register(mgr, connector); +#endif return 0; } @@ -3225,6 +3327,10 @@ EXPORT_SYMBOL(drm_dp_mst_topology_mgr_init); */ void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr) { +#ifdef CONFIG_DEBUG_FS + drm_debugfs_unregister_callback(mgr->dev->primary, + mgr->debugfs_init_cb); +#endif flush_work(&mgr->work); flush_work(&mgr->destroy_connector_work); mutex_lock(&mgr->payload_lock); diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h index ef8ba093ae8a..c70b81cd78b1 100644 --- a/include/drm/drm_dp_mst_helper.h +++ b/include/drm/drm_dp_mst_helper.h @@ -25,6 +25,7 @@ #include #include #include +#include struct drm_dp_mst_branch; @@ -568,6 +569,19 @@ struct drm_dp_mst_topology_mgr { * avoid locking inversion. */ struct work_struct destroy_connector_work; +#ifdef CONFIG_DEBUG_FS + /** + * @debugfs_init_cb: Pending debugfs callback for initializing the + * debugfs files for this topology. + */ + struct drm_debugfs_callback *debugfs_init_cb; + + /** + * @debugfs_entry: dentry for dp_mst_status located in connector's + * debugfs directory. + */ + struct dentry *debugfs; +#endif }; int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr, -- 2.17.1