|
@@ -37,6 +37,7 @@
|
|
|
#include <drm/i915_drm.h>
|
|
|
#include "i915_drv.h"
|
|
|
#include "i915_trace.h"
|
|
|
+#include <drm/drm_atomic.h>
|
|
|
#include <drm/drm_atomic_helper.h>
|
|
|
#include <drm/drm_dp_helper.h>
|
|
|
#include <drm/drm_crtc_helper.h>
|
|
@@ -2416,6 +2417,14 @@ out_unref_obj:
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+/* Update plane->state->fb to match plane->fb after driver-internal updates */
|
|
|
+static void
|
|
|
+update_state_fb(struct drm_plane *plane)
|
|
|
+{
|
|
|
+ if (plane->fb != plane->state->fb)
|
|
|
+ drm_atomic_set_fb_for_plane(plane->state, plane->fb);
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
intel_find_plane_obj(struct intel_crtc *intel_crtc,
|
|
|
struct intel_initial_plane_config *plane_config)
|
|
@@ -2462,6 +2471,8 @@ intel_find_plane_obj(struct intel_crtc *intel_crtc,
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ update_state_fb(intel_crtc->base.primary);
|
|
|
}
|
|
|
|
|
|
static void i9xx_update_primary_plane(struct drm_crtc *crtc,
|
|
@@ -6650,6 +6661,7 @@ i9xx_get_initial_plane_config(struct intel_crtc *crtc,
|
|
|
plane_config->size);
|
|
|
|
|
|
crtc->base.primary->fb = fb;
|
|
|
+ update_state_fb(crtc->base.primary);
|
|
|
}
|
|
|
|
|
|
static void chv_crtc_clock_get(struct intel_crtc *crtc,
|
|
@@ -7687,6 +7699,7 @@ skylake_get_initial_plane_config(struct intel_crtc *crtc,
|
|
|
plane_config->size);
|
|
|
|
|
|
crtc->base.primary->fb = fb;
|
|
|
+ update_state_fb(crtc->base.primary);
|
|
|
return;
|
|
|
|
|
|
error:
|
|
@@ -7778,6 +7791,7 @@ ironlake_get_initial_plane_config(struct intel_crtc *crtc,
|
|
|
plane_config->size);
|
|
|
|
|
|
crtc->base.primary->fb = fb;
|
|
|
+ update_state_fb(crtc->base.primary);
|
|
|
}
|
|
|
|
|
|
static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
|
|
@@ -9816,6 +9830,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
|
|
|
drm_gem_object_reference(&obj->base);
|
|
|
|
|
|
crtc->primary->fb = fb;
|
|
|
+ update_state_fb(crtc->primary);
|
|
|
|
|
|
work->pending_flip_obj = obj;
|
|
|
|
|
@@ -9884,6 +9899,7 @@ cleanup_unpin:
|
|
|
cleanup_pending:
|
|
|
atomic_dec(&intel_crtc->unpin_work_count);
|
|
|
crtc->primary->fb = old_fb;
|
|
|
+ update_state_fb(crtc->primary);
|
|
|
drm_gem_object_unreference(&work->old_fb_obj->base);
|
|
|
drm_gem_object_unreference(&obj->base);
|
|
|
mutex_unlock(&dev->struct_mutex);
|
|
@@ -13718,6 +13734,7 @@ void intel_modeset_gem_init(struct drm_device *dev)
|
|
|
to_intel_crtc(c)->pipe);
|
|
|
drm_framebuffer_unreference(c->primary->fb);
|
|
|
c->primary->fb = NULL;
|
|
|
+ update_state_fb(c->primary);
|
|
|
}
|
|
|
}
|
|
|
mutex_unlock(&dev->struct_mutex);
|