From a61cf3883c83d02cc27b18c4cf8f639279587bb0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ville=20Syrj=C3=A4l=C3=A4?= Date: Thu, 4 Nov 2021 16:45:13 +0200 Subject: [PATCH] drm/i915/fbc: Introduce intel_fbc_set_false_color() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Pull the direct FBC register frobbing out from the debugfs code into the fbc code. Also add a vfunc for this so we don't need extra platforms checks. Signed-off-by: Ville Syrjälä Link: https://patchwork.freedesktop.org/patch/msgid/20211104144520.22605-11-ville.syrjala@linux.intel.com Acked-by: Jani Nikula Reviewed-by: Mika Kahola --- .../drm/i915/display/intel_display_debugfs.c | 18 +------------ drivers/gpu/drm/i915/display/intel_fbc.c | 27 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_fbc.h | 2 ++ 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c index 19bc148e168c..1a9210739727 100644 --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c @@ -70,9 +70,6 @@ static int i915_fbc_false_color_get(void *data, u64 *val) { struct drm_i915_private *dev_priv = data; - if (DISPLAY_VER(dev_priv) < 7 || !HAS_FBC(dev_priv)) - return -ENODEV; - *val = dev_priv->fbc.false_color; return 0; @@ -81,21 +78,8 @@ static int i915_fbc_false_color_get(void *data, u64 *val) static int i915_fbc_false_color_set(void *data, u64 val) { struct drm_i915_private *dev_priv = data; - u32 reg; - - if (DISPLAY_VER(dev_priv) < 7 || !HAS_FBC(dev_priv)) - return -ENODEV; - mutex_lock(&dev_priv->fbc.lock); - - reg = intel_de_read(dev_priv, ILK_DPFC_CONTROL); - dev_priv->fbc.false_color = val; - - intel_de_write(dev_priv, ILK_DPFC_CONTROL, - val ? (reg | FBC_CTL_FALSE_COLOR) : (reg & ~FBC_CTL_FALSE_COLOR)); - - mutex_unlock(&dev_priv->fbc.lock); - return 0; + return intel_fbc_set_false_color(dev_priv, val); } DEFINE_SIMPLE_ATTRIBUTE(i915_fbc_false_color_fops, diff --git a/drivers/gpu/drm/i915/display/intel_fbc.c b/drivers/gpu/drm/i915/display/intel_fbc.c index 0cbd0e302320..b13a776cb3dc 100644 --- a/drivers/gpu/drm/i915/display/intel_fbc.c +++ b/drivers/gpu/drm/i915/display/intel_fbc.c @@ -55,6 +55,7 @@ struct intel_fbc_funcs { bool (*is_compressing)(struct drm_i915_private *i915); void (*nuke)(struct drm_i915_private *i915); void (*program_cfb)(struct drm_i915_private *i915); + void (*set_false_color)(struct drm_i915_private *i915, bool enable); }; /* @@ -538,6 +539,13 @@ static bool ivb_fbc_is_compressing(struct drm_i915_private *i915) return intel_de_read(i915, IVB_FBC_STATUS2) & IVB_FBC_COMP_SEG_MASK; } +static void ivb_fbc_set_false_color(struct drm_i915_private *i915, + bool enable) +{ + intel_de_rmw(i915, ILK_DPFC_CONTROL, + FBC_CTL_FALSE_COLOR, enable ? FBC_CTL_FALSE_COLOR : 0); +} + static const struct intel_fbc_funcs ivb_fbc_funcs = { .activate = ivb_fbc_activate, .deactivate = ilk_fbc_deactivate, @@ -545,6 +553,7 @@ static const struct intel_fbc_funcs ivb_fbc_funcs = { .is_compressing = ivb_fbc_is_compressing, .nuke = snb_fbc_nuke, .program_cfb = ilk_fbc_program_cfb, + .set_false_color = ivb_fbc_set_false_color, }; static bool intel_fbc_hw_is_active(struct drm_i915_private *dev_priv) @@ -593,6 +602,24 @@ static void intel_fbc_nuke(struct drm_i915_private *i915) fbc->funcs->nuke(i915); } +int intel_fbc_set_false_color(struct drm_i915_private *i915, bool enable) +{ + struct intel_fbc *fbc = &i915->fbc; + + if (!fbc->funcs || !fbc->funcs->set_false_color) + return -ENODEV; + + mutex_lock(&fbc->lock); + + fbc->false_color = enable; + + fbc->funcs->set_false_color(i915, enable); + + mutex_unlock(&fbc->lock); + + return 0; +} + /** * intel_fbc_is_active - Is FBC active? * @dev_priv: i915 device instance diff --git a/drivers/gpu/drm/i915/display/intel_fbc.h b/drivers/gpu/drm/i915/display/intel_fbc.h index b2c9e441edbd..4d1f2a76ccb4 100644 --- a/drivers/gpu/drm/i915/display/intel_fbc.h +++ b/drivers/gpu/drm/i915/display/intel_fbc.h @@ -37,5 +37,7 @@ void intel_fbc_flush(struct drm_i915_private *dev_priv, void intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv); void intel_fbc_handle_fifo_underrun_irq(struct drm_i915_private *dev_priv); int intel_fbc_reset_underrun(struct drm_i915_private *dev_priv); +int intel_fbc_set_false_color(struct drm_i915_private *i915, + bool enable); #endif /* __INTEL_FBC_H__ */ -- 2.34.1