Received: by 2002:a05:6358:701b:b0:131:369:b2a3 with SMTP id 27csp4381482rwo; Tue, 25 Jul 2023 05:26:19 -0700 (PDT) X-Google-Smtp-Source: APBJJlGIHT1OJZ2lZ4hp73PmA5co3zV4NJRyleabYShBVKTVMrS7saFxkvK9YPg1TcfqqbgdBcyR X-Received: by 2002:a05:6a20:1449:b0:133:be16:509 with SMTP id a9-20020a056a20144900b00133be160509mr17981002pzi.34.1690287979393; Tue, 25 Jul 2023 05:26:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690287979; cv=none; d=google.com; s=arc-20160816; b=OPyOVwCO9Kvohlxs700xfy7/LW8x/DKX5JNq5ai905Jd1NMp4eNdQ7VN9ZgYHZPpsP H32xKOQ02AT2jbUS3DnqlT233xhzTNwRMJvKMqTmQRrC+IK+THLhKNNwG5JcUgao79V8 7SaBd7aRPkNp3N3Y2Tipsi5n4XqvFEUvUXH/w/jdWPzgB7xrl8V1VpqQszPdLmxYbEMA PmagwPy8AI4uxgBDt9755rr5VIANAxH2XoCJi3Nf6EQkpkfRVjMp1QhhyGsQA5WELNVt 63LOO8vLjUskvVZrE4DtIGORbsNRKCvuwNkkdGp4JKZx2flOaLmCzWsQCQwc1Tp6DimS 46rQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=ezOtLhn8i8ejaqBandOa7C8VNwGl49BQ4dvqVuZDtjw=; fh=vRSaA4tSdqP+K900wM68sOOdqgVpvLLQ5BoCjIf1BBg=; b=xwv+FZ86O5L5Yf8VpgIIzZ9d+kckYNhC7giYC6q1A4bTumTbFfOissOJIfDfKoTKVy 9rhFeyoy0DjVxqLngEhOT2pbA6J9hVUlc3kq8r0b9SwKAYgnzL9nFsYFPDC+hI7W5BV3 lTmsTme+soIuKmw16HKYb2DlHZ7iFWjSCUrot8ynIVFqsFBU1QjLE20gSU8bRRWaJour /8fQLTfkf2FES++rz7+cSyj4sK0A8eQ4TT0O1xo9xKc9YqrUfR0utwi5GlYZMIXrJ+Rs juhGCgRDX+AEkjd8Yh6dYTsxbsXgSmR7Md6eBjthQkzsXHS83WzVAPqIm2cQTmR/Q6Iw tN7Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b="LJedM/I6"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id bs125-20020a632883000000b00543cba6043asi10623096pgb.151.2023.07.25.05.26.06; Tue, 25 Jul 2023 05:26:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b="LJedM/I6"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234834AbjGYLhZ (ORCPT + 99 others); Tue, 25 Jul 2023 07:37:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44386 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234811AbjGYLhX (ORCPT ); Tue, 25 Jul 2023 07:37:23 -0400 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C02EC1BD6 for ; Tue, 25 Jul 2023 04:37:12 -0700 (PDT) Received: from pendragon.ideasonboard.com (213-243-189-158.bb.dnainternet.fi [213.243.189.158]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C819C558; Tue, 25 Jul 2023 13:36:12 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1690284973; bh=goKtL5TeaLpIhqAc9ccfrYvYzQ0K7drvhhiKIDV+Geo=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=LJedM/I6z/5D9v1PFAbSUuDMODS8kRglzHaC+CxCJBSA+IpiMJYQFl5KESBw0GiT4 4LQLnxm9Wen60oitFTgM/cT9iljtUYfKUzLEtZxNh1fkZxLK+69BzBf77nvmcSBkd0 0hqOo2G/S2VS2RStN8+Kuq3RyKAb8v3tRaJfize0= Date: Tue, 25 Jul 2023 14:37:18 +0300 From: Laurent Pinchart To: Tomi Valkeinen Cc: Andrzej Hajda , Neil Armstrong , Robert Foss , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Francesco Dolcini , Aradhya Bhatia , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2] drm/bridge: Add debugfs print for bridge chains Message-ID: <20230725113718.GE31069@pendragon.ideasonboard.com> References: <20230721-drm-bridge-chain-debugfs-v2-1-76df94347962@ideasonboard.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20230721-drm-bridge-chain-debugfs-v2-1-76df94347962@ideasonboard.com> X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Tomi, Thank you for the patch. On Fri, Jul 21, 2023 at 06:01:39PM +0300, Tomi Valkeinen wrote: > DRM bridges are not visible to the userspace and it may not be > immediately clear if the chain is somehow constructed incorrectly. I > have had two separate instances of a bridge driver failing to do a > drm_bridge_attach() call, resulting in the bridge connector not being > part of the chain. In some situations this doesn't seem to cause issues, > but it will if DRM_BRIDGE_ATTACH_NO_CONNECTOR flag is used. > > Add a debugfs file to print the bridge chains. For me, on this TI AM62 > based platform, I get the following output: > > encoder[39] > bridge[0] type: 0, ops: 0x0 > bridge[1] type: 0, ops: 0x0, OF: /bus@f0000/i2c@20000000/dsi@e:toshiba,tc358778 > bridge[2] type: 0, ops: 0x3, OF: /bus@f0000/i2c@20010000/hdmi@48:lontium,lt8912b > bridge[3] type: 11, ops: 0x7, OF: /hdmi-connector:hdmi-connector Names would be more readable than numbers, but I'm not sure that's really worth it. It can always be improved on top if desired. > Signed-off-by: Tomi Valkeinen > --- > Changes in v2: > - Fixed compilation issue when !CONFIG_OF > - Link to v1: https://lore.kernel.org/r/20230721-drm-bridge-chain-debugfs-v1-1-8614ff7e890d@ideasonboard.com > --- > drivers/gpu/drm/drm_bridge.c | 50 +++++++++++++++++++++++++++++++++++++++++++ > drivers/gpu/drm/drm_debugfs.c | 3 +++ > include/drm/drm_bridge.h | 5 +++++ > 3 files changed, 58 insertions(+) > > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c > index c3d69af02e79..d3eb62d5ef3b 100644 > --- a/drivers/gpu/drm/drm_bridge.c > +++ b/drivers/gpu/drm/drm_bridge.c > @@ -27,8 +27,10 @@ > #include > > #include > +#include > #include > #include > +#include > #include > #include > > @@ -1345,6 +1347,54 @@ struct drm_bridge *of_drm_find_bridge(struct device_node *np) > EXPORT_SYMBOL(of_drm_find_bridge); > #endif > > +#ifdef CONFIG_DEBUG_FS > +static int drm_bridge_chains_info(struct seq_file *m, void *data) > +{ > + struct drm_debugfs_entry *entry = m->private; > + struct drm_device *dev = entry->dev; > + struct drm_printer p = drm_seq_file_printer(m); > + struct drm_mode_config *config = &dev->mode_config; As Alexander reported, there's a crash for GPU drivers, as mode_config isn't initialized in that case. I would skip creating the debugfs entry if DRIVER_MODESET isn't set. > + struct drm_encoder *encoder; > + unsigned int bridge_idx = 0; > + > + list_for_each_entry(encoder, &config->encoder_list, head) { > + struct drm_bridge *bridge; > + > + drm_printf(&p, "encoder[%u]\n", encoder->base.id); > + > + bridge = drm_bridge_chain_get_first_bridge(encoder); > + > + while (bridge) { Would drm_for_each_bridge_in_chain() help ? > + drm_printf(&p, "\tbridge[%u] type: %u, ops: %#x", > + bridge_idx, bridge->type, bridge->ops); > + > +#ifdef CONFIG_OF > + if (bridge->of_node) > + drm_printf(&p, ", OF: %pOFfc", bridge->of_node); > +#endif > + > + drm_printf(&p, "\n"); > + > + bridge_idx++; > + bridge = drm_bridge_get_next_bridge(bridge); > + } > + } > + > + return 0; > +} > + > +/* any use in debugfs files to dump individual planes/crtc/etc? */ Those can easily be listed from userspace, so I don't think that's needed. > +static const struct drm_debugfs_info drm_bridge_debugfs_list[] = { > + {"bridge_chains", drm_bridge_chains_info, 0}, Missing spaces after '{' and before '}'. > +}; > + > +void drm_bridge_debugfs_init(struct drm_minor *minor) > +{ > + drm_debugfs_add_files(minor->dev, drm_bridge_debugfs_list, > + ARRAY_SIZE(drm_bridge_debugfs_list)); > +} > +#endif > + > MODULE_AUTHOR("Ajay Kumar "); > MODULE_DESCRIPTION("DRM bridge infrastructure"); > MODULE_LICENSE("GPL and additional rights"); > diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c > index c90dbcffa0dc..3e89559d68cd 100644 > --- a/drivers/gpu/drm/drm_debugfs.c > +++ b/drivers/gpu/drm/drm_debugfs.c > @@ -31,6 +31,7 @@ > > #include > #include > +#include > #include > #include > #include > @@ -272,6 +273,8 @@ int drm_debugfs_init(struct drm_minor *minor, int minor_id, > > drm_debugfs_add_files(minor->dev, drm_debugfs_list, DRM_DEBUGFS_ENTRIES); > > + drm_bridge_debugfs_init(minor); > + > if (drm_drv_uses_atomic_modeset(dev)) { > drm_atomic_debugfs_init(minor); > } > diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h > index bf964cdfb330..60dbee6bd1e6 100644 > --- a/include/drm/drm_bridge.h > +++ b/include/drm/drm_bridge.h > @@ -949,4 +949,9 @@ static inline struct drm_bridge *drmm_of_get_bridge(struct drm_device *drm, > } > #endif > > +#ifdef CONFIG_DEBUG_FS You could drop the conditional compilation, it wouldn't hurt. > +struct drm_minor; > +void drm_bridge_debugfs_init(struct drm_minor *minor); > +#endif > + > #endif > > --- > base-commit: c7a472297169156252a50d76965eb36b081186e2 > change-id: 20230721-drm-bridge-chain-debugfs-0bbc1522f57a -- Regards, Laurent Pinchart