On 12/07/2024 4:24 pm, Jon Hunter wrote:
On 12/07/2024 12:48, Robin Murphy wrote:
...
I am seeing some failures on -next with some of our devices. Bisect
is pointing to this commit. Looks like the host1x device is no longer
probing successfully. I see the following ...
tegra-host1x 50000000.host1x: failed to initialize fwspec: -517
nouveau 57000000.gpu: failed to initialize fwspec: -517
The probe seems to be deferred forever. The above is seen on Tegra210
but Tegra30 and Tegra194 are also having the same problem.
Interestingly it is not all devices and so make me wonder if we are
missing something on these devices? Let me know if you have any
thoughts.
Ugh, tegra-smmu has been doing a complete nonsense this whole time -
on closer inspection, it's passing the fwnode of the *client device*
where it should be that of the IOMMU device :(
I *think* it should probably just be a case of:
- err = iommu_fwspec_init(dev, of_fwnode_handle(dev->of_node));
+ err = iommu_fwspec_init(dev, of_fwnode_handle(smmu->dev->of_node));
since smmu->dev appears to be the same one initially passed to
iommu_device_register(), so it at least ought to match and work, but
the SMMU device vs. MC device thing leaves me mildly wary of how
correct it might be overall.
(Also now I'm wondering why I didn't just use dev_fwnode() there...)
Yes making that change in the tegra-smmu driver does fix it.
Ace, thanks for confirming! I was just writing a follow-up to say that
I've pretty much convinced myself that this (proper diff below) should
in fact be the right thing to do in general as well :)
Will, Joerg, would you prefer to have a standalone fix patch for the
nvidia/tegra branch to then re-merge fwspec-ops-removal and fix up the
conflict, or just a patch on top of fwspec-ops-removal as below?
Thanks,
Robin.
----->8-----
diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c
index 4365d9936e68..7f633bb5efef 100644
--- a/drivers/iommu/tegra-smmu.c
+++ b/drivers/iommu/tegra-smmu.c
@@ -837,7 +837,7 @@ static int tegra_smmu_configure(struct tegra_smmu
*smmu, struct device *dev,
const struct iommu_ops *ops = smmu->iommu.ops;
int err;
- err = iommu_fwspec_init(dev, of_fwnode_handle(dev->of_node));
+ err = iommu_fwspec_init(dev, dev_fwnode(smmu->dev));
if (err < 0) {
dev_err(dev, "failed to initialize fwspec: %d\n", err);
return err;