123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- =======================
- HD-Audio DP-MST Support
- =======================
- To support DP MST audio, HD Audio hdmi codec driver introduces virtual pin
- and dynamic pcm assignment.
- Virtual pin is an extension of per_pin. The most difference of DP MST
- from legacy is that DP MST introduces device entry. Each pin can contain
- several device entries. Each device entry behaves as a pin.
- As each pin may contain several device entries and each codec may contain
- several pins, if we use one pcm per per_pin, there will be many PCMs.
- The new solution is to create a few PCMs and to dynamically bind pcm to
- per_pin. Driver uses spec->dyn_pcm_assign flag to indicate whether to use
- the new solution.
- PCM
- ===
- To be added
- Pin Initialization
- ==================
- Each pin may have several device entries (virtual pins). On Intel platform,
- the device entries number is dynamically changed. If DP MST hub is connected,
- it is in DP MST mode, and the device entries number is 3. Otherwise, the
- device entries number is 1.
- To simplify the implementation, all the device entries will be initialized
- when bootup no matter whether it is in DP MST mode or not.
- Connection list
- ===============
- DP MST reuses connection list code. The code can be reused because
- device entries on the same pin have the same connection list.
- This means DP MST gets the device entry connection list without the
- device entry setting.
- Jack
- ====
- Presume:
- - MST must be dyn_pcm_assign, and it is acomp (for Intel scenario);
- - NON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp;
- So there are the following scenarios:
- a. MST (&& dyn_pcm_assign && acomp)
- b. NON-MST && dyn_pcm_assign && acomp
- c. NON-MST && !dyn_pcm_assign && !acomp
- Below discussion will ignore MST and NON-MST difference as it doesn't
- impact on jack handling too much.
- Driver uses struct hdmi_pcm pcm[] array in hdmi_spec and snd_jack is
- a member of hdmi_pcm. Each pin has one struct hdmi_pcm * pcm pointer.
- For !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically.
- For dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n]
- when monitor is hotplugged.
- Build Jack
- ----------
- - dyn_pcm_assign
- Will not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly.
- - !dyn_pcm_assign
- Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically.
- Unsolicited Event Enabling
- --------------------------
- Enable unsolicited event if !acomp.
- Monitor Hotplug Event Handling
- ------------------------------
- - acomp
- pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() ->
- sync_eld_via_acomp().
- Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for
- both dyn_pcm_assign and !dyn_pcm_assign
- - !acomp
- hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() ->
- hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()
- Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign.
- Use hda_jack mechanism to handle jack events.
- Others to be added later
- ========================
|