Linux Switchtec 支持¶
Microsemi 的 “Switchtec” 系列 PCI 交换机设备已经通过标准 PCI 交换机驱动程序得到内核支持。 但是,Switchtec 设备公布了一个特殊的管理端点,可以启用一些额外的功能。 这包括
数据包和字节计数器
固件升级
事件和错误日志
查询端口链接状态
自定义用户固件命令
switchtec 内核模块实现了此功能。
接口¶
与 Switchtec 管理固件通信的主要方式是通过内存映射远程过程调用 (MRPC) 接口。 命令通过 4 字节命令标识符和最多 1KB 的命令特定数据提交到该接口。 固件将以 4 字节返回代码和最多 1KB 的命令特定数据响应。 该接口一次只处理一个命令。
用户空间接口¶
MRPC 接口将通过一个简单的字符设备暴露给用户空间:/dev/switchtec#,系统中的每个管理端点都有一个。
字符设备具有以下语义
写入必须包含至少 4 个字节,最多 1028 个字节。 前 4 个字节将被解释为命令 ID,其余字节将用作输入数据。 写入会将命令发送到固件以开始处理。
每次写入后必须准确跟随一次读取。 任何双重写入都会产生错误,任何不跟随写入的读取都会产生错误。
读取将阻塞,直到固件完成命令并返回 4 字节命令返回值加上最多 1024 字节的输出数据。 (长度将由读取调用的 size 参数指定 - 读取少于 4 个字节将产生错误。)
poll 调用也将被用户空间应用程序支持,这些应用程序需要在等待命令完成时执行其他操作。
该设备还支持以下 IOCTL
SWITCHTEC_IOCTL_FLASH_INFO - 检索固件长度和设备中的分区数。
SWITCHTEC_IOCTL_FLASH_PART_INFO - 检索闪存中任何指定分区的地址和长度。
SWITCHTEC_IOCTL_EVENT_SUMMARY - 读取指示所有未清除事件的位图结构。
SWITCHTEC_IOCTL_EVENT_CTL - 获取当前计数,清除和设置任何事件的标志。 此 ioctl 接受一个 switchtec_ioctl_event_ctl 结构,其中设置了 event_id、index 和 flags(index 是非全局事件的分区或 PFF 编号)。 它返回事件是否已发生、发生的次数以及任何事件特定数据。 这些标志可用于清除计数或启用和禁用事件发生时要执行的操作。 通过使用 SWITCHTEC_IOCTL_EVENT_FLAG_EN_POLL 标志,您可以设置一个事件以触发 poll 命令以返回 POLLPRI。 通过这种方式,用户空间可以等待事件发生。
SWITCHTEC_IOCTL_PFF_TO_PORT 和 SWITCHTEC_IOCTL_PORT_TO_PFF 在 PCI 功能框架编号(由事件系统使用)和 Switchtec 逻辑端口 ID 和分区编号(对用户更友好)之间进行转换。
非透明桥 (NTB) 驱动程序¶
ntb_hw_switchtec 中为 Switchtec 硬件提供了一个 NTB 硬件驱动程序。 目前,它仅支持配置为正好 2 个 NT 分区和零个或多个非 NT 分区的交换机。 它还需要以下配置设置
两个 NT 分区必须能够访问彼此的 GAS 空间。 因此,管理设置下的 GAS 访问向量中的位必须设置为支持此功能。
内核配置必须包含对 NTB 的支持(需要设置 CONFIG_NTB)
NT EP BAR 2 将被动态配置为直接窗口,配置文件不需要显式配置它。
有关 Linux NTB 堆栈的总体了解,请参阅 Linux 源代码树中的 NTB 驱动程序。 ntb_hw_switchtec 在此堆栈中充当 NTB 硬件驱动程序。