[PATCH 1/1][SRU][J] UBUNTU: SAUCE: iommu: intel-ipu: use IOMMU passthrough mode for Intel IPUs
Kai-Heng Feng
kai.heng.feng at canonical.com
Wed Feb 23 02:29:16 UTC 2022
On Wed, Feb 23, 2022 at 10:22 AM You-Sheng Yang
<vicamo.yang at canonical.com> wrote:
>
> From: zouxiaoh <xiaohong.zou at intel.com>
>
> BugLink: https://bugs.launchpad.net/bugs/1958004
>
> Intel IPU(Image Processing Unit) has its own (IO)MMU hardware,
> The IPU driver allocates its own page table that is not mapped
> via the DMA, and thus the Intel IOMMU driver blocks access giving
> this error: DMAR: DRHD: handling fault status reg 3 DMAR:
> [DMA Read] Request device [00:05.0] PASID ffffffff
> fault addr 76406000 [fault reason 06] PTE Read access is not set
> As IPU is not an external facing device which is not risky, so use
> IOMMU passthrough mode for Intel IPUs.
Many non-external facing devices also use DMA mode, so this is not a
good justification.
Can we ask whether PT mode is used for IPU6 under ChromeOS and Windows?
Kai-Heng
>
> Change-Id: I6dcccdadac308cf42e20a18e1b593381391e3e6b
> Depends-On: Iacd67578e8c6a9b9ac73285f52b4081b72fb68a6
> Tracked-On: #JIITL8-411
> Signed-off-by: Bingbu Cao <bingbu.cao at intel.com>
> Signed-off-by: zouxiaoh <xiaohong.zou at intel.com>
> Signed-off-by: Xu Chongyang <chongyang.xu at intel.com>
> (cherry picked from https://github.com/intel/ipu6-drivers/blob/5d5526d2b2811aa52590c2fa513ba989e7e594ab/patch/IOMMU-passthrough-for-intel-ipu.diff)
> Signed-off-by: You-Sheng Yang <vicamo.yang at canonical.com>
> ---
> drivers/iommu/intel/iommu.c | 29 +++++++++++++++++++++++++++++
> 1 file changed, 29 insertions(+)
>
> diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
> index 78f8c8e6803e..ff451b4e4a5a 100644
> --- a/drivers/iommu/intel/iommu.c
> +++ b/drivers/iommu/intel/iommu.c
> @@ -57,6 +57,12 @@
> #define IS_GFX_DEVICE(pdev) ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY)
> #define IS_USB_DEVICE(pdev) ((pdev->class >> 8) == PCI_CLASS_SERIAL_USB)
> #define IS_ISA_DEVICE(pdev) ((pdev->class >> 8) == PCI_CLASS_BRIDGE_ISA)
> +#define IS_INTEL_IPU(pdev) ((pdev)->vendor == PCI_VENDOR_ID_INTEL && \
> + ((pdev)->device == 0x9a19 || \
> + (pdev)->device == 0x9a39 || \
> + (pdev)->device == 0x4e19 || \
> + (pdev)->device == 0x465d || \
> + (pdev)->device == 0x1919))
> #define IS_AZALIA(pdev) ((pdev)->vendor == 0x8086 && (pdev)->device == 0x3a3e)
>
> #define IOAPIC_RANGE_START (0xfee00000)
> @@ -335,12 +341,14 @@ int intel_iommu_enabled = 0;
> EXPORT_SYMBOL_GPL(intel_iommu_enabled);
>
> static int dmar_map_gfx = 1;
> +static int dmar_map_ipu = 1;
> static int intel_iommu_superpage = 1;
> static int iommu_identity_mapping;
> static int iommu_skip_te_disable;
>
> #define IDENTMAP_GFX 2
> #define IDENTMAP_AZALIA 4
> +#define IDENTMAP_IPU 8
>
> int intel_iommu_gfx_mapped;
> EXPORT_SYMBOL_GPL(intel_iommu_gfx_mapped);
> @@ -2879,6 +2887,9 @@ static int device_def_domain_type(struct device *dev)
>
> if ((iommu_identity_mapping & IDENTMAP_GFX) && IS_GFX_DEVICE(pdev))
> return IOMMU_DOMAIN_IDENTITY;
> +
> + if ((iommu_identity_mapping & IDENTMAP_IPU) && IS_INTEL_IPU(pdev))
> + return IOMMU_DOMAIN_IDENTITY;
> }
>
> return 0;
> @@ -3315,6 +3326,9 @@ static int __init init_dmars(void)
> if (!dmar_map_gfx)
> iommu_identity_mapping |= IDENTMAP_GFX;
>
> + if (!dmar_map_ipu)
> + iommu_identity_mapping |= IDENTMAP_IPU;
> +
> check_tylersburg_isoch();
>
> ret = si_domain_init(hw_pass_through);
> @@ -5607,6 +5621,18 @@ static void quirk_iommu_igfx(struct pci_dev *dev)
> dmar_map_gfx = 0;
> }
>
> +static void quirk_iommu_ipu(struct pci_dev *dev)
> +{
> + if (!IS_INTEL_IPU(dev))
> + return;
> +
> + if (risky_device(dev))
> + return;
> +
> + pci_info(dev, "Passthrough IOMMU for integrated Intel IPU\n");
> + dmar_map_ipu = 0;
> +}
> +
> /* G4x/GM45 integrated gfx dmar support is totally busted. */
> DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_igfx);
> DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e00, quirk_iommu_igfx);
> @@ -5642,6 +5668,9 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1632, quirk_iommu_igfx);
> DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x163A, quirk_iommu_igfx);
> DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x163D, quirk_iommu_igfx);
>
> +/* disable IPU dmar support */
> +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_iommu_ipu);
> +
> static void quirk_iommu_rwbf(struct pci_dev *dev)
> {
> if (risky_device(dev))
> --
> 2.34.1
>
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
More information about the kernel-team
mailing list