* [PATCH 1/2] drm/i915: extract intel_init_fbc()
@ 2014-09-19 19:04 Paulo Zanoni
2014-09-19 19:04 ` [PATCH 2/2] drm/i915: add SW tracking to FBC enabling Paulo Zanoni
2014-09-19 19:36 ` [PATCH 1/2] drm/i915: extract intel_init_fbc() Rodrigo Vivi
0 siblings, 2 replies; 5+ messages in thread
From: Paulo Zanoni @ 2014-09-19 19:04 UTC (permalink / raw)
To: intel-gfx; +Cc: Paulo Zanoni
From: Paulo Zanoni <paulo.r.zanoni@intel.com>
Because I plan to expand it a little bit.
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
---
drivers/gpu/drm/i915/intel_pm.c | 50 +++++++++++++++++++++++------------------
1 file changed, 28 insertions(+), 22 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 1ec3c8f..2ca9fdb 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -7358,33 +7358,39 @@ void intel_fini_runtime_pm(struct drm_i915_private *dev_priv)
pm_runtime_disable(device);
}
+static void intel_init_fbc(struct drm_i915_private *dev_priv)
+{
+ if (!HAS_FBC(dev_priv))
+ return;
+
+ if (INTEL_INFO(dev_priv)->gen >= 7) {
+ dev_priv->display.fbc_enabled = ironlake_fbc_enabled;
+ dev_priv->display.enable_fbc = gen7_enable_fbc;
+ dev_priv->display.disable_fbc = ironlake_disable_fbc;
+ } else if (INTEL_INFO(dev_priv)->gen >= 5) {
+ dev_priv->display.fbc_enabled = ironlake_fbc_enabled;
+ dev_priv->display.enable_fbc = ironlake_enable_fbc;
+ dev_priv->display.disable_fbc = ironlake_disable_fbc;
+ } else if (IS_GM45(dev_priv)) {
+ dev_priv->display.fbc_enabled = g4x_fbc_enabled;
+ dev_priv->display.enable_fbc = g4x_enable_fbc;
+ dev_priv->display.disable_fbc = g4x_disable_fbc;
+ } else {
+ dev_priv->display.fbc_enabled = i8xx_fbc_enabled;
+ dev_priv->display.enable_fbc = i8xx_enable_fbc;
+ dev_priv->display.disable_fbc = i8xx_disable_fbc;
+
+ /* This value was pulled out of someone's hat */
+ I915_WRITE(FBC_CONTROL, 500 << FBC_CTL_INTERVAL_SHIFT);
+ }
+}
+
/* Set up chip specific power management-related functions */
void intel_init_pm(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
- if (HAS_FBC(dev)) {
- if (INTEL_INFO(dev)->gen >= 7) {
- dev_priv->display.fbc_enabled = ironlake_fbc_enabled;
- dev_priv->display.enable_fbc = gen7_enable_fbc;
- dev_priv->display.disable_fbc = ironlake_disable_fbc;
- } else if (INTEL_INFO(dev)->gen >= 5) {
- dev_priv->display.fbc_enabled = ironlake_fbc_enabled;
- dev_priv->display.enable_fbc = ironlake_enable_fbc;
- dev_priv->display.disable_fbc = ironlake_disable_fbc;
- } else if (IS_GM45(dev)) {
- dev_priv->display.fbc_enabled = g4x_fbc_enabled;
- dev_priv->display.enable_fbc = g4x_enable_fbc;
- dev_priv->display.disable_fbc = g4x_disable_fbc;
- } else {
- dev_priv->display.fbc_enabled = i8xx_fbc_enabled;
- dev_priv->display.enable_fbc = i8xx_enable_fbc;
- dev_priv->display.disable_fbc = i8xx_disable_fbc;
-
- /* This value was pulled out of someone's hat */
- I915_WRITE(FBC_CONTROL, 500 << FBC_CTL_INTERVAL_SHIFT);
- }
- }
+ intel_init_fbc(dev_priv);
/* For cxsr */
if (IS_PINEVIEW(dev))
--
2.1.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] drm/i915: add SW tracking to FBC enabling
2014-09-19 19:04 [PATCH 1/2] drm/i915: extract intel_init_fbc() Paulo Zanoni
@ 2014-09-19 19:04 ` Paulo Zanoni
2014-09-19 19:44 ` Rodrigo Vivi
2014-09-19 19:36 ` [PATCH 1/2] drm/i915: extract intel_init_fbc() Rodrigo Vivi
1 sibling, 1 reply; 5+ messages in thread
From: Paulo Zanoni @ 2014-09-19 19:04 UTC (permalink / raw)
To: intel-gfx; +Cc: Paulo Zanoni, Rodrigo Vivi
From: Paulo Zanoni <paulo.r.zanoni@intel.com>
Currently, calling intel_fbc_enabled() will trigger a register read.
And we call it a lot of times, even when FBC is disabled, so saving a
few cycles would be a good thing.
Another reason for this patch is because we currently call
intel_fbc_enabled() while the HW is runtime suspended, so the read
makes no sense and triggers a WARN. This happens even if FBC is
disabled by default. Of course one could argue that we just shouldn't
be calling intel_fbc_enabled() while the driver is runtime suspended,
and I agree that's a good argument, but I still think that the reason
explained in the first paragraph already justifies the patch.
This problem can easily be reproduced with many subtests of
igt/pm_rpm, and it is a regression introduced by:
commit c5ad011d7d256ecbe173324029e992817194d2b0
Author: Rodrigo Vivi <rodrigo.vivi@intel.com>
Date: Mon Aug 4 03:51:38 2014 -0700
drm/i915: FBC flush nuke for BDW
Testcase: igt/pm_rpm/cursor (and others)
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 4 ++++
drivers/gpu/drm/i915/intel_pm.c | 31 ++++++++++++++++++++-----------
2 files changed, 24 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 5fce16c..999bd57 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -662,6 +662,10 @@ struct i915_fbc {
bool false_color;
+ /* Tracks whether the HW is actually enabled, not whether the feature is
+ * possible. */
+ bool enabled;
+
struct intel_fbc_work {
struct delayed_work work;
struct drm_crtc *crtc;
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 2ca9fdb..6b41620 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -71,6 +71,8 @@ static void i8xx_disable_fbc(struct drm_device *dev)
struct drm_i915_private *dev_priv = dev->dev_private;
u32 fbc_ctl;
+ dev_priv->fbc.enabled = false;
+
/* Disable compression */
fbc_ctl = I915_READ(FBC_CONTROL);
if ((fbc_ctl & FBC_CTL_EN) == 0)
@@ -99,6 +101,8 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc)
int i;
u32 fbc_ctl;
+ dev_priv->fbc.enabled = true;
+
cfb_pitch = dev_priv->fbc.size / FBC_LL_SIZE;
if (fb->pitches[0] < cfb_pitch)
cfb_pitch = fb->pitches[0];
@@ -153,6 +157,8 @@ static void g4x_enable_fbc(struct drm_crtc *crtc)
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
u32 dpfc_ctl;
+ dev_priv->fbc.enabled = true;
+
dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane) | DPFC_SR_EN;
if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
dpfc_ctl |= DPFC_CTL_LIMIT_2X;
@@ -173,6 +179,8 @@ static void g4x_disable_fbc(struct drm_device *dev)
struct drm_i915_private *dev_priv = dev->dev_private;
u32 dpfc_ctl;
+ dev_priv->fbc.enabled = false;
+
/* Disable compression */
dpfc_ctl = I915_READ(DPFC_CONTROL);
if (dpfc_ctl & DPFC_CTL_EN) {
@@ -224,6 +232,8 @@ static void ironlake_enable_fbc(struct drm_crtc *crtc)
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
u32 dpfc_ctl;
+ dev_priv->fbc.enabled = true;
+
dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane);
if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
dev_priv->fbc.threshold++;
@@ -264,6 +274,8 @@ static void ironlake_disable_fbc(struct drm_device *dev)
struct drm_i915_private *dev_priv = dev->dev_private;
u32 dpfc_ctl;
+ dev_priv->fbc.enabled = false;
+
/* Disable compression */
dpfc_ctl = I915_READ(ILK_DPFC_CONTROL);
if (dpfc_ctl & DPFC_CTL_EN) {
@@ -290,6 +302,8 @@ static void gen7_enable_fbc(struct drm_crtc *crtc)
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
u32 dpfc_ctl;
+ dev_priv->fbc.enabled = true;
+
dpfc_ctl = IVB_DPFC_CTL_PLANE(intel_crtc->plane);
if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
dev_priv->fbc.threshold++;
@@ -339,16 +353,7 @@ bool intel_fbc_enabled(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
- /* If it wasn't never enabled by kernel parameter or platform default
- * we can avoid reading registers so many times in vain
- */
- if (!i915.enable_fbc)
- return false;
-
- if (!dev_priv->display.fbc_enabled)
- return false;
-
- return dev_priv->display.fbc_enabled(dev);
+ return dev_priv->fbc.enabled;
}
void gen8_fbc_sw_flush(struct drm_device *dev, u32 value)
@@ -7360,8 +7365,10 @@ void intel_fini_runtime_pm(struct drm_i915_private *dev_priv)
static void intel_init_fbc(struct drm_i915_private *dev_priv)
{
- if (!HAS_FBC(dev_priv))
+ if (!HAS_FBC(dev_priv)) {
+ dev_priv->fbc.enabled = false;
return;
+ }
if (INTEL_INFO(dev_priv)->gen >= 7) {
dev_priv->display.fbc_enabled = ironlake_fbc_enabled;
@@ -7383,6 +7390,8 @@ static void intel_init_fbc(struct drm_i915_private *dev_priv)
/* This value was pulled out of someone's hat */
I915_WRITE(FBC_CONTROL, 500 << FBC_CTL_INTERVAL_SHIFT);
}
+
+ dev_priv->fbc.enabled = dev_priv->display.fbc_enabled(dev_priv->dev);
}
/* Set up chip specific power management-related functions */
--
2.1.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] drm/i915: extract intel_init_fbc()
2014-09-19 19:04 [PATCH 1/2] drm/i915: extract intel_init_fbc() Paulo Zanoni
2014-09-19 19:04 ` [PATCH 2/2] drm/i915: add SW tracking to FBC enabling Paulo Zanoni
@ 2014-09-19 19:36 ` Rodrigo Vivi
1 sibling, 0 replies; 5+ messages in thread
From: Rodrigo Vivi @ 2014-09-19 19:36 UTC (permalink / raw)
To: Paulo Zanoni; +Cc: intel-gfx, Paulo Zanoni
[-- Attachment #1.1: Type: text/plain, Size: 3891 bytes --]
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
On Fri, Sep 19, 2014 at 12:04 PM, Paulo Zanoni <przanoni@gmail.com> wrote:
> From: Paulo Zanoni <paulo.r.zanoni@intel.com>
>
> Because I plan to expand it a little bit.
>
> Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
> ---
> drivers/gpu/drm/i915/intel_pm.c | 50
> +++++++++++++++++++++++------------------
> 1 file changed, 28 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_pm.c
> b/drivers/gpu/drm/i915/intel_pm.c
> index 1ec3c8f..2ca9fdb 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -7358,33 +7358,39 @@ void intel_fini_runtime_pm(struct drm_i915_private
> *dev_priv)
> pm_runtime_disable(device);
> }
>
> +static void intel_init_fbc(struct drm_i915_private *dev_priv)
> +{
> + if (!HAS_FBC(dev_priv))
> + return;
> +
> + if (INTEL_INFO(dev_priv)->gen >= 7) {
> + dev_priv->display.fbc_enabled = ironlake_fbc_enabled;
> + dev_priv->display.enable_fbc = gen7_enable_fbc;
> + dev_priv->display.disable_fbc = ironlake_disable_fbc;
> + } else if (INTEL_INFO(dev_priv)->gen >= 5) {
> + dev_priv->display.fbc_enabled = ironlake_fbc_enabled;
> + dev_priv->display.enable_fbc = ironlake_enable_fbc;
> + dev_priv->display.disable_fbc = ironlake_disable_fbc;
> + } else if (IS_GM45(dev_priv)) {
> + dev_priv->display.fbc_enabled = g4x_fbc_enabled;
> + dev_priv->display.enable_fbc = g4x_enable_fbc;
> + dev_priv->display.disable_fbc = g4x_disable_fbc;
> + } else {
> + dev_priv->display.fbc_enabled = i8xx_fbc_enabled;
> + dev_priv->display.enable_fbc = i8xx_enable_fbc;
> + dev_priv->display.disable_fbc = i8xx_disable_fbc;
> +
> + /* This value was pulled out of someone's hat */
> + I915_WRITE(FBC_CONTROL, 500 << FBC_CTL_INTERVAL_SHIFT);
> + }
> +}
> +
> /* Set up chip specific power management-related functions */
> void intel_init_pm(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
>
> - if (HAS_FBC(dev)) {
> - if (INTEL_INFO(dev)->gen >= 7) {
> - dev_priv->display.fbc_enabled =
> ironlake_fbc_enabled;
> - dev_priv->display.enable_fbc = gen7_enable_fbc;
> - dev_priv->display.disable_fbc =
> ironlake_disable_fbc;
> - } else if (INTEL_INFO(dev)->gen >= 5) {
> - dev_priv->display.fbc_enabled =
> ironlake_fbc_enabled;
> - dev_priv->display.enable_fbc = ironlake_enable_fbc;
> - dev_priv->display.disable_fbc =
> ironlake_disable_fbc;
> - } else if (IS_GM45(dev)) {
> - dev_priv->display.fbc_enabled = g4x_fbc_enabled;
> - dev_priv->display.enable_fbc = g4x_enable_fbc;
> - dev_priv->display.disable_fbc = g4x_disable_fbc;
> - } else {
> - dev_priv->display.fbc_enabled = i8xx_fbc_enabled;
> - dev_priv->display.enable_fbc = i8xx_enable_fbc;
> - dev_priv->display.disable_fbc = i8xx_disable_fbc;
> -
> - /* This value was pulled out of someone's hat */
> - I915_WRITE(FBC_CONTROL, 500 <<
> FBC_CTL_INTERVAL_SHIFT);
> - }
> - }
> + intel_init_fbc(dev_priv);
>
> /* For cxsr */
> if (IS_PINEVIEW(dev))
> --
> 2.1.0
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
--
Rodrigo Vivi
Blog: http://blog.vivi.eng.br
[-- Attachment #1.2: Type: text/html, Size: 5394 bytes --]
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] drm/i915: add SW tracking to FBC enabling
2014-09-19 19:04 ` [PATCH 2/2] drm/i915: add SW tracking to FBC enabling Paulo Zanoni
@ 2014-09-19 19:44 ` Rodrigo Vivi
2014-09-23 8:29 ` Daniel Vetter
0 siblings, 1 reply; 5+ messages in thread
From: Rodrigo Vivi @ 2014-09-19 19:44 UTC (permalink / raw)
To: Paulo Zanoni; +Cc: intel-gfx, Paulo Zanoni, Rodrigo Vivi
[-- Attachment #1.1: Type: text/plain, Size: 6429 bytes --]
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
But I think it would be good now to change fbc_status interface on debugfs
to show the current bit state as well.
On Fri, Sep 19, 2014 at 12:04 PM, Paulo Zanoni <przanoni@gmail.com> wrote:
> From: Paulo Zanoni <paulo.r.zanoni@intel.com>
>
> Currently, calling intel_fbc_enabled() will trigger a register read.
> And we call it a lot of times, even when FBC is disabled, so saving a
> few cycles would be a good thing.
>
> Another reason for this patch is because we currently call
> intel_fbc_enabled() while the HW is runtime suspended, so the read
> makes no sense and triggers a WARN. This happens even if FBC is
> disabled by default. Of course one could argue that we just shouldn't
> be calling intel_fbc_enabled() while the driver is runtime suspended,
> and I agree that's a good argument, but I still think that the reason
> explained in the first paragraph already justifies the patch.
> This problem can easily be reproduced with many subtests of
> igt/pm_rpm, and it is a regression introduced by:
>
> commit c5ad011d7d256ecbe173324029e992817194d2b0
> Author: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Date: Mon Aug 4 03:51:38 2014 -0700
> drm/i915: FBC flush nuke for BDW
>
> Testcase: igt/pm_rpm/cursor (and others)
> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
> ---
> drivers/gpu/drm/i915/i915_drv.h | 4 ++++
> drivers/gpu/drm/i915/intel_pm.c | 31 ++++++++++++++++++++-----------
> 2 files changed, 24 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h
> b/drivers/gpu/drm/i915/i915_drv.h
> index 5fce16c..999bd57 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -662,6 +662,10 @@ struct i915_fbc {
>
> bool false_color;
>
> + /* Tracks whether the HW is actually enabled, not whether the
> feature is
> + * possible. */
> + bool enabled;
> +
> struct intel_fbc_work {
> struct delayed_work work;
> struct drm_crtc *crtc;
> diff --git a/drivers/gpu/drm/i915/intel_pm.c
> b/drivers/gpu/drm/i915/intel_pm.c
> index 2ca9fdb..6b41620 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -71,6 +71,8 @@ static void i8xx_disable_fbc(struct drm_device *dev)
> struct drm_i915_private *dev_priv = dev->dev_private;
> u32 fbc_ctl;
>
> + dev_priv->fbc.enabled = false;
> +
> /* Disable compression */
> fbc_ctl = I915_READ(FBC_CONTROL);
> if ((fbc_ctl & FBC_CTL_EN) == 0)
> @@ -99,6 +101,8 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc)
> int i;
> u32 fbc_ctl;
>
> + dev_priv->fbc.enabled = true;
> +
> cfb_pitch = dev_priv->fbc.size / FBC_LL_SIZE;
> if (fb->pitches[0] < cfb_pitch)
> cfb_pitch = fb->pitches[0];
> @@ -153,6 +157,8 @@ static void g4x_enable_fbc(struct drm_crtc *crtc)
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> u32 dpfc_ctl;
>
> + dev_priv->fbc.enabled = true;
> +
> dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane) | DPFC_SR_EN;
> if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
> dpfc_ctl |= DPFC_CTL_LIMIT_2X;
> @@ -173,6 +179,8 @@ static void g4x_disable_fbc(struct drm_device *dev)
> struct drm_i915_private *dev_priv = dev->dev_private;
> u32 dpfc_ctl;
>
> + dev_priv->fbc.enabled = false;
> +
> /* Disable compression */
> dpfc_ctl = I915_READ(DPFC_CONTROL);
> if (dpfc_ctl & DPFC_CTL_EN) {
> @@ -224,6 +232,8 @@ static void ironlake_enable_fbc(struct drm_crtc *crtc)
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> u32 dpfc_ctl;
>
> + dev_priv->fbc.enabled = true;
> +
> dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane);
> if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
> dev_priv->fbc.threshold++;
> @@ -264,6 +274,8 @@ static void ironlake_disable_fbc(struct drm_device
> *dev)
> struct drm_i915_private *dev_priv = dev->dev_private;
> u32 dpfc_ctl;
>
> + dev_priv->fbc.enabled = false;
> +
> /* Disable compression */
> dpfc_ctl = I915_READ(ILK_DPFC_CONTROL);
> if (dpfc_ctl & DPFC_CTL_EN) {
> @@ -290,6 +302,8 @@ static void gen7_enable_fbc(struct drm_crtc *crtc)
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> u32 dpfc_ctl;
>
> + dev_priv->fbc.enabled = true;
> +
> dpfc_ctl = IVB_DPFC_CTL_PLANE(intel_crtc->plane);
> if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
> dev_priv->fbc.threshold++;
> @@ -339,16 +353,7 @@ bool intel_fbc_enabled(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
>
> - /* If it wasn't never enabled by kernel parameter or platform
> default
> - * we can avoid reading registers so many times in vain
> - */
> - if (!i915.enable_fbc)
> - return false;
> -
> - if (!dev_priv->display.fbc_enabled)
> - return false;
> -
> - return dev_priv->display.fbc_enabled(dev);
> + return dev_priv->fbc.enabled;
> }
>
> void gen8_fbc_sw_flush(struct drm_device *dev, u32 value)
> @@ -7360,8 +7365,10 @@ void intel_fini_runtime_pm(struct drm_i915_private
> *dev_priv)
>
> static void intel_init_fbc(struct drm_i915_private *dev_priv)
> {
> - if (!HAS_FBC(dev_priv))
> + if (!HAS_FBC(dev_priv)) {
> + dev_priv->fbc.enabled = false;
> return;
> + }
>
> if (INTEL_INFO(dev_priv)->gen >= 7) {
> dev_priv->display.fbc_enabled = ironlake_fbc_enabled;
> @@ -7383,6 +7390,8 @@ static void intel_init_fbc(struct drm_i915_private
> *dev_priv)
> /* This value was pulled out of someone's hat */
> I915_WRITE(FBC_CONTROL, 500 << FBC_CTL_INTERVAL_SHIFT);
> }
> +
> + dev_priv->fbc.enabled =
> dev_priv->display.fbc_enabled(dev_priv->dev);
> }
>
> /* Set up chip specific power management-related functions */
> --
> 2.1.0
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
--
Rodrigo Vivi
Blog: http://blog.vivi.eng.br
[-- Attachment #1.2: Type: text/html, Size: 8291 bytes --]
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] drm/i915: add SW tracking to FBC enabling
2014-09-19 19:44 ` Rodrigo Vivi
@ 2014-09-23 8:29 ` Daniel Vetter
0 siblings, 0 replies; 5+ messages in thread
From: Daniel Vetter @ 2014-09-23 8:29 UTC (permalink / raw)
To: Rodrigo Vivi; +Cc: Rodrigo Vivi, intel-gfx, Paulo Zanoni
On Fri, Sep 19, 2014 at 12:44:08PM -0700, Rodrigo Vivi wrote:
> Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Both patches merged to dinq.
> But I think it would be good now to change fbc_status interface on debugfs
> to show the current bit state as well.
Seconded. Also some locking for fbc would be awesome ;-)
Cheers, Daniel
>
>
> On Fri, Sep 19, 2014 at 12:04 PM, Paulo Zanoni <przanoni@gmail.com> wrote:
>
> > From: Paulo Zanoni <paulo.r.zanoni@intel.com>
> >
> > Currently, calling intel_fbc_enabled() will trigger a register read.
> > And we call it a lot of times, even when FBC is disabled, so saving a
> > few cycles would be a good thing.
> >
> > Another reason for this patch is because we currently call
> > intel_fbc_enabled() while the HW is runtime suspended, so the read
> > makes no sense and triggers a WARN. This happens even if FBC is
> > disabled by default. Of course one could argue that we just shouldn't
> > be calling intel_fbc_enabled() while the driver is runtime suspended,
> > and I agree that's a good argument, but I still think that the reason
> > explained in the first paragraph already justifies the patch.
> > This problem can easily be reproduced with many subtests of
> > igt/pm_rpm, and it is a regression introduced by:
> >
> > commit c5ad011d7d256ecbe173324029e992817194d2b0
> > Author: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > Date: Mon Aug 4 03:51:38 2014 -0700
> > drm/i915: FBC flush nuke for BDW
> >
> > Testcase: igt/pm_rpm/cursor (and others)
> > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
> > ---
> > drivers/gpu/drm/i915/i915_drv.h | 4 ++++
> > drivers/gpu/drm/i915/intel_pm.c | 31 ++++++++++++++++++++-----------
> > 2 files changed, 24 insertions(+), 11 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_drv.h
> > b/drivers/gpu/drm/i915/i915_drv.h
> > index 5fce16c..999bd57 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.h
> > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > @@ -662,6 +662,10 @@ struct i915_fbc {
> >
> > bool false_color;
> >
> > + /* Tracks whether the HW is actually enabled, not whether the
> > feature is
> > + * possible. */
> > + bool enabled;
> > +
> > struct intel_fbc_work {
> > struct delayed_work work;
> > struct drm_crtc *crtc;
> > diff --git a/drivers/gpu/drm/i915/intel_pm.c
> > b/drivers/gpu/drm/i915/intel_pm.c
> > index 2ca9fdb..6b41620 100644
> > --- a/drivers/gpu/drm/i915/intel_pm.c
> > +++ b/drivers/gpu/drm/i915/intel_pm.c
> > @@ -71,6 +71,8 @@ static void i8xx_disable_fbc(struct drm_device *dev)
> > struct drm_i915_private *dev_priv = dev->dev_private;
> > u32 fbc_ctl;
> >
> > + dev_priv->fbc.enabled = false;
> > +
> > /* Disable compression */
> > fbc_ctl = I915_READ(FBC_CONTROL);
> > if ((fbc_ctl & FBC_CTL_EN) == 0)
> > @@ -99,6 +101,8 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc)
> > int i;
> > u32 fbc_ctl;
> >
> > + dev_priv->fbc.enabled = true;
> > +
> > cfb_pitch = dev_priv->fbc.size / FBC_LL_SIZE;
> > if (fb->pitches[0] < cfb_pitch)
> > cfb_pitch = fb->pitches[0];
> > @@ -153,6 +157,8 @@ static void g4x_enable_fbc(struct drm_crtc *crtc)
> > struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> > u32 dpfc_ctl;
> >
> > + dev_priv->fbc.enabled = true;
> > +
> > dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane) | DPFC_SR_EN;
> > if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
> > dpfc_ctl |= DPFC_CTL_LIMIT_2X;
> > @@ -173,6 +179,8 @@ static void g4x_disable_fbc(struct drm_device *dev)
> > struct drm_i915_private *dev_priv = dev->dev_private;
> > u32 dpfc_ctl;
> >
> > + dev_priv->fbc.enabled = false;
> > +
> > /* Disable compression */
> > dpfc_ctl = I915_READ(DPFC_CONTROL);
> > if (dpfc_ctl & DPFC_CTL_EN) {
> > @@ -224,6 +232,8 @@ static void ironlake_enable_fbc(struct drm_crtc *crtc)
> > struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> > u32 dpfc_ctl;
> >
> > + dev_priv->fbc.enabled = true;
> > +
> > dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane);
> > if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
> > dev_priv->fbc.threshold++;
> > @@ -264,6 +274,8 @@ static void ironlake_disable_fbc(struct drm_device
> > *dev)
> > struct drm_i915_private *dev_priv = dev->dev_private;
> > u32 dpfc_ctl;
> >
> > + dev_priv->fbc.enabled = false;
> > +
> > /* Disable compression */
> > dpfc_ctl = I915_READ(ILK_DPFC_CONTROL);
> > if (dpfc_ctl & DPFC_CTL_EN) {
> > @@ -290,6 +302,8 @@ static void gen7_enable_fbc(struct drm_crtc *crtc)
> > struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> > u32 dpfc_ctl;
> >
> > + dev_priv->fbc.enabled = true;
> > +
> > dpfc_ctl = IVB_DPFC_CTL_PLANE(intel_crtc->plane);
> > if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
> > dev_priv->fbc.threshold++;
> > @@ -339,16 +353,7 @@ bool intel_fbc_enabled(struct drm_device *dev)
> > {
> > struct drm_i915_private *dev_priv = dev->dev_private;
> >
> > - /* If it wasn't never enabled by kernel parameter or platform
> > default
> > - * we can avoid reading registers so many times in vain
> > - */
> > - if (!i915.enable_fbc)
> > - return false;
> > -
> > - if (!dev_priv->display.fbc_enabled)
> > - return false;
> > -
> > - return dev_priv->display.fbc_enabled(dev);
> > + return dev_priv->fbc.enabled;
> > }
> >
> > void gen8_fbc_sw_flush(struct drm_device *dev, u32 value)
> > @@ -7360,8 +7365,10 @@ void intel_fini_runtime_pm(struct drm_i915_private
> > *dev_priv)
> >
> > static void intel_init_fbc(struct drm_i915_private *dev_priv)
> > {
> > - if (!HAS_FBC(dev_priv))
> > + if (!HAS_FBC(dev_priv)) {
> > + dev_priv->fbc.enabled = false;
> > return;
> > + }
> >
> > if (INTEL_INFO(dev_priv)->gen >= 7) {
> > dev_priv->display.fbc_enabled = ironlake_fbc_enabled;
> > @@ -7383,6 +7390,8 @@ static void intel_init_fbc(struct drm_i915_private
> > *dev_priv)
> > /* This value was pulled out of someone's hat */
> > I915_WRITE(FBC_CONTROL, 500 << FBC_CTL_INTERVAL_SHIFT);
> > }
> > +
> > + dev_priv->fbc.enabled =
> > dev_priv->display.fbc_enabled(dev_priv->dev);
> > }
> >
> > /* Set up chip specific power management-related functions */
> > --
> > 2.1.0
> >
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> >
>
>
>
> --
> Rodrigo Vivi
> Blog: http://blog.vivi.eng.br
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-09-23 8:29 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-19 19:04 [PATCH 1/2] drm/i915: extract intel_init_fbc() Paulo Zanoni
2014-09-19 19:04 ` [PATCH 2/2] drm/i915: add SW tracking to FBC enabling Paulo Zanoni
2014-09-19 19:44 ` Rodrigo Vivi
2014-09-23 8:29 ` Daniel Vetter
2014-09-19 19:36 ` [PATCH 1/2] drm/i915: extract intel_init_fbc() Rodrigo Vivi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.