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_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 驅動程式每次啟動相機操作時都會啟動一個吊床港同步流程。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 驅動程式進行捕獲。