天天看點

PCIE Resizable BAR

1. 什麼是Resizable BAR

Resizable BAR特性在PCIe規範中定義.僅可以通過本地DBI在控制寄存器中更改“Supported Resource Sizes”字段

Resizable BAR Capability是一個可選的功能,它允許硬體傳遞資源大小,系統軟體在确定最佳大小後,将最佳大小傳遞回硬體。硬體通過 Resizable BAR Capability and Control registers來傳達可接受的操作資源大小。硬體必須支援1mb ~ 512gb之間的至少一個大小。

軟體通過一種專有的機制來決定資源的最佳大小,程式通過Resizable BAR Control寄存器的BAR size字段來調整大小。

IMPLEMENTATION NOTE:

配置設定資源的系統軟體可以使用這個功能來調整BAR資源的大小。該軟體以前的版本通過将FFFFh寫入BAR,讀取值,并根據Set的位數确定資源的大小,然後,将基址被寫入BAR。

系統軟體在将基地位址配置設定給BAR之前使用這種方法來代替上面提到的确定資源大小的方法,潛在的可用資源大小由函數通過Resizable BAR Capability and Control registers報告。這樣做的目的是讓軟體能夠配置設定最大的大小,因為配置設定的位址空間小于報告的最大大小會導緻較低的性能。然後,軟體将該大小寫入到Resizable BAR Control register中。然後,将基址被寫入BAR。

2. Resizable BAR capability

PCIE Resizable BAR

2.1 Resizable BAR Extended Capability Header (Offset 00h)

PCIE Resizable BAR

PCI Express Extended Capability ID: 記錄Resizable BAR Extended capability的ID号,固定為0x15

Capability Version: PCI-SIG定義的版本号,表示目前能力結構的版本

Next Capability Offset: 指向下一個新的增強Capability寄存器的位址

2.2 Resizable BAR Capability Register

PCIE Resizable BAR

2.3 Resizable BAR Control Register

PCIE Resizable BAR

BAR Indix: 指向BAR的起點

■ 0x0 (VF_BAR_24h): VF BAR located at offset 24h.

■ 0x1 (VF_BAR_28h): VF BAR located at offset 28h.

■ 0x2 (VF_BAR_2Ch): VF BAR located at offset 2Ch.

■ 0x3 (VF_BAR_30h): VF BAR located at offset 30h.

■ 0x4 (VF_BAR_34h): VF BAR located at offset 34h.

■ 0x5 (VF_BAR_38h): VF BAR located at offset 38h.

Number of Resizeable BARs: 表示該函數的能力結構中可調整大小的bar的總數

■ 0x1 (BAR1): one resizable VF BAR for the function

■ 0x2 (BAR2): two resizable VF BARs for the function.

■ 0x3 (BAR3): three resizable VF BARs for the function.

■ 0x4 (BAR4): four resizable VF BARs for the function.

■ 0x5 (BAR5): five resizable VF BARs for the function.

■ 0x6 (BAR6): six resizable VF BARs for the function.

BAR Size: 這是一個編碼過的值,該字段的預設值等于BAR資源通過BAR的隻讀位請求的位址空間的預設大小,軟體必須隻寫入 Resizable BAR Capability中所支援的值相對應的值,編寫不支援的值将産生未定義的結果。

■ 0x0 (_1MB): 1MB(2^20 bytes)

■ 0x1 (_2MB): 2MB(2^21 bytes)

■ 0x2 (_4MB): 4MB(2^22 bytes)

■ 0x3 (_8MB): 8MB(2^23 bytes)

.

.

.

■ 0x2b (_8EB): 8EB(2^63 bytes)