S/390 PCI

作者
  • Pierre Morel

  • Niklas Schnelle

Copyright, IBM Corp. 2020

命令行参数和 debugfs 条目

命令行参数

  • nomio

    不使用 PCI 内存映射 I/O (MIO) 指令。

  • norid

    忽略 RID 字段,强制每个 PCI 功能使用一个 PCI 域。

debugfs entries

S/390 调试功能 (s390dbf) 生成用于保存各种调试结果的视图,其存储在以下形式的 sysfs 目录中:

  • /sys/kernel/debug/s390dbf/pci_*/

例如

  • /sys/kernel/debug/s390dbf/pci_msg/sprintf

    保存来自 PCI 事件处理的消息,例如机器检查处理以及全局功能(如 UID 检查)的设置。

通过向 /sys/kernel/debug/s390dbf/pci_*/level 写入一个 0 到 6 之间的数字,来调整日志记录的详细程度(更详细或更简洁)。有关详细信息,请参阅 S390 调试功能 上的文档。

Sysfs 条目

专属于 zPCI 功能的条目以及保存 zPCI 信息的条目。

  • /sys/bus/pci/slots/XXXXXXXX

    插槽条目使用 PCI 功能的功能标识符 (FID) 作为插槽名称进行设置。上面表示为 XXXXXXXX 的格式是指包含 8 个十六进制数字、以 0 填充且使用小写字母的十六进制数。

    • /sys/bus/pci/slots/XXXXXXXX/power

    除了使用 FID 作为插槽名称外,插槽目录还包含以下 s390 特定的插槽属性。

    • uid: 可由该插槽配置的功能的用户定义标识符 (UID)。另请参见设备的相应属性。

    当前支持虚拟功能的物理功能无法断电,直到使用以下命令移除所有虚拟功能:echo 0 > /sys/bus/pci/devices/DDDD:BB:dd.f/sriov_numvf

  • /sys/bus/pci/devices/DDDD:BB:dd.f/

    • function_id: zPCI 功能标识符 (FID) 是一个 32 位十六进制值,用于唯一标识 PCI 功能。除非虚拟机监控程序(hypervisor)提供了虚拟 FID(例如在 KVM 上),否则此标识符在整台机器上(甚至在不同分区之间)都是唯一的。

    • function_handle: 这个 32 位十六进制值是用于 PCI 功能的底层标识符。请注意,在发生 PCI 事件以及启用/禁用 PCI 功能时,功能句柄可能会更改并变为无效。

    • pchid: 这个 16 位十六进制值编码了 PCI 功能与模型相关的位置。

    • pfgid: PCI 功能组 ID;具有相同功能的函数使用公共标识符。PCI 组定义了中断、IOMMU、IOTLB 和 DMA 的具体细节。

    • vfn: 虚拟功能编号,对于虚拟功能为 1 到 N,对于物理功能为 0。

    • pft: PCI 功能类型是一个 s390 特定的类型属性。与 PCI 规范的类/厂商/设备标识符相比,它指示了一种更通用、面向用途的类型。也就是说,具有相同 pft 值的 PCI 功能可能由不同的硬件实现支持。同时,除了未分类的功能(pft 为 0x00)外,相同的 pft 值通常意味着相似的使用模型。与此同时,当处于不同的使用模型时,同一个 PCI 硬件设备可能会以不同的 pft 值出现。例如,NETD 和 NETH 虚拟功能(VF)可以由同一个 PCI 硬件设备实现,但在 NETD 中,父物理功能是由用户管理的,而在 NETH 中则是由平台管理的。

      目前定义了以下 PFT 值:

      • 0x00 (UNC): 未分类 (Unclassified)

      • 0x02 (ROCE): RoCE Express

      • 0x05 (ISM): 内部共享内存 (Internal Shared Memory)

      • 0x0a (ROC2): RoCE Express 2

      • 0x0b (NVMe): NVMe

      • 0x0c (NETH): 混合网络快车 (Network Express hybrid)

      • 0x0d (CNW): 云网络适配器 (Cloud Network Adapter)

      • 0x0f (NETD): 直接网络快车 (Network Express direct)

    • port: 端口是一个十进制值,对应于该功能连接到的物理端口。虚拟功能(VF)与其父物理功能(PF)共享端口。值为 0 表示端口属性不适用于该 PCI 功能类型。

    • uid: PCI 功能的用户定义标识符 (UID) 是一个 32 位十六进制值。它是按实例进行定义的,作为分区、KVM 客户机或 z/VM 客户机配置的一部分。如果启用了 UID 检查,平台会确保 UID 在该实例内是唯一的,并且该实例不会看到具有相同 UID 的两个 PCI 功能。

      与此保证无关,并且与功能 ID (FID) 不同,同一台机器内不同分区中的 UID 可以相同。这允许在多个分区中创建在 UID 命名空间中完全相同的 PCI 配置。

    • uid_is_unique: 一个 0 或 1 的标志,指示是否保证用户定义标识符 (UID) 在此 Linux 实例内是且将保持唯一的。此平台功能称为 UID 检查。

    • pfip/segmentX: 这些段决定了功能的隔离性。它们对应于通往该功能的物理路径。段差异越大,功能的隔离度就越高。

    • fidparm: 包含由平台提供的、每个 PCI 功能 8 位的十六进制参数字段。该字段的含义取决于特定的 PCI 功能类型。对于 NETH 虚拟功能,值为 0x01 表示该功能支持混杂模式。

  • /sys/firmware/clp/uid_checking

    除了每个设备的 uid_is_unique 属性之外,这还提供了是否启用 UID 检查的全局指示。这使用户即使在未配置任何 PCI 功能时也能检查 UID 检查状态。

枚举与热插拔

PCI 地址由四部分组成:域、总线、设备和功能,其形式为:DDDD:BB:dd.f。

  • 对于平台未公开 RID 的 PCI 功能,或者使用 pci=norid 内核参数,或者对于所谓的隔离虚拟功能(它确实具有 RID 信息,但其使用时并不包含其父物理功能作为同一 PCI 配置的一部分)

    • 每个域只有一个功能。

    • 如果开启了 UID 检查,则域由 zPCI 功能的 UID 设置;否则,域 ID 是动态生成的,并且在重启或热插拔后不稳定。

  • 对于平台公开了 RID 且不是隔离虚拟功能的 PCI 功能:

    • 每个域仍然只有一个总线。

    • 每个总线最多可以有 256 个 PCI 功能。

    • 同一拓扑中所有功能的地址域部分,是该拓扑中具有最低 devfn 的已配置 PCI 功能的域。

    • 由支持 SR-IOV 的物理功能生成的虚拟功能,只有在启用 SR-IOV 后才会可见。