顯示核心下一代 (DCN)

為了讓讀者掌握 AMD 顯示核心下一代 (DCN) 的基本工作原理,我們需要從硬體流水線的概述開始。 下面您可以看到一張提供 DCN 概述的圖片,請記住,這是一個通用圖,每個 ASIC 都有變體。

../../../_images/dc_pipeline_overview.svg

基於這張圖,我們可以遍歷每個塊並簡要描述它們

  • 顯示控制器集線器 (DCHUB):這是可擴充套件資料埠 (SDP) 和 DCN 之間的閘道器。 此元件具有多種功能,例如記憶體仲裁、旋轉和游標操作。

  • 顯示管道和平面 (DPP):此塊提供預混合畫素處理,例如顏色空間轉換、畫素資料線性化、色調對映和色域對映。

  • 多管道/平面組合 (MPC):此元件使用全域性或每畫素 alpha 執行多個平面的混合。

  • 輸出畫素處理 (OPP):處理和格式化畫素以傳送到顯示器。

  • 輸出管道時序組合器 (OPTC):它生成時間輸出以組合流或劃分能力。 CRC 值在此塊中生成。

  • 顯示輸出 (DIO):將輸出編碼到連線到我們 GPU 的顯示器。

  • 顯示回寫 (DWB):它提供將顯示管道的輸出作為影片幀寫回記憶體的能力。

  • 多媒體集線器 (MMHUBBUB):用於 DMCUB 和 DWB 的記憶體控制器介面(請注意,DWB 尚未連線)。

  • DCN 管理單元 (DMU):它提供帶有訪問控制的暫存器,並將控制器中斷到 SOC 主機中斷單元。 此塊包括顯示微控制器單元 - B 版本 (DMCUB),它透過韌體處理。

  • DCN 時鐘發生器塊 (DCCG):它為所有顯示控制器時鐘域提供時鐘和復位。

  • Azalia (AZ):音訊引擎。

上面的圖是 DCN 的架構概括,這意味著每個 ASIC 都有圍繞這個基本模型的變體。 請注意,顯示管道透過 DCHUB 連線到可擴充套件資料埠 (SDP); 您可以將 SDP 視為我們資料結構中為顯示管道提供資料的元素。

始終將 DCN 架構視為可以以多種方式配置和重新配置的靈活事物; 換句話說,可以根據使用者空間的需求相應地設定或忽略每個塊。 例如,如果我們想驅動一個啟用 DSC 的 8k@60Hz,我們的 DCN 可能需要 4 個 DPP 和 2 個 OPP。 DC 的職責是為每個特定場景驅動最佳配置。 將所有這些元件協調在一起需要一個複雜的通訊介面,該介面在圖中由連線每個塊的邊突出顯示; 從圖表中可以看出,這些塊之間的每個連線代表

  1. 畫素資料介面(紅色):表示畫素資料流;

  2. 全域性同步訊號(綠色):它是由 VStartup、VUpdate 和 VReady 組成的一組同步訊號;

  3. 配置介面:負責配置塊;

  4. 邊帶訊號:所有不符合前一個的訊號。

這些訊號至關重要,並在 DCN 中發揮重要作用。 然而,全域性同步值得在下一節中詳細描述。

所有這些元件都由一個名為 dc_state 的資料結構表示。 從 DCHUB 到 MPC,我們有一個名為 dc_plane 的表示; 從 MPC 到 OPTC,我們有 dc_stream,輸出 (DIO) 由 dc_link 處理。 請記住,HUBP 使用從記憶體讀取的特定格式訪問表面,並且我們的 dc_plane 應該努力將平面中的所有畫素轉換為可以透過 dc_stream 和 dc_link 傳送到顯示器的東西。

前端和後端

顯示管道可以分解為通常稱為前端 (FE)後端 (BE) 的兩個元件,其中 FE 包括

  • DCHUB(主要指名為 HUBP 的子元件)

  • DPP

  • MPC

另一方面,BE 包括

  • OPP

  • OPTC

  • DIO (DP/HDMI 流編碼器和鏈路編碼器)

OPP 和 OPTC 是 FE 和 BE 之間的兩個連線塊。 順便說一句,這是鏈路編碼器到 PHY 的一對一對映,但我們可以配置 DCN 以選擇將哪個鏈路編碼器連線到哪個 PHY。 FE 的主要職責是更改、混合和組合畫素資料,而 BE 的工作是將通用畫素流構架為特定顯示的畫素流。

資料流

最初,資料以原生畫素格式透過資料結構 (DF) 從 VRAM 傳入。 這種資料格式一直保持到 DCHUB 中的 HUBP,HUBP 在這裡解壓縮不同的畫素格式,並透過 4 個通道(1 個用於 alpha + 3 個用於顏色)以統一的流將它們輸出到 DPP。

DPP 中的轉換器和游標 (CNVC) 然後將規範化資料表示形式,並將它們轉換為 DCN 特定的浮點格式(即,不同於 IEEE 浮點格式)。 在此過程中,CNVC 還應用一個反伽瑪函式,將資料從非線性空間轉換為線性空間,以放鬆後續的浮點計算。 資料將以這種浮點格式從 DPP 保持到 OPP。

從 OPP 開始,因為顏色轉換和混合已經完成(即,可以刪除 alpha),並且最終接收器不需要浮點提供的精度和動態範圍(即,所有顯示器都是整數深度格式),因此位深度減少/抖動會啟動。 在 OPP 中,我們還將應用一個反伽瑪函式,以將先前刪除的伽瑪重新引入。 最終,我們以整數格式在 DIO 輸出資料。

AMD 硬體流水線

在討論 Linux 上的圖形時,流水線術語有時可能被過度使用,具有多種含義,因此重要的是定義我們所說的流水線的含義。 在 DCN 驅動程式中,我們使用術語硬體流水線流水線或僅管道作為一種抽象,以指示例項化的一系列 DCN 塊,以解決某些特定配置。 DC 核心將 DCN 塊視為單個資源,這意味著我們可以透過獲取所有單個硬體塊的資源來構建一個管道來組成一個管道。 實際上,我們無法將一個管道中的任意塊連線到另一個管道中的塊; 它們是線性路由的,除了 DSC,它可以根據需要任意分配。 我們有這個流水線概念是為了嘗試最佳化頻寬利用率。

../../../_images/pipeline_4k_no_split.svg

此外,讓我們看一下 DTN 日誌的一部分(有關更多資訊,請參見“顯示核心除錯工具”),因為此日誌可以幫助我們即時檢視此流水線行為的一部分

HUBP:  format  addr_hi  width  height ...
[ 0]:      8h      81h   3840    2160
[ 1]:      0h       0h      0       0
[ 2]:      0h       0h      0       0
[ 3]:      0h       0h      0       0
[ 4]:      0h       0h      0       0
...
MPCC:  OPP  DPP ...
[ 0]:   0h   0h ...

從圖和 DTN 日誌中首先要注意的是,我們 DCN 塊的每個部分都有不同的時鐘域。 在此示例中,我們只有一個流水線,其中資料從 DCHUB 流向 DIO,正如我們憑直覺所期望的那樣。 儘管如此,如前所述,DCN 是靈活的,我們可以以不同的方式拆分這單個管道,如下面的圖所示

../../../_images/pipeline_4k_split.svg

現在,如果我們再次檢查 DTN 日誌,我們可以看到一些有趣的變化

HUBP:  format  addr_hi  width  height ...
[ 0]:      8h      81h   1920    2160 ...
...
[ 4]:      0h       0h      0       0 ...
[ 5]:      8h      81h   1920    2160 ...
...
MPCC:  OPP  DPP ...
[ 0]:   0h   0h ...
[ 5]:   0h   5h ...

從上面的示例中,我們現在將顯示管道分成兩個 1920x2160 的垂直部分(即 3440x2160),因此,我們可以降低 DPP 部分中的時鐘頻率。 這不僅對於節省功耗很有用,而且對於更好地處理所需的吞吐量也很有用。 這裡要記住的是,管道配置可能會根據顯示配置而變化很大,並且 DML 的職責是為我們的硬體支援的多種場景設定所有必需的配置引數。

全域性同步

許多 DCN 暫存器都是雙緩衝的,最重要的是表面地址。 這使我們能夠以原子方式更新 DCN 硬體以進行頁面翻轉,以及大多數其他不需要啟用或停用新管道的更新。

(注意:在許多情況下,DC 會決定保留額外的管道,以支援需要非常高的畫素時鐘的輸出,或出於省電的目的。)

這些原子暫存器更新由 DCN 中的全域性同步訊號驅動。 為了瞭解原子更新如何與 DCN 硬體互動,以及 DCN 如何發出頁面翻轉和垂直消隱事件的訊號,瞭解全域性同步的程式設計方式很有幫助。

全域性同步由三個訊號組成:VSTARTUP、VUPDATE 和 VREADY。 這些訊號由顯示模式庫 - DML (drivers/gpu/drm/amd/display/dc/dml) 基於大量引數計算得出,並確保我們的硬體能夠在任何給定的系統配置中為 DCN 管道提供資料,而不會出現下溢或掛起。 全域性同步訊號始終發生在垂直消隱期間,獨立於 VSync 訊號,並且彼此不重疊。

VUPDATE 是驅動程式堆疊或使用者空間客戶端唯一感興趣的訊號,因為它表示硬體鎖定到原子程式設計的(即雙緩衝)暫存器的點。 即使它獨立於 VSync 訊號,我們也使用 VUPDATE 來發出 VSync 事件的訊號,因為它提供了有關原子提交和硬體如何互動的最佳指示。

由於 DCN 硬體是雙緩衝的,因此 DC 驅動程式能夠在幀的任何時間點對硬體進行程式設計。

下圖說明了全域性同步訊號

../../../_images/global_sync_vblank.svg

這些訊號會影響核心 DCN 行為。 如果程式設計不正確,將導致許多負面後果,其中大多數是災難性的。

下圖顯示了全域性同步如何允許郵箱樣式的更新,即它允許在 VUpdate 事件之間進行多次重新配置,其中只有在 VUpdate 訊號之前程式設計的最後一個配置才生效。

../../../_images/config_example.svg