DPAA2 (数据路径加速架构第二代) 概述

版权所有:

© 2015 Freescale Semiconductor Inc.

版权所有:

© 2018 NXP

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

简介

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

一个名为管理复合体 (MC) 的 DPAA2 硬件组件管理 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 对象。在下面的示例图中,容器中有 5 种类型的 8 个对象(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”的新总线类型,并实现总线回调(例如,匹配/uevent/dev_groups)

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

  • 创建一个 MSI IRQ 域

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

可以在Documentation/devicetree/bindings/misc/fsl,qoriq-mc.yaml中查看 MC 总线设备树节点的绑定。可以在Documentation/ABI/testing/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 是一个片外、板级特定的组件,由相应的 PHY 驱动程序通过 mdio 总线进行管理。MAC 驱动程序充当 PHY 驱动程序和 MC 之间的代理。它通过向 DPMAC 对象发送 MC 命令来实现代理功能。如果 PHY 驱动程序发出链路更改信号,则 MAC 驱动程序会通过 DPMAC 命令通知 MC。如果网络接口被启动或关闭,MC 会通过中断通知 DPMAC 驱动程序,驱动程序可以采取相应的操作。