| From foo@baz Tue Feb 2 02:03:57 PM CET 2021 |
| From: Filippo Sironi <sironi@amazon.de> |
| Date: Tue, 2 Feb 2021 01:09:37 +0100 |
| Subject: iommu/vt-d: Don't dereference iommu_device if IOMMU_API is not built |
| To: <gregkh@linuxfoundation.org> |
| Cc: <stable@vger.kernel.org>, <samjonas@amazon.com>, <dwmw@amazon.co.uk>, <sironi@amazon.de>, Bartosz Golaszewski <bgolaszewski@baylibre.com>, Joerg Roedel <jroedel@suse.de> |
| Message-ID: <20210202000937.2151-2-sironi@amazon.de> |
| |
| From: Bartosz Golaszewski <bgolaszewski@baylibre.com> |
| |
| commit 9def3b1a07c41e21c68a0eb353e3e569fdd1d2b1 upstream. |
| |
| Since commit c40aaaac1018 ("iommu/vt-d: Gracefully handle DMAR units |
| with no supported address widths") dmar.c needs struct iommu_device to |
| be selected. We can drop this dependency by not dereferencing struct |
| iommu_device if IOMMU_API is not selected and by reusing the information |
| stored in iommu->drhd->ignored instead. |
| |
| This fixes the following build error when IOMMU_API is not selected: |
| |
| drivers/iommu/dmar.c: In function ‘free_iommu’: |
| drivers/iommu/dmar.c:1139:41: error: ‘struct iommu_device’ has no member named ‘ops’ |
| 1139 | if (intel_iommu_enabled && iommu->iommu.ops) { |
| ^ |
| |
| Fixes: c40aaaac1018 ("iommu/vt-d: Gracefully handle DMAR units with no supported address widths") |
| Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com> |
| Acked-by: Lu Baolu <baolu.lu@linux.intel.com> |
| Acked-by: David Woodhouse <dwmw@amazon.co.uk> |
| Link: https://lore.kernel.org/r/20201013073055.11262-1-brgl@bgdev.pl |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| [ - context change due to moving drivers/iommu/dmar.c to |
| drivers/iommu/intel/dmar.c |
| - set the drhr in the iommu like in upstream commit b1012ca8dc4f |
| ("iommu/vt-d: Skip TE disabling on quirky gfx dedicated iommu") ] |
| Signed-off-by: Filippo Sironi <sironi@amazon.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/iommu/dmar.c | 3 ++- |
| include/linux/intel-iommu.h | 2 ++ |
| 2 files changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/iommu/dmar.c |
| +++ b/drivers/iommu/dmar.c |
| @@ -1087,6 +1087,7 @@ static int alloc_iommu(struct dmar_drhd_ |
| raw_spin_lock_init(&iommu->register_lock); |
| |
| drhd->iommu = iommu; |
| + iommu->drhd = drhd; |
| |
| if (intel_iommu_enabled && !drhd->ignored) |
| iommu->iommu_dev = iommu_device_create(NULL, iommu, |
| @@ -1104,7 +1105,7 @@ error: |
| |
| static void free_iommu(struct intel_iommu *iommu) |
| { |
| - if (intel_iommu_enabled && iommu->iommu_dev) |
| + if (intel_iommu_enabled && !iommu->drhd->ignored) |
| iommu_device_destroy(iommu->iommu_dev); |
| |
| if (iommu->irq) { |
| --- a/include/linux/intel-iommu.h |
| +++ b/include/linux/intel-iommu.h |
| @@ -447,6 +447,8 @@ struct intel_iommu { |
| struct device *iommu_dev; /* IOMMU-sysfs device */ |
| int node; |
| u32 flags; /* Software defined flags */ |
| + |
| + struct dmar_drhd_unit *drhd; |
| }; |
| |
| static inline void __iommu_flush_cache( |