[alsa-devel] [ANNOUNCE] patch for INTEL HDMI codec

Wu, Fengguang fengguang.wu at intel.com
Tue Oct 28 10:50:16 CET 2008


On Tue, Oct 28, 2008 at 02:01:08AM -0700, Takashi Iwai wrote:
> At Tue, 28 Oct 2008 16:07:39 +0800,
> Wu Fengguang wrote:
> > 
> > Hello,
> > 
> > We have recently enabled sound output for Intel HDMI codecs,
> > and would like to share the good news and some early code :-)
> 
> Great!
> 
> > The audio enabling code includes both ALSA and X.Org patches.
> > Attached is one single patch against today's sound-2.6 tree.
> > It contains very basic code for handling
> >         - audio infoframe
> >         - ELD(E-EDID Like Data)
> >         - unsolicited response
> > 
> > The patch is full enough to produce stereo sound via HDMI.
> > But it still lacks features and contains many 'defined but unused' staffs.
> 
> Yeah I see.
> 
> > It was tested OK on ASUS P5E-VM board and HP 2230s notebook.
> > It _should_ also work on Intel DG45ID board.
> 
> Does the ALSA patch work alone without changes in x.org side?

- P5E-VM:   works in console, ALSA patch is enough
- HP 2230s: needs intel video driver to produce sound at all

- DG45ID:   (if I remember it right)
  - produces noise in console since booting(this is why I call
    hdmi_disable_output() in intel_hdmi_init(), will comment this case)
  - sound OK both with vesa/intel video drivers

> > Takashi, I can prepare a trimmed-down patch series, in doing so I'd like
> > to know if you are interested in the basic DIP/ELD/UNSOL routines?
> 
> Yes.  I wanted to write it by myself, but forgot for long time since
> I have no HDMI hardware for testing :)
> Good to see someone finally adding it!

Yeah, hardware is critical.
To do this work, we collected several HDMI boxes and monitors :-)

> > Or should I only submit bare code comparable to the current patch_atihdmi.c?
> 
> If the codec is supposed to be (almost) compatible, it'd be a good
> idea.  Otherwise (if you are uncertain), we can keep it separated as
> your original patch.  I don't mind much about it.

OK. The main logic for ati/nv/intel HDMI codecs should be the same,
except some possible quirks.  One fact is, we migrated SiI1392 HDMI
support from patch_atihdmi.c to patch_intelhdmi.c to make it work for
our P5E-VM board.

> And, maybe we'll need to move EDID handling to the common place,
> anyway.

Yes. But what if the intel driver evolve/expand fast enough to be the
one real driver for HDMI/Display Port codecs? ;-)

> 
> > 
> > PS: the patch can now produce the following ELD information:
> > 
> > [10340.656719] eldv = 1, pinp = 1
> > [10340.660711] ELD buffer size  is 64
> > [10340.660716] ELD baseline len is 10*4
> > [10340.660720] vendor block len is 20
> > [10340.660724] ELD version      is CEA-861D or below
> > [10340.660728] CEA-EDID version is CEA-861-B, C or D
> > [10340.660732] manufacture name is 0x4544
> > [10340.660736] product code     is 0xa02c
> > [10340.660740] port id          is 0x0
> > [10340.660743] HDCP support     is 0
> > [10340.660747] AI support       is 0
> > [10340.660751] SAD count        is 0
> > [10340.660754] audio sync delay is 0
> > [10340.660758] connection type  is HDMI
> > [10340.660763] speaker allocations:
> > [10340.660766] monitor name     is DELL 2408WFP
> 
> Looks good.

I think those kernel messages would be valuable informations for both
developers and end users. Such information are also good candidates
for sysfs(or procfs) exports, I guess.

> 
> > --- /dev/null
> > +++ sound-2.6/sound/pci/hda/patch_intelhdmi.c
> (snip)
> > +struct ELD_fixed_fields {
> > +	__u8 rsv_0		:3;
> > +	__u8 ELD_ver		:5;
> 
> We should avoid bitfields if it's used for communication with the
> hardware in general for portability reason.  Simply take it as bytes,
> and use normal bit shift ops.

This structure is for communication with intel's video driver.
ie. intel video driver reuses that struct for filling the ELD buffer,
so I think it should be OK.

> 
> Also, no reason to use "__" prefix there.

OK.

> > +static void hdmi_debug_slot_mapping(struct hda_codec *codec)
> > +{
> > +#ifdef CONFIG_SND_DEBUG
> 
> I'd use CONFIG_SND_DEBUG_VERBOSE here.  Most distros turn on
> CONFIG_SND_DEBUG=y, and this will be annoying.

Will use it - it wasn't only because I cannot find the _VERBOSE
version at the time ;-)

> > +	int i;
> > +	int slot;
> > +
> > +	for (i = 0; i < 8; i++) {
> > +		slot = snd_hda_codec_read(codec, CVT_NID, 0,
> > +						AC_VERB_GET_HDMI_CHAN_SLOT, i);
> > +		printk(KERN_DEBUG "ASP channel %d => slot %d\n",
> > +				slot >> 4, slot & 0x7);
> > +	}
> > +#endif
> > +}
> > +static void hdmi_debug_present_sense(struct hda_codec *codec)
> > +{
> > +#ifdef CONFIG_SND_DEBUG
> 
> Ditto.
> 
> > +static int hdmi_get_eldd(struct hda_codec *codec, char **eldd)
> > +{
> > +	int i;
> > +	int size;
> > +	char *buf;
> > +
> > +	i = hdmi_present_sense(codec) & AC_PINSENSE_ELDV;
> > +	if (!i)
> > +		return 0;
> > +
> > +	size = snd_hda_codec_read(codec, PIN_NID, 0, AC_VERB_GET_HDMI_DIP_SIZE,
> > +						     AC_DIPSIZE_ELD_BUF);
> > +	if (size == 0) {
> > +		/* wfg: workaround for ASUS P5E-VM HDMI board */
> > +		snd_printk(KERN_INFO "ELD buf size is 0, force 64\n");
> > +		size = 64;
> > +	}
> > +	if (size < sizeof(struct ELD_fixed_fields)) {
> > +		snd_printk(KERN_WARNING "Invalid ELD buf size %d\n", size);
> > +		return 0;
> > +	}
> > +	WARN_ON(size > PAGE_SIZE);
> 
> Better to check more explicity and show the value in the error
> message, and restrict the size.

Good idea!

> > +static void hdmi_parse_short_audio_desc(struct ELD_SAD *a)
> > +{
> > +	};
> 
> Unnecessary semicolon.

Good catch, fixed.

> > --- sound-2.6.orig/sound/pci/hda/hda_intel.c
> > +++ sound-2.6/sound/pci/hda/hda_intel.c
> > @@ -1196,7 +1196,7 @@ static unsigned int azx_max_codecs[AZX_N
> >   * report wrongly the non-existing 4th slot availability
> >   */
> >  static unsigned int azx_default_codecs[AZX_NUM_DRIVERS] __devinitdata = {
> > -	[AZX_DRIVER_ICH] = 3,
> > +	[AZX_DRIVER_ICH] = 4,
> >  	[AZX_DRIVER_ATI] = 3,
> 
> Well, this change should be done in a separate patch.

OK, it's a temp solution - I read about the same patch from you in
latest linux-2.6 tree :-)

> I guess your hardware has the HDMI code on the 4th slot, and the audio
> codec on other?

It's required for DG45ID, however I no longer have access to it now :-(

> This number 3 was basically to avoid lock-up by a wrong detection on
> some hardwares such as thinkpad X60 with some old BIOS.  I remember
> there were others, too.
> 
> I guess, however, this workaround is no longer necessary because we
> clear the slot bits beforehand properly.  If any, a user can add
> probe_mask option manually, and we can put it in the blacklist.
> 
> So, I'd say, let's remove this azx_default_codecs[] stuff completely
> now.

Agreed, I wondered why probe_mask and max limits exist side by side...

Thank you,
Fengguang



More information about the Alsa-devel mailing list