[Intel-gfx] [PATCH v3] drm/i915: Compare GGTT view structs instead of types

2015-03-27 Thread Joonas Lahtinen
To allow for views where the view type is not defined by the view type only,
like it is in stereo or rotated 90 degree view, change the semantic to require
the whole view structure for comparison when we match a GGTT view.

This allows including parameters like offset to be included in the view which
is useful for eg. partial views.

v3:
- Rely on ggtt_view type being 0 for non-GGTT vma's, which equals to
  I915_GGTT_VIEW_NORMAL. (Daniel Vetter)
- Do not use potentially slower comparison when we only want to know if
  something is or is not a normal view.
- Rebase on top of rotated view patches. Add rotated view singleton.
- If one view is missing in comparison they're equal only if both are missing.

Cc: Daniel Vetter 
Reviewed-by: Tvrtko Ursulin  (v2)
Signed-off-by: Joonas Lahtinen 
---
 drivers/gpu/drm/i915/i915_drv.h  |  8 
 drivers/gpu/drm/i915/i915_gem.c  | 13 +++--
 drivers/gpu/drm/i915/i915_gem_gtt.c  |  3 +++
 drivers/gpu/drm/i915/i915_gem_gtt.h  |  8 
 drivers/gpu/drm/i915/intel_display.c |  8 +++-
 5 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 256369f..5aeba60 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2794,19 +2794,19 @@ void i915_gem_restore_fences(struct drm_device *dev);
 
 unsigned long
 i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
- enum i915_ggtt_view_type view);
+ const struct i915_ggtt_view *view);
 unsigned long
 i915_gem_obj_offset(struct drm_i915_gem_object *o,
struct i915_address_space *vm);
 static inline unsigned long
 i915_gem_obj_ggtt_offset(struct drm_i915_gem_object *o)
 {
-   return i915_gem_obj_ggtt_offset_view(o, I915_GGTT_VIEW_NORMAL);
+   return i915_gem_obj_ggtt_offset_view(o, &i915_ggtt_view_normal);
 }
 
 bool i915_gem_obj_bound_any(struct drm_i915_gem_object *o);
 bool i915_gem_obj_ggtt_bound_view(struct drm_i915_gem_object *o,
- enum i915_ggtt_view_type view);
+ const struct i915_ggtt_view *view);
 bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
struct i915_address_space *vm);
 
@@ -2854,7 +2854,7 @@ i915_vm_to_ppgtt(struct i915_address_space *vm)
 
 static inline bool i915_gem_obj_ggtt_bound(struct drm_i915_gem_object *obj)
 {
-   return i915_gem_obj_ggtt_bound_view(obj, I915_GGTT_VIEW_NORMAL);
+   return i915_gem_obj_ggtt_bound_view(obj, &i915_ggtt_view_normal);
 }
 
 static inline unsigned long
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 3300963..8c32b1d 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4131,7 +4131,7 @@ i915_gem_object_do_pin(struct drm_i915_gem_object *obj,
 
if (i915_vma_misplaced(vma, alignment, flags)) {
unsigned long offset;
-   offset = ggtt_view ? i915_gem_obj_ggtt_offset_view(obj, 
ggtt_view->type) :
+   offset = ggtt_view ? i915_gem_obj_ggtt_offset_view(obj, 
ggtt_view) :
 i915_gem_obj_offset(obj, vm);
WARN(vma->pin_count,
 "bo is already pinned in %s with incorrect 
alignment:"
@@ -4230,7 +4230,7 @@ i915_gem_object_ggtt_unpin_view(struct 
drm_i915_gem_object *obj,
 
BUG_ON(!vma);
WARN_ON(vma->pin_count == 0);
-   WARN_ON(!i915_gem_obj_ggtt_bound_view(obj, view->type));
+   WARN_ON(!i915_gem_obj_ggtt_bound_view(obj, view));
 
if (--vma->pin_count == 0 && view->type == I915_GGTT_VIEW_NORMAL)
obj->pin_mappable = false;
@@ -5109,13 +5109,14 @@ i915_gem_obj_offset(struct drm_i915_gem_object *o,
 
 unsigned long
 i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
- enum i915_ggtt_view_type view)
+ const struct i915_ggtt_view *view)
 {
struct i915_address_space *ggtt = i915_obj_to_ggtt(o);
struct i915_vma *vma;
 
list_for_each_entry(vma, &o->vma_list, vma_link)
-   if (vma->vm == ggtt && vma->ggtt_view.type == view)
+   if (vma->vm == ggtt &&
+   i915_ggtt_view_equal(&vma->ggtt_view, view))
return vma->node.start;
 
WARN(1, "global vma for this object not found.\n");
@@ -5139,14 +5140,14 @@ bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
 }
 
 bool i915_gem_obj_ggtt_bound_view(struct drm_i915_gem_object *o,
- enum i915_ggtt_view_type view)
+ const struct i915_ggtt_view *view)
 {
struct i915_address_space *ggtt = i915_obj_to_ggtt(o);
struct i915_vma *vma;
 
list_for_each_entry(vma, &o->vma_list, vma_link)
if (vma-

Re: [Intel-gfx] [PATCH v3] drm/i915: Compare GGTT view structs instead of types

2015-03-27 Thread Tvrtko Ursulin


Hi,

On 03/27/2015 10:03 AM, Joonas Lahtinen wrote:

To allow for views where the view type is not defined by the view type only,
like it is in stereo or rotated 90 degree view, change the semantic to require
the whole view structure for comparison when we match a GGTT view.

This allows including parameters like offset to be included in the view which
is useful for eg. partial views.

v3:
- Rely on ggtt_view type being 0 for non-GGTT vma's, which equals to
   I915_GGTT_VIEW_NORMAL. (Daniel Vetter)
- Do not use potentially slower comparison when we only want to know if
   something is or is not a normal view.
- Rebase on top of rotated view patches. Add rotated view singleton.
- If one view is missing in comparison they're equal only if both are missing.

Cc: Daniel Vetter 
Reviewed-by: Tvrtko Ursulin  (v2)
Signed-off-by: Joonas Lahtinen 
---
  drivers/gpu/drm/i915/i915_drv.h  |  8 
  drivers/gpu/drm/i915/i915_gem.c  | 13 +++--
  drivers/gpu/drm/i915/i915_gem_gtt.c  |  3 +++
  drivers/gpu/drm/i915/i915_gem_gtt.h  |  8 
  drivers/gpu/drm/i915/intel_display.c |  8 +++-
  5 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 256369f..5aeba60 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2794,19 +2794,19 @@ void i915_gem_restore_fences(struct drm_device *dev);

  unsigned long
  i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
- enum i915_ggtt_view_type view);
+ const struct i915_ggtt_view *view);
  unsigned long
  i915_gem_obj_offset(struct drm_i915_gem_object *o,
struct i915_address_space *vm);
  static inline unsigned long
  i915_gem_obj_ggtt_offset(struct drm_i915_gem_object *o)
  {
-   return i915_gem_obj_ggtt_offset_view(o, I915_GGTT_VIEW_NORMAL);
+   return i915_gem_obj_ggtt_offset_view(o, &i915_ggtt_view_normal);
  }

  bool i915_gem_obj_bound_any(struct drm_i915_gem_object *o);
  bool i915_gem_obj_ggtt_bound_view(struct drm_i915_gem_object *o,
- enum i915_ggtt_view_type view);
+ const struct i915_ggtt_view *view);
  bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
struct i915_address_space *vm);

@@ -2854,7 +2854,7 @@ i915_vm_to_ppgtt(struct i915_address_space *vm)

  static inline bool i915_gem_obj_ggtt_bound(struct drm_i915_gem_object *obj)
  {
-   return i915_gem_obj_ggtt_bound_view(obj, I915_GGTT_VIEW_NORMAL);
+   return i915_gem_obj_ggtt_bound_view(obj, &i915_ggtt_view_normal);
  }

  static inline unsigned long
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 3300963..8c32b1d 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4131,7 +4131,7 @@ i915_gem_object_do_pin(struct drm_i915_gem_object *obj,

if (i915_vma_misplaced(vma, alignment, flags)) {
unsigned long offset;
-   offset = ggtt_view ? i915_gem_obj_ggtt_offset_view(obj, 
ggtt_view->type) :
+   offset = ggtt_view ? i915_gem_obj_ggtt_offset_view(obj, 
ggtt_view) :
 i915_gem_obj_offset(obj, vm);
WARN(vma->pin_count,
 "bo is already pinned in %s with incorrect 
alignment:"
@@ -4230,7 +4230,7 @@ i915_gem_object_ggtt_unpin_view(struct 
drm_i915_gem_object *obj,

BUG_ON(!vma);
WARN_ON(vma->pin_count == 0);
-   WARN_ON(!i915_gem_obj_ggtt_bound_view(obj, view->type));
+   WARN_ON(!i915_gem_obj_ggtt_bound_view(obj, view));

if (--vma->pin_count == 0 && view->type == I915_GGTT_VIEW_NORMAL)
obj->pin_mappable = false;


No comparison helper in i915_gem_obj_to_ggtt_view()?


@@ -5109,13 +5109,14 @@ i915_gem_obj_offset(struct drm_i915_gem_object *o,

  unsigned long
  i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
- enum i915_ggtt_view_type view)
+ const struct i915_ggtt_view *view)
  {
struct i915_address_space *ggtt = i915_obj_to_ggtt(o);
struct i915_vma *vma;

list_for_each_entry(vma, &o->vma_list, vma_link)
-   if (vma->vm == ggtt && vma->ggtt_view.type == view)
+   if (vma->vm == ggtt &&
+   i915_ggtt_view_equal(&vma->ggtt_view, view))
return vma->node.start;

WARN(1, "global vma for this object not found.\n");
@@ -5139,14 +5140,14 @@ bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
  }

  bool i915_gem_obj_ggtt_bound_view(struct drm_i915_gem_object *o,
- enum i915_ggtt_view_type view)
+ const struct i915_ggtt_view *view)
  {
struct i915_address_space *ggtt = i915_

Re: [Intel-gfx] [PATCH v3] drm/i915: Compare GGTT view structs instead of types

2015-03-27 Thread shuang . he
Tested-By: PRC QA PRTS (Patch Regression Test System Contact: 
shuang...@intel.com)
Task id: 6072
-Summary-
Platform  Delta  drm-intel-nightly  Series Applied
PNV  276/276  276/276
ILK  303/303  303/303
SNB  304/304  304/304
IVB -1  330/330  329/330
BYT  287/287  287/287
HSW  361/361  361/361
BDW  309/309  309/309
-Detailed-
Platform  Testdrm-intel-nightly  Series 
Applied
*IVB  igt@gem_pwrite_pread@snooped-copy-performance  PASS(3)  
DMESG_WARN(1)PASS(1)
(dmesg patch 
applied)drm:i915_hangcheck_elapsed[i915]]*ERROR*Hangcheck_timer_elapsed...blitter_ring_idle@Hangcheck
 timer elapsed... blitter ring idle
Note: You need to pay more attention to line start with '*'
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx