From: Chris Wilson chris@chris-wilson.co.uk
stable inclusion from linux-4.19.155 commit d1dff15c809e93af022da03f4663b8ac93e3d1c9
--------------------------------
commit 8195400f7ea95399f721ad21f4d663a62c65036f upstream.
If i915.ko is being used as a passthrough device, it does not know if the host is using intel_iommu. Mixing the iommu and gfx causes a few issues (such as scanout overfetch) which we need to workaround inside the driver, so if we detect we are running under a hypervisor, also assume the device access is being virtualised.
Reported-by: Stefan Fritsch sf@sfritsch.de Suggested-by: Stefan Fritsch sf@sfritsch.de Signed-off-by: Chris Wilson chris@chris-wilson.co.uk Cc: Zhenyu Wang zhenyuw@linux.intel.com Cc: Joonas Lahtinen joonas.lahtinen@linux.intel.com Cc: Stefan Fritsch sf@sfritsch.de Cc: stable@vger.kernel.org Tested-by: Stefan Fritsch sf@sfritsch.de Reviewed-by: Zhenyu Wang zhenyuw@linux.intel.com Link: https://patchwork.freedesktop.org/patch/msgid/20201019101523.4145-1-chris@ch... (cherry picked from commit f566fdcd6cc49a9d5b5d782f56e3e7cb243f01b8) Signed-off-by: Rodrigo Vivi rodrigo.vivi@intel.com Signed-off-by: Greg Kroah-Hartman gregkh@linuxfoundation.org Signed-off-by: Yang Yingliang yangyingliang@huawei.com --- drivers/gpu/drm/i915/i915_drv.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index db2e9af49ae6..37c80cfecd09 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -33,6 +33,8 @@ #include <uapi/drm/i915_drm.h> #include <uapi/drm/drm_fourcc.h>
+#include <asm/hypervisor.h> + #include <linux/io-mapping.h> #include <linux/i2c.h> #include <linux/i2c-algo-bit.h> @@ -2683,7 +2685,9 @@ static inline bool intel_vtd_active(void) if (intel_iommu_gfx_mapped) return true; #endif - return false; + + /* Running as a guest, we assume the host is enforcing VT'd */ + return !hypervisor_is_type(X86_HYPER_NATIVE); }
static inline bool intel_scanout_needs_vtd_wa(struct drm_i915_private *dev_priv)