引子
- virtio 可以使用不同类型的总线,这里讲解PCIe类型的virtio设备
- virtio通常实现为PCIe类型
- virtio可以是PCI设备也可以是PCIe设备
- 设备
- 设备暴露给客户机的接口需要符合PCI/PCIe规范
PCI 设备发现
- vendor id: 0x1af4
- device id: 0x1040 + ${Virtio Device ID},确定具体设备类型,Legacy的是 0x1000 到 0x103F
- 设备
- PCI Vendor ID 必须是 0x1AF4
- device id: 0x1040 + ${Virtio Device ID}(从1开始),Legacy的是 0x1000 到 0x103F
- 区别
- device id: 0x1040 + ${Virtio Device ID}(从1开始),Legacy的是 0x1000 到 0x103F
PCI 设备布局
- 通过IO 和 MMIO 的方式配置 Virtio PCI Capabilities 结构
- device configuration regions 有不同的长度
- 64-bit; 32-bit; 16-bit 都是按照小端序处理
- 64-bit 作为2个32-bit处理, 高32-bit 后面是 低32-bit
- 驱动
- 8-bit 方式访问 8-bit域
- 16-bit 方式对齐访问 16-bit域
- 32-bit 方式对齐访问 32-bit域 和 对齐访问 64-bit域
- 64-bit 域的高、低32-bit访问是独立进行的
- 设备
- 64-bit device configuration,设备必须支持驱动高、低32-bit 进行独立访问
Virtio PCI Capabilities 结构
- virtio device configuration 布局结构组成
- Common configuration
- Notifications
- ISR Status
- Device-specific configuration (可选)
- PCI configuration access
- 结构访问方式
- Base Address register (BAR) 映射
- 访问 PCI configuration space 的 special VIRTIO_PCI_CAP_PCI_CFG 域
- 结构的位置
- PCI configuration 空间中的 capability 列表中的 vendor特定的 PCI capability 类型来指定的具体capability位置
- virtio capability 结构使用小端序
- 除了stated 其他所有的域都是只读的
- virtio capability 定义,根据 cfg_type,结构后面可以跟 extra data
- cap_vndr:0x09,标明是一个 vendor-specific capability
- cap_next:连接到 PCI configuration space 的下一个capability
- cap_len:capability 结构长度,包括 struct virtio_pci_cap 和 extra data,可能含有padding
- cfg_type:标明了 结构的类型,其他值保留,每种结构可以出现2次,先出现的结构优于后出现的结构,如两个 PCI_CAP_NOTIFY_CFG
- bar:0x0 到 0x5,指定该function使用 PCI Configuration Space 10h 处的哪个BAR,映射到 Memory 或 I/O Space
- offset :结构相对于BAR指定地址的偏移量
- length:结构长度
- cap_vndr:0x09,标明是一个 vendor-specific capability
- 驱动
- 驱动必须忽略cfg_type为保留值的 vendor-specific capability 结构或 bar为保留值的 vendor-specific capability
- 驱动应该使用最先匹配到的某类型的 virtio 结构
- 驱动不能对capability结构进行写入
- 设备
- 如果同一个类型的capability结构出现多次,按照优先级排序
- 如果有extra data,必须包含在 cap_len. 中,cap_len.中可能还有padding