Re: [PATCH] memory: tegra: add multi-socket support to the memory interconnect
From: Sumit Gupta
Date: Tue Jun 02 2026 - 07:55:48 EST
On 29/05/26 20:53, Thierry Reding wrote:
On Fri, May 29, 2026 at 02:55:35PM +0530, Sumit Gupta wrote:
On 28/05/26 18:35, Thierry Reding wrote:of_find_matching_node() has the big downside that it scans the entire
On Thu, May 28, 2026 at 02:20:07PM +0200, Krzysztof Kozlowski wrote:soc_is_tegra()'s match table currently has entries up to Tegra210
On 28/05/2026 13:56, Thierry Reding wrote:We have a utility function (soc_is_tegra()) that we've used in similar
I was thinking about this as well but that would mean your driver willI think we want a top-level directory for a bit more structure inYou assume this is fully synced, so you as well could do a look up andThe singleton was added so multi-socket MC/EMC instances could- mc->debugfs.root = debugfs_create_dir("mc", NULL);That's a probe path and you created a singletone. Looks like preventing
+ if (!mc_debugfs_root)
async probing for no real reason.
I am very against singletons and debugfs does not look like justified
exception.
share a "mc"/"emc" parent. I'll drop it in v2.
On single-socket SoCs, the "mc"/"emc" names will be unchanged.
On multi-socket SoCs, each instance will create a top-level debugfs
dir named with dev_name(). Same pattern in tegra186-emc.c.
if (dev_to_node(mc->dev) == NUMA_NO_NODE)
mc->debugfs.root = debugfs_create_dir("mc", NULL);
else
mc->debugfs.root = debugfs_create_dir(dev_name(mc->dev), NULL);
then use what you found or create new dir. If you think that is racy, so
is this approach... How are other drivers handling per-device debugfs
directories? Do they also create such in the top-level? I think no.
debugfs. But I also think we want to create that top-level directory in
the module's init function rather than _probe.
create it on every multi-arch kernel.
This should be then moved to some core bus (and there are examples of
that, e.g. USB), except there is no core-MC bus code to do that.
situations in the past. We haven't used them in a little while, but it
could be useful here. It's not for free, but should be fairly quick to
error out early on multi-arch kernels.
Thierry
(seems only used by a legacy 32-bit ARM path), so it would skip
the SoCs this patch targets (Tegra186+).
Could we follow tegra_init_soc() in fuse-tegra.c. Only create the
"mc"/"emc" parent at module init when a matching DT node is present:
static int __init tegra_mc_init(void)
{
struct device_node *np;
np = of_find_matching_node(NULL, tegra_mc_of_match);
if (np) {
tegra_mc_debugfs_root = debugfs_create_dir("mc", NULL);
of_node_put(np);
}
return platform_driver_register(&tegra_mc_driver);
}
arch_initcall(tegra_mc_init);
Each probe just creates its per-device child under that parent
without touching any shared state. Same in tegra186-emc.c.
Or would you prefer a different approach, e.g. extending the
soc_is_tegra() match table for arm64 SoCs, before I respin?
device tree to find matching nodes, which can be quite expensive. The
soc_is_tegra() helper uses of_machine_device_match() which only checks
the compatible string on the root node and therefore is much faster.
Good point. Will skip that approach.
Jon is working on a different solution for a similar case for BPMP, so
maybe we can also look at doing something similar for MC. It's a bit
involved because it adds an extra mutex to make sure we don't end up
racing the creation of the parent directory, but it has the advantage
that it's only ever triggered when really needed and doesn't need any
"tricks" like soc_is_tegra().
Sure, will do a similar change as Jon's v3 [1] for debugfs.
[1] https://lore.kernel.org/linux-tegra/20260529173337.155722-2-jonathanh@xxxxxxxxxx/
I wonder if maybe a helper could be extracted from that to make this a
bit easier to replicate elsewhere.
Thierry
Will do it as a follow up if we have more users.
Thank you,
Sumit Gupta