SR-IOV的介绍见:【88】SR-IOV-CSDN博客
SR-IOV cap中的Supported Page Sizes (RO)和System Page Size (RW)字段
SR-IOV cap中定义了Supported Page Sizes (RO)和System Page Size (RW)两个字段,offset 如下:
Supported Page Sizes (RO)字段
其中Supported Page Sizes (RO)定义了PF支持的page size。该reg的每1bit代表一种page size,PF必须支持的是4-KB, 8-KB, 64-KB, 256-KB, 1-MB, 4-MB,其他的page size是可选的。也就是说bit0/1/4/6/8/10(0x553)是必须要支持的。
System Page size(RW)字段
System Page size字段定义system用来map VF的memory address的page size。主要有以下固定:
(1)软件必须使用support page sizes字段中的一个system page size来设置system page size。如果使用了support page size不支持的bit设置了system page size,则结果是未定义的。
(2)如果system page size字段是0,则结果是未定义的
(3)如果system page size的多个bit被置1,则结果是未定义的
(4)当system page size被设置后,VF对应的PF需要按照system page size边界对齐
(5)VF BARn也应该按照system page size边界对齐
(6)当写system page size字段是,VF enable必须是0,否则将会出现未知结果
(7)system page size默认值是1(4KB)
LINUX如何使用Supported Page Sizes (RO)和System Page Size (RW)字段
在sriov_init函数中先读取了Supported Page Sizes字段并且赋值给pgze,然后通过运算后把pgsz写入System Page Size寄存器:
pci_read_config_dword(dev, pos + PCI_SRIOV_SUP_PGSIZE, &pgsz);i = PAGE_SHIFT > 12 ? PAGE_SHIFT - 12 : 0;//系统页的位移pgsz &= ~((1 << i) - 1);//确保pgsz只保留大于或等于系统页大小的页大小设置if (!pgsz)return -EIO;pgsz &= ~(pgsz - 1);//找到Supported Page Size支持的最小的sizepci_write_config_dword(dev, pos + PCI_SRIOV_SYS_PGSIZE, pgsz);
往 System Page Size reg写的pgsz需要同时满足下面两个要求:
(1)pgsz一定是大于或者等于当前系统的page size的
(2)pgsz是Supported Page Size支持的最小的size
比如:
(1)系统page size 是4K,那么page shift是12,如果Supported Page Size 是0x553(4K/8K/64K/256K/1M/4M),那么就往System Page Size reg写0x1,对应bit0为1,芯片要求使用4K对齐
(2)系统page size 是128K,那么page shift是17,如果Supported Page Size 是0x553(支持4K/8K/64K/256K/1M/4M),那么就往System Page Size reg写0x40,对应bit6为1,芯片要求使用256K对齐
(3)系统page size 是128K,page shift是17,如果Supported Page Size 是0x573(支持4K/8K/64K/128K/256K/1M/4M),那么就往System Page Size reg写0x20,对应bit5为1,芯片要求使用128K对齐
NV A100的Supported Page Sizes (RO)和System Page Size (RW)字段
https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Center/a100/pdf/PB-10577-001_v02.pdf
NV A100 每个VF BAR0的size是 256KB。支持20VF,Supported Page Size: 00000573,比spec规定的必须支持的page size多了128K对齐的