[Intel-gfx] [PATCH v7 3/4] drm/i915: Haswell HDMI audio initialization

Wang Xingchao xingchao.wang at intel.com
Thu Aug 16 05:45:32 CEST 2012


On Wed, Aug 15, 2012 at 08:05:14PM +0300, Imre Deak wrote:
> On Wed, Aug 15, 2012 at 6:27 AM, Wang, Xingchao <xingchao.wang at intel.com> wrote:
> > Hi Daniel/Imre,
> >
> > This revised version changelog:
> > -  add " Wait for 1 vertical blank" after enable audio output port
> > -  configure pipe related transcoder instead of operate all transcoders blindly
> 
> Thanks for the explanation. I'd have still a couple of questions inlined:
> 
> >
> >> +
> >> +     /* Audio output enable */
> >> +     DRM_DEBUG_DRIVER("HDMI audio: enable codec\n");
> >> +     tmp = I915_READ(aud_cntrl_st2);
> >> +     tmp |= (AUDIO_OUTPUT_ENABLE_A | AUDIO_OUTPUT_ENABLE_B |
> >> AUDIO_OUTPUT_ENABLE_C);
> 
> The output bits are also transcoder specific, so why don't we enable
> only the required output?
> I.e. similarly as you do below tmp |= AUDIO_OUTPUT_ENABLE_A << (pipe *
> 4);. Otherwise
> this function will leave also unrelated outputs enabled which is not
> that nice power
> management-wise.

Thanks, makes sense. :)
I left the code without change because as the Audio enable sequence
description, there's no particular requirement to set the bit based on which
transcoder would be used. So i just enable *ALL* transcoders. Anyway your
suggestion makes sense, i should only enable the related transcoder. Wil make
that change in next version.
> 
> >> +     I915_WRITE(aud_cntrl_st2, tmp);
> >> +
> >> +     /* Wait for 1 vertical blank */
> >> +     intel_wait_for_vblank(dev, pipe);
> >> +
> >> +     /* Set ELD valid state */
> >> +     tmp = I915_READ(aud_cntrl_st2);
> >> +     DRM_DEBUG_DRIVER("HDMI audio: pin eld vld status=0x%8x\n", tmp);
> >> +     tmp |= (AUDIO_ELD_VALID_A << (pipe * 4));
> >> +     I915_WRITE(aud_cntrl_st2, tmp);
> >> +     tmp = I915_READ(aud_cntrl_st2);
> >> +     DRM_DEBUG_DRIVER("HDMI audio: eld vld status=0x%8x\n", tmp);
> >> +
> >> +     /* Enable HDMI mode */
> >> +     tmp = I915_READ(aud_config);
> >> +     DRM_DEBUG_DRIVER("HDMI audio: audio conf: 0x%8x\n", tmp);
> >> +     /* clear N_programing_enable and N_value_index */
> >> +     tmp &= ~(AUD_CONFIG_N_VALUE_INDEX |
> >> AUD_CONFIG_N_PROG_ENABLE);
> >> +     I915_WRITE(aud_config, tmp);
> >> +
> >> +     DRM_DEBUG_DRIVER("ELD on pipe %c\n", pipe_name(pipe));
> >> +
> >> +     i = I915_READ(aud_cntl_st);
> >> +     i = (i >> 29) & DIP_PORT_SEL_MASK;              /* DIP_Port_Select, 0x1 =
> >> PortB */
> >> +     if (!i) {
> >> +             DRM_DEBUG_DRIVER("Audio directed to unknown port\n");
> >> +             /* operate blindly on all ports */
> >> +             eldv = AUDIO_ELD_VALID_A;
> >> +             eldv |= AUDIO_ELD_VALID_B;
> >> +             eldv |= AUDIO_ELD_VALID_C;
> >> +     } else {
> >> +             DRM_DEBUG_DRIVER("ELD on port %c\n", 'A' + i);
> >> +             eldv = AUDIO_ELD_VALID_A << ((i - 1) * 4);
> >> +     }
> 
> Again, if we handle the ELD_VALID bits on a transcoder basis, as above
> when enabling and
> disabling it, why are we doing it here differently, on a port basis?

A bit different. These bits[30:29] reflects which port is used to transmit DIP
data. It's configured in other register, see PIPE_DDI_FUNC_CTL, that
determines which DDI port would be combined with current pipe. I think it's
also transcoder basis. please note aud_cntl_st is also "pipe" based.

> This should read then just
> as above eldv = AUDIO_ELD_VALID_A << (pipe * 4);
> 
> As a sidenote I guess at the moment due to the bug you mentioned
> DIP_PORT_SEL will
> always read 0, hence the else branch never runs and we just enable
> blindly all valid bits.
> 
> --Imre



More information about the Intel-gfx mailing list