{
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;
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,
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);
};
/*
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,
.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)
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
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__ */