[alsa-devel] [RFC PATCH 4/5] drm: i915: add DisplayPort amp unmute for LPE audio mode

Jani Nikula jani.nikula at linux.intel.com
Fri Jan 27 14:51:34 CET 2017


On Fri, 27 Jan 2017, Ville Syrjälä <ville.syrjala at linux.intel.com> wrote:
> On Fri, Jan 27, 2017 at 12:08:58PM +0200, Jani Nikula wrote:
>> On Thu, 26 Jan 2017, Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com> wrote:
>> > Enable chicken bit on LPE mode setup and unmute amp on
>> > notification
>> >
>> > FIXME: should these two phases done somewhere else?
>> >
>> > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
>> > ---
>> >  drivers/gpu/drm/i915/i915_reg.h        | 12 ++++++++++++
>> >  drivers/gpu/drm/i915/intel_lpe_audio.c | 27 +++++++++++++++++++++++++++
>> >  2 files changed, 39 insertions(+)
>> >
>> > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
>> > index a9ffc8d..ee90f64 100644
>> > --- a/drivers/gpu/drm/i915/i915_reg.h
>> > +++ b/drivers/gpu/drm/i915/i915_reg.h
>> > @@ -2061,6 +2061,18 @@ enum skl_disp_power_wells {
>> >  #define I915_HDMI_LPE_AUDIO_BASE	(VLV_DISPLAY_BASE + 0x65000)
>> >  #define I915_HDMI_LPE_AUDIO_SIZE	0x1000
>> >  
>> > +/* DisplayPort Audio w/ LPE */
>> > +#define CHICKEN_BIT_DBG_ENABLE		(1 << 0)
>> > +#define AMP_UNMUTE		        (1 << 1)
>
> That should be called AMP_MUTE I think,
>
>> 
>> The convention is to define registers first and the contents/bits for
>> each register immedialy below. For groups of registers (like
>> PORT_EN_B/C/D below) define all registers first and bits immediately
>> below. (But note that the chicken register is not part of the group.)
>> 
>> > +#define AUD_CHICKEN_BIT_REG		0x62F38
>
> Spec calls this AUD_CHICKENBIT_REG. Might as well follow it to the
> letter.
>
>> > +#define AUD_PORT_EN_B_DBG		0x62F20
>> > +#define AUD_PORT_EN_C_DBG		0x62F28
>> > +#define AUD_PORT_EN_D_DBG		0x62F2C
>
> These match the spec. But to match the standard i915 convention they
> should be called _AUD_PORT_EN_B_DBG etc. Same forthe chicken bit
> register.
>
>> 
>> Please don't define these separately without the display base, use
>> (VLV_DISPLAY_BASE + 0x62f38) style instead. All the other uses of
>> VLV_DISPLAY_BASE in the file follow the same convention.
>> 
>> > +#define VLV_AUD_CHICKEN_BIT_REG		_MMIO(VLV_DISPLAY_BASE + AUD_CHICKEN_BIT_REG)
>> > +#define VLV_AUD_PORT_EN_B_DBG		_MMIO(VLV_DISPLAY_BASE + AUD_PORT_EN_B_DBG)
>> > +#define VLV_AUD_PORT_EN_C_DBG		_MMIO(VLV_DISPLAY_BASE + AUD_PORT_EN_C_DBG)
>> > +#define VLV_AUD_PORT_EN_D_DBG		_MMIO(VLV_DISPLAY_BASE + AUD_PORT_EN_D_DBG)
>> > +
>> 
>> Would be nice to have a macro VLV_AUD_PORT_EN_DBG(port), but damn those
>> reg offsets don't make it easy...
>
> _MMIO_PORT3().

Works for ports A, B, C, but here we have ports B, C, D.

BR,
Jani.


>
>> 
>> 
>> >  #define GEN6_BSD_RNCID			_MMIO(0x12198)
>> >  
>> >  #define GEN7_FF_THREAD_MODE		_MMIO(0x20a0)
>> > diff --git a/drivers/gpu/drm/i915/intel_lpe_audio.c b/drivers/gpu/drm/i915/intel_lpe_audio.c
>> > index 245523e..b3134ef 100644
>> > --- a/drivers/gpu/drm/i915/intel_lpe_audio.c
>> > +++ b/drivers/gpu/drm/i915/intel_lpe_audio.c
>> > @@ -248,6 +248,15 @@ static int lpe_audio_setup(struct drm_i915_private *dev_priv)
>> >  		goto err_free_irq;
>> >  	}
>> >  
>> > +	/* Enable DPAudio debug bits by default */
>> > +	if (IS_CHERRYVIEW(dev_priv)) {
>
> VLV too. And like I said we might need this in the powerwell code as
> well. You should make a test to see if the register value is retained
> across the display power well being turned off. Eg. simply disable all
> displays, check the log to make sure it really did turn off the display
> power well, then re-enable some displays, and finally check if the
> register value was retained or not).
>
>> > +		u32 chicken_bit;
>> > +
>> > +		chicken_bit = I915_READ(VLV_AUD_CHICKEN_BIT_REG);
>> > +		I915_WRITE(VLV_AUD_CHICKEN_BIT_REG,
>> > +			   chicken_bit | CHICKEN_BIT_DBG_ENABLE);
>> > +	}
>> > +
>> >  	return 0;
>> >  err_free_irq:
>> >  	irq_free_desc(dev_priv->lpe_audio.irq);
>> > @@ -357,6 +366,24 @@ void intel_lpe_audio_notify(struct drm_i915_private *dev_priv,
>> >  			pdata->tmds_clock_speed = tmds_clk_speed;
>> >  		if (link_rate)
>> >  			pdata->link_rate = link_rate;
>> > +
>> > +		if (dp_output) { /* unmute the amp */
>
> The spec doesn't distinquish DP vs. HDMI here. So I presume we should be
> able to do this always.
>
> And I think we might want to mute things again when disabling audio.
>
>> > +			u32 audio_enable;
>> > +
>> > +			if (port == PORT_B) {
>> > +				audio_enable = I915_READ(VLV_AUD_PORT_EN_B_DBG);
>> > +				I915_WRITE(VLV_AUD_PORT_EN_B_DBG,
>> > +					   audio_enable & ~AMP_UNMUTE);
>> > +			} else if (port == PORT_C) {
>> > +				audio_enable = I915_READ(VLV_AUD_PORT_EN_C_DBG);
>> > +				I915_WRITE(VLV_AUD_PORT_EN_C_DBG,
>> > +					   audio_enable & ~AMP_UNMUTE);
>> > +			} else if (port == PORT_D) {
>> > +				audio_enable = I915_READ(VLV_AUD_PORT_EN_D_DBG);
>> > +				I915_WRITE(VLV_AUD_PORT_EN_D_DBG,
>> > +					   audio_enable & ~AMP_UNMUTE);
>> > +			}
>> > +		}
>> >  	} else {
>> >  		memset(pdata->eld.eld_data, 0,
>> >  			HDMI_MAX_ELD_BYTES);
>> 
>> -- 
>> Jani Nikula, Intel Open Source Technology Center

-- 
Jani Nikula, Intel Open Source Technology Center


More information about the Alsa-devel mailing list