HD-Audio DP-MST 支援¶
為了支援 DP MST 音訊,HD Audio hdmi 編解碼器驅動程式引入了虛擬引腳和動態 pcm 分配。
虛擬引腳是 per_pin 的擴充套件。DP MST 與傳統方案的最大區別在於 DP MST 引入了裝置條目。每個引腳可以包含多個裝置條目。每個裝置條目的行為都像一個引腳。
由於每個引腳可能包含多個裝置條目,並且每個編解碼器可能包含多個引腳,如果我們每個 per_pin 使用一個 pcm,則會有很多 PCM。新的解決方案是建立少量 PCM 並將 pcm 動態繫結到 per_pin。驅動程式使用 spec->dyn_pcm_assign 標誌來指示是否使用新的解決方案。
PCM¶
待新增
引腳初始化¶
每個引腳可能有多個裝置條目(虛擬引腳)。在 Intel 平臺上,裝置條目數量是動態變化的。如果連線了 DP MST 集線器,則它處於 DP MST 模式,裝置條目數為 3。否則,裝置條目數為 1。
為了簡化實現,無論是否處於 DP MST 模式,所有裝置條目都會在啟動時初始化。
連線列表¶
DP MST 重用連線列表程式碼。該程式碼可以重用,因為同一引腳上的裝置條目具有相同的連線列表。
這意味著 DP MST 獲取裝置條目連線列表,而無需裝置條目設定。
插孔¶
- 假定
MST 必須是 dyn_pcm_assign,並且它是 acomp(對於 Intel 場景);
NON-MST 可能或可能不是 dyn_pcm_assign,它可以是 acomp 或 !acomp;
- 因此有以下場景
MST (&& dyn_pcm_assign && acomp)
NON-MST && dyn_pcm_assign && acomp
NON-MST && !dyn_pcm_assign && !acomp
以下討論將忽略 MST 和 NON-MST 的區別,因為它對插孔處理的影響不大。
驅動程式在 hdmi_spec 中使用 struct hdmi_pcm pcm[] 陣列,而 snd_jack 是 hdmi_pcm 的成員。每個引腳都有一個 struct hdmi_pcm * pcm 指標。
對於 !dyn_pcm_assign,per_pin->pcm 將靜態分配給 spec->pcm[n]。
對於 dyn_pcm_assign,per_pin->pcm 將在顯示器熱插拔時分配給 spec->pcm[n]。
構建插孔¶
dyn_pcm_assign
將不使用 hda_jack,而是直接使用 spec->pcm_rec[pcm_idx].jack 中的 snd_jack。
!dyn_pcm_assign
使用 hda_jack 並靜態分配 spec->pcm_rec[pcm_idx].jack = jack->jack。
主動事件啟用¶
如果 !acomp,則啟用主動事件。
顯示器熱插拔事件處理¶
acomp
pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() -> sync_eld_via_acomp()。
對於 dyn_pcm_assign 和 !dyn_pcm_assign,直接在 spec->pcm_rec[pcm_idx].jack 上使用
snd_jack_report()!acomp
hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() -> hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()
對於 dyn_pcm_assign,直接在 spec->pcm_rec[pcm_idx].jack 上使用
snd_jack_report()。 使用 hda_jack 機制來處理插孔事件。