9.1.16. Intel IPU6 驱动程序¶
作者:Bingbu Cao <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 (rev 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_CTL
和 IPU6_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 驱动程序每次启动相机操作时都会启动一个吊床港同步流程。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.c
、ipu6-isys-jsl-phy.c
和 ipu6-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_START
和 STREAM_CAPTURE
命令以请求固件开始捕获图像帧。STREAM_CAPTURE
命令使用 struct ipu6_fw_isys_frame_buff_set
将缓冲区排队到固件,然后软件等待来自固件的中断和响应,PIN_DATA_READY
表示缓冲区在特定输出引脚上已准备好,然后软件可以将缓冲区返回给用户。
注意
请参阅 示例,了解如何通过 IPU6 ISYS 驱动程序进行捕获。