From: Daniel Vetter <daniel@ffwll.ch>
To: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 9/9] drm/i915: fix FBC for cases where crtc->base.y is non-zero
Date: Wed, 23 Sep 2015 11:09:18 +0200 [thread overview]
Message-ID: <20150923090918.GA3383@phenom.ffwll.local> (raw)
In-Reply-To: <20150921140449.GI26517@intel.com>
Pulled in the entire series to dinq, thanks.
-Daniel
On Mon, Sep 21, 2015 at 05:04:49PM +0300, Ville Syrjälä wrote:
> On Mon, Sep 14, 2015 at 03:20:03PM -0300, Paulo Zanoni wrote:
> > I only tested this on BDW and SKL, but since the register description
> > is the same ever since gen4, let's assume that all gens take the same
> > register format. If that's not true, then hopefully someone will
> > bisect a bug to this patch and we'll fix it.
> >
> > Notice that the wrong fence offset register just means that the
> > hardware tracking will be wrong.
> >
> > Testcases:
> > - igt/kms_frontbuffer_tracking/fbc-1p-primscrn-pri-shrfb-draw-mmap-gtt
> > - igt/kms_frontbuffer_tracking/fbc-2p-primscrn-pri-shrfb-draw-mmap-gtt
> >
> > v2:
> > - Add intel_crtc->adjusted_{x,y} so this code can work independently
> > of intel_gen4_compute_page_offset(). (Ville).
> > - This version also works on SKL.
> >
> > Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
> > ---
> > drivers/gpu/drm/i915/intel_display.c | 9 +++++++++
> > drivers/gpu/drm/i915/intel_drv.h | 2 ++
> > drivers/gpu/drm/i915/intel_fbc.c | 25 ++++++++++++++++++++-----
> > 3 files changed, 31 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > index fc00867..c27a636 100644
> > --- a/drivers/gpu/drm/i915/intel_display.c
> > +++ b/drivers/gpu/drm/i915/intel_display.c
> > @@ -2730,6 +2730,9 @@ static void i9xx_update_primary_plane(struct drm_crtc *crtc,
> > (intel_crtc->config->pipe_src_w - 1) * pixel_size;
> > }
> >
> > + intel_crtc->adjusted_x = x;
> > + intel_crtc->adjusted_y = y;
> > +
> > I915_WRITE(reg, dspcntr);
> >
> > I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]);
> > @@ -2830,6 +2833,9 @@ static void ironlake_update_primary_plane(struct drm_crtc *crtc,
> > }
> > }
> >
> > + intel_crtc->adjusted_x = x;
> > + intel_crtc->adjusted_y = y;
> > +
> > I915_WRITE(reg, dspcntr);
> >
> > I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]);
> > @@ -3082,6 +3088,9 @@ static void skylake_update_primary_plane(struct drm_crtc *crtc,
> > }
> > plane_offset = y_offset << 16 | x_offset;
> >
> > + intel_crtc->adjusted_x = x_offset;
> > + intel_crtc->adjusted_y = y_offset;
> > +
> > I915_WRITE(PLANE_CTL(pipe, 0), plane_ctl);
> > I915_WRITE(PLANE_OFFSET(pipe, 0), plane_offset);
> > I915_WRITE(PLANE_SIZE(pipe, 0), plane_size);
> > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> > index 02a755a..6054bcb 100644
> > --- a/drivers/gpu/drm/i915/intel_drv.h
> > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > @@ -537,6 +537,8 @@ struct intel_crtc {
> > * gen4+ this only adjusts up to a tile, offsets within a tile are
> > * handled in the hw itself (with the TILEOFF register). */
> > unsigned long dspaddr_offset;
> > + int adjusted_x;
> > + int adjusted_y;
> >
> > struct drm_i915_gem_object *cursor_bo;
> > uint32_t cursor_addr;
> > diff --git a/drivers/gpu/drm/i915/intel_fbc.c b/drivers/gpu/drm/i915/intel_fbc.c
> > index a3a97f2..2319dc5 100644
> > --- a/drivers/gpu/drm/i915/intel_fbc.c
> > +++ b/drivers/gpu/drm/i915/intel_fbc.c
> > @@ -41,6 +41,19 @@
> > #include "intel_drv.h"
> > #include "i915_drv.h"
> >
> > +/*
> > + * In some platforms where the CRTC's x:0/y:0 coordinates doesn't match the
> > + * frontbuffer's x:0/y:0 coordinates we lie to the hardware about the plane's
> > + * origin so the x and y offsets can actually fit the registers. As a
> > + * consequence, the fence doesn't really start exactly at the display plane
> > + * address we program because it starts at the real start of the buffer, so we
> > + * have to take this into consideration here.
> > + */
> > +static unsigned int get_crtc_fence_y_offset(struct intel_crtc *crtc)
> > +{
> > + return crtc->base.y - crtc->adjusted_y;
> > +}
>
> We may want to move over to using the plane state here in the future.
> But for now it looks OK, so:
>
> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
>
> > +
> > static void i8xx_fbc_disable(struct drm_i915_private *dev_priv)
> > {
> > u32 fbc_ctl;
> > @@ -97,7 +110,7 @@ static void i8xx_fbc_enable(struct intel_crtc *crtc)
> > fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM | FBC_CTL_CPU_FENCE;
> > fbc_ctl2 |= FBC_CTL_PLANE(crtc->plane);
> > I915_WRITE(FBC_CONTROL2, fbc_ctl2);
> > - I915_WRITE(FBC_FENCE_OFF, crtc->base.y);
> > + I915_WRITE(FBC_FENCE_OFF, get_crtc_fence_y_offset(crtc));
> > }
> >
> > /* enable it... */
> > @@ -135,7 +148,7 @@ static void g4x_fbc_enable(struct intel_crtc *crtc)
> > dpfc_ctl |= DPFC_CTL_LIMIT_1X;
> > dpfc_ctl |= DPFC_CTL_FENCE_EN | obj->fence_reg;
> >
> > - I915_WRITE(DPFC_FENCE_YOFF, crtc->base.y);
> > + I915_WRITE(DPFC_FENCE_YOFF, get_crtc_fence_y_offset(crtc));
> >
> > /* enable it... */
> > I915_WRITE(DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
> > @@ -177,6 +190,7 @@ static void ilk_fbc_enable(struct intel_crtc *crtc)
> > struct drm_i915_gem_object *obj = intel_fb_obj(fb);
> > u32 dpfc_ctl;
> > int threshold = dev_priv->fbc.threshold;
> > + unsigned int y_offset;
> >
> > dev_priv->fbc.enabled = true;
> >
> > @@ -200,7 +214,8 @@ static void ilk_fbc_enable(struct intel_crtc *crtc)
> > if (IS_GEN5(dev_priv))
> > dpfc_ctl |= obj->fence_reg;
> >
> > - I915_WRITE(ILK_DPFC_FENCE_YOFF, crtc->base.y);
> > + y_offset = get_crtc_fence_y_offset(crtc);
> > + I915_WRITE(ILK_DPFC_FENCE_YOFF, y_offset);
> > I915_WRITE(ILK_FBC_RT_BASE, i915_gem_obj_ggtt_offset(obj) | ILK_FBC_RT_VALID);
> > /* enable it... */
> > I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
> > @@ -208,7 +223,7 @@ static void ilk_fbc_enable(struct intel_crtc *crtc)
> > if (IS_GEN6(dev_priv)) {
> > I915_WRITE(SNB_DPFC_CTL_SA,
> > SNB_CPU_FENCE_ENABLE | obj->fence_reg);
> > - I915_WRITE(DPFC_CPU_FENCE_OFFSET, crtc->base.y);
> > + I915_WRITE(DPFC_CPU_FENCE_OFFSET, y_offset);
> > }
> >
> > intel_fbc_nuke(dev_priv);
> > @@ -288,7 +303,7 @@ static void gen7_fbc_enable(struct intel_crtc *crtc)
> >
> > I915_WRITE(SNB_DPFC_CTL_SA,
> > SNB_CPU_FENCE_ENABLE | obj->fence_reg);
> > - I915_WRITE(DPFC_CPU_FENCE_OFFSET, crtc->base.y);
> > + I915_WRITE(DPFC_CPU_FENCE_OFFSET, get_crtc_fence_y_offset(crtc));
> >
> > intel_fbc_nuke(dev_priv);
> >
> > --
> > 2.5.1
> >
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
> --
> Ville Syrjälä
> Intel OTC
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
prev parent reply other threads:[~2015-09-23 9:06 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-14 18:19 [PATCH 1/9] drm/i915: fix the FBC work allocation failure path Paulo Zanoni
2015-09-14 18:19 ` [PATCH 2/9] drm/i915: check for the supported strides on HSW+ FBC Paulo Zanoni
2015-09-21 13:43 ` Ville Syrjälä
2015-09-14 18:19 ` [PATCH 3/9] drm/i915: avoid the last 8mb of stolen on BDW/SKL Paulo Zanoni
2015-09-21 13:55 ` Ville Syrjälä
2015-09-14 18:19 ` [PATCH 4/9] drm/i915: print the correct amount of bytes allocated for the CFB Paulo Zanoni
2015-09-14 18:19 ` [PATCH 5/9] drm/i915: don't enable FBC when pixel rate exceeds 95% on HSW/BDW Paulo Zanoni
2015-09-21 13:58 ` Ville Syrjälä
2015-09-14 18:20 ` [PATCH 6/9] drm/i915: apply WaFbcAsynchFlipDisableFbcQueue earlier Paulo Zanoni
2015-09-14 18:20 ` [PATCH 7/9] drm/i915: don't apply WaFbcAsynchFlipDisableFbcQueue on SKL Paulo Zanoni
2015-09-14 18:20 ` [PATCH 8/9] drm/i915: reject invalid formats for FBC Paulo Zanoni
2015-09-21 14:00 ` Ville Syrjälä
2015-09-21 22:48 ` Paulo Zanoni
2015-09-14 18:20 ` [PATCH 9/9] drm/i915: fix FBC for cases where crtc->base.y is non-zero Paulo Zanoni
2015-09-21 14:04 ` Ville Syrjälä
2015-09-23 9:09 ` Daniel Vetter [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150923090918.GA3383@phenom.ffwll.local \
--to=daniel@ffwll.ch \
--cc=intel-gfx@lists.freedesktop.org \
--cc=ville.syrjala@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.