Commit ea69dc4e authored by Ashish Mhetre's avatar Ashish Mhetre Committed by Will Deacon
Browse files

iommu/arm-smmu-v3: Add device-tree support for CMDQV driver



Add device tree support to the CMDQV driver to enable usage on Tegra264
SoCs. The implementation parses the nvidia,cmdqv phandle from the SMMU
device tree node to associate each SMMU with its corresponding CMDQV
instance based on compatible string.

Reviewed-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Signed-off-by: default avatarAshish Mhetre <amhetre@nvidia.com>
Reviewed-by: default avatarJon Hunter <jonathanh@nvidia.com>
Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent eb20758f
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -4533,6 +4533,35 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
	return 0;
}

#ifdef CONFIG_TEGRA241_CMDQV
static void tegra_cmdqv_dt_probe(struct device_node *smmu_node,
				 struct arm_smmu_device *smmu)
{
	struct platform_device *pdev;
	struct device_node *np;

	np = of_parse_phandle(smmu_node, "nvidia,cmdqv", 0);
	if (!np)
		return;

	/* Tegra241 CMDQV driver is responsible for put_device() */
	pdev = of_find_device_by_node(np);
	of_node_put(np);
	if (!pdev)
		return;

	smmu->impl_dev = &pdev->dev;
	smmu->options |= ARM_SMMU_OPT_TEGRA241_CMDQV;
	dev_dbg(smmu->dev, "found companion CMDQV device: %s\n",
		dev_name(smmu->impl_dev));
}
#else
static void tegra_cmdqv_dt_probe(struct device_node *smmu_node,
				 struct arm_smmu_device *smmu)
{
}
#endif

#ifdef CONFIG_ACPI
#ifdef CONFIG_TEGRA241_CMDQV
static void acpi_smmu_dsdt_probe_tegra241_cmdqv(struct acpi_iort_node *node,
@@ -4638,6 +4667,9 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev,
	if (of_dma_is_coherent(dev->of_node))
		smmu->features |= ARM_SMMU_FEAT_COHERENCY;

	if (of_device_is_compatible(dev->of_node, "nvidia,tegra264-smmu"))
		tegra_cmdqv_dt_probe(dev->of_node, smmu);

	return ret;
}