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:记录正在使用的射频频段

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

驱动程序编程接口

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 或从中删除

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 以取消注册通知器。