We should enable semaphores on IVB by default, and on SNB in cases where dma remapping is disabled or iommu is not enabled. v2: adapt patch according to the feedback, and put it in line with Keith's rc6 enabling patch. CC: Daniel Vetter <daniel.vetter at ffwll.ch> CC: Ben Widawsky <ben at bwidawsk.net> CC: Keith Packard <keithp at keithp.com> CC: Jesse Barnes <jbarnes at virtuousgeek.org> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42696 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=40564 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41353 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=38862 Signed-off-by: Eugeni Dodonov <eugeni.dodonov at intel.com> --- drivers/gpu/drm/i915/i915_drv.c | 4 ++-- drivers/gpu/drm/i915/i915_gem_execbuffer.c | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index cc531bb..83b2be4 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -58,10 +58,10 @@ module_param_named(powersave, i915_powersave, int, 0600); MODULE_PARM_DESC(powersave, "Enable powersavings, fbc, downclocking, etc. (default: true)"); -unsigned int i915_semaphores __read_mostly = 0; +unsigned int i915_semaphores __read_mostly = -1; module_param_named(semaphores, i915_semaphores, int, 0600); MODULE_PARM_DESC(semaphores, - "Use semaphores for inter-ring sync (default: false)"); + "Use semaphores for inter-ring sync (default: -1 (use per-chip defaults))"); unsigned int i915_enable_rc6 __read_mostly = 0; module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 3693e83..c19a063 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -33,6 +33,11 @@ #include "i915_trace.h" #include "intel_drv.h" +#ifdef CONFIG_INTEL_IOMMU +#include <linux/dma_remapping.h> +#include <linux/dmar.h> +#endif + struct change_domains { uint32_t invalidate_domains; uint32_t flush_domains; @@ -746,6 +751,23 @@ i915_gem_execbuffer_flush(struct drm_device *dev, return 0; } +static bool +intel_enable_semaphores(struct drm_device *dev) +{ + if (i915_semaphores >= 0) + return i915_semaphores; + if (INTEL_INFO(dev)->gen >= 7) + return 1; +#ifdef CONFIG_INTEL_IOMMU + /* On gen6, we only enable semaphores if dma remapping is disabled, + * or if there is no iommu. + */ + if (INTEL_INFO(dev)->gen == 6) + return no_iommu || dmar_disabled; +#endif + return 1; +} + static int i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj, struct intel_ring_buffer *to) @@ -758,7 +780,7 @@ i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj, return 0; /* XXX gpu semaphores are implicated in various hard hangs on SNB */ - if (INTEL_INFO(obj->base.dev)->gen < 6 || !i915_semaphores) + if (INTEL_INFO(obj->base.dev)->gen < 6 || !intel_enable_semaphores(obj->base.dev)) return i915_gem_object_wait_rendering(obj); idx = intel_ring_sync_index(from, to); -- 1.7.7.4