Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca377809 authored by Tvrtko Ursulin's avatar Tvrtko Ursulin
Browse files

drm/i915: Avoid snooping with userptr where not supported



   commit e5756c10
   Author: Imre Deak <imre.deak@intel.com>
   Date:   Fri Aug 14 18:43:30 2015 +0300

       drm/i915/bxt: don't allow cached GEM mappings on A stepping

Added an exception of disallowing snooping for Broxton A
stepping hardware but userptr was still enabling it regardless.

Move the check to HAS_SNOOP now that it is used from multiple
call sites and use it.

v2: Userptr cannot be supported when it cannot be coherent and
    generalize the code better. (Chris Wilson)

v3: Make has_snoop true only when !has_llc. (Chris Wilson)

Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Imre Deak <imre.deak@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1456920631-34302-1-git-send-email-tvrtko.ursulin@linux.intel.com
parent 32fff610
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -853,6 +853,10 @@ static void intel_device_info_runtime_init(struct drm_device *dev)
	else if (INTEL_INFO(dev)->gen >= 9)
		gen9_sseu_info_init(dev);

	/* Snooping is broken on BXT A stepping. */
	info->has_snoop = !info->has_llc;
	info->has_snoop &= !IS_BXT_REVID(dev, 0, BXT_REVID_A1);

	DRM_DEBUG_DRIVER("slice total: %u\n", info->slice_total);
	DRM_DEBUG_DRIVER("subslice total: %u\n", info->subslice_total);
	DRM_DEBUG_DRIVER("subslice per slice: %u\n", info->subslice_per_slice);
+2 −0
Original line number Diff line number Diff line
@@ -786,6 +786,7 @@ struct intel_csr {
	func(overlay_needs_physical) sep \
	func(supports_tv) sep \
	func(has_llc) sep \
	func(has_snoop) sep \
	func(has_ddi) sep \
	func(has_fpga_dbg)

@@ -2630,6 +2631,7 @@ struct drm_i915_cmd_table {
#define HAS_BLT(dev)		(INTEL_INFO(dev)->ring_mask & BLT_RING)
#define HAS_VEBOX(dev)		(INTEL_INFO(dev)->ring_mask & VEBOX_RING)
#define HAS_LLC(dev)		(INTEL_INFO(dev)->has_llc)
#define HAS_SNOOP(dev)		(INTEL_INFO(dev)->has_snoop)
#define HAS_WT(dev)		((IS_HASWELL(dev) || IS_BROADWELL(dev)) && \
				 __I915__(dev)->ellc_size)
#define I915_NEED_GFX_HWS(dev)	(INTEL_INFO(dev)->need_gfx_hws)
+1 −1
Original line number Diff line number Diff line
@@ -3949,7 +3949,7 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
		 * cacheline, whereas normally such cachelines would get
		 * invalidated.
		 */
		if (IS_BXT_REVID(dev, 0, BXT_REVID_A1))
		if (!HAS_LLC(dev) && !HAS_SNOOP(dev))
			return -ENODEV;

		level = I915_CACHE_LLC;
+7 −0
Original line number Diff line number Diff line
@@ -758,6 +758,13 @@ i915_gem_userptr_ioctl(struct drm_device *dev, void *data, struct drm_file *file
	int ret;
	u32 handle;

	if (!HAS_LLC(dev) && !HAS_SNOOP(dev)) {
		/* We cannot support coherent userptr objects on hw without
		 * LLC and broken snooping.
		 */
		return -ENODEV;
	}

	if (args->flags & ~(I915_USERPTR_READ_ONLY |
			    I915_USERPTR_UNSYNCHRONIZED))
		return -EINVAL;