[PATCH] HACK: drm/i915: Debug fbc failures when running kms_frontbuffer_tracking2

José Roberto de Souza jose.souza at intel.com
Thu Mar 21 07:17:56 UTC 2019


Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
---
 drivers/gpu/drm/i915/intel_display.c | 26 +++++++++++++++++++++++---
 drivers/gpu/drm/i915/intel_drv.h     |  3 ++-
 drivers/gpu/drm/i915/intel_fbc.c     |  9 ++++++---
 drivers/gpu/drm/i915/intel_fbdev.c   |  3 ++-
 4 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 01cdd6e745c3..0c2ebd0cd3bc 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2038,7 +2038,8 @@ struct i915_vma *
 intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
 			   const struct i915_ggtt_view *view,
 			   bool uses_fence,
-			   unsigned long *out_flags)
+			   unsigned long *out_flags,
+			   struct intel_plane_state *intel_plane_state_debug_only)
 {
 	struct drm_device *dev = fb->dev;
 	struct drm_i915_private *dev_priv = to_i915(dev);
@@ -2047,6 +2048,14 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
 	struct i915_vma *vma;
 	unsigned int pinctl;
 	u32 alignment;
+	struct intel_plane *intel_plane;
+
+	if (intel_plane_state_debug_only) {
+		intel_plane = to_intel_plane(intel_plane_state_debug_only->base.plane);
+	} else {
+		intel_plane = NULL;
+		DRM_DEBUG_KMS("intel_pin_and_fence_fb_obj() with a null intel_plane_state_debug_only\n");
+	}
 
 	WARN_ON(!mutex_is_locked(&dev->struct_mutex));
 
@@ -2088,6 +2097,12 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
 	if (IS_ERR(vma))
 		goto err;
 
+	if (!uses_fence && intel_plane && (intel_plane->i9xx_plane == PLANE_A))
+		DRM_WARN("uses_fence = false but it is a plane_A\n");
+
+	if (uses_fence && !i915_vma_is_map_and_fenceable(vma))
+		DRM_WARN("uses_fence = true, plane_a but i915_vma_is_map_and_fenceable() = false\n");
+
 	if (uses_fence && i915_vma_is_map_and_fenceable(vma)) {
 		int ret;
 
@@ -2108,6 +2123,9 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
 		 * mode that matches the user configuration.
 		 */
 		ret = i915_vma_pin_fence(vma);
+		if (ret != 0)
+			DRM_WARN("*** i915_vma_pin_fence() failed ret=%i\n", ret);
+
 		if (ret != 0 && INTEL_GEN(dev_priv) < 4) {
 			i915_gem_object_unpin_from_display_plane(vma);
 			vma = ERR_PTR(ret);
@@ -2907,7 +2925,8 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
 		intel_pin_and_fence_fb_obj(fb,
 					   &intel_state->view,
 					   intel_plane_uses_fence(intel_state),
-					   &intel_state->flags);
+					   &intel_state->flags,
+					   intel_state);
 	mutex_unlock(&dev->struct_mutex);
 	if (IS_ERR(intel_state->vma)) {
 		DRM_ERROR("failed to pin boot fb on pipe %d: %li\n",
@@ -13786,7 +13805,8 @@ static int intel_plane_pin_fb(struct intel_plane_state *plane_state)
 	vma = intel_pin_and_fence_fb_obj(fb,
 					 &plane_state->view,
 					 intel_plane_uses_fence(plane_state),
-					 &plane_state->flags);
+					 &plane_state->flags,
+					 plane_state);
 	if (IS_ERR(vma))
 		return PTR_ERR(vma);
 
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 4d7ae579fc92..a42641f50dde 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1779,7 +1779,8 @@ struct i915_vma *
 intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
 			   const struct i915_ggtt_view *view,
 			   bool uses_fence,
-			   unsigned long *out_flags);
+			   unsigned long *out_flags,
+			   struct intel_plane_state *intel_plane_state_debug_only);
 void intel_unpin_fb_vma(struct i915_vma *vma, unsigned long flags);
 struct drm_framebuffer *
 intel_framebuffer_create(struct drm_i915_gem_object *obj,
diff --git a/drivers/gpu/drm/i915/intel_fbc.c b/drivers/gpu/drm/i915/intel_fbc.c
index 656e684e7c9a..1a6d3895c25b 100644
--- a/drivers/gpu/drm/i915/intel_fbc.c
+++ b/drivers/gpu/drm/i915/intel_fbc.c
@@ -689,8 +689,6 @@ static void intel_fbc_update_state_cache(struct intel_crtc *crtc,
 
 	cache->vma = plane_state->vma;
 	cache->flags = plane_state->flags;
-	if (WARN_ON(cache->flags & PLANE_HAS_FENCE && !cache->vma->fence))
-		cache->flags &= ~PLANE_HAS_FENCE;
 }
 
 static bool intel_fbc_can_activate(struct intel_crtc *crtc)
@@ -736,9 +734,14 @@ static bool intel_fbc_can_activate(struct intel_crtc *crtc)
 	 * rotation.
 	 */
 	if (!(cache->flags & PLANE_HAS_FENCE)) {
-		fbc->no_fbc_reason = "framebuffer not tiled or fenced";
+		fbc->no_fbc_reason = "framebuffer has no fence";
 		return false;
 	}
+	if (!cache->vma->fence) {
+		fbc->no_fbc_reason = "framebuffer don't have a vma fence";
+		return false;
+	}
+
 	if (INTEL_GEN(dev_priv) <= 4 && !IS_G4X(dev_priv) &&
 	    cache->plane.rotation != DRM_MODE_ROTATE_0) {
 		fbc->no_fbc_reason = "rotation unsupported";
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index e8f694b57b8a..f7e234e98e8a 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -218,8 +218,9 @@ static int intelfb_create(struct drm_fb_helper *helper,
 	 * This also validates that any existing fb inherited from the
 	 * BIOS is suitable for own access.
 	 */
+	DRM_DEBUG_KMS("intelfb_create() intel_pin_and_fence_fb_obj() uses_fence=false\n");
 	vma = intel_pin_and_fence_fb_obj(&ifbdev->fb->base,
-					 &view, false, &flags);
+					 &view, false, &flags, NULL);
 	if (IS_ERR(vma)) {
 		ret = PTR_ERR(vma);
 		goto out_unlock;
-- 
2.21.0



More information about the Intel-gfx-trybot mailing list