| From 44436bd24fb453bdf57f56afb14b8a4230473084 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 25 Mar 2020 21:16:03 +0100 |
| Subject: drm/tegra: Fix SMMU support on Tegra124 and Tegra210 |
| |
| From: Thierry Reding <treding@nvidia.com> |
| |
| [ Upstream commit 501be6c1c72417eab05e7413671a38ea991a8ebc ] |
| |
| When testing whether or not to enable the use of the SMMU, consult the |
| supported DMA mask rather than the actually configured DMA mask, since |
| the latter might already have been restricted. |
| |
| Fixes: 2d9384ff9177 ("drm/tegra: Relax IOMMU usage criteria on old Tegra") |
| Tested-by: Jon Hunter <jonathanh@nvidia.com> |
| Signed-off-by: Thierry Reding <treding@nvidia.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/tegra/drm.c | 3 ++- |
| drivers/gpu/host1x/dev.c | 13 +++++++++++++ |
| include/linux/host1x.h | 3 +++ |
| 3 files changed, 18 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c |
| index bd268028fb3d6..583cd6e0ae27f 100644 |
| --- a/drivers/gpu/drm/tegra/drm.c |
| +++ b/drivers/gpu/drm/tegra/drm.c |
| @@ -1039,6 +1039,7 @@ void tegra_drm_free(struct tegra_drm *tegra, size_t size, void *virt, |
| |
| static bool host1x_drm_wants_iommu(struct host1x_device *dev) |
| { |
| + struct host1x *host1x = dev_get_drvdata(dev->dev.parent); |
| struct iommu_domain *domain; |
| |
| /* |
| @@ -1076,7 +1077,7 @@ static bool host1x_drm_wants_iommu(struct host1x_device *dev) |
| * sufficient and whether or not the host1x is attached to an IOMMU |
| * doesn't matter. |
| */ |
| - if (!domain && dma_get_mask(dev->dev.parent) <= DMA_BIT_MASK(32)) |
| + if (!domain && host1x_get_dma_mask(host1x) <= DMA_BIT_MASK(32)) |
| return true; |
| |
| return domain != NULL; |
| diff --git a/drivers/gpu/host1x/dev.c b/drivers/gpu/host1x/dev.c |
| index 388bcc2889aaf..40a4b9f8b861a 100644 |
| --- a/drivers/gpu/host1x/dev.c |
| +++ b/drivers/gpu/host1x/dev.c |
| @@ -502,6 +502,19 @@ static void __exit tegra_host1x_exit(void) |
| } |
| module_exit(tegra_host1x_exit); |
| |
| +/** |
| + * host1x_get_dma_mask() - query the supported DMA mask for host1x |
| + * @host1x: host1x instance |
| + * |
| + * Note that this returns the supported DMA mask for host1x, which can be |
| + * different from the applicable DMA mask under certain circumstances. |
| + */ |
| +u64 host1x_get_dma_mask(struct host1x *host1x) |
| +{ |
| + return host1x->info->dma_mask; |
| +} |
| +EXPORT_SYMBOL(host1x_get_dma_mask); |
| + |
| MODULE_AUTHOR("Thierry Reding <thierry.reding@avionic-design.de>"); |
| MODULE_AUTHOR("Terje Bergstrom <tbergstrom@nvidia.com>"); |
| MODULE_DESCRIPTION("Host1x driver for Tegra products"); |
| diff --git a/include/linux/host1x.h b/include/linux/host1x.h |
| index 62d216ff10979..c230b4e70d759 100644 |
| --- a/include/linux/host1x.h |
| +++ b/include/linux/host1x.h |
| @@ -17,9 +17,12 @@ enum host1x_class { |
| HOST1X_CLASS_GR3D = 0x60, |
| }; |
| |
| +struct host1x; |
| struct host1x_client; |
| struct iommu_group; |
| |
| +u64 host1x_get_dma_mask(struct host1x *host1x); |
| + |
| /** |
| * struct host1x_client_ops - host1x client operations |
| * @init: host1x client initialization code |
| -- |
| 2.20.1 |
| |