HD-音频 DP-MST 支持¶
为了支持 DP MST 音频,HD 音频 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 机制来处理插孔事件。