[RESEND PATCH v2] drm/bridge: dw-hdmi-i2s: set insert_pcuv bit if hardware supports it

Geraldo Nascimento geraldogabriel at gmail.com
Mon Oct 31 21:06:57 UTC 2022


On Mon, Oct 31, 2022 at 09:20:36AM +0100, Neil Armstrong wrote:
> Hi,
>

Hi Neil and thanks for caring.

> 
> On 17/10/2022 14:04, Geraldo Nascimento wrote:
> > Hi Mark, resending this as it failed to apply in my last submission. Added
> > Neil Armstrong to Cc: as hopefully he will be able to better review this.
> > 
> > Thanks,
> > Geraldo Nascimento
> > 
> > ---
> > 
> > Starting with version 2.10a of Synopsys DesignWare HDMI controller the
> > insert_pcuv bit was introduced. On RK3399pro SoM (Radxa Rock Pi N10),
> > for example, if we neglect to set this bit and proceed to enable hdmi_sound
> > and i2s2 on the device tree there will be extreme clipping of sound
> > output, to the point that music sounds like white noise. Problem
> > could also manifest as just mild cracking depending of HDMI audio
> > implementation of sink. Setting insert_pcuv bit (bit 2 of
> > aud_conf2 Audio Sample register) fixes this.
> 
> 
> I did some research and this insert_pcuv is already present in the 1.40a version
> of the dw-hdmi databook, so I wonder why suddenly this is needed.

Like I told you, I was unaware of this fact, but I have a hunch this bit
was being set to 1 as default before the 2.10a version of dw-hdmi. It
remains to be checked, I see you added Christian Hewitt to the Cc:,
maybe he can use i2cdump or printk() on older Rockchip  hardware, the
Radxa Rock Pi N10 is the only thing from Rockchip I own.

> 
> The insert_pcuv is documented as:
> -------------------------------------------------------
> When set (1'b1), it enables the insertion of the PCUV (Parity, Channel Status, User
> bit and Validity) bits on the incoming audio stream (support limited to Linear PCM
> audio).
> If disabled, the incomming audio stream must contain the PCUV bits, mapped
> acording to 2.6.4.2 Data Mapping Examples
> --------------------------------------------------------
> 
> 
> What's interesting is this register is only present if thre DW-HDMI IP is configured
> as GPAUD or GDOUBLE, meaning it must have GPAUD enabled. So it has
> something to do with it, so what's value of it when GPAUD isn't present in the IP ?

Would you like me to inject some printk() or dump some memory value
with i2cdump? I'm not sure I follow you because you obviously know much
more about this driver than me, but if you could elaborate a bit I'd be
happy to provide some answers.

> 
> And HDMI2 spec added this, even PCVU were required before:
> --------------------------------------------------------
> Note that PCUV refers to the parity bit (P), channel status (C), user data (U), and validity bit (V) as defined in IEC
> 60958-1.
> --------------------------------------------------------
> 
> So it has something to do with IEC60958-1 stream format, do maybe this
> insert_pcuv should only be enforced when the input stream is _not_ IEC60958-1 ?

Yes, the HDMI2 spec requires PCUV audio bits, and they borrow the idea
from IEC 60958-1 (Digital Audio Interface - DAI), but insert_pcuv definitely
needs to be set for newer Synopsys Designware HDMI hardware when we're
talking about Linear PCM - that's what my patch attempts to address.

Thanks,
Geraldo Nascimento

> 
> Neil
> 
> > 
> > Signed-off-by: Geraldo Nascimento <geraldogabriel at gmail.com>
> > 
> > ---
> > 
> > v1->v2: SoC->SoM on description, better commenting, minor style changes,
> > 	conditional application of fix for L-PCM only
> > 
> > --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio-20221017.c
> > +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio-20221017.c
> > @@ -42,6 +42,7 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data,
> >   	struct dw_hdmi *hdmi = audio->hdmi;
> >   	u8 conf0 = 0;
> >   	u8 conf1 = 0;
> > +	u8 conf2 = 0;
> >   	u8 inputclkfs = 0;
> >   
> >   	/* it cares I2S only */
> > @@ -101,6 +102,28 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data,
> >   		return -EINVAL;
> >   	}
> >   
> > +	/*
> > +	 * dw-hdmi introduced insert_pcuv bit in
> > +	 * version 2.10a.
> > +	 *
> > +	 * This single bit (bit 2 of HDMI_AUD_CONF2)
> > +	 * when set to 1 will enable the insertion of the PCUV
> > +	 * (Parity, Channel Status, User bit and Validity)
> > +	 * bits on the incoming audio stream.
> > +	 *
> > +	 * Support is limited to Linear PCM audio. If
> > +	 * neglected, the lack of valid PCUV bits
> > +	 * on L-PCM streams will cause anything from
> > +	 * mild cracking to full blown extreme
> > +	 * clipping depending on the HDMI audio
> > +	 * implementation of the sink.
> > +	 *
> > +	 */
> > +
> > +	if (hdmi_read(audio, HDMI_DESIGN_ID) >= 0x21 &&
> > +			!(hparms->iec.status[0] & IEC958_AES0_NONAUDIO))
> > +		conf2 = HDMI_AUD_CONF2_INSERT_PCUV;
> > +
> >   	dw_hdmi_set_sample_rate(hdmi, hparms->sample_rate);
> >   	dw_hdmi_set_channel_status(hdmi, hparms->iec.status);
> >   	dw_hdmi_set_channel_count(hdmi, hparms->channels);
> > @@ -109,6 +120,7 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data,
> >   	hdmi_write(audio, inputclkfs, HDMI_AUD_INPUTCLKFS);
> >   	hdmi_write(audio, conf0, HDMI_AUD_CONF0);
> >   	hdmi_write(audio, conf1, HDMI_AUD_CONF1);
> > +	hdmi_write(audio, conf2, HDMI_AUD_CONF2);
> >   
> >   	return 0;
> >   }
> > --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-20221017.h
> > +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-20221017.h
> > @@ -931,6 +931,11 @@ enum {
> >   	HDMI_AUD_CONF1_WIDTH_16 = 0x10,
> >   	HDMI_AUD_CONF1_WIDTH_24 = 0x18,
> >   
> > +/* AUD_CONF2 field values */
> > +	HDMI_AUD_CONF2_HBR = 0x01,
> > +	HDMI_AUD_CONF2_NLPCM = 0x02,
> > +	HDMI_AUD_CONF2_INSERT_PCUV = 0x04,
> > +
> >   /* AUD_CTS3 field values */
> >   	HDMI_AUD_CTS3_N_SHIFT_OFFSET = 5,
> >   	HDMI_AUD_CTS3_N_SHIFT_MASK = 0xe0,
> 


More information about the dri-devel mailing list