@@ -16,7 +16,7 @@ i915_gem_object_swapout_pages(struct drm_i915_gem_object *obj,
struct drm_i915_private *i915 = to_i915(obj->base.dev);
struct drm_i915_gem_object *dst, *src;
unsigned long start, diff, msec;
- int err;
+ int err = -EINVAL;
GEM_BUG_ON(obj->swapto);
GEM_BUG_ON(i915_gem_object_has_pages(obj));
@@ -54,7 +54,10 @@ i915_gem_object_swapout_pages(struct drm_i915_gem_object *obj,
__i915_gem_object_pin_pages(src);
/* copying the pages */
- err = i915_gem_object_memcpy(dst, src);
+ if (i915->params.enable_eviction >= 2)
+ err = i915_window_blt_copy(dst, src);
+ if (err && i915->params.enable_eviction != 2)
+ err = i915_gem_object_memcpy(dst, src);
__i915_gem_object_unpin_pages(src);
__i915_gem_object_unset_pages(src);
@@ -83,7 +86,7 @@ i915_gem_object_swapin_pages(struct drm_i915_gem_object *obj,
struct drm_i915_private *i915 = to_i915(obj->base.dev);
struct drm_i915_gem_object *dst, *src;
unsigned long start, diff, msec;
- int err;
+ int err = -EINVAL;
GEM_BUG_ON(!obj->swapto);
GEM_BUG_ON(i915_gem_object_has_pages(obj));
@@ -117,7 +120,10 @@ i915_gem_object_swapin_pages(struct drm_i915_gem_object *obj,
__i915_gem_object_pin_pages(dst);
/* copying the pages */
- err = i915_gem_object_memcpy(dst, src);
+ if (i915->params.enable_eviction >= 2)
+ err = i915_window_blt_copy(dst, src);
+ if (err && i915->params.enable_eviction != 2)
+ err = i915_gem_object_memcpy(dst, src);
__i915_gem_object_unpin_pages(dst);
__i915_gem_object_unset_pages(dst);
@@ -891,7 +891,7 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
i915_driver_register(i915);
- if (HAS_LMEM(i915)) {
+ if (HAS_LMEM(i915) && i915->params.enable_eviction >= 2) {
ret = i915_setup_blt_windows(i915);
if (ret)
goto out_cleanup_drv_register;
@@ -939,7 +939,7 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
void i915_driver_remove(struct drm_i915_private *i915)
{
- if (HAS_LMEM(i915))
+ if (HAS_LMEM(i915) && i915->params.enable_eviction >= 2)
i915_teardown_blt_windows(i915);
disable_rpm_wakeref_asserts(&i915->runtime_pm);
@@ -197,8 +197,10 @@ i915_param_named_unsafe(fake_lmem_start, ulong, 0400,
"Fake LMEM start offset (default: 0)");
#endif
-i915_param_named_unsafe(enable_eviction, bool, 0600,
- "Enable memcpy based eviction which does not rely on DMA resv refactoring)");
+i915_param_named_unsafe(enable_eviction, uint, 0600,
+ "Enable eviction which does not rely on DMA resv refactoring "
+ "0=disabled, 1=memcpy based only, 2=blt based only, "
+ "3=blt based but fallsback to memcpy based [default])");
i915_param_named_unsafe(lmem_size, uint, 0400,
"Change lmem size for each region. (default: 0, all memory)");
@@ -72,8 +72,8 @@ struct drm_printer;
param(char *, force_probe, CONFIG_DRM_I915_FORCE_PROBE, 0400) \
param(unsigned long, fake_lmem_start, 0, 0400) \
param(unsigned int, lmem_size, 0, 0400) \
+ param(unsigned int, enable_eviction, 3, 0600) \
/* leave bools at the end to not create holes */ \
- param(bool, enable_eviction, true, 0600) \
param(bool, enable_hangcheck, true, 0600) \
param(bool, load_detect_test, false, 0600) \
param(bool, force_reset_modeset_test, false, 0600) \