[Intel-gfx] [PATCH] drm/i915: Implement fbc_status "Compressing" info for all platforms
Paulo Zanoni
paulo.r.zanoni at intel.com
Mon Jun 5 20:23:17 UTC 2017
Em Qui, 2017-06-01 às 21:02 +0300, ville.syrjala at linux.intel.com
escreveu:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> The number of compressed segments has been available ever since
> FBC2 was introduced in g4x, it just moved from the STATUS register
> into STATUS2 on IVB.
>
> For FBC1 if we really wanted the number of compressed segments we'd
> have to trawl through the tags, but in this case since the code just
> uses the number of compressed segments as an indicator whether
> compression has occurred we can just check the state of the
> COMPRESSING and COMPRESSED bits. IIRC the hardware will try to
> periodically recompress all uncompressed lines even if they haven't
> changed and the COMPRESSED bit will be cleared while the compressor
> is running, so just checking the COMPRESSED bit might not give us
> the right answer. Hence it seems better to check for both
> COMPRESSED and COMPRESSING as that should tell us that the
> compressor is at least trying to do something.
>
> While at it move the IVB+ register define to the right place, unify
> the naming convention of the compressed segment count masks, and
> fix up the mask for g4x.
>
> Cc: Paulo Zanoni <paulo.r.zanoni at intel.com>
> Cc: Gabriel Krisman Bertazi <krisman at collabora.co.uk>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/i915_debugfs.c | 22 ++++++++++++++++------
> drivers/gpu/drm/i915/i915_reg.h | 10 +++++-----
> 2 files changed, 21 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c
> b/drivers/gpu/drm/i915/i915_debugfs.c
> index 3b088685a553..126f1e8a9d0b 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -1670,12 +1670,22 @@ static int i915_fbc_status(struct seq_file
> *m, void *unused)
> seq_printf(m, "FBC disabled: %s\n",
> dev_priv->fbc.no_fbc_reason);
>
> - if (intel_fbc_is_active(dev_priv) && INTEL_GEN(dev_priv) >=
> 7) {
> - uint32_t mask = INTEL_GEN(dev_priv) >= 8 ?
> - BDW_FBC_COMPRESSION_MASK :
> - IVB_FBC_COMPRESSION_MASK;
> - seq_printf(m, "Compressing: %s\n",
> - yesno(I915_READ(FBC_STATUS2) & mask));
> + if (intel_fbc_is_active(dev_priv)) {
> + u32 mask;
Someone should sed our whole driver so it either fully uses u32 or
uint32_t.
> +
> + if (INTEL_GEN(dev_priv) >= 8)
> + mask = I915_READ(ILK_DPFC_STATUS2) &
> BDW_DPFC_COMP_SEG_MASK;
> + else if (INTEL_GEN(dev_priv) >= 7)
> + mask = I915_READ(ILK_DPFC_STATUS2) &
> IVB_DPFC_COMP_SEG_MASK;
> + else if (INTEL_GEN(dev_priv) >= 5)
> + mask = I915_READ(ILK_DPFC_STATUS) &
> ILK_DPFC_COMP_SEG_MASK;
> + else if (IS_G4X(dev_priv))
> + mask = I915_READ(DPFC_STATUS) &
> DPFC_COMP_SEG_MASK;
> + else
> + mask = I915_READ(FBC_STATUS) &
> (FBC_STAT_COMPRESSING |
> + FBC_STAT_COM
> PRESSED);
> +
> + seq_printf(m, "Compressing: %s\n", yesno(mask));
> }
>
> mutex_unlock(&dev_priv->fbc.lock);
> diff --git a/drivers/gpu/drm/i915/i915_reg.h
> b/drivers/gpu/drm/i915/i915_reg.h
> index 231ee86625cd..23bdc079575c 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -2507,10 +2507,6 @@ enum skl_disp_power_wells {
> #define FBC_FENCE_OFF _MMIO(0x3218) /* BSpec typo has
> 321Bh */
> #define FBC_TAG(i) _MMIO(0x3300 + (i) * 4)
>
> -#define FBC_STATUS2 _MMIO(0x43214)
> -#define IVB_FBC_COMPRESSION_MASK 0x7ff
> -#define BDW_FBC_COMPRESSION_MASK 0xfff
> -
> #define FBC_LL_SIZE (1536)
>
> #define FBC_LLC_READ_CTRL _MMIO(0x9044)
> @@ -2539,7 +2535,7 @@ enum skl_disp_power_wells {
> #define DPFC_INVAL_SEG_SHIFT (16)
> #define DPFC_INVAL_SEG_MASK (0x07ff0000)
> #define DPFC_COMP_SEG_SHIFT (0)
> -#define DPFC_COMP_SEG_MASK (0x000003ff)
> +#define DPFC_COMP_SEG_MASK (0x000007ff)
> #define DPFC_STATUS2 _MMIO(0x3214)
> #define DPFC_FENCE_YOFF _MMIO(0x3218)
> #define DPFC_CHICKEN _MMIO(0x3224)
> @@ -2553,6 +2549,10 @@ enum skl_disp_power_wells {
> #define DPFC_RESERVED (0x1FFFFF00)
> #define ILK_DPFC_RECOMP_CTL _MMIO(0x4320c)
> #define ILK_DPFC_STATUS _MMIO(0x43210)
> +#define ILK_DPFC_COMP_SEG_MASK 0x7ff
> +#define ILK_DPFC_STATUS2 _MMIO(0x43214)
I'm fine with using ILK names for something that appeared on ILK, but I
can't find ILK_DPFC_STATUS2 on my ILK docs. It seems to me that STATUS2
only appeared on IVB, and it's named FBC_STATUS2 there.
If that's the case, ideally we should call it FBC_STATUS2, because
that's the name. If you really insist, I could very reluctantly go with
IVB_DPFC_STATUS2, although I really don't like the idea of going with a
name that's nowhere in our docs. We should really only keep it as
ILK_DPFC_STATUS2 if the register indeed was added on ILK (and in this
case, please give me pointers to the appropriate doc).
For the gen5+ part of the patch, if you rename the STATUS2 register,
consider it Reviewed-by: Paulo Zanoni <paulo.r.zanoni at intel.com>.
For the gen 2 - 4 part, I really didn't check the docs. But FBC is
disabled by default on these platforms anyway and assumed to be broken,
so: Acked-by: Paulo Zanoni <paulo.r.zanoni at intel.com>.
> +#define IVB_DPFC_COMP_SEG_MASK 0x7ff
> +#define BDW_DPFC_COMP_SEG_MASK 0xfff
> #define ILK_DPFC_FENCE_YOFF _MMIO(0x43218)
> #define ILK_DPFC_CHICKEN _MMIO(0x43224)
> #define ILK_DPFC_DISABLE_DUMMY0 (1<<8)
More information about the Intel-gfx
mailing list