€•AŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ)/translations/zh_CN/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/zh_TW/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/it_IT/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/ja_JP/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/ko_KR/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/sp_SP/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒHD-Audio DP-MST Support”h]”hŒHD-Audio DP-MST Support”…””}”(hh¨hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hh£hžhhŸŒC/var/lib/git/docbuild/linux/Documentation/sound/hd-audio/dp-mst.rst”h KubhŒ paragraph”“”)”}”(hŒfTo support DP MST audio, HD Audio hdmi codec driver introduces virtual pin and dynamic pcm assignment.”h]”hŒfTo support DP MST audio, HD Audio hdmi codec driver introduces virtual pin and dynamic pcm assignment.”…””}”(hh¹hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khh£hžhubh¸)”}”(hŒÊ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.”h]”hŒÊ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.”…””}”(hhÇhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khh£hžhubh¸)”}”(hX3As 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.”h]”hX3As 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.”…””}”(hhÕhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K hh£hžhubh¢)”}”(hhh]”(h§)”}”(hŒPCM”h]”hŒPCM”…””}”(hhæhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hhãhžhhŸh¶h Kubh¸)”}”(hŒ To be added”h]”hŒ To be added”…””}”(hhôhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khhãhžhubeh}”(h]”Œpcm”ah ]”h"]”Œpcm”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Kubh¢)”}”(hhh]”(h§)”}”(hŒPin Initialization”h]”hŒPin Initialization”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj hžhhŸh¶h Kubh¸)”}”(hŒþ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.”h]”hŒþ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.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj hžhubh¸)”}”(hŒ…To simplify the implementation, all the device entries will be initialized when bootup no matter whether it is in DP MST mode or not.”h]”hŒ…To simplify the implementation, all the device entries will be initialized when bootup no matter whether it is in DP MST mode or not.”…””}”(hj)hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj hžhubeh}”(h]”Œpin-initialization”ah ]”h"]”Œpin initialization”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Kubh¢)”}”(hhh]”(h§)”}”(hŒConnection list”h]”hŒConnection list”…””}”(hjBhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj?hžhhŸh¶h K!ubh¸)”}”(hŒ€DP MST reuses connection list code. The code can be reused because device entries on the same pin have the same connection list.”h]”hŒ€DP MST reuses connection list code. The code can be reused because device entries on the same pin have the same connection list.”…””}”(hjPhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K"hj?hžhubh¸)”}”(hŒYThis means DP MST gets the device entry connection list without the device entry setting.”h]”hŒYThis means DP MST gets the device entry connection list without the device entry setting.”…””}”(hj^hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K%hj?hžhubeh}”(h]”Œconnection-list”ah ]”h"]”Œconnection list”ah$]”h&]”uh1h¡hh£hžhhŸh¶h K!ubh¢)”}”(hhh]”(h§)”}”(hŒJack”h]”hŒJack”…””}”(hjwhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjthžhhŸh¶h K)ubhŒdefinition_list”“”)”}”(hhh]”(hŒdefinition_list_item”“”)”}”(hŒ”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; ”h]”(hŒterm”“”)”}”(hŒPresume:”h]”hŒPresume:”…””}”(hj’hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhŸh¶h K-hjŒubhŒ definition”“”)”}”(hhh]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒAMST must be dyn_pcm_assign, and it is acomp (for Intel scenario);”h]”h¸)”}”(hj®h]”hŒAMST must be dyn_pcm_assign, and it is acomp (for Intel scenario);”…””}”(hj°hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K,hj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj§ubj«)”}”(hŒENON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp; ”h]”h¸)”}”(hŒDNON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp;”h]”hŒDNON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp;”…””}”(hjÇhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K-hjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj§ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j¥hŸh¶h K,hj¢ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjŒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jŠhŸh¶h K-hj‡ubj‹)”}”(hŒ˜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 ”h]”(j‘)”}”(hŒ%So there are the following scenarios:”h]”hŒ%So there are the following scenarios:”…””}”(hjóhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhŸh¶h K2hjïubj¡)”}”(hhh]”hŒenumerated_list”“”)”}”(hhh]”(j«)”}”(hŒ MST (&& dyn_pcm_assign && acomp)”h]”h¸)”}”(hj h]”hŒ MST (&& dyn_pcm_assign && acomp)”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K0hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjubj«)”}”(hŒ"NON-MST && dyn_pcm_assign && acomp”h]”h¸)”}”(hj"h]”hŒ"NON-MST && dyn_pcm_assign && acomp”…””}”(hj$hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K1hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjubj«)”}”(hŒ%NON-MST && !dyn_pcm_assign && !acomp ”h]”h¸)”}”(hŒ$NON-MST && !dyn_pcm_assign && !acomp”h]”hŒ$NON-MST && !dyn_pcm_assign && !acomp”…””}”(hj;hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K2hj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œ loweralpha”Œprefix”hŒsuffix”Œ.”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjïubeh}”(h]”h ]”h"]”h$]”h&]”uh1jŠhŸh¶h K2hj‡hžhubeh}”(h]”h ]”h"]”h$]”h&]”uh1j…hjthžhhŸNh Nubh¸)”}”(hŒgBelow discussion will ignore MST and NON-MST difference as it doesn't impact on jack handling too much.”h]”hŒiBelow discussion will ignore MST and NON-MST difference as it doesn’t impact on jack handling too much.”…””}”(hjlhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K4hjthžhubh¸)”}”(hŒŠ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.”h]”hŒŠ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.”…””}”(hjzhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K7hjthžhubh¸)”}”(hŒKFor !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically.”h]”hŒKFor !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically.”…””}”(hjˆhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K:hjthžhubh¸)”}”(hŒZFor dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] when monitor is hotplugged.”h]”hŒZFor dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] when monitor is hotplugged.”…””}”(hj–hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Kpcm_rec[pcm_idx].jack directly. ”h]”(h¸)”}”(hŒdyn_pcm_assign”h]”hŒdyn_pcm_assign”…””}”(hj¼hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KChj¸ubh¸)”}”(hŒOWill not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly.”h]”hŒOWill not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly.”…””}”(hjÊhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KEhj¸ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jªhjµhžhhŸh¶h Nubj«)”}”(hŒ_!dyn_pcm_assign Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically. ”h]”(h¸)”}”(hŒ!dyn_pcm_assign”h]”hŒ!dyn_pcm_assign”…””}”(hjâhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KGhjÞubh¸)”}”(hŒLUse hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically.”h]”hŒLUse hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically.”…””}”(hjðhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KIhjÞubeh}”(h]”h ]”h"]”h$]”h&]”uh1jªhjµhžhhŸh¶h Nubeh}”(h]”h ]”h"]”h$]”h&]”jájâuh1j¥hŸh¶h KChj¤hžhubeh}”(h]”Œ build-jack”ah ]”h"]”Œ build jack”ah$]”h&]”uh1h¡hjthžhhŸh¶h KAubh¢)”}”(hhh]”(h§)”}”(hŒUnsolicited Event Enabling”h]”hŒUnsolicited Event Enabling”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjhžhhŸh¶h KMubh¸)”}”(hŒ#Enable unsolicited event if !acomp.”h]”hŒ#Enable unsolicited event if !acomp.”…””}”(hj#hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KNhjhžhubeh}”(h]”Œunsolicited-event-enabling”ah ]”h"]”Œunsolicited event enabling”ah$]”h&]”uh1h¡hjthžhhŸh¶h KMubh¢)”}”(hhh]”(h§)”}”(hŒMonitor Hotplug Event Handling”h]”hŒMonitor Hotplug Event Handling”…””}”(hj<hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj9hžhhŸh¶h KRubj¦)”}”(hhh]”(j«)”}”(hŒÓ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 ”h]”(h¸)”}”(hŒacomp”h]”hŒacomp”…””}”(hjQhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KShjMubh¸)”}”(hŒ`pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() -> sync_eld_via_acomp().”h]”hŒ`pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() -> sync_eld_via_acomp().”…””}”(hj_hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KUhjMubh¸)”}”(hŒiUse directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for both dyn_pcm_assign and !dyn_pcm_assign”h]”hŒiUse directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for both dyn_pcm_assign and !dyn_pcm_assign”…””}”(hjmhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KXhjMubeh}”(h]”h ]”h"]”h$]”h&]”uh1jªhjJhžhhŸh¶h Nubj«)”}”(hX!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. ”h]”(h¸)”}”(hŒ!acomp”h]”hŒ!acomp”…””}”(hj…hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K[hjubh¸)”}”(hŒ†hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() -> hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()”h]”hŒ†hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() -> hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()”…””}”(hj“hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K]hjubh¸)”}”(hŒUse directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign. Use hda_jack mechanism to handle jack events.”h]”hŒUse directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign. Use hda_jack mechanism to handle jack events.”…””}”(hj¡hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K`hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jªhjJhžhhŸh¶h Nubeh}”(h]”h ]”h"]”h$]”h&]”jájâuh1j¥hŸh¶h KShj9hžhubeh}”(h]”Œmonitor-hotplug-event-handling”ah ]”h"]”Œmonitor hotplug event handling”ah$]”h&]”uh1h¡hjthžhhŸh¶h KRubeh}”(h]”Œjack”ah ]”h"]”Œjack”ah$]”h&]”uh1h¡hh£hžhhŸh¶h K)ubh¢)”}”(hhh]”h§)”}”(hŒOthers to be added later”h]”hŒOthers to be added later”…””}”(hjÎhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjËhžhhŸh¶h Keubah}”(h]”Œothers-to-be-added-later”ah ]”h"]”Œothers to be added later”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Keubeh}”(h]”Œhd-audio-dp-mst-support”ah ]”h"]”Œhd-audio dp-mst support”ah$]”h&]”uh1h¡hhhžhhŸh¶h Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”h¶uh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(h¦NŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”h¶Œ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jéjæjjj<j9jqjnjÈjÅjj j6j3jÀj½jájÞuŒ nametypes”}”(jé‰j‰j<‰jq‰jȉj‰j6‰jÀ‰já‰uh}”(jæh£jhãj9j jnj?jÅjtj j¤j3jj½j9jÞjËuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nhžhub.