xref: /OK3568_Linux_fs/kernel/Documentation/sound/hd-audio/dp-mst.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun=======================
2*4882a593SmuzhiyunHD-Audio DP-MST Support
3*4882a593Smuzhiyun=======================
4*4882a593Smuzhiyun
5*4882a593SmuzhiyunTo support DP MST audio, HD Audio hdmi codec driver introduces virtual pin
6*4882a593Smuzhiyunand dynamic pcm assignment.
7*4882a593Smuzhiyun
8*4882a593SmuzhiyunVirtual pin is an extension of per_pin. The most difference of DP MST
9*4882a593Smuzhiyunfrom legacy is that DP MST introduces device entry. Each pin can contain
10*4882a593Smuzhiyunseveral device entries. Each device entry behaves as a pin.
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunAs each pin may contain several device entries and each codec may contain
13*4882a593Smuzhiyunseveral pins, if we use one pcm per per_pin, there will be many PCMs.
14*4882a593SmuzhiyunThe new solution is to create a few PCMs and to dynamically bind pcm to
15*4882a593Smuzhiyunper_pin. Driver uses spec->dyn_pcm_assign flag to indicate whether to use
16*4882a593Smuzhiyunthe new solution.
17*4882a593Smuzhiyun
18*4882a593SmuzhiyunPCM
19*4882a593Smuzhiyun===
20*4882a593SmuzhiyunTo be added
21*4882a593Smuzhiyun
22*4882a593SmuzhiyunPin Initialization
23*4882a593Smuzhiyun==================
24*4882a593SmuzhiyunEach pin may have several device entries (virtual pins). On Intel platform,
25*4882a593Smuzhiyunthe device entries number is dynamically changed. If DP MST hub is connected,
26*4882a593Smuzhiyunit is in DP MST mode, and the device entries number is 3. Otherwise, the
27*4882a593Smuzhiyundevice entries number is 1.
28*4882a593Smuzhiyun
29*4882a593SmuzhiyunTo simplify the implementation, all the device entries will be initialized
30*4882a593Smuzhiyunwhen bootup no matter whether it is in DP MST mode or not.
31*4882a593Smuzhiyun
32*4882a593SmuzhiyunConnection list
33*4882a593Smuzhiyun===============
34*4882a593SmuzhiyunDP MST reuses connection list code. The code can be reused because
35*4882a593Smuzhiyundevice entries on the same pin have the same connection list.
36*4882a593Smuzhiyun
37*4882a593SmuzhiyunThis means DP MST gets the device entry connection list without the
38*4882a593Smuzhiyundevice entry setting.
39*4882a593Smuzhiyun
40*4882a593SmuzhiyunJack
41*4882a593Smuzhiyun====
42*4882a593Smuzhiyun
43*4882a593SmuzhiyunPresume:
44*4882a593Smuzhiyun - MST must be dyn_pcm_assign, and it is acomp (for Intel scenario);
45*4882a593Smuzhiyun - NON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp;
46*4882a593Smuzhiyun
47*4882a593SmuzhiyunSo there are the following scenarios:
48*4882a593Smuzhiyun a. MST (&& dyn_pcm_assign && acomp)
49*4882a593Smuzhiyun b. NON-MST && dyn_pcm_assign && acomp
50*4882a593Smuzhiyun c. NON-MST && !dyn_pcm_assign && !acomp
51*4882a593Smuzhiyun
52*4882a593SmuzhiyunBelow discussion will ignore MST and NON-MST difference as it doesn't
53*4882a593Smuzhiyunimpact on jack handling too much.
54*4882a593Smuzhiyun
55*4882a593SmuzhiyunDriver uses struct hdmi_pcm pcm[] array in hdmi_spec and snd_jack is
56*4882a593Smuzhiyuna member of hdmi_pcm. Each pin has one struct hdmi_pcm * pcm pointer.
57*4882a593Smuzhiyun
58*4882a593SmuzhiyunFor !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically.
59*4882a593Smuzhiyun
60*4882a593SmuzhiyunFor dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n]
61*4882a593Smuzhiyunwhen monitor is hotplugged.
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun
64*4882a593SmuzhiyunBuild Jack
65*4882a593Smuzhiyun----------
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun- dyn_pcm_assign
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun  Will not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly.
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun- !dyn_pcm_assign
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun  Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically.
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun
76*4882a593SmuzhiyunUnsolicited Event Enabling
77*4882a593Smuzhiyun--------------------------
78*4882a593SmuzhiyunEnable unsolicited event if !acomp.
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun
81*4882a593SmuzhiyunMonitor Hotplug Event Handling
82*4882a593Smuzhiyun------------------------------
83*4882a593Smuzhiyun- acomp
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun  pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() ->
86*4882a593Smuzhiyun  sync_eld_via_acomp().
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun  Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for
89*4882a593Smuzhiyun  both dyn_pcm_assign and !dyn_pcm_assign
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun- !acomp
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun  hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() ->
94*4882a593Smuzhiyun  hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun  Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign.
97*4882a593Smuzhiyun  Use hda_jack mechanism to handle jack events.
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun
100*4882a593SmuzhiyunOthers to be added later
101*4882a593Smuzhiyun========================
102