[alsa-devel] HDMI codec, way forward?

Takashi Iwai tiwai at suse.de
Wed Oct 21 16:37:07 CEST 2015


On Wed, 21 Oct 2015 16:10:31 +0200,
Takashi Iwai wrote:
> 
> On Wed, 21 Oct 2015 16:03:07 +0200,
> Russell King - ARM Linux wrote:
> > 
> > On Wed, Oct 21, 2015 at 03:41:44PM +0200, Takashi Iwai wrote:
> > > On Wed, 21 Oct 2015 11:27:44 +0200,
> > > Russell King - ARM Linux wrote:
> > > > 
> > > > On Tue, Oct 20, 2015 at 07:31:48PM +0530, Vinod Koul wrote:
> > > > > On Tue, Oct 20, 2015 at 09:08:00AM +0100, Russell King - ARM Linux wrote:
> > > > > > > > Currently i915/audio component works as you described.  The audio is
> > > > > > > > optional and HDMI graphics works without audio, while HDMI HD-audio
> > > > > > > > mandates i915 graphics.
> > > > > > > 
> > > > > > > Right, but we also add additional interface on top of this to allow
> > > > > > > things like ensuring display is on when audio wants to run and now
> > > > > > > notification for events.
> > > > > > > 
> > > > > > > I don't see a reason why this can be used as single interface to bind as
> > > > > > > well as talk to display from various components, unless I missed obvious
> > > > > > > which prevent us from doing this in non i915 cases...
> > > > > > 
> > > > > > Maybe I can comment more specifically if I saw the code.  Right now all
> > > > > > I'm aware of is this idea without any code, and I don't like it.
> > > > > 
> > > > > Ok, i will be post my patches tomorrow. FWIW uses interface in
> > > > > sound/hda/hdac_i915.c for display power up/down
> > > > 
> > > > This:
> > > > 
> > > >         component_match_add(dev, &match, hdac_component_master_match, bus);
> > > >         ret = component_master_add_with_match(dev, &hdac_component_master_ops,
> > > >                                               match);
> > > >         if (ret < 0)
> > > >                 goto out_err;
> > > > 
> > > >         /*
> > > >          * Atm, we don't support deferring the component binding, so make sure
> > > >          * i915 is loaded and that the binding successfully completes.
> > > >          */
> > > >         request_module("i915");
> > > > 
> > > >         if (!acomp->ops) {
> > > >                 ret = -ENODEV;
> > > >                 goto out_master_del;
> > > >         }
> > > > 
> > > > is really not nice.
> > > 
> > > Yeah, admittedly it's a really ugly workaround.  It's coded in that
> > > way just to make our lives easier: it works well in most cases for
> > > i915 / hd-audio.
> > > 
> > > Actually, it's easy to modify the hda code in the right way, i.e. to
> > > defer via component bind ops.  However, one drawback is that it's not
> > > trivial to handle the fallback case; namely, HD-audio might not need
> > > i915 binding, depending on the chip model and the configuration.
> > > 
> > > Braswell and Skylake have a (virtually) single audio controller as
> > > default, and this manages both the analog and HDMI/DP codecs.  The
> > > i915 interaction is required only for the latter codecs, and thus for
> > > the former, it's optional.  If we defer binding, the instantiation
> > > won't happen unless it's bound with i915.  So, if i915 isn't
> > > initialized (e.g. by booting with nomodeset option), the whole audio
> > > will be gone, too.  OTOH, Haswell and Braswell have a dedicated HDA
> > > controller for HDMI/DP, and they must be disabled (or fail) unless
> > > bound with graphics.
> > > 
> > > It's a corner case, so we might better ignore this.  But it'd be
> > > certainly a "regression" -- at least, I used to test this in that way
> > > sometimes in the past.  So it remains in the current way as is.
> > > 
> > > It's one of the reasons I mentioned it being a stop gap.  But, I think
> > > the concept, passing ops via component, is actually working, and
> > > should be applicable to other drm/audio drivers.  That's the point.
> > 
> > It's only the point if you can code it up properly, which from what I
> > read in that file, it isn't.
> 
> An idea can fly without coding, too :)
> 
> > Build the i915 DRM drivers as a module, load up the system, and then
> > try removing the i915 DRM module and see what happens to the audio part.
> > For starters, you have no protection what so ever against acomp->ops or
> > acomp->dev becoming NULL - it's hellishly racy.
> 
> Yes, very likely.
> 
> > Secondly, you reject the initialisation if acomp->ops isn't set, but you
> > allow acomp->ops to later become unset by the i915 DRM module being
> > removed.  If you can cope with acomp->ops being unset at a random point
> > during the audio driver's use, why can't you cope with it being set at
> > some random point later?
> 
> Setting/unsetting on the fly would be picky because the code does
> refcounting.  Maybe an easier option is to inc/dec module usage
> count appropriately in use.

... and actually we pin at master bind:

static int hdac_component_master_bind(struct device *dev)
{
.....
	/*
	 * Atm, we don't support dynamic unbinding initiated by the child
	 * component, so pin its containing module until we unbind.
	 */
	if (!try_module_get(acomp->ops->owner)) {

so unloading i915 module won't happen (but other method for unbinding
still possible).


Takashi


More information about the Alsa-devel mailing list