[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