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

2020-11-27 Thread Chris Wilson
Quoting Matthew Auld (2020-11-27 12:06:56)
> From: Ramalingam C 
> 
> window_blt_copy feature is used for swapin and swapout based on the i915
> module parameter called enable_eviction.

A module parameter?
-Chris
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


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

2020-11-27 Thread Matthew Auld
From: Ramalingam C 

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

Signed-off-by: Ramalingam C 
Cc: Matthew Auld 
Cc: CQ Tang 
---
 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) \
--