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 以取消註冊通知程式。