WBRF - Wifi 频段 RFI 缓解

由于某些平台设计中的电气和机械限制,GPU 内存时钟的相对高功率谐波可能会干扰某些 Wifi 频段使用的本地无线模块频段。

为了缓解可能的 RFI 干扰,生产者可以公布正在使用的频率,消费者可以使用此信息来避免将这些频率用于敏感功能。

如果已知平台中的任何包含的设备存在此问题,平台设计者将通过带有设备特定方法 (_DSM) 的 ACPI 设备来公布此功能的可用性。 * 带有此 _DSM 的生产者将能够公布正在使用的频率。 * 带有此 _DSM 的消费者将能够注册以接收正在使用的频率的通知。

一些通用术语

生产者:指可以产生高功率无线电频率的组件 消费者:指可以调整其使用中频率以响应其他组件的无线电频率,从而减轻可能的 RFI 的组件。

为了使该机制发挥作用,这些生产者应通知其特定频率的活跃使用情况,以便其他消费者可以根据需要进行相应的内部调整,以避免这种共振。

ACPI 接口

尽管最初用于 wifi + dGPU 用例,但 ACPI 接口可以扩展到平台设计者发现可能导致干扰的任何类型的设备。

用于 _DSM 的 GUID 是 7B7656CF-DC3D-4C1C-83E9-66E721DE3070。

此 _DSM 中有 3 个功能可用

  • 0:发现可用功能的数量

  • 1:记录正在使用的 RF 频段

  • 2:检索正在使用的 RF 频段

驱动程序编程接口

int acpi_amd_wbrf_add_remove(struct device *dev, uint8_t action, struct wbrf_ranges_in_out *in)

添加或删除设备正在使用的频段

参数

struct device *dev

设备指针

uint8_t action

将频段添加到 bios 或从 bios 中移除

struct wbrf_ranges_in_out *in

包含设备正在使用的频段的输入结构

描述

向其他消费者广播设备开始使用的频段。 在表面之下,信息首先被缓存到内部缓冲区中。 然后,向所有已注册的消费者发送通知。 因此,他们可以检索该缓冲区以了解最新的活动频段。 尚未注册的消费者可以在注册时从缓存中检索信息。

返回

成功添加/删除 wifi 频段时返回 0。 失败时返回负错误代码。

bool acpi_amd_wbrf_supported_producer(struct device *dev)

确定是否可以为设备启用 WBRF 作为生产者

参数

struct device *dev

设备指针

描述

检查平台是否配备了必要的实现来支持 WBRF,以使设备充当生产者。

返回

如果支持 WBRF,则为 true,否则返回 false

bool acpi_amd_wbrf_supported_consumer(struct device *dev)

确定是否可以为设备启用 WBRF 作为消费者

参数

struct device *dev

设备指针

描述

确定平台是否配备了必要的实现来支持 WBRF,以使设备充当消费者。

返回

如果支持 WBRF,则为 true,否则返回 false。

int amd_wbrf_retrieve_freq_band(struct device *dev, struct wbrf_ranges_in_out *out)

检索当前活动的频段

参数

struct device *dev

设备指针

struct wbrf_ranges_in_out *out

包含所有活动频段的输出结构

描述

检索由其他生产者广播的当前活动频段。 调用此 API 的消费者应采取适当的措施,以防任何频段可能导致与其自身使用的频段发生 RFI。

返回

成功获取 wifi 频段时返回 0。 失败时返回负错误代码。

int amd_wbrf_register_notifier(struct notifier_block *nb)

注册以接收频段更新的通知

参数

struct notifier_block *nb

驱动程序通知程序块

描述

消费者应通过此 API 注册自己,以便它可以接收来自其他生产者的频段更新的通知。

返回

成功注册消费者驱动程序时返回 0。 失败时返回负错误代码。

int amd_wbrf_unregister_notifier(struct notifier_block *nb)

取消注册以接收频段更新的通知

参数

struct notifier_block *nb

驱动程序通知程序块

描述

当消费者不再对来自其他生产者的频段更新感兴趣时,应调用此 API。 通常,这应在驱动程序清理期间执行。

返回

用于取消注册消费者驱动程序时返回 0。 失败时返回负错误代码。

用法示例

生产者的预期流程: 1. 在探测期间,调用 acpi_amd_wbrf_supported_producer 以检查是否可以为设备启用 WBRF。 2. 在使用某些频段时,调用 acpi_amd_wbrf_add_remove 并带有“add”参数,以使其他消费者获得适当的通知。 3. 或者,在停止使用某些频段时,调用 acpi_amd_wbrf_add_remove 并带有“remove”参数,以通知其他消费者。

消费者的预期流程: 1. 在探测期间,调用 acpi_amd_wbrf_supported_consumer 以检查是否可以为设备启用 WBRF。 2. 调用 amd_wbrf_register_notifier 注册以接收来自其他生产者的频段更改(添加或删除)的通知。 3. 最初调用 amd_wbrf_retrieve_freq_band 以检索当前的活动频段,因为某些生产者可能会在消费者启动之前广播此类信息。 4. 在接收到频段更改的通知时,再次运行 amd_wbrf_retrieve_freq_band 以检索最新的活动频段。 5. 在驱动程序清理期间,调用 amd_wbrf_unregister_notifier 以取消注册通知程序。