[Intel-gfx] [PATCH] drm/i915: implement high-bpc + pipeconf-dither support for g4x/vlv
Daniel Vetter
daniel.vetter at ffwll.ch
Fri Apr 19 21:29:12 CEST 2013
On Fri, Apr 19, 2013 at 8:39 PM, Jesse Barnes <jbarnes at virtuousgeek.org> wrote:
> On Fri, 19 Apr 2013 20:17:10 +0200
> Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
>> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
>> index 8c36376..7f1ab8b 100644
>> --- a/drivers/gpu/drm/i915/intel_display.c
>> +++ b/drivers/gpu/drm/i915/intel_display.c
>> @@ -4605,22 +4605,29 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc)
>> pipeconf &= ~PIPECONF_DOUBLE_WIDE;
>> }
>>
>> - /* default to 8bpc */
>> - pipeconf &= ~(PIPECONF_BPC_MASK | PIPECONF_DITHER_EN);
>> - if (intel_crtc->config.has_dp_encoder) {
>> - if (intel_crtc->config.dither) {
>> - pipeconf |= PIPECONF_6BPC |
>> - PIPECONF_DITHER_EN |
>> + /* only g4x and later have fancy bpc/dither controls */
>> + if (IS_G4X(dev) || IS_VALLEYVIEW(dev)) {
>> + pipeconf &= ~(PIPECONF_BPC_MASK | PIPECONF_DITHER_EN);
>> +
>> + /* Bspec claims that we can't use dithering for 30bpp pipes. */
>> + if (intel_crtc->config.dither && intel_crtc->config.pipe_bpp != 30)
>> + pipeconf |= PIPECONF_DITHER_EN |
>> PIPECONF_DITHER_TYPE_SP;
>> - }
>> - }
>>
>> - if (IS_VALLEYVIEW(dev) && intel_pipe_has_type(&intel_crtc->base,
>> - INTEL_OUTPUT_EDP)) {
>> - if (intel_crtc->config.dither) {
>> - pipeconf |= PIPECONF_6BPC |
>> - PIPECONF_ENABLE |
>> - I965_PIPECONF_ACTIVE;
>> + pipeconf &= ~PIPECONF_BPC_MASK;
>> + switch (intel_crtc->config.pipe_bpp) {
>> + case 18:
>> + pipeconf |= PIPECONF_6BPC;
>> + break;
>> + case 24:
>> + pipeconf |= PIPECONF_8BPC;
>> + break;
>> + case 30:
>> + pipeconf |= PIPECONF_10BPC;
>> + break;
>> + default:
>> + /* Case prevented by intel_choose_pipe_bpp_dither. */
>> + BUG();
>
> Am I misreading here? It looks like we may set the 10bpc pipeconf bit,
> but never enable it. Should there be another G4x check somewhere? Or
> should the 10bpc case be dropped from the switch?
Previous patches fixed up the pipe_bpp computation for vlv, and other
patches in this series allow us to actually come up with a 10bpp
config (e.g. dp unconditionally goes with a 24bpp limit thus far ...).
So I don't see exactly where you see an issue.
>> }
>> }
>>
>> diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
>> index 58a98ff..094f3c5 100644
>> --- a/drivers/gpu/drm/i915/intel_lvds.c
>> +++ b/drivers/gpu/drm/i915/intel_lvds.c
>> @@ -135,7 +135,7 @@ static void intel_pre_pll_enable_lvds(struct intel_encoder *encoder)
>> /* Set the dithering flag on LVDS as needed, note that there is no
>> * special lvds dither control bit on pch-split platforms, dithering is
>> * only controlled through the PIPECONF reg. */
>> - if (INTEL_INFO(dev)->gen == 4) {
>> + if (INTEL_INFO(dev)->gen == 4 && !IS_G4X(dev)) {
>> if (intel_crtc->config.dither)
>> temp |= LVDS_ENABLE_DITHER;
>> else
>
> Looks ok otherwise, though I'd still like to see LVDS dither compared
> with pipe dither.
I've figued since we want dither for DP (e.g. cheap vga dongles which
only work with 6bpc on high-res modes) we should switch to pipe
dithering unconditionally.
> And what happens now if a 30bpp config gets chosen for an LVDS or eDP
> panel? Do we just output it anyway and get junk on the screen?
encoder->compute_config will save the day. If you read up to the fdi
auto-dither code you can watch a pretty elaborate negotiation going on
between encoders and the pipe about which bpp things should run at ;-)
So should all just magically work. In the end (once everything
interesting is converted over) the mode_set/enable functions just grab
the parameters from pipe_conf and smash it into hw registers. All
interesting stuff is done up-front in the pipe/encoder compute_config
stage. Of course that means for a given hw feature you need to check
individual encoders and the pipe to figure out what exactly pops out
at the end.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
More information about the Intel-gfx
mailing list