1 ======================= 1 ======================= 2 HD-Audio DP-MST Support 2 HD-Audio DP-MST Support 3 ======================= 3 ======================= 4 4 5 To support DP MST audio, HD Audio hdmi codec d 5 To support DP MST audio, HD Audio hdmi codec driver introduces virtual pin 6 and dynamic pcm assignment. 6 and dynamic pcm assignment. 7 7 8 Virtual pin is an extension of per_pin. The mo 8 Virtual pin is an extension of per_pin. The most difference of DP MST 9 from legacy is that DP MST introduces device e 9 from legacy is that DP MST introduces device entry. Each pin can contain 10 several device entries. Each device entry beha 10 several device entries. Each device entry behaves as a pin. 11 11 12 As each pin may contain several device entries 12 As each pin may contain several device entries and each codec may contain 13 several pins, if we use one pcm per per_pin, t 13 several pins, if we use one pcm per per_pin, there will be many PCMs. 14 The new solution is to create a few PCMs and t 14 The new solution is to create a few PCMs and to dynamically bind pcm to 15 per_pin. Driver uses spec->dyn_pcm_assign flag 15 per_pin. Driver uses spec->dyn_pcm_assign flag to indicate whether to use 16 the new solution. 16 the new solution. 17 17 18 PCM 18 PCM 19 === 19 === 20 To be added 20 To be added 21 21 22 Pin Initialization << 23 ================== << 24 Each pin may have several device entries (virt << 25 the device entries number is dynamically chang << 26 it is in DP MST mode, and the device entries n << 27 device entries number is 1. << 28 << 29 To simplify the implementation, all the device << 30 when bootup no matter whether it is in DP MST << 31 << 32 Connection list << 33 =============== << 34 DP MST reuses connection list code. The code c << 35 device entries on the same pin have the same c << 36 << 37 This means DP MST gets the device entry connec << 38 device entry setting. << 39 22 40 Jack 23 Jack 41 ==== 24 ==== 42 25 43 Presume: 26 Presume: 44 - MST must be dyn_pcm_assign, and it is acomp 27 - MST must be dyn_pcm_assign, and it is acomp (for Intel scenario); 45 - NON-MST may or may not be dyn_pcm_assign, i 28 - NON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp; 46 29 47 So there are the following scenarios: 30 So there are the following scenarios: 48 a. MST (&& dyn_pcm_assign && acomp) 31 a. MST (&& dyn_pcm_assign && acomp) 49 b. NON-MST && dyn_pcm_assign && acomp 32 b. NON-MST && dyn_pcm_assign && acomp 50 c. NON-MST && !dyn_pcm_assign && !acomp 33 c. NON-MST && !dyn_pcm_assign && !acomp 51 34 52 Below discussion will ignore MST and NON-MST d 35 Below discussion will ignore MST and NON-MST difference as it doesn't 53 impact on jack handling too much. 36 impact on jack handling too much. 54 37 55 Driver uses struct hdmi_pcm pcm[] array in hdm 38 Driver uses struct hdmi_pcm pcm[] array in hdmi_spec and snd_jack is 56 a member of hdmi_pcm. Each pin has one struct 39 a member of hdmi_pcm. Each pin has one struct hdmi_pcm * pcm pointer. 57 40 58 For !dyn_pcm_assign, per_pin->pcm will assigne 41 For !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically. 59 42 60 For dyn_pcm_assign, per_pin->pcm will assigned 43 For dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] 61 when monitor is hotplugged. 44 when monitor is hotplugged. 62 45 63 46 64 Build Jack 47 Build Jack 65 ---------- 48 ---------- 66 49 67 - dyn_pcm_assign 50 - dyn_pcm_assign 68 51 69 Will not use hda_jack but use snd_jack in sp 52 Will not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly. 70 53 71 - !dyn_pcm_assign 54 - !dyn_pcm_assign 72 55 73 Use hda_jack and assign spec->pcm_rec[pcm_id 56 Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically. 74 57 75 58 76 Unsolicited Event Enabling 59 Unsolicited Event Enabling 77 -------------------------- 60 -------------------------- 78 Enable unsolicited event if !acomp. 61 Enable unsolicited event if !acomp. 79 62 80 63 81 Monitor Hotplug Event Handling 64 Monitor Hotplug Event Handling 82 ------------------------------ 65 ------------------------------ 83 - acomp 66 - acomp 84 67 85 pin_eld_notify() -> check_presence_and_repor 68 pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() -> 86 sync_eld_via_acomp(). 69 sync_eld_via_acomp(). 87 70 88 Use directly snd_jack_report() on spec->pcm_ 71 Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for 89 both dyn_pcm_assign and !dyn_pcm_assign 72 both dyn_pcm_assign and !dyn_pcm_assign 90 73 91 - !acomp 74 - !acomp 92 75 93 hdmi_unsol_event() -> hdmi_intrinsic_event() 76 hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() -> 94 hdmi_present_sense() -> hdmi_prepsent_sense_ 77 hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs() 95 78 96 Use directly snd_jack_report() on spec->pcm_ 79 Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign. 97 Use hda_jack mechanism to handle jack events 80 Use hda_jack mechanism to handle jack events. 98 81 99 82 100 Others to be added later 83 Others to be added later 101 ======================== 84 ========================
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.