[RFC PATCH 140/162] drm/i915: window_blt_copy is used for swapin and swapout

Matthew Auld matthew.auld at intel.com
Fri Nov 27 12:06:56 UTC 2020


From: Ramalingam C <ramalingam.c at intel.com>

window_blt_copy feature is used for swapin and swapout based on the i915
module parameter called enable_eviction.

Signed-off-by: Ramalingam C <ramalingam.c at intel.com>
Cc: Matthew Auld <matthew.auld at intel.com>
Cc: CQ Tang <cq.tang at intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_region.c | 14 ++++++++++----
 drivers/gpu/drm/i915/i915_drv.c            |  4 ++--
 drivers/gpu/drm/i915/i915_params.c         |  6 ++++--
 drivers/gpu/drm/i915/i915_params.h         |  2 +-
 4 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_region.c b/drivers/gpu/drm/i915/gem/i915_gem_region.c
index 4fab9f6b4bee..f9ff0aa31752 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_region.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_region.c
@@ -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);
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 683643b211fa..78b528e89486 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -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);
diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
index 264de32f3d6a..9fa58ed76614 100644
--- a/drivers/gpu/drm/i915/i915_params.c
+++ b/drivers/gpu/drm/i915/i915_params.c
@@ -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)");
diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h
index be6979e7feda..c835e592ee5f 100644
--- a/drivers/gpu/drm/i915/i915_params.h
+++ b/drivers/gpu/drm/i915/i915_params.h
@@ -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) \
-- 
2.26.2



More information about the dri-devel mailing list