android_kernel_samsung_a7y1.../drivers/iommu
Daniel Drake 744dc29fb6 iommu/vt-d: Ignore devices with out-of-spec domain number
commit da72a379b2ec0bad3eb265787f7008bead0b040c upstream.

VMD subdevices are created with a PCI domain ID of 0x10000 or
higher.

These subdevices are also handled like all other PCI devices by
dmar_pci_bus_notifier().

However, when dmar_alloc_pci_notify_info() take records of such devices,
it will truncate the domain ID to a u16 value (in info->seg).
The device at (e.g.) 10000:00:02.0 is then treated by the DMAR code as if
it is 0000:00:02.0.

In the unlucky event that a real device also exists at 0000:00:02.0 and
also has a device-specific entry in the DMAR table,
dmar_insert_dev_scope() will crash on:
   BUG_ON(i >= devices_cnt);

That's basically a sanity check that only one PCI device matches a
single DMAR entry; in this case we seem to have two matching devices.

Fix this by ignoring devices that have a domain number higher than
what can be looked up in the DMAR table.

This problem was carefully diagnosed by Jian-Hong Pan.

Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Daniel Drake <drake@endlessm.com>
Fixes: 59ce0515cdaf3 ("iommu/vt-d: Update DRHD/RMRR/ATSR device scope caches when PCI hotplug happens")
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-04-07 14:11:55 +02:00
..
amd_iommu_init.c iommu/amd: Make iommu_disable safer 2020-04-07 13:42:24 +02:00
amd_iommu_proto.h
amd_iommu_types.h
amd_iommu_v2.c
amd_iommu.c iommu/amd: Wait for completion of IOTLB flush in attach_device 2020-04-07 13:43:24 +02:00
arm-smmu-v3.c iommu/arm-smmu-v3: Use WRITE_ONCE() when changing validity of an STE 2020-04-07 13:56:53 +02:00
arm-smmu.c
dma-iommu.c
dmar.c iommu/vt-d: Ignore devices with out-of-spec domain number 2020-04-07 14:11:55 +02:00
exynos-iommu.c
exynos-iommu.h
exynos-iovmm.c
fsl_pamu_domain.c
fsl_pamu_domain.h
fsl_pamu.c
fsl_pamu.h
intel_irq_remapping.c
intel-iommu.c iommu/vt-d: Fix a bug in intel_iommu_iova_to_phys() for huge page 2020-04-07 14:11:46 +02:00
intel-svm.c
io-pgtable-arm.c
io-pgtable.c
io-pgtable.h
iommu-sysfs.c
iommu-traces.c
iommu.c
iova.c
ipmmu-vmsa.c
irq_remapping.c
irq_remapping.h
Kconfig
Makefile
msm_iommu_dev.c
msm_iommu_hw-8xxx.h
msm_iommu.c
msm_iommu.h
of_iommu.c
omap-iommu-debug.c
omap-iommu.c
omap-iommu.h
omap-iopgtable.h
rockchip-iommu.c
s390-iommu.c
shmobile-iommu.c
shmobile-ipmmu.c
shmobile-ipmmu.h
tegra-gart.c
tegra-smmu.c