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 个字节会产生错误。)
轮询调用也将支持需要在等待命令完成时执行其他操作的用户空间应用程序。
设备还支持以下 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、索引和标志(索引是非全局事件的分区或 PFF 编号)。它返回事件是否发生、次数以及任何事件特定数据。标志可用于清除计数或启用和禁用事件发生时的操作。通过使用 SWITCHTEC_IOCTL_EVENT_FLAG_EN_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 硬件驱动程序。