DPAA2 (数据路径加速架构 Gen2) 概述

版权所有:

© 2015 Freescale Semiconductor Inc.

版权所有:

© 2018 NXP

本文档概述了 Freescale DPAA2 架构以及它如何集成到 Linux 内核中。

简介

DPAA2 是一种为高速网络数据包处理而设计的硬件架构。 DPAA2 包含用于处理以太网数据包、队列管理、缓冲区管理、自主 L2 交换、虚拟以太网桥接和加速器(例如加密)共享的复杂机制。

DPAA2 硬件组件(称为管理复合体 (MC))管理 DPAA2 硬件资源。 MC 为软件驱动程序提供基于对象的抽象,以使用 DPAA2 硬件。 MC 使用 DPAA2 硬件资源(例如队列、缓冲区池和网络端口)来创建功能对象/设备,例如网络接口、L2 交换机或加速器实例。 MC 提供内存映射的 I/O 命令接口(MC 门户),DPAA2 软件驱动程序使用这些接口来操作 DPAA2 对象。

下图显示了 DPAA2 资源管理架构的概述

+--------------------------------------+
|                  OS                  |
|                        DPAA2 drivers |
|                             |        |
+-----------------------------|--------+
                              |
                              | (create,discover,connect
                              |  config,use,destroy)
                              |
                 DPAA2        |
+------------------------| mc portal |-+
|                             |        |
|   +- - - - - - - - - - - - -V- - -+  |
|   |                               |  |
|   |   Management Complex (MC)     |  |
|   |                               |  |
|   +- - - - - - - - - - - - - - - -+  |
|                                      |
| Hardware                  Hardware   |
| Resources                 Objects    |
| ---------                 -------    |
| -queues                   -DPRC      |
| -buffer pools             -DPMCP     |
| -Eth MACs/ports           -DPIO      |
| -network interface        -DPNI      |
|  profiles                 -DPMAC     |
| -queue portals            -DPBP      |
| -MC portals                ...       |
|  ...                                 |
|                                      |
+--------------------------------------+

MC 调节诸如创建、发现、连接、配置和销毁等操作。 数据上的快速通道操作(例如数据包传输/接收)不由 MC 调节,而是直接使用 DPIO 对象中的内存映射区域完成。

DPAA2 对象概述

本节简要概述了一些关键的 DPAA2 对象。 描述了一个简单的场景,说明了创建网络接口所涉及的对象。

DPRC(数据路径资源容器)

DPRC 是一个容器对象,其中包含所有其他类型的 DPAA2 对象。 在下面的示例图中,容器中有 8 个对象,类型为 5 种(DPMCP、DPIO、DPBP、DPNI 和 DPMAC)。

+---------------------------------------------------------+
| DPRC                                                    |
|                                                         |
|  +-------+  +-------+  +-------+  +-------+  +-------+  |
|  | DPMCP |  | DPIO  |  | DPBP  |  | DPNI  |  | DPMAC |  |
|  +-------+  +-------+  +-------+  +---+---+  +---+---+  |
|  | DPMCP |  | DPIO  |                                   |
|  +-------+  +-------+                                   |
|  | DPMCP |                                              |
|  +-------+                                              |
|                                                         |
+---------------------------------------------------------+

从操作系统的角度来看,DPRC 的行为类似于即插即用总线,例如 PCI。 DPRC 命令可用于枚举 DPRC 的内容,发现存在的硬件对象(包括可映射区域和中断)。

DPRC.1 (bus)
   |
   +--+--------+-------+-------+-------+
      |        |       |       |       |
    DPMCP.1  DPIO.1  DPBP.1  DPNI.1  DPMAC.1
    DPMCP.2  DPIO.2
    DPMCP.3

可以动态创建和销毁硬件对象,从而能够热插拔进出 DPRC 的对象。

DPRC 具有可映射的 MMIO 区域(MC 门户),可用于发送 MC 命令。 它具有用于状态事件(如热插拔)的中断。 容器中的所有对象共享相同的硬件“隔离上下文”。 这意味着,对于 IOMMU,隔离粒度位于 DPRC(容器)级别,而不是位于单个对象级别。

可以通过传递给 MC 的配置文件(固件启动时)静态定义 DPRC 并使用对象填充它。

以太网网络接口的 DPAA2 对象

典型的以太网 NIC 是单片的——NIC 设备包含 TX/RX 队列机制、配置机制、缓冲区管理、物理端口和中断。 DPAA2 使用更精细的方法,利用多个硬件对象。 每个对象提供专门的功能。 软件使用这些对象的组来提供以太网网络接口功能。 这种方法提供了有限硬件资源的有效利用、灵活性和性能优势。

下图显示了具有 2 个 CPU 的系统上简单网络接口配置所需的对象。

+---+---+ +---+---+
   CPU0     CPU1
+---+---+ +---+---+
    |         |
+---+---+ +---+---+
   DPIO     DPIO
+---+---+ +---+---+
    \     /
     \   /
      \ /
   +---+---+
      DPNI  --- DPBP,DPMCP
   +---+---+
       |
       |
   +---+---+
     DPMAC
   +---+---+
       |
   port/PHY

下面描述了这些对象。 对于每个对象,都会提供一个简短的描述,以及该对象支持的操作类型的摘要以及该对象的主要资源(MMIO 区域和 IRQ)的摘要。

DPMAC(数据路径以太网 MAC)

表示以太网 MAC,一种连接到以太网 PHY 的硬件设备,允许以太网帧的物理传输和接收。

  • MMIO 区域:无

  • IRQ:DPNI 链接更改

  • 命令:设置链路启动/关闭、链路配置、获取统计信息、IRQ 配置、启用、重置

DPNI(数据路径网络接口)

包含 TX/RX 队列、网络接口配置和 RX 缓冲区池配置机制。 TX/RX 队列位于内存中,并由队列号标识。

  • MMIO 区域:无

  • IRQ:链路状态

  • 命令:端口配置、卸载配置、队列配置、解析/分类配置、IRQ 配置、启用、重置

DPIO(数据路径 I/O)

提供用于排队和取消数据包以及执行硬件缓冲区池管理操作的接口。 DPAA2 架构将访问队列的机制(DPIO 对象)与队列本身分开。 DPIO 提供 MMIO 接口来排队/取消数据包。 为了排队,将一个描述符写入 DPIO MMIO 区域,其中包括目标队列号。 通常会为每个 CPU 分配一个 DPIO。 这允许所有 CPU 同时执行排队/取消排队操作。 预计 DPIO 将由不同的 DPAA2 驱动程序共享。

  • MMIO 区域:队列操作、缓冲区管理

  • IRQ:数据可用性、拥塞通知、缓冲区池耗尽

  • 命令:IRQ 配置、启用、重置

DPBP(数据路径缓冲区池)

表示硬件缓冲区池。

  • MMIO 区域:无

  • IRQ:无

  • 命令:启用、重置

DPMCP(数据路径 MC 门户)

提供 MC 命令门户。 驱动程序使用它向 MC 发送命令以管理对象。

  • MMIO 区域:MC 命令门户

  • IRQ:命令完成

  • 命令:IRQ 配置、启用、重置

对象连接

某些对象具有必须配置的显式关系

  • DPNI <--> DPMAC

  • DPNI <--> DPNI

  • DPNI <--> L2 交换机端口

    DPNI 必须连接到 DPMAC、另一个 DPNI 或 L2 交换机端口等对象。 DPNI 连接是通过 DPRC 命令建立的。

+-------+  +-------+
| DPNI  |  | DPMAC |
+---+---+  +---+---+
    |          |
    +==========+
  • DPNI <--> DPBP

    网络接口需要一个“缓冲区池”(DPBP 对象),它提供一个指向内存的指针列表,接收到的以太网数据将复制到该内存中。 以太网驱动程序配置与网络接口关联的 DPBP。

中断

DPAA2 对象生成的所有中断都是消息中断。 在硬件级别,设备生成的消息中断通常具有 3 个组件——1)在硬件总线上表达的不可欺骗的“设备 ID”,2)一个地址,3)一个数据值。

对于 DPAA2 设备/对象,同一容器/DPRC 中的所有对象共享相同的“设备 ID”。 对于基于 ARM 的 SoC,这与流 ID 相同。

DPAA2 Linux 驱动程序概述

本节概述了 DPAA2 的 Linux 内核驱动程序——1)总线驱动程序和关联的“DPAA2 基础架构”驱动程序,以及 2)功能对象驱动程序(例如以太网)。

如前所述,DPRC 是一个包含其他类型 DPAA2 对象的容器。 它在功能上类似于即插即用总线控制器。 DPRC 中的每个对象都是 Linux“设备”并绑定到驱动程序。 下图显示了网络场景中涉及的 Linux 驱动程序以及绑定到每个驱动程序的对象。 下面是每个驱动程序的简要说明。

                                     +------------+
                                     | OS Network |
                                     |   Stack    |
         +------------+              +------------+
         | Allocator  |. . . . . . . |  Ethernet  |
         |(DPMCP,DPBP)|              |   (DPNI)   |
         +-.----------+              +---+---+----+
          .          .                   ^   |
         .            .     <data avail, |   | <enqueue,
        .              .     tx confirm> |   | dequeue>
+-------------+         .                |   |
| DPRC driver |          .           +---+---V----+     +---------+
|   (DPRC)    |           . . . . . .| DPIO driver|     |   MAC   |
+----------+--+                      |  (DPIO)    |     | (DPMAC) |
           |                         +------+-----+     +-----+---+
           |<dev add/remove>                |                 |
           |                                |                 |
  +--------+----------+                     |              +--+---+
  |   MC-bus driver   |                     |              | PHY  |
  |                   |                     |              |driver|
  |   /bus/fsl-mc     |                     |              +--+---+
  +-------------------+                     |                 |
                                            |                 |
========================= HARDWARE =========|=================|======
                                          DPIO                |
                                            |                 |
                                          DPNI---DPBP         |
                                            |                 |
                                          DPMAC               |
                                            |                 |
                                           PHY ---------------+
============================================|========================

下面提供了每个驱动程序的简要说明。

MC 总线驱动程序

MC 总线驱动程序是一个平台驱动程序,并且是从设备树中的节点(兼容“fsl,qoriq-mc”)探测的,由引导固件传入。 它负责引导 DPAA2 内核基础架构。 主要功能包括

  • 向内核注册一个名为“fsl-mc”的新总线类型,并实现总线回调(例如 match/uevent/dev_groups)

  • 实现 DPAA2 驱动程序注册和设备添加/删除的 API

  • 创建 MSI IRQ 域

  • 执行“设备添加”以公开“根”DPRC,进而触发根 DPRC 与 DPRC 驱动程序的绑定

可以在 Documentation/devicetree/bindings/misc/fsl,qoriq-mc.yaml 中查阅 MC 总线设备树节点的绑定。 可以在 ABI 文件测试/sysfs-bus-fsl-mc 中查阅 MC 总线的 sysfs 绑定/取消绑定接口。

DPRC 驱动程序

DPRC 驱动程序绑定到 DPRC 对象,并执行总线实例的运行时管理。 它执行 DPRC 的初始总线扫描,并处理容器事件(例如热插拔)的中断,方法是重新扫描 DPRC。

分配器

某些对象(例如 DPMCP 和 DPBP)是通用的且可互换的,旨在供其他驱动程序使用。 例如,DPAA2 以太网驱动程序需要

  • DPMCP 发送 MC 命令,配置网络接口

  • DPBP 用于网络缓冲区池

分配器驱动程序为这些可分配的对象类型注册,并且当探测总线时,这些对象绑定到分配器。 分配器维护一个对象池,其他 DPAA2 驱动程序可以使用这些对象进行分配。

DPIO 驱动程序

DPIO 驱动程序绑定到 DPIO 对象,并提供服务,允许其他驱动程序(例如以太网驱动程序)为其各自的对象排队和取消排队数据。 主要服务包括

  • 数据可用性通知

  • 硬件队列操作(数据的排队和取消排队)

  • 硬件缓冲区池管理

为了传输数据包,以太网驱动程序将数据放在队列上并调用 DPIO API。 对于接收,以太网驱动程序注册一个数据可用性通知回调。 要取消排队数据包,请使用 DPIO API。 通常每个物理 CPU 有一个 DPIO 对象以获得最佳性能,允许不同的 CPU 同时排队和取消排队数据。

DPIO 驱动程序代表内核中处于活动状态的所有 DPAA2 驱动程序运行——以太网、加密、压缩等。

以太网驱动程序

以太网驱动程序绑定到 DPNI,并实现将 DPAA2 网络接口连接到网络堆栈所需的内核接口。 每个 DPNI 对应于一个 Linux 网络接口。

MAC 驱动程序

以太网 PHY 是一个片外、特定于板的组件,并通过 mdio 总线由相应的 PHY 驱动程序管理。 MAC 驱动程序充当 PHY 驱动程序和 MC 之间的代理。 它通过 MC 命令对 DPMAC 对象执行此代理。 如果 PHY 驱动程序发出链路更改信号,则 MAC 驱动程序通过 DPMAC 命令通知 MC。 如果启动或关闭网络接口,MC 会通过中断通知 DPMAC 驱动程序,并且该驱动程序可以采取适当的措施。