forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.0 KiB
101 lines
3.0 KiB
======================= |
|
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 |
|
========================
|
|
|