Re: [PATCH 40/62] drm/i915/bdw: Broadwell has PIPEMISC

Ville Syrjälä
2013-11-03T11:11:35Z

On Sat, Nov 02, 2013 at 09:07:38PM -0700, Ben Widawsky wrote:
> From: Paulo Zanoni <paulo.r.zanoni@intel.com>
>
> And it inherits some bits from the previous TRANS_CONF (aka PIPE_CONF
> on previous gens).
>
> v2: Rebase on to of the pipe config bpp handling rework.
>
> v3: Rebased on top of the pipe_config->dither refactoring.
>
> v4: Drop the read-modify-write cycle for PIPEMISC, similarly to how we
> now also build up PIPECONF completely ourselves - keeping around
> random stuff set by the BIOS just isn't a good idea. I've checked BDW
> BSpec and we already set all relevant bits.
>
> Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> (v1)
> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

> ---
> drivers/gpu/drm/i915/i915_reg.h | 12 ++++++++++++
> drivers/gpu/drm/i915/intel_display.c | 33 +++++++++++++++++++++++++++++++--
> 2 files changed, 43 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index d5995dd..4131223 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -3224,6 +3224,18 @@
> #define PIPEFRAMEPIXEL(pipe) _PIPE(pipe, _PIPEAFRAMEPIXEL, _PIPEBFRAMEPIXEL)
> #define PIPESTAT(pipe) _PIPE(pipe, _PIPEASTAT, _PIPEBSTAT)
>
> +#define _PIPE_MISC_A 0x70030
> +#define _PIPE_MISC_B 0x71030
> +#define PIPEMISC_DITHER_BPC_MASK (7<<5)
> +#define PIPEMISC_DITHER_8_BPC (0<<5)
> +#define PIPEMISC_DITHER_10_BPC (1<<5)
> +#define PIPEMISC_DITHER_6_BPC (2<<5)
> +#define PIPEMISC_DITHER_12_BPC (3<<5)
> +#define PIPEMISC_DITHER_ENABLE (1<<4)
> +#define PIPEMISC_DITHER_TYPE_MASK (3<<2)
> +#define PIPEMISC_DITHER_TYPE_SP (0<<2)
> +#define PIPEMISC(pipe) _PIPE(pipe, _PIPE_MISC_A, _PIPE_MISC_B)
> +
> #define VLV_DPFLIPSTAT (VLV_DISPLAY_BASE + 0x70028)
> #define PIPEB_LINE_COMPARE_INT_EN (1<<29)
> #define PIPEB_HLINE_INT_EN (1<<28)
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 7729c88..134ae66 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -5772,14 +5772,16 @@ static void intel_set_pipe_csc(struct drm_crtc *crtc)
>
> static void haswell_set_pipeconf(struct drm_crtc *crtc)
> {
> - struct drm_i915_private *dev_priv = crtc->dev->dev_private;
> + struct drm_device *dev = crtc->dev;
> + struct drm_i915_private *dev_priv = dev->dev_private;
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> + enum pipe pipe = intel_crtc->pipe;
> enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> uint32_t val;
>
> val = 0;
>
> - if (intel_crtc->config.dither)
> + if (IS_HASWELL(dev) && intel_crtc->config.dither)
> val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
>
> if (intel_crtc->config.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
> @@ -5792,6 +5794,33 @@ static void haswell_set_pipeconf(struct drm_crtc *crtc)
>
> I915_WRITE(GAMMA_MODE(intel_crtc->pipe), GAMMA_MODE_MODE_8BIT);
> POSTING_READ(GAMMA_MODE(intel_crtc->pipe));
> +
> + if (IS_BROADWELL(dev)) {
> + val = 0;
> +
> + switch (intel_crtc->config.pipe_bpp) {
> + case 18:
> + val |= PIPEMISC_DITHER_6_BPC;
> + break;
> + case 24:
> + val |= PIPEMISC_DITHER_8_BPC;
> + break;
> + case 30:
> + val |= PIPEMISC_DITHER_10_BPC;
> + break;
> + case 36:
> + val |= PIPEMISC_DITHER_12_BPC;
> + break;
> + default:
> + /* Case prevented by pipe_config_set_bpp. */
> + BUG();
> + }
> +
> + if (intel_crtc->config.dither)
> + val |= PIPEMISC_DITHER_ENABLE | PIPEMISC_DITHER_TYPE_SP;
> +
> + I915_WRITE(PIPEMISC(pipe), val);
> + }
> }
>
> static bool ironlake_compute_clocks(struct drm_crtc *crtc,
> --
> 1.8.4.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

--
Ville Syrjälä
Intel OTC