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;

因此有以下場景
  1. MST (&& dyn_pcm_assign && acomp)

  2. NON-MST && dyn_pcm_assign && acomp

  3. 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 機制來處理插孔事件。

其他待新增