From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rodrigo Vivi Subject: Re: [PATCH] drm/i915: Try harder to get FBC Date: Tue, 1 Jul 2014 09:09:28 -0700 Message-ID: References: <20140620165533.GC23411@bwidawsk.net> <1404150084-3629-1-git-send-email-rodrigo.vivi@intel.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1945713162==" Return-path: Received: from mail-we0-f180.google.com (mail-we0-f180.google.com [74.125.82.180]) by gabe.freedesktop.org (Postfix) with ESMTP id 096686E0E9 for ; Tue, 1 Jul 2014 09:09:29 -0700 (PDT) Received: by mail-we0-f180.google.com with SMTP id x48so9865257wes.39 for ; Tue, 01 Jul 2014 09:09:29 -0700 (PDT) In-Reply-To: <1404150084-3629-1-git-send-email-rodrigo.vivi@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Rodrigo Vivi , Jani Nikula Cc: intel-gfx , Art Runyan , Ben Widawsky , Ben Widawsky List-Id: intel-gfx@lists.freedesktop.org --===============1945713162== Content-Type: multipart/alternative; boundary=089e013d0b5412b7b504fd24003c --089e013d0b5412b7b504fd24003c Content-Type: text/plain; charset=UTF-8 Jani, please ignore the 4th patch on this series and merge the 3 I've reviewed and tested already. They are essential to allow FBC work on BDW without changing bios configuration and allow PC7 residency. Thanks, Rodrigo. On Mon, Jun 30, 2014 at 10:41 AM, Rodrigo Vivi wrote: > From: Ben Widawsky > > The GEN FBC unit provides the ability to set a low pass on frames it > attempts to compress. If a frame is less than a certain amount > compressibility (2:1, 4:1) it will not bother. This allows the driver to > reduce the size it requests out of stolen memory. > > Unluckily, a few months ago, Ville actually began using this feature for > framebuffers that are 16bpp (not sure why not 8bpp). In those cases, we > are already using this mechanism for a different purpose, and so we can > only achieve one further level of compression (2:1 -> 4:1) > > FBC GEN1, ie. pre-G45 is ignored. > > The cleverness of the patch is Art's. The bugs are mine. > > v2: Update message and including missing threshold case 3 (Spotted by > Arthur). > > Reviewedby: Rodrigo Vivi > Cc: Art Runyan > Signed-off-by: Ben Widawsky > Signed-off-by: Rodrigo Vivi > --- > drivers/gpu/drm/i915/i915_drv.h | 3 +- > drivers/gpu/drm/i915/i915_gem_stolen.c | 54 > +++++++++++++++++++++++++--------- > drivers/gpu/drm/i915/intel_pm.c | 30 +++++++++++++++++-- > 3 files changed, 69 insertions(+), 18 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h > b/drivers/gpu/drm/i915/i915_drv.h > index 5b7aed2..9953ea8 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -600,6 +600,7 @@ struct intel_context { > > struct i915_fbc { > unsigned long size; > + unsigned threshold; > unsigned int fb_id; > enum plane plane; > int y; > @@ -2489,7 +2490,7 @@ static inline void i915_gem_chipset_flush(struct > drm_device *dev) > > /* i915_gem_stolen.c */ > int i915_gem_init_stolen(struct drm_device *dev); > -int i915_gem_stolen_setup_compression(struct drm_device *dev, int size); > +int i915_gem_stolen_setup_compression(struct drm_device *dev, int size, > int fb_cpp); > void i915_gem_stolen_cleanup_compression(struct drm_device *dev); > void i915_gem_cleanup_stolen(struct drm_device *dev); > struct drm_i915_gem_object * > diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c > b/drivers/gpu/drm/i915/i915_gem_stolen.c > index a86b331..b695d18 100644 > --- a/drivers/gpu/drm/i915/i915_gem_stolen.c > +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c > @@ -105,35 +105,61 @@ static unsigned long i915_stolen_to_physical(struct > drm_device *dev) > > static int find_compression_threshold(struct drm_device *dev, > struct drm_mm_node *node, > - int size) > + int size, > + int fb_cpp) > { > struct drm_i915_private *dev_priv = dev->dev_private; > - const int compression_threshold = 1; > + int compression_threshold = 1; > int ret; > > - /* Try to over-allocate to reduce reallocations and fragmentation > */ > + /* HACK: This code depends on what we will do in *_enable_fbc. If > that > + * code changes, this code needs to change as well. > + * > + * The enable_fbc code will attempt to use one of our 2 compression > + * thresholds, therefore, in that case, we only have 1 resort. > + */ > + > + /* Try to over-allocate to reduce reallocations and fragmentation. > */ > ret = drm_mm_insert_node(&dev_priv->mm.stolen, node, > size <<= 1, 4096, DRM_MM_SEARCH_DEFAULT); > - if (ret) > - ret = drm_mm_insert_node(&dev_priv->mm.stolen, node, > - size >>= 1, 4096, > - DRM_MM_SEARCH_DEFAULT); > - if (ret) > + if (ret == 0) > + return compression_threshold; > + > +again: > + /* HW's ability to limit the CFB is 1:4 */ > + if (compression_threshold > 4 || > + (fb_cpp == 2 && compression_threshold == 2)) > return 0; > - else > + > + ret = drm_mm_insert_node(&dev_priv->mm.stolen, node, > + size >>= 1, 4096, > + DRM_MM_SEARCH_DEFAULT); > + if (ret && INTEL_INFO(dev)->gen <= 4) { > + return 0; > + } else if (ret) { > + compression_threshold <<= 1; > + goto again; > + } else { > return compression_threshold; > + } > } > > -static int i915_setup_compression(struct drm_device *dev, int size) > +static int i915_setup_compression(struct drm_device *dev, int size, int > fb_cpp) > { > struct drm_i915_private *dev_priv = dev->dev_private; > struct drm_mm_node *uninitialized_var(compressed_llb); > int ret; > > ret = find_compression_threshold(dev, &dev_priv->fbc.compressed_fb, > - size); > + size, fb_cpp); > if (!ret) > goto err_llb; > + else if (ret > 1) { > + DRM_INFO("Reducing the compressed framebuffer size. This > may lead to less power savings than a non-reduced-size. Try to increase > stolen memory size if available in BIOS.\n"); > + > + } > + > + dev_priv->fbc.threshold = ret; > > if (HAS_PCH_SPLIT(dev)) > I915_WRITE(ILK_DPFC_CB_BASE, > dev_priv->fbc.compressed_fb.start); > @@ -157,7 +183,7 @@ static int i915_setup_compression(struct drm_device > *dev, int size) > dev_priv->mm.stolen_base + > compressed_llb->start); > } > > - dev_priv->fbc.size = size; > + dev_priv->fbc.size = size / dev_priv->fbc.threshold; > > DRM_DEBUG_KMS("reserved %d bytes of contiguous stolen space for > FBC\n", > size); > @@ -172,7 +198,7 @@ err_llb: > return -ENOSPC; > } > > -int i915_gem_stolen_setup_compression(struct drm_device *dev, int size) > +int i915_gem_stolen_setup_compression(struct drm_device *dev, int size, > int fb_cpp) > { > struct drm_i915_private *dev_priv = dev->dev_private; > > @@ -185,7 +211,7 @@ int i915_gem_stolen_setup_compression(struct > drm_device *dev, int size) > /* Release any current block */ > i915_gem_stolen_cleanup_compression(dev); > > - return i915_setup_compression(dev, size); > + return i915_setup_compression(dev, size, fb_cpp); > } > > void i915_gem_stolen_cleanup_compression(struct drm_device *dev) > diff --git a/drivers/gpu/drm/i915/intel_pm.c > b/drivers/gpu/drm/i915/intel_pm.c > index a90fdbd..4fcb2f7 100644 > --- a/drivers/gpu/drm/i915/intel_pm.c > +++ b/drivers/gpu/drm/i915/intel_pm.c > @@ -229,9 +229,20 @@ static void ironlake_enable_fbc(struct drm_crtc *crtc) > > dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane); > if (drm_format_plane_cpp(fb->pixel_format, 0) == 2) > + dev_priv->fbc.threshold++; > + > + switch (dev_priv->fbc.threshold) { > + case 4: > + case 3: > + dpfc_ctl |= DPFC_CTL_LIMIT_4X; > + break; > + case 2: > dpfc_ctl |= DPFC_CTL_LIMIT_2X; > - else > + break; > + case 1: > dpfc_ctl |= DPFC_CTL_LIMIT_1X; > + break; > + } > dpfc_ctl |= DPFC_CTL_FENCE_EN; > if (IS_GEN5(dev)) > dpfc_ctl |= obj->fence_reg; > @@ -285,9 +296,21 @@ static void gen7_enable_fbc(struct drm_crtc *crtc) > > dpfc_ctl = IVB_DPFC_CTL_PLANE(intel_crtc->plane); > if (drm_format_plane_cpp(fb->pixel_format, 0) == 2) > + dev_priv->fbc.threshold++; > + > + switch (dev_priv->fbc.threshold) { > + case 4: > + case 3: > + dpfc_ctl |= DPFC_CTL_LIMIT_4X; > + break; > + case 2: > dpfc_ctl |= DPFC_CTL_LIMIT_2X; > - else > + break; > + case 1: > dpfc_ctl |= DPFC_CTL_LIMIT_1X; > + break; > + } > + > dpfc_ctl |= IVB_DPFC_CTL_FENCE_EN; > > I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN); > @@ -566,7 +589,8 @@ void intel_update_fbc(struct drm_device *dev) > if (in_dbg_master()) > goto out_disable; > > - if (i915_gem_stolen_setup_compression(dev, > intel_fb->obj->base.size)) { > + if (i915_gem_stolen_setup_compression(dev, > intel_fb->obj->base.size, > + > drm_format_plane_cpp(fb->pixel_format, 0))) { > if (set_no_fbc_reason(dev_priv, FBC_STOLEN_TOO_SMALL)) > DRM_DEBUG_KMS("framebuffer too large, disabling > compression\n"); > goto out_disable; > -- > 1.9.1 > > _______________________________________________ > 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 --089e013d0b5412b7b504fd24003c Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Jani, please ignore the 4th patch on this series and merge= the 3 I've reviewed and tested already.

They are es= sential to allow FBC work on BDW without changing bios configuration and al= low PC7 residency.

Thanks,
Rodrigo.


On Mon, Jun 30, 2014 at 10:41 = AM, Rodrigo Vivi <rodrigo.vivi@intel.com> wrote:
From: Ben Widawsky <benjamin.widawsky@intel.com>

The GEN FBC unit provides the ability to set a low pass on frames it
attempts to compress. If a frame is less than a certain amount
compressibility (2:1, 4:1) it will not bother. This allows the driver to reduce the size it requests out of stolen memory.

Unluckily, a few months ago, Ville actually began using this feature for framebuffers that are 16bpp (not sure why not 8bpp). In those cases, we
are already using this mechanism for a different purpose, and so we can
only achieve one further level of compression (2:1 -> 4:1)

FBC GEN1, ie. pre-G45 is ignored.

The cleverness of the patch is Art's. The bugs are mine.

v2: Update message and including missing threshold case 3 (Spotted by= Arthur).

Reviewedby: Rodrigo Vivi <rodr= igo.vivi@intel.com>
Cc: Art Runyan <arthur.j.runyan@intel.com>
Signed-off-by: Ben Widawsky <ben@bwi= dawsk.net>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
=C2=A0drivers/gpu/drm/i915/i915_drv.h =C2=A0 =C2=A0 =C2=A0 =C2=A0| =C2=A03 = +-
=C2=A0drivers/gpu/drm/i915/i915_gem_stolen.c | 54 +++++++++++++++++++++++++= ---------
=C2=A0drivers/gpu/drm/i915/intel_pm.c =C2=A0 =C2=A0 =C2=A0 =C2=A0| 30= +++++++++++++++++--
=C2=A03 files changed, 69 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_dr= v.h
index 5b7aed2..9953ea8 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -600,6 +600,7 @@ struct intel_context {

=C2=A0struct i915_fbc {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long size;
+ =C2=A0 =C2=A0 =C2=A0 unsigned threshold;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned int fb_id;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 enum plane plane;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int y;
@@ -2489,7 +2490,7 @@ static inline void i915_gem_chipset_flush(struc= t drm_device *dev)

=C2=A0/* i915_gem_stolen.c */
=C2=A0int i915_gem_init_stolen(struct drm_device *dev);
-int i915_gem_stolen_setup_compression(struct drm_device *dev, int size); +int i915_gem_stolen_setup_compression(struct drm_device *dev, int size, in= t fb_cpp);
=C2=A0void i915_gem_stolen_cleanup_compression(struct drm_device *dev);
=C2=A0void i915_gem_cleanup_stolen(struct drm_device *dev);
=C2=A0struct drm_i915_gem_object *
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/= i915_gem_stolen.c
index a86b331..b695d18 100644
--- a/drivers/gpu/drm/i915/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/i915_gem_stolen.c
@@ -105,35 +105,61 @@ static unsigned long i915_stolen_to_physical(struct d= rm_device *dev)

=C2=A0static int find_compression_threshold(struct drm_device *dev,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct drm_mm_n= ode *node,
- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 int size)
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 int size,
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 int fb_cpp)
=C2=A0{
=C2=A0 =C2=A0 =C2=A0 =C2=A0 struct drm_i915_private *dev_priv =3D dev->d= ev_private;
- =C2=A0 =C2=A0 =C2=A0 const int compression_threshold =3D 1;
+ =C2=A0 =C2=A0 =C2=A0 int compression_threshold =3D 1;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int ret;

- =C2=A0 =C2=A0 =C2=A0 /* Try to over-allocate to reduce reallocations and = fragmentation */
+ =C2=A0 =C2=A0 =C2=A0 /* HACK: This code depends on what we will do in *_e= nable_fbc. If that
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0* code changes, this code needs to change as w= ell.
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0*
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0* The enable_fbc code will attempt to use one = of our 2 compression
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0* thresholds, therefore, in that case, we only= have 1 resort.
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0*/
+
+ =C2=A0 =C2=A0 =C2=A0 /* Try to over-allocate to reduce reallocations and = fragmentation. */
=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D drm_mm_insert_node(&dev_priv->mm= .stolen, node,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0size <<=3D 1, 4096, DRM_= MM_SEARCH_DEFAULT);
- =C2=A0 =C2=A0 =C2=A0 if (ret)
- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D drm_mm_insert_no= de(&dev_priv->mm.stolen, node,
- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0size >= >=3D 1, 4096,
- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0DRM_MM_SE= ARCH_DEFAULT);
- =C2=A0 =C2=A0 =C2=A0 if (ret)
+ =C2=A0 =C2=A0 =C2=A0 if (ret =3D=3D 0)
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return compression_thres= hold;
+
+again:
+ =C2=A0 =C2=A0 =C2=A0 /* HW's ability to limit the CFB is 1:4 */
+ =C2=A0 =C2=A0 =C2=A0 if (compression_threshold > 4 ||
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (fb_cpp =3D=3D 2 && compressio= n_threshold =3D=3D 2))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return 0;
- =C2=A0 =C2=A0 =C2=A0 else
+
+ =C2=A0 =C2=A0 =C2=A0 ret =3D drm_mm_insert_node(&dev_priv->mm.stol= en, node,
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0size >>=3D 1, 4096,
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0DRM_MM_SEARCH_DEFAULT);
+ =C2=A0 =C2=A0 =C2=A0 if (ret && INTEL_INFO(dev)->gen <=3D 4= ) {
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return 0;
+ =C2=A0 =C2=A0 =C2=A0 } else if (ret) {
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 compression_threshold &l= t;<=3D 1;
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto again;
+ =C2=A0 =C2=A0 =C2=A0 } else {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return compression_= threshold;
+ =C2=A0 =C2=A0 =C2=A0 }
=C2=A0}

-static int i915_setup_compression(struct drm_device *dev, int size)
+static int i915_setup_compression(struct drm_device *dev, int size, int fb= _cpp)
=C2=A0{
=C2=A0 =C2=A0 =C2=A0 =C2=A0 struct drm_i915_private *dev_priv =3D dev->d= ev_private;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 struct drm_mm_node *uninitialized_var(compresse= d_llb);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 int ret;

=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D find_compression_threshold(dev, &de= v_priv->fbc.compressed_fb,
- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0size); + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0size, fb_= cpp);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!ret)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto err_llb;
+ =C2=A0 =C2=A0 =C2=A0 else if (ret > 1) {
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 DRM_INFO(&qu= ot;Reducing the compressed framebuffer size. This may lead to less power sa= vings than a non-reduced-size. Try to increase stolen memory size if availa= ble in BIOS.\n");
+
+ =C2=A0 =C2=A0 =C2=A0 }
+
+ =C2=A0 =C2=A0 =C2=A0 dev_priv->fbc.threshold =3D ret;

=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (HAS_PCH_SPLIT(dev))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 I915_WRITE(ILK_DPFC= _CB_BASE, dev_priv->fbc.compressed_fb.start);
@@ -157,7 +183,7 @@ static int i915_setup_compression(struct drm_device *de= v, int size)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0dev_priv->mm.stolen_base + compressed_llb->st= art);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 }

- =C2=A0 =C2=A0 =C2=A0 dev_priv->fbc.size =3D size;
+ =C2=A0 =C2=A0 =C2=A0 dev_priv->fbc.size =3D size / dev_priv->fbc.th= reshold;

=C2=A0 =C2=A0 =C2=A0 =C2=A0 DRM_DEBUG_KMS("reserved %d bytes of contig= uous stolen space for FBC\n",
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 size);
@@ -172,7 +198,7 @@ err_llb:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 return -ENOSPC;
=C2=A0}

-int i915_gem_stolen_setup_compression(struct drm_device *dev, int size) +int i915_gem_stolen_setup_compression(struct drm_device *dev, int size, in= t fb_cpp)
=C2=A0{
=C2=A0 =C2=A0 =C2=A0 =C2=A0 struct drm_i915_private *dev_priv =3D dev->d= ev_private;

@@ -185,7 +211,7 @@ int i915_gem_stolen_setup_compression(struct drm_device= *dev, int size)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Release any current block */
=C2=A0 =C2=A0 =C2=A0 =C2=A0 i915_gem_stolen_cleanup_compression(dev);

- =C2=A0 =C2=A0 =C2=A0 return i915_setup_compression(dev, size);
+ =C2=A0 =C2=A0 =C2=A0 return i915_setup_compression(dev, size, fb_cpp); =C2=A0}

=C2=A0void i915_gem_stolen_cleanup_compression(struct drm_device *dev)
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_p= m.c
index a90fdbd..4fcb2f7 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -229,9 +229,20 @@ static void ironlake_enable_fbc(struct drm_crtc *crtc)=

=C2=A0 =C2=A0 =C2=A0 =C2=A0 dpfc_ctl =3D DPFC_CTL_PLANE(intel_crtc->plan= e);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (drm_format_plane_cpp(fb->pixel_format, 0= ) =3D=3D 2)
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dev_priv->fbc.thresho= ld++;
+
+ =C2=A0 =C2=A0 =C2=A0 switch (dev_priv->fbc.threshold) {
+ =C2=A0 =C2=A0 =C2=A0 case 4:
+ =C2=A0 =C2=A0 =C2=A0 case 3:
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dpfc_ctl |=3D DPFC_CTL_L= IMIT_4X;
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
+ =C2=A0 =C2=A0 =C2=A0 case 2:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dpfc_ctl |=3D DPFC_= CTL_LIMIT_2X;
- =C2=A0 =C2=A0 =C2=A0 else
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
+ =C2=A0 =C2=A0 =C2=A0 case 1:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dpfc_ctl |=3D DPFC_= CTL_LIMIT_1X;
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
+ =C2=A0 =C2=A0 =C2=A0 }
=C2=A0 =C2=A0 =C2=A0 =C2=A0 dpfc_ctl |=3D DPFC_CTL_FE= NCE_EN;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (IS_GEN5(dev))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dpfc_ctl |=3D obj-&= gt;fence_reg;
@@ -285,9 +296,21 @@ static void gen7_enable_fbc(struct drm_crtc *crt= c)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 dpfc_ctl =3D IVB_DPFC_CTL_PLANE(intel_crtc->= plane);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (drm_format_plane_cpp(fb->= ;pixel_format, 0) =3D=3D 2)
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dev_priv->fbc.thresho= ld++;
+
+ =C2=A0 =C2=A0 =C2=A0 switch (dev_priv->fbc.threshold) {
+ =C2=A0 =C2=A0 =C2=A0 case 4:
+ =C2=A0 =C2=A0 =C2=A0 case 3:
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dpfc_ctl |=3D DPFC_CTL_L= IMIT_4X;
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
+ =C2=A0 =C2=A0 =C2=A0 case 2:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dpfc_ctl |=3D DPFC_= CTL_LIMIT_2X;
- =C2=A0 =C2=A0 =C2=A0 else
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
+ =C2=A0 =C2=A0 =C2=A0 case 1:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dpfc_ctl |=3D DPFC_= CTL_LIMIT_1X;
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
+ =C2=A0 =C2=A0 =C2=A0 }
+
=C2=A0 =C2=A0 =C2=A0 =C2=A0 dpfc_ctl |=3D IVB_DPFC_CTL_FENCE_EN;

=C2=A0 =C2=A0 =C2=A0 =C2=A0 I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CT= L_EN);
@@ -566,7 +589,8 @@ void intel_update_fbc(struct drm_device *dev)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (in_dbg_master())
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto out_disable;
- =C2=A0 =C2=A0 =C2=A0 if (i915_gem_stolen_setup_compression(dev, intel_fb-= >obj->base.size)) {
+ =C2=A0 =C2=A0 =C2=A0 if (i915_gem_stolen_setup_compression(dev, intel_fb-= >obj->base.size,
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 drm_format_plane_cpp(fb->pixel_format, 0))) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (set_no_fbc_reas= on(dev_priv, FBC_STOLEN_TOO_SMALL))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 DRM_DEBUG_KMS("framebuffer too large, disabling compression= \n");
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto out_disable; --
1.9.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesk= top.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx



--
=
Rodrigo Vivi
=C2=A0
--089e013d0b5412b7b504fd24003c-- --===============1945713162== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx --===============1945713162==--