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;

因此有以下几种情况
  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 机制来处理插孔事件。

其他待添加内容