drm/1915/fbc: Replace plane->has_fbc with a pointer to the fbc instance
With multiple fbc instances we need to find the right one for each plane. Rather than going looking for the right instance every time let's just replace the has_fbc boolean with a pointer that gets us there straight away. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20211104144520.22605-18-ville.syrjala@linux.intel.com Acked-by: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Mika Kahola <mika.kahola@intel.com>
This commit is contained in:
@@ -807,12 +807,10 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
|
|||||||
plane->id = PLANE_PRIMARY;
|
plane->id = PLANE_PRIMARY;
|
||||||
plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane->id);
|
plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane->id);
|
||||||
|
|
||||||
plane->has_fbc = i9xx_plane_has_fbc(dev_priv, plane->i9xx_plane);
|
if (i9xx_plane_has_fbc(dev_priv, plane->i9xx_plane))
|
||||||
if (plane->has_fbc) {
|
plane->fbc = &dev_priv->fbc;
|
||||||
struct intel_fbc *fbc = &dev_priv->fbc;
|
if (plane->fbc)
|
||||||
|
plane->fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
|
||||||
fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
|
if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
|
||||||
formats = vlv_primary_formats;
|
formats = vlv_primary_formats;
|
||||||
|
|||||||
@@ -645,7 +645,7 @@ bool intel_plane_uses_fence(const struct intel_plane_state *plane_state)
|
|||||||
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
|
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
|
||||||
|
|
||||||
return DISPLAY_VER(dev_priv) < 4 ||
|
return DISPLAY_VER(dev_priv) < 4 ||
|
||||||
(plane->has_fbc &&
|
(plane->fbc &&
|
||||||
plane_state->view.gtt.type == I915_GGTT_VIEW_NORMAL);
|
plane_state->view.gtt.type == I915_GGTT_VIEW_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@
|
|||||||
struct drm_printer;
|
struct drm_printer;
|
||||||
struct __intel_global_objs_state;
|
struct __intel_global_objs_state;
|
||||||
struct intel_ddi_buf_trans;
|
struct intel_ddi_buf_trans;
|
||||||
|
struct intel_fbc;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Display related stuff
|
* Display related stuff
|
||||||
@@ -1339,7 +1340,6 @@ struct intel_plane {
|
|||||||
enum i9xx_plane_id i9xx_plane;
|
enum i9xx_plane_id i9xx_plane;
|
||||||
enum plane_id id;
|
enum plane_id id;
|
||||||
enum pipe pipe;
|
enum pipe pipe;
|
||||||
bool has_fbc;
|
|
||||||
bool need_async_flip_disable_wa;
|
bool need_async_flip_disable_wa;
|
||||||
u32 frontbuffer_bit;
|
u32 frontbuffer_bit;
|
||||||
|
|
||||||
@@ -1347,6 +1347,8 @@ struct intel_plane {
|
|||||||
u32 base, cntl, size;
|
u32 base, cntl, size;
|
||||||
} cursor;
|
} cursor;
|
||||||
|
|
||||||
|
struct intel_fbc *fbc;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: Do not place new plane state fields here (e.g., when adding
|
* NOTE: Do not place new plane state fields here (e.g., when adding
|
||||||
* new plane properties). New runtime state should now be placed in
|
* new plane properties). New runtime state should now be placed in
|
||||||
|
|||||||
@@ -1217,11 +1217,11 @@ bool intel_fbc_pre_update(struct intel_atomic_state *state,
|
|||||||
const struct intel_plane_state *plane_state =
|
const struct intel_plane_state *plane_state =
|
||||||
intel_atomic_get_new_plane_state(state, plane);
|
intel_atomic_get_new_plane_state(state, plane);
|
||||||
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
|
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
|
||||||
struct intel_fbc *fbc = &i915->fbc;
|
struct intel_fbc *fbc = plane->fbc;
|
||||||
const char *reason = "update pending";
|
const char *reason = "update pending";
|
||||||
bool need_vblank_wait = false;
|
bool need_vblank_wait = false;
|
||||||
|
|
||||||
if (!plane->has_fbc || !plane_state)
|
if (!fbc || !plane_state)
|
||||||
return need_vblank_wait;
|
return need_vblank_wait;
|
||||||
|
|
||||||
mutex_lock(&fbc->lock);
|
mutex_lock(&fbc->lock);
|
||||||
@@ -1309,13 +1309,12 @@ static void __intel_fbc_post_update(struct intel_crtc *crtc)
|
|||||||
void intel_fbc_post_update(struct intel_atomic_state *state,
|
void intel_fbc_post_update(struct intel_atomic_state *state,
|
||||||
struct intel_crtc *crtc)
|
struct intel_crtc *crtc)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
|
|
||||||
struct intel_plane *plane = to_intel_plane(crtc->base.primary);
|
struct intel_plane *plane = to_intel_plane(crtc->base.primary);
|
||||||
const struct intel_plane_state *plane_state =
|
const struct intel_plane_state *plane_state =
|
||||||
intel_atomic_get_new_plane_state(state, plane);
|
intel_atomic_get_new_plane_state(state, plane);
|
||||||
struct intel_fbc *fbc = &i915->fbc;
|
struct intel_fbc *fbc = plane->fbc;
|
||||||
|
|
||||||
if (!plane->has_fbc || !plane_state)
|
if (!fbc || !plane_state)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mutex_lock(&fbc->lock);
|
mutex_lock(&fbc->lock);
|
||||||
@@ -1419,7 +1418,7 @@ void intel_fbc_choose_crtc(struct drm_i915_private *i915,
|
|||||||
struct intel_crtc_state *crtc_state;
|
struct intel_crtc_state *crtc_state;
|
||||||
struct intel_crtc *crtc = to_intel_crtc(plane_state->hw.crtc);
|
struct intel_crtc *crtc = to_intel_crtc(plane_state->hw.crtc);
|
||||||
|
|
||||||
if (!plane->has_fbc)
|
if (plane->fbc != fbc)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!plane_state->uapi.visible)
|
if (!plane_state->uapi.visible)
|
||||||
@@ -1458,13 +1457,15 @@ static void intel_fbc_enable(struct intel_atomic_state *state,
|
|||||||
intel_atomic_get_new_crtc_state(state, crtc);
|
intel_atomic_get_new_crtc_state(state, crtc);
|
||||||
const struct intel_plane_state *plane_state =
|
const struct intel_plane_state *plane_state =
|
||||||
intel_atomic_get_new_plane_state(state, plane);
|
intel_atomic_get_new_plane_state(state, plane);
|
||||||
struct intel_fbc *fbc = &i915->fbc;
|
struct intel_fbc *fbc = plane->fbc;
|
||||||
struct intel_fbc_state_cache *cache = &fbc->state_cache;
|
struct intel_fbc_state_cache *cache;
|
||||||
int min_limit;
|
int min_limit;
|
||||||
|
|
||||||
if (!plane->has_fbc || !plane_state)
|
if (!fbc || !plane_state)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
cache = &fbc->state_cache;
|
||||||
|
|
||||||
min_limit = intel_fbc_min_limit(plane_state->hw.fb ?
|
min_limit = intel_fbc_min_limit(plane_state->hw.fb ?
|
||||||
plane_state->hw.fb->format->cpp[0] : 0);
|
plane_state->hw.fb->format->cpp[0] : 0);
|
||||||
|
|
||||||
@@ -1514,11 +1515,10 @@ out:
|
|||||||
*/
|
*/
|
||||||
void intel_fbc_disable(struct intel_crtc *crtc)
|
void intel_fbc_disable(struct intel_crtc *crtc)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
|
|
||||||
struct intel_plane *plane = to_intel_plane(crtc->base.primary);
|
struct intel_plane *plane = to_intel_plane(crtc->base.primary);
|
||||||
struct intel_fbc *fbc = &i915->fbc;
|
struct intel_fbc *fbc = plane->fbc;
|
||||||
|
|
||||||
if (!plane->has_fbc)
|
if (!fbc)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mutex_lock(&fbc->lock);
|
mutex_lock(&fbc->lock);
|
||||||
|
|||||||
@@ -2101,12 +2101,10 @@ skl_universal_plane_create(struct drm_i915_private *dev_priv,
|
|||||||
plane->id = plane_id;
|
plane->id = plane_id;
|
||||||
plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane_id);
|
plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane_id);
|
||||||
|
|
||||||
plane->has_fbc = skl_plane_has_fbc(dev_priv, pipe, plane_id);
|
if (skl_plane_has_fbc(dev_priv, pipe, plane_id))
|
||||||
if (plane->has_fbc) {
|
plane->fbc = &dev_priv->fbc;
|
||||||
struct intel_fbc *fbc = &dev_priv->fbc;
|
if (plane->fbc)
|
||||||
|
plane->fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
|
||||||
fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DISPLAY_VER(dev_priv) >= 11) {
|
if (DISPLAY_VER(dev_priv) >= 11) {
|
||||||
plane->min_width = icl_plane_min_width;
|
plane->min_width = icl_plane_min_width;
|
||||||
|
|||||||
Reference in New Issue
Block a user