PG332 ERNIC Datasheet Ch.6 Translation

PG332 ERNIC Datasheet Ch.6 Translation

ERNIC 软件流程

ERNIC IP 应先进行初始化和配置,然后才能用于发送和接收 RDMA 流量。 这涉及按顺序执行以下步骤:

  1. ERNIC IP全局配置。
  2. 内存区域注册(适用于与远程主机共享内存区域的 RDMA 客户端应用程序)。
  3. 创建QP1,用于发送和接收RDMA连接管理(CM)数据包。
  4. 创建RC QP。
  5. 创建CQ。
  6. 提交用于 RDMA 操作的 WQE(工作请求元素)。
  7. 处理完成情况。
  8. QP删除。
  9. QP致命错误恢复。

ERNIC IP全局配置

应为 ERNIC 全局配置配置以下寄存器。

  • 配置错误缓冲区队列。分配内存并将基地址配置到ERRBUFBA寄存器,将队列深度和大小配置到ERRBUFSZ寄存器。 寄存器ERRBUFWPTR由硬件用于通知SW(软件)有关ERROR缓冲队列中新条目的情况。
  • 配置传入数据包错误状态队列。此队列提供带有错误的传入数据包的状态。 要配置此队列,要配置此队列,分配内存并将基地址写入IPKTERRQBA寄存器,将队列深度和大小写入IPKTERRQSZ寄存器。IPKTERRQWPTR寄存器由硬件用于通知SW有关队列中新条目的情况。
  • 配置响应错误数据包缓冲区。 这涉及将内存基地址写入RESP_ERR_PKT_BUF_BA,将队列深度和大小写入RESP_ERR_BUF_SZ,并将DDR地址写入RESP_ERR_BUF_WRPTR,以便硬件通知软件有关响应错误缓冲区写入的情况。
  • 通过写入INTEN 寄存器来使能中断。
  • 为将要创建的所有QP分配CQ和RQ门铃的内存。各个CQ和RQ的门铃内存来自该内存的偏移,并在QP创建期间在相应的ERNIC寄存器中进行配置(请参阅QP1创建)。
  • 在MACXADDLSB、MACXADDMSB 寄存器中配置源MAC 地址。
  • 配置源IP地址。 如果IP版本为IPv6,则将接口的IPv6地址写入寄存器IPv6XADD1-4寄存器,否则将IPv4地址写入IPv4XADD寄存器。
  • 配置ERNIC设计支持的QP数量、UDP端口,并通过写入XRNICCONF寄存器来启用ERNIC。

QP1的创建

QP1是ERNIC IP中的特殊QP。此QP用于与远程主机交换MAD数据包,以建立RC QPs的连接。在创建任何其他RC QP之前,必须首先配置QP1。有关QP1的更多信息,请参见InfiniBand架构规范第1卷,附录A16 RoCE和附录17 RoCE V2 [参考文献1]。配置和启用QP1需要执行以下步骤:

  1. 为队列(RQ、SQ、CQ)分配内存,并将相应的基地址寄存器进行编程。
    • 将RQ的基地址写入RQBAi寄存器。将SQ的基地址写入SQBAi寄存器,并将队列深度写入QDEPTHi寄存器。
    • 将CQ的基地址写入CQBAi寄存器。
    • 通过写入QPCONFi寄存器来配置每个RQ缓冲区的大小。
  2. 作为ERNIC初始化的一部分,从预先分配的门铃内存池中获取SQ完成门铃和RQ写指针的内存(请参见ERNIC全局配置)。
    • 将SQ完成门铃地址写入CQDBADDi寄存器。
    • 将RQ写指针门铃地址写入RQWPTRDBADDi寄存器。

内存注册

在与远程主机交换进行RDMA操作(传入的RDMA READ和传入的RDMA WRITE)之前,必须先将内存与ERNIC硬件进行注册。以下步骤对于将内存与ERNIC进行注册非常重要:

  1. 分配物理内存并为其创建虚拟地址映射。
  2. 创建一个保护域编号,并将其写入PD表中的一个空闲槽位,将其写入PDPDNUM寄存器。
  3. 在PD表中的相同槽位,将内存区域的虚拟地址写入VIRTADDRLSB和VIRTADDRMSB寄存器。
  4. 将内存区域的物理地址写入BUFBASEADDRLSB和BUFBASEADDRMSB寄存器。
  5. 创建一个R_KEY并将其配置到BUFFERKEY寄存器。
  6. 将内存区域的长度写入WRRDBUFLEN寄存器,并将访问权限(远程读取或写入)写入ACCESSDESC寄存器。

RC QP 创建

一旦启用了 QP1,就可以通过在 QP1 上交换 CM MAD 数据包来创建 RC QPs。有关 CM MAD 数据包的详细信息,请参阅 InfiniBand 架构规范第 1 卷中的“通信管理”章节,附录 A16 RoCE 和附录 17 RoCE V2 [参考文献 1]。要创建任何 RC QP,需要执行以下步骤:

  1. 为队列(RQ、SQ、CQ)分配内存,并编程相应的基地址寄存器。
    • RQ 的基地址写入 RQBAi 寄存器,SQ 的基地址写入 SQBAi 寄存器,并将队列深度写入 QDEPTHi 寄存器。
    • CQ 的基地址写入 CQBAi 寄存器。
    • 通过写入 QPCONFi 来配置每个 RQ 缓冲区的大小。
  2. 作为 ERNIC 初始化的一部分,从预分配的门铃内存池中获取 SQ 完成门铃和 RQ 写指针的内存。
    • 将 SQ 完成门铃地址写入 CQDBADDi 寄存器。
    • 将 RQ 写指针门铃地址写入 RQWPTRDBADDi 寄存器。
  3. 当 QP 状态从 RESET 转换到 RTS(在连接建立过程中),配置以下信息:
    1. 将远程主机的 MAC 地址写入 MACDESADDLSBi 和 MACDESADDMSBi 寄存器。
    2. 使用目标 QP ID 配置 DESTQPCONFi。
    3. 如果使用 IPv6,则将 IP 地址写入 IPDESADDR1i - IPDESADDR4i;否则,仅将 IPv4 地址写入 IPDESADDR1i。在 QPCONFi 中配置 IP 地址版本。
    4. 通过写入 SQPSNi 来配置发送队列 PSN。
    5. 通过写入 LSTRQREQi 来配置最后接收队列 PSN。
    6. 通过写入 QPCONFi 寄存器来配置 PMTU。
    7. 通过写入 TIMEOUTCONFi 寄存器来配置以下内容:
      • 配置 RNR(Receiver Not Ready)重试次数和 RNR 重试超时
      • 配置重试次数和重试超时
    8. 将 QP 关联的 PD 编号通过写入保护域编号寄存器来配置。

提交 WQE SQ

  • 现在可以使用QP来提交用于RDMA操作的工作请求(Work Request)。要做到这一点,按照表格2-1中描述的格式准备WQE,并将其复制到SQ内存中。
  • 通过将SQPIi增加1并将该值写入SQPIi寄存器来敲响门铃。

接收传入的 RDMA SEND 消息

ERNIC IP 将传入的 SEND 消息中的数据复制到 RQ 缓冲区。软件可以通过执行以下步骤检索此数据:

  1. 读取 RQWPTRDBADDi 的值。如果与先前的值不同,则通过从 RQBAi+offset 处读取数据来处理接收到的数据。此偏移量是基于 RQ 缓冲区大小和 RQWPTRDBADDi 中的值计算得出的。
  2. 在处理接收到的消息后,递增 RQCIi 寄存器的值,以向硬件指示缓冲区已被使用,因此可以用于进一步的传入消息。这表示缓冲区已被消耗,可以继续用于后续的传入消息。

处理 WQE 完成

ERNIC IP 通过递增 CQHEADi 寄存器来指示已完成向其提交的 WQE。软件应该轮询此寄存器,以检查先前提交的 WQE 是否已完成。

启用 QP 硬件卸载

RC QP 可以启用硬件握手模式,外部硬件应用程序可以在此 QP 上发送和接收 RDMA 消息。这将 RDMA 消息的软件提交卸载到外部硬件应用程序中。要在 QP 上启用硬件握手模式,需要执行以下步骤:

  1. 通过写入 XRNIC_ADV_CONF 来启用软件覆盖。
  2. 通过将 0 写入 SQPIi、CQHEADi 和 STATCURSQPTRi 来重置 QP 指针。
  3. 通过获取 RQCIi 和 RQWPTRDBADDi 之间的差值来配置要处理的剩余 RQ,并将该值写入 STATRQPIDBi 的较低 2Byte。
  4. 通过写入 QPCONFi 来启用硬件卸载。
  5. 通过写入 XRNIC_ADV_CONF 来禁用软件覆盖。

QP删除

当 RC 不再使用时(无论是由于本地发起的断开连接还是远程对等方的操作),可以删除它。以下步骤需要执行以删除 QP 并删除其配置:

  1. 等待 SQ 和未完成的队列变为空。状态位位于 STATQPi 寄存器中。
  2. 等待 SQ 中收到的WQE的所有完成事件。通过检查 SQPIi 和 CQHEADi 寄存器来完成此操作。
  3. 通过写入 XRNIC_ADV_CONF 寄存器来启用软件覆盖,并通过写入 QPCONFi 寄存器来禁用 QP。
  4. 通过将 0 写入 RQWPTRDBADDi、SQPIi、CQHEADi、RQCIi、STATRQPIDBi、STATCURSQPTRi、SQPSNi、LSTRQREQi 和 STATMSN 寄存器来重置 QP 指针,然后通过写入 QPCONFi 寄存器来禁用 QP 并将其保留在恢复模式中。
  5. 在重置指针后,应通过写入 XRNIC_ADV_CONF 寄存器来禁用软件覆盖。
  6. 此后,软件应该释放为 SQ、RQ 和 CQ 分配的内存。

QP致命错误恢复

以下步骤描述了进入致命状态的 QP 的恢复过程。它描述了如何清除 QP 上的现有流量并重新初始化它,以便可以重新使用它。
清除 QP 流量的步骤:

  1. 在检测到 QP 处于致命中断状态时,读取 IPKTERRQBA 寄存器以获取由驱动程序写入的传入数据包错误状态队列基地址。
  2. 读取该基地址以获取 QP 的致命状态并确定哪个 QP 进入了致命状态(位[31:16]),并检查 QP 的致命状态代码(位[15:0]),详见表2-4。
  3. 停止推送任何进一步的 SQ PI 门铃。
  4. 将 QPCONFi 寄存器中的“QP under recovery”位设置为 1。
  5. 读取 STATQPi 寄存器以检查“send Q empty”和“outstanding Q empty”位是否变为 1。
  6. 轮询 CQHEADi 寄存器,以检查其值是否与 SQPIi 寄存器相同。
  7. 轮询 RESP_HND_STS 寄存器,以检查“sq pici db check en”——第16位是否被设置。
  8. 将 QPCONFi 寄存器中的“QP enable”位设置为 0,将“QP under recovery”位设置为 1。

重新初始化 QP 的步骤:

  1. 轮询 CQHEADi 寄存器,以检查其值是否与 SQPIi 寄存器相同。
  2. 轮询 RESP_HND_STS 寄存器,以检查“sq pici db check en”——第16位是否被设置。
  3. 将 XRNICADCONF 寄存器中的“SW OVERWRIDE”位设置为 1。
  4. 将以下 QP 寄存器初始化为 0:
    • STATRQPIDBi
    • STATRQBUFCAi
    • STATRQBUFCAMSBi
    • RQCIi
    • STATCURSQPTRi
    • SQPIi
    • SQPSNi
    • LSTRQREQi
    • STATMSN
    • CQHEADi
  5. 轮询 CQHEADi 寄存器,以检查其值是否为 0。
  6. 用新值初始化以下寄存器:
    • SQPSNi
    • LSTRQREQi
  7. 初始化以下以太网侧的寄存器:
    • MACDESADDMSBi
    • MACDESADDLSBi
    • IPDESADDR1i
    • IPDESADDR2i
    • IPDESADDR3i
    • IPDESADDR4i
  8. 在 QPCONFi 中重新配置 IP 版本。
  9. 在 STATQPi 寄存器中重新初始化“RNR nack count”和“retry count”。
  10. 将 ACCESSDESC 寄存器的“access type”设置为 'b10。
  11. 通过重新初始化“RQ 中断使能”、“CQ 中断使能”、“PMTU”和“HW 握手禁用”等字段,重新编程 QPCONFi 寄存器。选择性地启用“CQE 写入使能”以调试错误完成,并重新初始化“RQ 缓冲区大小”。
  12. 通过随机设置“Traffic class”、“Time to live”和“Partition key”,重新编程 QPADVCONFi 寄存器。
  13. 将 QPCONFi 寄存器中的“QP EN”设置为 1,将“QP under recovery”设置为 0。
  14. 清除 XRNICADCONF 寄存器中的“SW OVERWRIDE”位,将其设置为 0。
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值