9.1.16. Intel IPU6 驱动程序

作者:曹冰步 <bingbu.cao@intel.com>

9.1.16.1. 概述

Intel IPU6 是英特尔图像处理单元的第六代产品,用于某些英特尔芯片组,如 Tiger Lake、Jasper Lake、Alder Lake、Raptor Lake 和 Meteor Lake。IPU6 由两个主要系统组成:输入系统 (ISYS) 和处理系统 (PSYS)。IPU6 在 PCI 总线上显示为单个设备,可以通过 lspci 找到

0000:00:05.0 多媒体 控制器: 英特尔 公司 设备 xxxx (修订版 xx)

IPU6 在 PCI 配置空间中有一个 16 MB 的 BAR,用于驱动程序可见的 MMIO 寄存器。

9.1.16.2. 支撑结构

IPU6 通过支撑结构连接到系统结构,这使得主机驱动程序能够控制 IPU6,它还允许 IPU6 访问系统内存以存储和加载帧像素流以及任何其他元数据。

支撑结构主要管理几个系统功能:电源管理、中断处理、固件身份验证和全局定时器同步。

9.1.16.2.1. ISYS 和 PSYS 电源流

IPU6 驱动程序通过在函数中设置 ISYS 和 PSYS 的支撑结构频率控制寄存器(IPU6_BUTTRESS_REG_IS_FREQ_CTLIPU6_BUTTRESS_REG_PS_FREQ_CTL),初始化 ISYS 和 PSYS 的上电或断电请求

int ipu6_buttress_power(...)

支撑结构将请求转发到 Punit,在 Punit 执行上电流程后,支撑结构通过更新电源状态寄存器来指示驱动程序 ISYS 或 PSYS 已上电。

注意

由于硬件限制,ISYS 上电需要在 PSYS 上电之前进行,ISYS 断电需要在 PSYS 断电之后进行。

9.1.16.2.2. 中断

IPU6 中断可以生成为 MSI 或 INTA,当 ISYS、PSYS、支撑结构事件或错误发生时,会触发中断,驱动程序可以通过读取中断状态寄存器 BUTTRESS_REG_ISR_STATUS 来获取中断原因,驱动程序清除 irq 状态,然后调用特定的 ISYS 或 PSYS irq 处理程序。

irqreturn_t ipu6_buttress_isr(int irq, ...)

9.1.16.2.3. 安全性和固件身份验证

为了解决 IPU6 固件安全问题,IPU6 固件需要在 IPU6 内部处理器上执行之前进行身份验证过程。IPU6 驱动程序将与融合安全引擎 (CSE) 协同工作以完成身份验证过程。CSE 负责验证 IPU6 固件。经过身份验证的固件二进制文件将复制到隔离的内存区域。固件身份验证过程由 CSE 实施,遵循与 IPU6 驱动程序的 IPC 握手。CSE 和 IPU6 驱动程序使用一些支撑结构寄存器,通过 IPC 相互通信。

int ipu6_buttress_authenticate(...)

9.1.16.2.4. 全局定时器同步

每次启动相机操作时,IPU6 驱动程序都会启动一个 Hammock Harbor 同步流程。IPU6 将支撑结构中的内部计数器与 SoC 时间的副本同步,该计数器保持最新时间,直到相机操作停止。IPU6 驱动程序可以使用此时间计数器,根据固件响应事件中的时间戳来校准时间戳。

int ipu6_buttress_start_tsc_sync(...)

9.1.16.3. DMA 和 MMU

IPU6 有自己的标量处理器,固件在该处理器上运行,并有一个内部 32 位虚拟地址空间。IPU6 具有 MMU 地址转换硬件,允许标量处理器通过 IPU6 虚拟地址访问内部内存和外部系统内存。地址转换基于存储在系统内存中的两级页面查找表,这些表由 IPU6 驱动程序维护。IPU6 驱动程序将 1 级页面表基地址设置为 MMU 寄存器,并允许 MMU 执行页面表查找。

IPU6 驱动程序导出其自己的 DMA 操作。IPU6 驱动程序将为每个 DMA 操作更新页面表条目,并在每次取消映射和释放后使 MMU TLB 失效。

9.1.16.4. 固件文件格式

IPU6 固件采用代码分区目录 (CPD) 文件格式。CPD 固件包含一个 CPD 标头、多个 CPD 条目和组件。CPD 组件包括 3 个条目 - 清单、元数据和模块数据。清单和元数据由 CSE 定义,并由 CSE 用于身份验证。模块数据是 IPU6 特有的,其中包含称为包目录的固件的二进制数据。IPU6 驱动程序(特别是 ipu6-cpd.c)解析并验证 CPD 固件文件,获取 IPU6 固件的包目录二进制数据,将其复制到特定的 DMA 缓冲区,并将其基地址设置为支撑结构的 FW_SOURCE_BASE 寄存器。最后,CSE 将对此固件二进制文件进行身份验证。

9.1.16.5. Syscom 接口

IPU6 驱动程序通过 Syscom ABI 与固件通信。Syscom 是 IPU 标量处理器和 CPU 之间的处理器间通信机制。固件和软件之间共享许多资源。消息队列所在的系统内存区域,固件可以通过 IPU MMU 访问该内存区域。Syscom 队列是 FIFO 固定深度队列,具有可配置数量的令牌(消息)。还有一些公共 IPU6 MMIO 寄存器,其中包含队列读取和写入索引。软件和固件充当队列中令牌的生产者和使用者,并在发送或接收每个消息时分别更新写入和读取索引。

在启动和开始与固件通信之前,IPU6 驱动程序必须准备和配置输入和输出队列的数量,配置每个队列的令牌计数和每个令牌的大小。固件和软件必须使用相同的配置。IPU6 支撑结构有许多固件启动参数寄存器,可用于存储配置地址和初始化 Syscom 状态,然后驱动程序可以通过设置标量处理器控制状态寄存器来请求固件启动和运行。

9.1.16.6. 输入系统

IPU6 输入系统由 MIPI D-PHY 和多个 CSI-2 接收器组成。它可以从相机传感器或其他 MIPI CSI-2 输出设备捕获图像像素数据。

9.1.16.6.1. D-PHY 和 CSI-2 端口通道映射

IPU6 在不同的 SoC 上集成了不同的 D-PHY IP。在 Tiger Lake 和 Alder Lake 上,IPU6 集成了 MCD10 D-PHY;Jasper Lake 上的 IPU6SE 集成了 JSL D-PHY;而 Meteor Lake 上的 IPU6EP 集成了 Synopsys DWC D-PHY。在 D-PHY 和 CSI-2 接收器控制器之间存在一个适配层,其中包括端口配置、PHY 封装或用于 D-PHY 的私有测试接口。有 3 个 D-PHY 驱动程序 ipu6-isys-mcd-phy.cipu6-isys-jsl-phy.cipu6-isys-dwc-phy.c,分别用于编程 IPU6 中的上述 3 个 D-PHY。

不同的 IPU6 版本具有不同的 D-PHY 通道映射。在 Tiger Lake 上,有 12 个数据通道和 8 个时钟通道,IPU6 最多支持 8 个 CSI-2 端口,更多信息请参阅 ipu6-isys-mcd-phy.c 中的 PPI 映射。在 Jasper Lake 和 Alder Lake 上,D-PHY 有 8 个数据通道和 4 个时钟通道,IPU6 最多支持 4 个 CSI-2 端口。对于 Meteor Lake,D-PHY 有 12 个数据通道和 6 个时钟通道,因此 IPU6 最多支持 6 个 CSI-2 端口。

注意

每对 CSI-2 端口都是一个可以共享数据通道的单元。例如,对于 CSI-2 端口 0 和 1,CSI-2 端口 0 最多支持 4 个数据通道,CSI-2 端口 1 最多支持 2 个数据通道。具有 2 个数据通道的 CSI-2 端口 0 可以与具有 2 个数据通道的 CSI-2 端口 1 一起工作。如果尝试使用具有 4 个通道的 CSI-2 端口 0,则 CSI-2 端口 1 将不可用,因为 4 个数据通道由 CSI-2 端口 0 和 1 共享。同样适用于 CSI 端口 2/3、4/5 和 7/8。

9.1.16.6.2. ISYS 固件 ABI

IPU6 固件为软件访问实现了一系列 ABI。通常,软件首先准备流配置 struct ipu6_fw_isys_stream_cfg_data_abi,并通过发送 STREAM_OPEN 命令将配置发送到固件。流配置包括输入引脚和输出引脚。输入引脚 struct ipu6_fw_isys_input_pin_info_abi 定义了输入源的分辨率和数据类型,输出引脚 struct ipu6_fw_isys_output_pin_info_abi 定义了输出分辨率、步幅和帧格式等。

一旦驱动程序从固件收到中断,表明流已成功打开,驱动程序将发送 STREAM_STARTSTREAM_CAPTURE 命令,以请求固件开始捕获图像帧。STREAM_CAPTURE 命令将缓冲区通过 struct ipu6_fw_isys_frame_buff_set 排队到固件。然后,软件等待来自固件的中断和响应。PIN_DATA_READY 表示特定输出引脚上的缓冲区已准备就绪,然后软件可以将缓冲区返回给用户。

注意

请参阅示例,了解如何通过 IPU6 ISYS 驱动程序进行捕获。