核心驅動程式基礎設施

GPU 硬體結構

每個 ASIC 都是硬體塊的集合。 我們將它們稱為“IP”(智慧財產權塊)。 每個 IP 封裝了特定的功能。 IP 是有版本的,也可以混合和匹配。 例如,您可能有兩個不同的 ASIC,它們都具有 System DMA (SDMA) 5.x IP。 驅動程式按 IP 排列。 有驅動程式元件來處理每個 IP 的初始化和操作。 還有一些較小的 IP,實際上不需要太多驅動程式互動。 這些最終會被歸入 soc 檔案中的常見內容中。 soc 檔案(例如 vi.c、soc15.c nv.c)包含 SoC 本身方面的程式碼,而不是特定 IP。 例如,諸如 GPU 重置和暫存器訪問功能之類的東西是 SoC 相關的。

APU 包含的不僅僅是 CPU 和 GPU,它還包含所有平臺內容(音訊、USB、GPIO 等)。 此外,許多元件在 CPU、平臺和 GPU 之間共享(例如,SMU、PSP 等)。 特定元件(CPU、GPU 等)通常具有與其互動的介面,這些通用元件。 對於像 S0i3 這樣的東西,需要在所有元件之間進行大量的協調,但這可能有點超出本節的範圍。

關於 GPU,我們有以下主要 IP

GMC(圖形記憶體控制器)

這在較舊的 pre-vega 晶片上是一個專用 IP,但自 Vega 和更新的晶片以來,它在某種程度上變得分散。 它們現在為特定的 IP 或 IP 組配備了專用的記憶體集線器。 但是,我們在驅動程式中仍然將其視為單個元件,因為程式設計模型仍然非常相似。 這是 GPU 上的不同 IP 獲取記憶體(VRAM 或系統記憶體)的方式。 它還為每個程序 GPU 虛擬地址空間提供支援。

IH(中斷處理程式)

這是 GPU 上的中斷控制器。 所有 IP 都將其中斷饋送到此 IP,它將它們聚合到一組環形緩衝區中,驅動程式可以解析這些緩衝區以處理來自不同 IP 的中斷。

PSP(平臺安全處理器)

它處理 SoC 的安全策略並執行受信任的應用程式,並驗證和載入其他塊的韌體。

SMU(系統管理單元)

這是電源管理微控制器。 它管理整個 SoC。 驅動程式與它互動以控制時鐘、電壓、電源軌等電源管理功能。

DCN(下一代顯示控制器)

這是顯示控制器。 它處理顯示硬體。 在 顯示核心 中進行了更詳細的描述。

SDMA(系統 DMA)

這是一個多用途 DMA 引擎。 核心驅動程式將其用於各種用途,包括分頁和 GPU 頁表更新。 它也暴露給使用者空間,供使用者模式驅動程式(OpenGL、Vulkan 等)使用。

GC(圖形和計算)

這是圖形和計算引擎,即包含 3D 管道和著色器塊的塊。 這是 GPU 上迄今為止最大的塊。 3D 管道有大量的子塊。 除此之外,它還包含 CP 微控制器(ME、PFP、CE、MEC)和 RLC 微控制器。 它暴露給使用者空間,供使用者模式驅動程式(OpenGL、Vulkan、OpenCL 等)使用。 在 圖形 (GFX) 和計算 中提供了更多詳細資訊。

VCN(下一代影片核心)

這是多媒體引擎。 它處理影片和影像編碼和解碼。 它暴露給使用者空間,供使用者模式驅動程式(VA-API、OpenMAX 等)使用。

GFX、計算和 SDMA 總體行為

注意

為簡單起見,只要在本節中使用術語塊,它就表示 GFX、計算和 SDMA。

GFX、計算和 SDMA 共享一種類似的操作形式,可以對其進行抽象以方便理解這些塊的行為。 請參見下圖,該圖說明了這些塊的常見元件

../../_images/pipe_and_queue_abstraction.svg

在此圖的中心部分,您可以看到兩個硬體元件,一個稱為 管道,另一個稱為 佇列; 重要的是要強調佇列必須與管道相關聯,反之亦然。 每個特定的硬體 IP 可能具有不同數量的管道,進而具有不同數量的佇列; 例如,GFX 11 每個管道有兩個管道和兩個佇列,用於 GFX 前端。

管道是處理佇列中可用指令的硬體; 換句話說,它是一個執行插入佇列中的操作的執行緒。 管道的一個關鍵特徵是它們一次只能執行一個佇列; 無論硬體在管道中有多少個佇列,它每個管道只執行一個佇列。

管道具有在硬體級別在佇列之間交換的機制。 然而,它們僅利用被認為是對映的佇列。 管道可以基於以下任何輸入在佇列之間切換

  1. 命令流;

  2. 逐個資料包;

  3. 其他硬體請求更改(例如,MES)。

管道中的佇列由硬體佇列描述符 (HQD) 定義。 與 HQD 概念相關聯,我們有記憶體佇列描述符 (MQD),它負責儲存有關記憶體中每個可用佇列狀態的資訊。 佇列的狀態包含諸如佇列本身的 GPU 虛擬地址、儲存區域、門鈴等資訊。 MQD 還儲存 HQD 暫存器,這對於啟用或停用給定的佇列至關重要。 排程韌體(例如,MES)負責從 MQD 載入 HQD,反之亦然。

佇列切換過程也可能發生在韌體請求搶佔或取消對映佇列時。 韌體等待 HQD_ACTIVE 位變為低電平,然後將狀態儲存到 MQD 中。 為了使不同的佇列變為活動佇列,韌體將 MQD 狀態複製到 HQD 暫存器中並載入任何其他狀態。 最後,它將 HQD_ACTIVE 位設定為高電平,以指示佇列處於活動狀態。 然後,管道將執行來自活動佇列的工作。

驅動程式結構

通常,驅動程式具有特定 SoC 上所有 IP 的列表,並且對於諸如 init/fini/suspend/resume 之類的事情,或多或少只是遍歷列表並處理每個 IP。

一些有用的構造

KIQ(核心介面佇列)

這是核心驅動程式用來管理 GFX/計算引擎上的其他 gfx 和計算佇列的控制佇列。 您可以使用它來對映/取消對映其他佇列等。 這在 GFX 11 和更新的硬體上被 MES 取代。

IB(間接緩衝區)

特定引擎的命令緩衝區。 您可以將命令寫入記憶體塊中,而不是直接將命令寫入佇列中,然後將指向該記憶體的指標放入佇列中。 然後,硬體將跟蹤指標並執行記憶體中的命令,然後返回到環形緩衝區中的其餘命令。

記憶體域

AMDGPU_GEM_DOMAIN_CPU 不是 GPU 可訪問的系統記憶體。 如果存在壓力,此池中的記憶體可能會被交換到磁碟。

AMDGPU_GEM_DOMAIN_GTT GPU 可訪問的系統記憶體,透過 gart 對映到 GPU 的虛擬地址空間中。 Gart 記憶體線性化系統記憶體的非連續頁面,允許 GPU 以線性方式訪問系統記憶體。

AMDGPU_GEM_DOMAIN_VRAM 本地影片記憶體。 對於 APU,它是 BIOS 雕刻出的記憶體。

AMDGPU_GEM_DOMAIN_GDS 用於跨著色器執行緒共享資料的全域性片上資料儲存。

AMDGPU_GEM_DOMAIN_GWS 全域性波同步,用於同步裝置上所有波的執行。

AMDGPU_GEM_DOMAIN_OA 有序追加,由 3D 或計算引擎用於追加資料。

AMDGPU_GEM_DOMAIN_DOORBELL 門鈴。 它是用於向用戶模式佇列發出訊號的 MMIO 區域。

緩衝區物件

這定義了在 amdgpu_bo 緩衝區物件上進行操作的介面,該物件表示驅動程式使用的記憶體(VRAM、系統記憶體等)。 驅動程式為使用者空間提供 DRM/GEM API。 然後,DRM/GEM API 使用這些介面來建立/銷燬/設定緩衝區物件,然後由核心 TTM 記憶體管理器管理這些物件。 這些介面也供核心客戶端在內部使用,包括 gfx、uvd 等,用於 GPU 使用的核心管理分配。

bool amdgpu_bo_is_amdgpu_bo(struct ttm_buffer_object *bo)

檢查緩衝區物件是否為 amdgpu_bo

引數

struct ttm_buffer_object *bo

要檢查的緩衝區物件

描述

使用與物件關聯的銷燬函式來確定這是否為 amdgpu_bo

返回

如果物件屬於 amdgpu_bo,則為 true,否則為 false。

void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain)

設定緩衝區的放置位置

引數

struct amdgpu_bo *abo

amdgpu_bo 要設定放置位置的緩衝區物件

u32 domain

請求的域

描述

根據請求的域和緩衝區的標誌設定緩衝區的放置位置。

int amdgpu_bo_create_reserved(struct amdgpu_device *adev, unsigned long size, int align, u32 domain, struct amdgpu_bo **bo_ptr, u64 *gpu_addr, void **cpu_addr)

為核心使用建立保留的 BO

引數

struct amdgpu_device *adev

amdgpu 裝置物件

unsigned long size

新 BO 的大小

int align

新 BO 的對齊方式

u32 domain

將其放置在何處

struct amdgpu_bo **bo_ptr

用於初始化結構中的 BO

u64 *gpu_addr

固定 BO 的 GPU 地址

void **cpu_addr

可選的 CPU 地址對映

描述

為核心內部使用分配和固定 BO,並返回仍保留的 BO。

注意

對於 bo_ptr,僅當 bo_ptr 指向 NULL 時才建立新 BO。

返回

成功時為 0,否則為負錯誤程式碼。

int amdgpu_bo_create_kernel_at(struct amdgpu_device *adev, uint64_t offset, uint64_t size, struct amdgpu_bo **bo_ptr, void **cpu_addr)

在特定位置為核心使用建立 BO

引數

struct amdgpu_device *adev

amdgpu 裝置物件

uint64_t offset

BO 的偏移量

uint64_t size

BO 的大小

struct amdgpu_bo **bo_ptr

用於初始化結構中的 BO

void **cpu_addr

可選的 CPU 地址對映

描述

在 VRAM 中的特定偏移量處建立核心 BO。

返回

成功時為 0,否則為負錯誤程式碼。

int amdgpu_bo_create(struct amdgpu_device *adev, struct amdgpu_bo_param *bp, struct amdgpu_bo **bo_ptr)

建立一個 amdgpu_bo 緩衝區物件

引數

struct amdgpu_device *adev

amdgpu 裝置物件

struct amdgpu_bo_param *bp

要用於緩衝區物件的引數

struct amdgpu_bo **bo_ptr

指向緩衝區物件指標的指標

描述

建立 amdgpu_bo 緩衝區物件。

返回

成功時為 0,失敗時為負錯誤程式碼。

int amdgpu_bo_create_user(struct amdgpu_device *adev, struct amdgpu_bo_param *bp, struct amdgpu_bo_user **ubo_ptr)

建立 amdgpu_bo_user 緩衝區物件

引數

struct amdgpu_device *adev

amdgpu 裝置物件

struct amdgpu_bo_param *bp

要用於緩衝區物件的引數

struct amdgpu_bo_user **ubo_ptr

指向緩衝區物件指標的指標

描述

建立一個要由使用者應用程式使用的 BO;

返回

成功時為 0,失敗時為負錯誤程式碼。

int amdgpu_bo_create_vm(struct amdgpu_device *adev, struct amdgpu_bo_param *bp, struct amdgpu_bo_vm **vmbo_ptr)

建立 amdgpu_bo_vm 緩衝區物件

引數

struct amdgpu_device *adev

amdgpu 裝置物件

struct amdgpu_bo_param *bp

要用於緩衝區物件的引數

struct amdgpu_bo_vm **vmbo_ptr

指向緩衝區物件指標的指標

描述

建立一個用於 GPUVM 的 BO。

返回

成功時為 0,失敗時為負錯誤程式碼。

int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr)

對映 amdgpu_bo 緩衝區物件

引數

struct amdgpu_bo *bo

要對映的 amdgpu_bo 緩衝區物件

void **ptr

要返回的核心虛擬地址

描述

呼叫 ttm_bo_kmap() 設定核心虛擬對映; 呼叫 amdgpu_bo_kptr() 獲取核心虛擬地址。

返回

成功時為 0,失敗時為負錯誤程式碼。

void *amdgpu_bo_kptr(struct amdgpu_bo *bo)

返回緩衝區物件的核心虛擬地址

引數

struct amdgpu_bo *bo

amdgpu_bo 緩衝區物件

描述

呼叫 ttm_kmap_obj_virtual() 獲取核心虛擬地址

返回

緩衝區物件區域的虛擬地址。

void amdgpu_bo_kunmap(struct amdgpu_bo *bo)

取消對映 amdgpu_bo 緩衝區物件

引數

struct amdgpu_bo *bo

要取消對映的 amdgpu_bo 緩衝區物件

描述

取消對映由 amdgpu_bo_kmap() 設定的核心對映。

struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo)

引用 amdgpu_bo 緩衝區物件

引數

struct amdgpu_bo *bo

amdgpu_bo 緩衝區物件

描述

引用包含的 ttm_buffer_object

返回

指向 amdgpu_bo 緩衝區物件的引用計數指標。

void amdgpu_bo_unref(struct amdgpu_bo **bo)

取消引用 amdgpu_bo 緩衝區物件

引數

struct amdgpu_bo **bo

amdgpu_bo 緩衝區物件

描述

取消引用包含的 ttm_buffer_object 並清除指標

int amdgpu_bo_pin(struct amdgpu_bo *bo, u32 domain)

固定 amdgpu_bo 緩衝區物件

引數

struct amdgpu_bo *bo

amdgpu_bo 要固定的緩衝區物件

u32 domain

要固定到的域

描述

根據請求的域固定緩衝區物件。 如果記憶體是未繫結的 gart 記憶體,則將頁面繫結到 gart 表中。 相應地調整 pin_count 和 pin_size。

固定意味著鎖定記憶體中的頁面以及將它們保持在固定的偏移量處。 當緩衝區無法移動時(例如,當顯示緩衝區正在掃描輸出時)需要這樣做。

返回

成功時為 0,失敗時為負錯誤程式碼。

void amdgpu_bo_unpin(struct amdgpu_bo *bo)

取消固定 amdgpu_bo 緩衝區物件

引數

struct amdgpu_bo *bo

amdgpu_bo 要取消固定的緩衝區物件

描述

減少 pin_count,如果 pin_count 達到 0,則清除標誌。 相應地更改放置位置和固定大小。

返回

成功時為 0,失敗時為負錯誤程式碼。

int amdgpu_bo_init(struct amdgpu_device *adev)

初始化記憶體管理器

引數

struct amdgpu_device *adev

amdgpu 裝置物件

描述

呼叫 amdgpu_ttm_init() 初始化 amdgpu 記憶體管理器。

返回

成功時為 0,失敗時為負錯誤程式碼。

void amdgpu_bo_fini(struct amdgpu_device *adev)

拆除記憶體管理器

引數

struct amdgpu_device *adev

amdgpu 裝置物件

描述

反轉 amdgpu_bo_init() 以拆除記憶體管理器。

int amdgpu_bo_set_tiling_flags(struct amdgpu_bo *bo, u64 tiling_flags)

設定平鋪標誌

引數

struct amdgpu_bo *bo

amdgpu_bo 緩衝區物件

u64 tiling_flags

新標誌

描述

使用新的平鋪標誌設定緩衝區物件的平鋪標誌。 由 GEM ioctl 或核心驅動程式用於設定緩衝區上的平鋪標誌。

返回

成功時為 0,失敗時為負錯誤程式碼。

void amdgpu_bo_get_tiling_flags(struct amdgpu_bo *bo, u64 *tiling_flags)

獲取平鋪標誌

引數

struct amdgpu_bo *bo

amdgpu_bo 緩衝區物件

u64 *tiling_flags

返回的標誌

描述

獲取緩衝區物件的平鋪標誌。 由 GEM ioctl 或核心驅動程式用於設定緩衝區上的平鋪標誌。

int amdgpu_bo_set_metadata(struct amdgpu_bo *bo, void *metadata, u32 metadata_size, uint64_t flags)

設定元資料

引數

struct amdgpu_bo *bo

amdgpu_bo 緩衝區物件

void *metadata

新元資料

u32 metadata_size

新元資料的大小

uint64_t flags

新元資料的標誌

描述

設定緩衝區物件的元資料、大小和標誌。 透過 GEM ioctl 使用。

返回

成功時為 0,失敗時為負錯誤程式碼。

int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer, size_t buffer_size, uint32_t *metadata_size, uint64_t *flags)

獲取元資料

引數

struct amdgpu_bo *bo

amdgpu_bo 緩衝區物件

void *buffer

返回的元資料

size_t buffer_size

緩衝區的大小

uint32_t *metadata_size

返回的元資料的大小

uint64_t *flags

返回的元資料的標誌

描述

獲取緩衝區物件的元資料、大小和標誌。 buffer_size 不應小於 metadata_size。 透過 GEM ioctl 使用。

返回

成功時為 0,失敗時為負錯誤程式碼。

void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict, struct ttm_resource *new_mem)

記憶體移動的通知

引數

struct ttm_buffer_object *bo

指向緩衝區物件的指標

bool evict

如果此移動將緩衝區從圖形地址空間中逐出

struct ttm_resource *new_mem

用於支援 BO 的新資源

描述

將相應的 amdgpu_bo 緩衝區物件標記為無效,同時執行簿記。TTM 驅動程式回撥,在 ttm 移動緩衝區時呼叫。

void amdgpu_bo_release_notify(struct ttm_buffer_object *bo)

關於 BO 被釋放的通知

引數

struct ttm_buffer_object *bo

指向緩衝區物件的指標

描述

清除 VRAM 緩衝區,其中的內容在記憶體釋放之前不應洩漏。

vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)

關於記憶體錯誤的通知

引數

struct ttm_buffer_object *bo

指向緩衝區物件的指標

描述

通知驅動程式我們正在處理此 BO 上的錯誤並已保留它,同時執行簿記。TTM 驅動程式回撥,用於處理 vm 錯誤。

返回

成功時為 0,失敗時為負錯誤程式碼。

void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence, bool shared)

將 fence 新增到緩衝區物件

引數

struct amdgpu_bo *bo

有問題的緩衝區物件

struct dma_fence *fence

要新增的 fence

bool shared

如果 fence 應該以共享方式新增,則為 true

int amdgpu_bo_sync_wait_resv(struct amdgpu_device *adev, struct dma_resv *resv, enum amdgpu_sync_mode sync_mode, void *owner, bool intr)

等待 BO 預留 fence

引數

struct amdgpu_device *adev

amdgpu 裝置指標

struct dma_resv *resv

要同步到的預留物件

enum amdgpu_sync_mode sync_mode

同步模式

void *owner

fence 所有者

bool intr

等待是否可中斷

描述

從預留物件中提取 fence 並等待它們完成。

返回

成功時為 0,否則為 errno。

int amdgpu_bo_sync_wait(struct amdgpu_bo *bo, void *owner, bool intr)

amdgpu_bo_sync_wait_resv 的包裝器

引數

struct amdgpu_bo *bo

要等待的緩衝區物件

void *owner

fence 所有者

bool intr

等待是否可中斷

描述

用於等待 BO 中 fence 的包裝器。

返回

成功時為 0,否則為 errno。

u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo)

返回 bo 的 GPU 偏移量

引數

struct amdgpu_bo *bo

我們查詢偏移量的 amdgpu 物件

注意

在呼叫此函式時,物件應該被固定或預留,為除錯新增此檢查可能很有用。

返回

物件的當前 GPU 偏移量。

u64 amdgpu_bo_gpu_offset_no_check(struct amdgpu_bo *bo)

返回 bo 的 GPU 偏移量

引數

struct amdgpu_bo *bo

我們查詢偏移量的 amdgpu 物件

返回

物件的當前 GPU 偏移量,不引發警告。

uint32_t amdgpu_bo_mem_stats_placement(struct amdgpu_bo *bo)

用於記憶體統計的 bo 放置

引數

struct amdgpu_bo *bo

我們應該檢視的緩衝區物件

描述

BO 可以有多個首選放置位置,為了避免重複計數,我們希望將其歸檔在單個放置位置下的記憶體統計資訊中。幸運的是,如果我們採用 preferred_domains 中設定的最高位,結果是相當合理的。

返回

BO 應該在哪個放置位置下進行統計。

uint32_t amdgpu_bo_get_preferred_domain(struct amdgpu_device *adev, uint32_t domain)

獲取首選域

引數

struct amdgpu_device *adev

amdgpu 裝置物件

uint32_t domain

允許的記憶體域

返回

對於分配 BO,首選哪個允許的域。

u64 amdgpu_bo_print_info(int id, struct amdgpu_bo *bo, struct seq_file *m)

在 debugfs 檔案中列印 BO 資訊

引數

int id

BO 的索引或 Id

struct amdgpu_bo *bo

請求列印資訊的 BO

struct seq_file *m

debugfs 檔案

描述

在 debugfs 檔案中列印 BO 資訊

返回

BO 的大小,以位元組為單位。

PRIME 緩衝區共享

以下回調實現用於透過 PRIME 在不同裝置之間共享 GEM 緩衝區物件

struct amdgpu_device *dma_buf_attach_adev(struct dma_buf_attachment *attach)

幫助器,用於獲取附件的 adev

引數

struct dma_buf_attachment *attach

附件

返回

如果附加裝置是 amdgpu 裝置或分割槽,則為 struct amdgpu_device *,否則為 NULL。

int amdgpu_dma_buf_attach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)

dma_buf_ops.attach 實現

引數

struct dma_buf *dmabuf

我們附加到的 DMA-buf

struct dma_buf_attachment *attach

要新增的附件

描述

將附件作為使用者新增到匯出的 DMA-buf。

int amdgpu_dma_buf_pin(struct dma_buf_attachment *attach)

dma_buf_ops.pin 實現

引數

struct dma_buf_attachment *attach

要鎖定的附件

描述

鎖定支援 DMA-buf 的 BO,使其無法再移動。

void amdgpu_dma_buf_unpin(struct dma_buf_attachment *attach)

dma_buf_ops.unpin 實現

引數

struct dma_buf_attachment *attach

要解鎖的附件

描述

解鎖先前鎖定的 BO 以使其再次可移動。

struct sg_table *amdgpu_dma_buf_map(struct dma_buf_attachment *attach, enum dma_data_direction dir)

dma_buf_ops.map_dma_buf 實現

引數

struct dma_buf_attachment *attach

DMA-buf 附件

enum dma_data_direction dir

DMA 方向

描述

確保目標裝置可以訪問共享 DMA 緩衝區。目前,只需將其鎖定到 GTT 域,所有 DMA 裝置都應該可以訪問它。

返回

sg_table 填充了要使用的 DMA 地址或帶有負錯誤程式碼的 ERR_PTR。

void amdgpu_dma_buf_unmap(struct dma_buf_attachment *attach, struct sg_table *sgt, enum dma_data_direction dir)

dma_buf_ops.unmap_dma_buf 實現

引數

struct dma_buf_attachment *attach

DMA-buf 附件

struct sg_table *sgt

要取消對映的 sg_table

enum dma_data_direction dir

DMA 方向

描述

當共享 DMA 緩衝區不再需要被另一個裝置訪問時,將呼叫此函式。目前,只需從 GTT 中解鎖緩衝區。

int amdgpu_dma_buf_begin_cpu_access(struct dma_buf *dma_buf, enum dma_data_direction direction)

dma_buf_ops.begin_cpu_access 實現

引數

struct dma_buf *dma_buf

共享 DMA 緩衝區

enum dma_data_direction direction

DMA 傳輸方向

描述

在 CPU 訪問共享 DMA 緩衝區的記憶體之前呼叫此函式。如果是讀取訪問,則儘可能將緩衝區移動到 GTT 域,以獲得最佳 CPU 讀取效能。

返回

成功時為 0,失敗時為負錯誤程式碼。

struct dma_buf *amdgpu_gem_prime_export(struct drm_gem_object *gobj, int flags)

drm_driver.gem_prime_export 實現

引數

struct drm_gem_object *gobj

GEM BO

int flags

DRM_CLOEXEC 和 DRM_RDWR 等標誌。

描述

主要工作由drm_gem_prime_export 幫助程式完成。

返回

表示來自給定裝置的 GEM BO 的共享 DMA 緩衝區。

struct drm_gem_object *amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)

建立用於 DMA-buf 匯入的 BO

引數

struct drm_device *dev

DRM 裝置

struct dma_buf *dma_buf

DMA-buf

描述

為 DMA-buf 匯入建立空的 SG BO。

返回

給定 DRM 裝置的新 GEM BO,表示給定 DMA-buf 附件和分散/聚集表描述的記憶體。

void amdgpu_dma_buf_move_notify(struct dma_buf_attachment *attach)

attach.move_notify 實現

引數

struct dma_buf_attachment *attach

DMA-buf 附件

描述

使 DMA-buf 附件失效,確保我們在下次使用之前重新建立對映。

struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev, struct dma_buf *dma_buf)

drm_driver.gem_prime_import 實現

引數

struct drm_device *dev

DRM 裝置

struct dma_buf *dma_buf

共享 DMA 緩衝區

描述

將 dma_buf 匯入到驅動程式中,並可能建立一個新的 GEM 物件。

返回

表示給定裝置的共享 DMA 緩衝區的 GEM BO。

bool amdgpu_dmabuf_is_xgmi_accessible(struct amdgpu_device *adev, struct amdgpu_bo *bo)

檢查 xgmi 是否可用於 P2P 傳輸

引數

struct amdgpu_device *adev

匯入器的 amdgpu_device 指標

struct amdgpu_bo *bo

amdgpu 緩衝區物件

返回

如果可以透過 xgmi 訪問 dmabuf,則為 True,否則為 False。

MMU 通知程式

對於一致的 userptr 處理,註冊一個 MMU 通知程式,以通知驅動程式程序的頁表更新。

當有人嘗試使頁表失效時,我們會阻止更新,直到問題頁面上的所有操作都完成,然後這些頁面被標記為已訪問,如果不是隻讀訪問,也會被標記為髒頁。

使用問題 userptr 的新命令提交會延遲,直到所有頁表失效都完成,並且我們再次看到一致的程序地址空間。

bool amdgpu_hmm_invalidate_gfx(struct mmu_interval_notifier *mni, const struct mmu_notifier_range *range, unsigned long cur_seq)

回撥以通知有關 mm 更改

引數

struct mmu_interval_notifier *mni

範圍 (mm) 即將更新

const struct mmu_notifier_range *range

有關失效的詳細資訊

unsigned long cur_seq

要傳遞給 mmu_interval_set_seq() 的值

描述

阻止對 BO 的操作完成,並將頁面標記為已訪問,並可能標記為髒頁。

bool amdgpu_hmm_invalidate_hsa(struct mmu_interval_notifier *mni, const struct mmu_notifier_range *range, unsigned long cur_seq)

回撥以通知有關 mm 更改

引數

struct mmu_interval_notifier *mni

範圍 (mm) 即將更新

const struct mmu_notifier_range *range

有關失效的詳細資訊

unsigned long cur_seq

要傳遞給 mmu_interval_set_seq() 的值

描述

我們暫時逐出附加到此範圍的 BO。這需要逐出程序的所有使用者模式佇列。

int amdgpu_hmm_register(struct amdgpu_bo *bo, unsigned long addr)

註冊 BO 以進行通知程式更新

引數

struct amdgpu_bo *bo

amdgpu 緩衝區物件

unsigned long addr

我們應該監視的 userptr addr

描述

在指定地址為給定 BO 註冊 mmu_notifier。成功時返回 0,如果出現任何問題,則返回 -ERRNO。

void amdgpu_hmm_unregister(struct amdgpu_bo *bo)

登出 BO 以進行通知程式更新

引數

struct amdgpu_bo *bo

amdgpu 緩衝區物件

描述

從緩衝區物件中刪除 mmu 通知程式的任何註冊更新。

AMDGPU 虛擬記憶體

GPUVM 是 GPU 上提供的 MMU 功能。GPUVM 類似於舊 asic 上的傳統 GART,但是,與其為整個 GPU 提供單個全域性 GART 表,不如在任何給定時間都可以有多個 GPUVM 頁表處於活動狀態。GPUVM 頁表可以包含 VRAM 頁面和系統頁面的混合(記憶體和 MMIO),並且系統頁面可以對映為 snooped(快取的系統頁面)或 unsnooped(未快取的系統頁面)。

每個活動的 GPUVM 都有一個與之關聯的 ID,並且每個 VMID 都有一個頁錶鏈接。執行命令緩衝區時,核心會告訴引擎要為該命令緩衝區使用哪個 VMID。VMID 在提交命令時動態分配。使用者空間驅動程式維護自己的地址空間,並且核心會在提交命令緩衝區並分配 VMID 時相應地設定其頁面表。硬體最多支援 16 個活動 GPUVM。

每個 GPUVM 都由 1-2 或 1-5 級頁表表示,具體取決於 ASIC 系列。GPUVM 支援每個頁面上的 RWX 屬性以及加密和快取屬性等其他功能。

VMID 0 是特殊的。它是核心驅動程式使用的 GPUVM。除了由頁表管理的 aperture 之外,VMID 0 還有幾個其他 aperture。有一個用於直接訪問 VRAM 的 aperture,並且有一個傳統的 AGP aperture,它只是將訪問直接轉發到匹配的系統物理地址(或者存在 IOMMU 時的 IOVA)。這些 aperture 提供對這些記憶體的直接訪問,而不會產生頁表的開銷。VMID 0 由核心驅動程式用於記憶體管理等任務。

GPU 客戶端(即 GPU 上的引擎)使用 GPUVM VMID 來訪問記憶體。對於使用者應用程式,每個應用程式都可以有自己唯一的 GPUVM 地址空間。應用程式管理地址空間,核心驅動程式管理每個程序的 GPUVM 頁表。如果 GPU 客戶端訪問無效頁面,它將生成 GPU 頁錯誤,類似於訪問 CPU 上的無效頁面。

struct amdgpu_prt_cb

幫助程式,用於從 fence 回撥停用部分駐留紋理功能

定義:

struct amdgpu_prt_cb {
    struct amdgpu_device *adev;
    struct dma_fence_cb cb;
};

成員

adev

amdgpu 裝置

cb

回撥

struct amdgpu_vm_tlb_seq_struct

幫助程式,用於遞增 TLB 重新整理序列

定義:

struct amdgpu_vm_tlb_seq_struct {
    struct amdgpu_vm *vm;
    struct dma_fence_cb cb;
};

成員

vm

指向 amdgpu_vm 結構的指標,用於設定 fence 序列

cb

回撥

int amdgpu_vm_set_pasid(struct amdgpu_device *adev, struct amdgpu_vm *vm, u32 pasid)

管理 pasid 和 vm 指標對映

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

amdgpu_vm 指標

u32 pasid

VM 在此 GPU 上使用的 pasid

描述

設定此 VM 在此 GPU 上使用的 pasid,也可以透過傳入零來刪除 pasid。

void amdgpu_vm_bo_evicted(struct amdgpu_vm_bo_base *vm_bo)

vm_bo 被驅逐

引數

struct amdgpu_vm_bo_base *vm_bo

被驅逐的 vm_bo

描述

PD/PT 和每個 VM BO 的狀態,它們不在它們應該在的位置。

void amdgpu_vm_bo_moved(struct amdgpu_vm_bo_base *vm_bo)

vm_bo 已移動

引數

struct amdgpu_vm_bo_base *vm_bo

已移動的 vm_bo

描述

每個 VM BO 的狀態,它們已移動,但該更改尚未反映在頁表中。

void amdgpu_vm_bo_idle(struct amdgpu_vm_bo_base *vm_bo)

vm_bo 空閒

引數

struct amdgpu_vm_bo_base *vm_bo

現在空閒的 vm_bo

描述

PD/PT 和每個 VM BO 的狀態,它們已經過狀態機,現在處於空閒狀態。

void amdgpu_vm_bo_invalidated(struct amdgpu_vm_bo_base *vm_bo)

vm_bo 已失效

引數

struct amdgpu_vm_bo_base *vm_bo

現在失效的 vm_bo

描述

普通 BO 的狀態,它們已失效,並且該更改尚未反映在 PT 中。

void amdgpu_vm_bo_evicted_user(struct amdgpu_vm_bo_base *vm_bo)

vm_bo 被驅逐

引數

struct amdgpu_vm_bo_base *vm_bo

被驅逐的 vm_bo

描述

使用者模式佇列使用的 BO 的狀態,它們不在它們應該在的位置。

void amdgpu_vm_bo_relocated(struct amdgpu_vm_bo_base *vm_bo)

vm_bo 已重定位

引數

struct amdgpu_vm_bo_base *vm_bo

已重定位的 vm_bo

描述

PD/PT 的狀態,它們需要更新其父 PD。對於根 PD,只需移動到空閒狀態。

void amdgpu_vm_bo_done(struct amdgpu_vm_bo_base *vm_bo)

vm_bo 已完成

引數

struct amdgpu_vm_bo_base *vm_bo

現在完成的 vm_bo

描述

普通 BO 的狀態,它們已失效,並且該更改已在 PT 中更新。

void amdgpu_vm_bo_reset_state_machine(struct amdgpu_vm *vm)

重置 vm_bo 狀態機

引數

struct amdgpu_vm *vm

要重置狀態機的 VM

描述

將 VM 中的所有 vm_bo 物件移動到一種狀態,在該狀態下它們將在驗證期間再次更新。

void amdgpu_vm_update_shared(struct amdgpu_vm_bo_base *base)

用於更新共享記憶體統計資訊的助手函式

引數

struct amdgpu_vm_bo_base *base

用於跟蹤 VM 中 BO 使用情況的基本結構

描述

獲取 vm status_lock 並更新共享記憶體統計資訊。如果基本統計資訊已更改(例如,緩衝區已移動),則也需要呼叫 amdgpu_vm_update_stats。

void amdgpu_vm_bo_update_shared(struct amdgpu_bo *bo)

當 bo 被共享/取消共享時的回撥

引數

struct amdgpu_bo *bo

amdgpu 緩衝區物件

描述

如果需要,更新所有 vm 的每個 VM 統計資訊,從私有更改為共享,反之亦然。

void amdgpu_vm_update_stats_locked(struct amdgpu_vm_bo_base *base, struct ttm_resource *res, int sign)

用於更新普通記憶體統計資訊的助手函式

引數

struct amdgpu_vm_bo_base *base

用於跟蹤 VM 中 BO 使用情況的基本結構

struct ttm_resource *res

ttm_resource 用於統計,可能或可能不是 bo->tbo.resource

int sign

如果我們應該從統計資訊中新增 (+1) 或減去 (-1)

描述

呼叫方需要持有 vm status_lock。當需要同時進行多次更新時很有用。

void amdgpu_vm_update_stats(struct amdgpu_vm_bo_base *base, struct ttm_resource *res, int sign)

用於更新普通記憶體統計資訊的助手函式

引數

struct amdgpu_vm_bo_base *base

用於跟蹤 VM 中 BO 使用情況的基本結構

struct ttm_resource *res

ttm_resource 用於統計,可能或可能不是 bo->tbo.resource

int sign

如果我們應該從統計資訊中新增 (+1) 或減去 (-1)

描述

當 bo 被新增/刪除/移動時,更新基本記憶體統計資訊。

void amdgpu_vm_bo_base_init(struct amdgpu_vm_bo_base *base, struct amdgpu_vm *vm, struct amdgpu_bo *bo)

將 bo 新增到與 vm 關聯的 bos 列表

引數

struct amdgpu_vm_bo_base *base

用於跟蹤 VM 中 BO 使用情況的基本結構

struct amdgpu_vm *vm

要將 bo 新增到的 vm

struct amdgpu_bo *bo

amdgpu 緩衝區物件

描述

初始化 bo_va_base 結構並將其新增到適當的列表中

int amdgpu_vm_lock_pd(struct amdgpu_vm *vm, struct drm_exec *exec, unsigned int num_fences)

在 drm_exec 中鎖定 PD

引數

struct amdgpu_vm *vm

提供 BO 的 vm

struct drm_exec *exec

drm 執行上下文

unsigned int num_fences

要保留的額外 fence 數量

描述

在 DRM 執行上下文中鎖定 VM 根 PD。

void amdgpu_vm_move_to_lru_tail(struct amdgpu_device *adev, struct amdgpu_vm *vm)

將所有 BO 移動到 LRU 的末尾

引數

struct amdgpu_device *adev

amdgpu 裝置指標

struct amdgpu_vm *vm

提供 BO 的 vm

描述

將所有 BO 移動到 LRU 的末尾,並記住它們的位置以將它們放在一起。

uint64_t amdgpu_vm_generation(struct amdgpu_device *adev, struct amdgpu_vm *vm)

返回頁表重新生成計數器

引數

struct amdgpu_device *adev

amdgpu_device

struct amdgpu_vm *vm

要檢查的可選 VM,可能為 NULL

描述

返回頁表重新生成令牌,以允許檢查提交是否仍然有效以使用此 VM。VM 引數可能為 NULL,在這種情況下,將僅使用 VRAM 丟失計數器。

int amdgpu_vm_validate(struct amdgpu_device *adev, struct amdgpu_vm *vm, struct ww_acquire_ctx *ticket, int (*validate)(void *p, struct amdgpu_bo *bo), void *param)

驗證 VM 中跟蹤的已驅逐 BO

引數

struct amdgpu_device *adev

amdgpu 裝置指標

struct amdgpu_vm *vm

提供 BO 的 vm

struct ww_acquire_ctx *ticket

用於保留 VM 的可選保留票證

int (*validate)(void *p, struct amdgpu_bo *bo)

執行驗證的回撥

void *param

驗證回撥的引數

描述

如有必要,在命令提交時驗證頁表 BO 和每個 VM BO。如果給定了票證,還嘗試驗證已驅逐的使用者佇列 BO。它們必須已使用給定的票證保留。

返回

驗證結果。

bool amdgpu_vm_ready(struct amdgpu_vm *vm)

檢查 VM 是否已準備好進行更新

引數

struct amdgpu_vm *vm

要檢查的 VM

描述

檢查所有 VM PD/PT 是否已準備好進行更新

返回

如果 VM 未被驅逐,則為 True。

void amdgpu_vm_check_compute_bug(struct amdgpu_device *adev)

檢查 ASIC 是否有計算 VM 錯誤

引數

struct amdgpu_device *adev

amdgpu_device 指標

bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring, struct amdgpu_job *job)

檢查作業是否需要管道同步。

引數

struct amdgpu_ring *ring

將在其上提交作業的環

struct amdgpu_job *job

要提交的作業

返回

如果需要同步,則為 True。

int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_pipe_sync)

硬體重新整理 VM

引數

struct amdgpu_ring *ring

用於重新整理的環

struct amdgpu_job *job

相關作業

bool need_pipe_sync

是否需要管道同步

描述

在必要時發出 VM 重新整理。

返回

成功時為 0,否則為 errno。

struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm, struct amdgpu_bo *bo)

查詢特定 vm 和 bo 的 bo_va

引數

struct amdgpu_vm *vm

請求的 vm

struct amdgpu_bo *bo

請求的緩衝區物件

描述

在請求的 vm 中查詢 bo。在 bos vm 列表中搜索請求的 vm。返回找到的 bo_va,如果未找到,則返回 NULL

物件必須保留!

返回

找到的 bo_va 或 NULL。

uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr)

解析 addr 的 gart 對映

引數

const dma_addr_t *pages_addr

用於查詢的可選 DMA 地址

uint64_t addr

未對映的 addr

描述

查詢 pte 解析到的頁面的物理地址。

返回

頁表條目的指標。

int amdgpu_vm_update_pdes(struct amdgpu_device *adev, struct amdgpu_vm *vm, bool immediate)

確保所有目錄都有效

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

請求的 vm

bool immediate

立即提交到分頁佇列

描述

確保所有目錄都是最新的。

返回

成功則為 0,失敗則為錯誤。

void amdgpu_vm_tlb_seq_cb(struct dma_fence *fence, struct dma_fence_cb *cb)

確保增加 tlb 序列

引數

struct dma_fence *fence

未使用

struct dma_fence_cb *cb

回撥結構

描述

增加 tlb 序列以確保未來的 CS 執行 VM 重新整理。

void amdgpu_vm_tlb_flush(struct amdgpu_vm_update_params *params, struct dma_fence **fence, struct amdgpu_vm_tlb_seq_struct *tlb_cb)

準備 TLB 重新整理

引數

struct amdgpu_vm_update_params *params

更新引數

struct dma_fence **fence

與 TLB 重新整理同步的輸入 fence

struct amdgpu_vm_tlb_seq_struct *tlb_cb

回撥結構

描述

增加 tlb 序列以確保未來的 CS 執行 VM 重新整理。

int amdgpu_vm_update_range(struct amdgpu_device *adev, struct amdgpu_vm *vm, bool immediate, bool unlocked, bool flush_tlb, bool allow_override, struct amdgpu_sync *sync, uint64_t start, uint64_t last, uint64_t flags, uint64_t offset, uint64_t vram_base, struct ttm_resource *res, dma_addr_t *pages_addr, struct dma_fence **fence)

更新 vm 頁表中的範圍

引數

struct amdgpu_device *adev

用於命令的 amdgpu_device 指標

struct amdgpu_vm *vm

要更新範圍的 VM

bool immediate

頁面錯誤中的立即提交

bool unlocked

MM 回撥期間的解鎖失效

bool flush_tlb

更新完成後觸發 tlb 失效

bool allow_override

更改本地 NUMA 節點的 MTYPE

struct amdgpu_sync *sync

我們需要同步的 fence

uint64_t start

對映範圍的開始

uint64_t last

上次對映的條目

uint64_t flags

條目的標誌

uint64_t offset

節點和 pages_addr 中的偏移量

uint64_t vram_base

vram 對映的基礎

struct ttm_resource *res

要對映的 ttm_resource

dma_addr_t *pages_addr

用於對映的 DMA 地址

struct dma_fence **fence

可選的結果 fence

描述

填充 startlast 之間的頁表條目。

返回

成功則為 0,失敗則為負錯誤程式碼。

int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va, bool clear)

更新 vm 頁表中的所有 BO 對映

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_bo_va *bo_va

請求的 BO 和 VM 物件

bool clear

如果為 true,則清除條目

描述

填充 bo_va 的頁表條目。

返回

成功則為 0,失敗則為 -EINVAL。

void amdgpu_vm_update_prt_state(struct amdgpu_device *adev)

更新全域性 PRT 狀態

引數

struct amdgpu_device *adev

amdgpu_device 指標

void amdgpu_vm_prt_get(struct amdgpu_device *adev)

新增 PRT 使用者

引數

struct amdgpu_device *adev

amdgpu_device 指標

void amdgpu_vm_prt_put(struct amdgpu_device *adev)

刪除 PRT 使用者

引數

struct amdgpu_device *adev

amdgpu_device 指標

void amdgpu_vm_prt_cb(struct dma_fence *fence, struct dma_fence_cb *_cb)

用於更新 PRT 狀態的回撥

引數

struct dma_fence *fence

回撥的 fence

struct dma_fence_cb *_cb

回撥函式

void amdgpu_vm_add_prt_cb(struct amdgpu_device *adev, struct dma_fence *fence)

新增用於更新 PRT 狀態的回撥

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct dma_fence *fence

回撥的 fence

void amdgpu_vm_free_mapping(struct amdgpu_device *adev, struct amdgpu_vm *vm, struct amdgpu_bo_va_mapping *mapping, struct dma_fence *fence)

釋放對映

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

請求的 vm

struct amdgpu_bo_va_mapping *mapping

要釋放的對映

struct dma_fence *fence

取消對映操作的 fence

描述

釋放對映,並確保我們減少 PRT 使用計數(如果適用)。

void amdgpu_vm_prt_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)

完成所有 prt 對映

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

請求的 vm

描述

註冊清理回撥以在 VM 死後停用 PRT 支援。

int amdgpu_vm_clear_freed(struct amdgpu_device *adev, struct amdgpu_vm *vm, struct dma_fence **fence)

清除 PT 中已釋放的 BO

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

請求的 vm

struct dma_fence **fence

可選的結果 fence(如果不需要執行任何操作或發生錯誤,則保持不變)

描述

確保所有已釋放的 BO 在 PT 中都被清除。PT 必須被預留,並且互斥鎖必須被鎖定!

返回

成功返回 0。

int amdgpu_vm_handle_moved(struct amdgpu_device *adev, struct amdgpu_vm *vm, struct ww_acquire_ctx *ticket)

處理 PT 中移動的 BO

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

請求的 vm

struct ww_acquire_ctx *ticket

用於保留 VM 的可選保留票證

描述

確保所有移動的 BO 在 PT 中都被更新。

PT 必須被預留!

返回

成功返回 0。

int amdgpu_vm_flush_compute_tlb(struct amdgpu_device *adev, struct amdgpu_vm *vm, uint32_t flush_type, uint32_t xcc_mask)

重新整理計算 VM 上的 TLB

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

請求的 vm

uint32_t flush_type

重新整理型別

uint32_t xcc_mask

需要重新整理 TLB 的計算分割槽所屬的 XCC 掩碼。

描述

如果需要,重新整理計算 VM 的 TLB。

返回

成功返回 0。

struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev, struct amdgpu_vm *vm, struct amdgpu_bo *bo)

將 bo 新增到特定的 vm

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

請求的 vm

struct amdgpu_bo *bo

amdgpu 緩衝區物件

描述

將 **bo** 新增到請求的 vm 中。將 **bo** 新增到與 vm 關聯的 bo 列表中

物件必須保留!

返回

新新增的 bo_va,失敗則返回 NULL

void amdgpu_vm_bo_insert_map(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va, struct amdgpu_bo_va_mapping *mapping)

插入新的對映

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_bo_va *bo_va

bo_va 用於儲存地址

struct amdgpu_bo_va_mapping *mapping

要插入的對映

描述

將新的對映插入到所有結構中。

int amdgpu_vm_bo_map(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va, uint64_t saddr, uint64_t offset, uint64_t size, uint64_t flags)

將 bo 對映到 vm 內部

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_bo_va *bo_va

bo_va 用於儲存地址

uint64_t saddr

bo 對映的位置

uint64_t offset

bo 中請求的偏移量

uint64_t size

bo 大小,以位元組為單位

uint64_t flags

頁面的屬性(讀/寫/有效/等等)

描述

在指定的地址將 BO 的對映新增到 VM 中。

物件必須在外部預留和取消預留!

返回

成功則為 0,失敗則為錯誤。

int amdgpu_vm_bo_replace_map(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va, uint64_t saddr, uint64_t offset, uint64_t size, uint64_t flags)

將 bo 對映到 vm 內部,替換現有的對映

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_bo_va *bo_va

bo_va 用於儲存地址

uint64_t saddr

bo 對映的位置

uint64_t offset

bo 中請求的偏移量

uint64_t size

bo 大小,以位元組為單位

uint64_t flags

頁面的屬性(讀/寫/有效/等等)

描述

在指定的地址將 BO 的對映新增到 VM 中。在此過程中替換現有的對映。

物件必須在外部預留和取消預留!

返回

成功則為 0,失敗則為錯誤。

int amdgpu_vm_bo_unmap(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va, uint64_t saddr)

從 vm 中移除 bo 對映

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_bo_va *bo_va

bo_va 用於從中移除地址

uint64_t saddr

BO 對映的位置

描述

從 VM 中移除在指定的地址的 BO 對映。

物件必須在外部預留和取消預留!

返回

成功則為 0,失敗則為錯誤。

int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev, struct amdgpu_vm *vm, uint64_t saddr, uint64_t size)

移除特定範圍內的所有對映

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

要使用的 VM 結構

uint64_t saddr

範圍的起點

uint64_t size

範圍的大小

描述

移除一個範圍內的所有對映,並適當地拆分它們。

返回

成功則為 0,失敗則為錯誤。

struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm, uint64_t addr)

按地址查詢對映

引數

struct amdgpu_vm *vm

請求的 VM

uint64_t addr

地址

描述

透過地址查詢對映。

返回

與 addr 匹配的 amdgpu_bo_va_mapping,如果沒有則返回 NULL

void amdgpu_vm_bo_trace_cs(struct amdgpu_vm *vm, struct ww_acquire_ctx *ticket)

跟蹤所有預留的對映

引數

struct amdgpu_vm *vm

請求的 vm

struct ww_acquire_ctx *ticket

CS ticket

描述

跟蹤命令提交期間預留的 BO 的所有對映。

void amdgpu_vm_bo_del(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va)

從特定的 vm 中移除 bo

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_bo_va *bo_va

請求的 bo_va

描述

從請求的 vm 中移除 **bo_va->bo**。

物件必須被預留!

bool amdgpu_vm_evictable(struct amdgpu_bo *bo)

檢查我們是否可以驅逐 VM

引數

struct amdgpu_bo *bo

VM 的頁表。

描述

檢查是否可以驅逐 VM。

void amdgpu_vm_bo_invalidate(struct amdgpu_bo *bo, bool evicted)

將 bo 標記為無效

引數

struct amdgpu_bo *bo

amdgpu 緩衝區物件

bool evicted

BO 是否被驅逐

描述

將 **bo** 標記為無效。

void amdgpu_vm_bo_move(struct amdgpu_bo *bo, struct ttm_resource *new_mem, bool evicted)

處理 BO 移動

引數

struct amdgpu_bo *bo

amdgpu 緩衝區物件

struct ttm_resource *new_mem

BO 移動的新位置

bool evicted

BO 是否被驅逐

描述

更新新位置的記憶體統計資訊,並將 **bo** 標記為無效。

uint32_t amdgpu_vm_get_block_size(uint64_t vm_size)

以 2 的冪計算 VM 頁表大小

引數

uint64_t vm_size

VM 大小

返回

VM 頁表,以 2 的冪表示

void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t min_vm_size, uint32_t fragment_size_default, unsigned max_level, unsigned max_bits)

調整 vm 大小、塊大小和片段大小

引數

struct amdgpu_device *adev

amdgpu_device 指標

uint32_t min_vm_size

如果設定為 auto,則最小 vm 大小(GB)

uint32_t fragment_size_default

預設 PTE 片段大小

unsigned max_level

最大 VMPT 級別

unsigned max_bits

地址空間的最大位數

long amdgpu_vm_wait_idle(struct amdgpu_vm *vm, long timeout)

等待 VM 變為 idle 狀態

引數

struct amdgpu_vm *vm

要等待的 VM 物件

long timeout

等待 VM 變為 idle 狀態的超時時間

void amdgpu_vm_put_task_info(struct amdgpu_task_info *task_info)

減少 vm task_info 指標的引用計數

引數

struct amdgpu_task_info *task_info

正在討論的 task_info 結構。

描述

在最後一次 put 操作時釋放 vm task_info 指標

struct amdgpu_task_info *amdgpu_vm_get_task_info_vm(struct amdgpu_vm *vm)

提取 vm 的任務資訊。

引數

struct amdgpu_vm *vm

要從中獲取資訊的 VM

描述

返回引用計數的 task_info 結構,必須使用 amdgpu_vm_put_task_info 減少其引用計數。

struct amdgpu_task_info *amdgpu_vm_get_task_info_pasid(struct amdgpu_device *adev, u32 pasid)

提取 PASID 的任務資訊。

引數

struct amdgpu_device *adev

drm 裝置指標

u32 pasid

VM 的 PASID 識別符號

描述

返回引用計數的 task_info 結構,必須使用 amdgpu_vm_put_task_info 減少其引用計數。

void amdgpu_vm_set_task_info(struct amdgpu_vm *vm)

設定 VM 的任務資訊。

引數

struct amdgpu_vm *vm

要設定資訊的 vm

int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, int32_t xcp_id)

初始化 vm 例項

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

請求的 vm

int32_t xcp_id

GPU 分割槽選擇 id

描述

初始化 **vm** 欄位。

返回

成功則為 0,失敗則為錯誤。

int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)

將 GFX VM 轉換為計算 VM

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

請求的 vm

描述

這僅適用於沒有新增任何 BO 且尚未分配頁表的 GFX VM。

更改以下 VM 引數:- use_cpu_for_update - pte_supports_ats

重新初始化頁目錄以反映更改的 ATS 設定。

返回

成功返回 0,錯誤返回 -errno。

void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)

拆卸 vm 例項

引數

struct amdgpu_device *adev

amdgpu_device 指標

struct amdgpu_vm *vm

請求的 vm

描述

拆卸 **vm**。取消繫結 VM 並從 vm bo 列表中移除所有 bo

void amdgpu_vm_manager_init(struct amdgpu_device *adev)

初始化 VM 管理器

引數

struct amdgpu_device *adev

amdgpu_device 指標

描述

初始化 VM 管理器結構

void amdgpu_vm_manager_fini(struct amdgpu_device *adev)

清理 VM 管理器

引數

struct amdgpu_device *adev

amdgpu_device 指標

描述

清理 VM 管理器並釋放資源。

int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)

管理 vm hub 的 VMID 預留。

引數

struct drm_device *dev

drm 裝置指標

void *data

drm_amdgpu_vm

struct drm_file *filp

drm 檔案指標

返回

成功返回 0,錯誤返回 -errno。

bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, u32 vmid, u32 node_id, uint64_t addr, uint64_t ts, bool write_fault)

優雅地處理 VM 故障。

引數

struct amdgpu_device *adev

amdgpu 裝置指標

u32 pasid

VM 的 PASID

u32 vmid

VMID,僅用於 GFX 9.4.3。

u32 node_id

IH cookie 中接收的 Node_id。僅適用於 GFX 9.4.3。

uint64_t addr

故障地址

uint64_t ts

故障的時間戳

bool write_fault

true 表示寫故障,false 表示讀故障

描述

嘗試優雅地處理 VM 故障。如果故障已處理且不應再報告,則返回 true。

void amdgpu_debugfs_vm_bo_info(struct amdgpu_vm *vm, struct seq_file *m)

列印 VM 的 BO 資訊

引數

struct amdgpu_vm *vm

請求列印 BO 資訊的 VM

struct seq_file *m

debugfs 檔案

描述

在 VM 的 debugfs 檔案中列印 BO 資訊

void amdgpu_vm_update_fault_cache(struct amdgpu_device *adev, unsigned int pasid, uint64_t addr, uint32_t status, unsigned int vmhub)

更新快取的故障資訊。

引數

struct amdgpu_device *adev

amdgpu 裝置指標

unsigned int pasid

VM 的 PASID

uint64_t addr

故障地址

uint32_t status

GPUVM 故障狀態暫存器

unsigned int vmhub

哪個 vmhub 發生了故障

描述

快取故障資訊,供使用者空間以後在除錯中使用。

bool amdgpu_vm_is_bo_always_valid(struct amdgpu_vm *vm, struct amdgpu_bo *bo)

檢查 BO 是否 VM 始終有效

引數

struct amdgpu_vm *vm

要測試的 VM。

struct amdgpu_bo *bo

要測試的 BO。

描述

如果 BO 與根 PD 共享 dma_resv 物件,並且保證在 VM 內部始終有效,則返回 true。

中斷處理

GPU 硬體中生成的中斷會引發中斷請求,這些請求會傳遞給 amdgpu IRQ 處理程式,該處理程式負責檢測中斷的來源和型別,並分派匹配的處理程式。如果處理中斷需要呼叫可能休眠的核心函式,則處理會被分派給工作處理程式。

如果模組引數未停用 MSI 功能,則將啟用 MSI 支援。

對於可能由另一個驅動程式驅動的 GPU 中斷源,將使用 IRQ 域支援(在虛擬 IRQ 和硬體 IRQ 之間進行對映)。

void amdgpu_irq_disable_all(struct amdgpu_device *adev)

停用*所有*中斷

引數

struct amdgpu_device *adev

amdgpu 裝置指標

描述

停用來自所有來源的所有型別的中斷。

irqreturn_t amdgpu_irq_handler(int irq, void *arg)

IRQ 處理程式

引數

int irq

IRQ 編號(未使用)

void *arg

指向 DRM 裝置的指標

描述

amdgpu 驅動程式(所有 ASIC)的 IRQ 處理程式。

返回

處理 IRQ 的結果,由 irqreturn_t 定義

void amdgpu_irq_handle_ih1(struct work_struct *work)

啟動 IH1 的處理

引數

struct work_struct *work

struct amdgpu_irq 中的工作結構

描述

啟動處理 IH 環 1。

void amdgpu_irq_handle_ih2(struct work_struct *work)

啟動 IH2 的處理

引數

struct work_struct *work

struct amdgpu_irq 中的工作結構

描述

啟動 IH 環 2 的處理。

void amdgpu_irq_handle_ih_soft(struct work_struct *work)

啟動 ih_soft 的處理

引數

struct work_struct *work

struct amdgpu_irq 中的工作結構

描述

啟動 IH 軟環的處理。

bool amdgpu_msi_ok(struct amdgpu_device *adev)

檢查是否啟用了 MSI 功能

引數

struct amdgpu_device *adev

amdgpu 裝置指標(未使用)

描述

檢查是否已透過模組引數停用 MSI 功能(所有 ASIC)。

返回

如果允許啟用 MSI,則為 *true*,否則為 *false*

int amdgpu_irq_init(struct amdgpu_device *adev)

初始化中斷處理

引數

struct amdgpu_device *adev

amdgpu 裝置指標

描述

設定熱插拔和重置中斷的工作函式,啟用 MSI 功能,初始化垂直消隱、熱插拔和重置中斷處理。

返回

成功時為 0,失敗時為錯誤程式碼

void amdgpu_irq_fini_sw(struct amdgpu_device *adev)

關閉中斷處理

引數

struct amdgpu_device *adev

amdgpu 裝置指標

描述

拆卸熱插拔和重置中斷的工作函式,停用 MSI 功能,關閉垂直消隱、熱插拔和重置中斷處理,關閉來自所有源的中斷(所有 ASIC)。

int amdgpu_irq_add_id(struct amdgpu_device *adev, unsigned int client_id, unsigned int src_id, struct amdgpu_irq_src *source)

註冊 IRQ 源

引數

struct amdgpu_device *adev

amdgpu 裝置指標

unsigned int client_id

客戶端 ID

unsigned int src_id

源 ID

struct amdgpu_irq_src *source

IRQ 源指標

描述

在客戶端上註冊 IRQ 源。

返回

成功時為 0,否則為錯誤程式碼

void amdgpu_irq_dispatch(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih)

將 IRQ 分派到 IP 塊

引數

struct amdgpu_device *adev

amdgpu 裝置指標

struct amdgpu_ih_ring *ih

中斷環例項

描述

將 IRQ 分派到 IP 塊。

void amdgpu_irq_delegate(struct amdgpu_device *adev, struct amdgpu_iv_entry *entry, unsigned int num_dw)

將 IV 委託給軟 IH 環

引數

struct amdgpu_device *adev

amdgpu 裝置指標

struct amdgpu_iv_entry *entry

IV 條目

unsigned int num_dw

IV 的大小

描述

將 IV 委託給軟 IH 環並安排對其進行處理。 如果由於某種原因硬體委託給 IH1 或 IH2 不起作用,則使用此方法。

int amdgpu_irq_update(struct amdgpu_device *adev, struct amdgpu_irq_src *src, unsigned int type)

更新硬體中斷狀態

引數

struct amdgpu_device *adev

amdgpu 裝置指標

struct amdgpu_irq_src *src

中斷源指標

unsigned int type

中斷型別

描述

更新特定源的中斷狀態(所有 ASIC)。

void amdgpu_irq_gpu_reset_resume_helper(struct amdgpu_device *adev)

更新所有源的中斷狀態

引數

struct amdgpu_device *adev

amdgpu 裝置指標

描述

重置後恢復時,更新所有源上所有型別中斷的狀態。

int amdgpu_irq_get(struct amdgpu_device *adev, struct amdgpu_irq_src *src, unsigned int type)

啟用中斷

引數

struct amdgpu_device *adev

amdgpu 裝置指標

struct amdgpu_irq_src *src

中斷源指標

unsigned int type

中斷型別

描述

在指定源上啟用指定型別的中斷(所有 ASIC)。

返回

成功時為 0,否則為錯誤程式碼

int amdgpu_irq_put(struct amdgpu_device *adev, struct amdgpu_irq_src *src, unsigned int type)

停用中斷

引數

struct amdgpu_device *adev

amdgpu 裝置指標

struct amdgpu_irq_src *src

中斷源指標

unsigned int type

中斷型別

描述

在指定源上啟用指定型別的中斷(所有 ASIC)。

返回

成功時為 0,否則為錯誤程式碼

bool amdgpu_irq_enabled(struct amdgpu_device *adev, struct amdgpu_irq_src *src, unsigned int type)

檢查是否已啟用中斷

引數

struct amdgpu_device *adev

amdgpu 裝置指標

struct amdgpu_irq_src *src

中斷源指標

unsigned int type

中斷型別

描述

檢查給定型別的中斷是否已在給定源上啟用。

返回

如果已啟用中斷,則為 *true*;如果已停用中斷或引數無效,則為 *false*

int amdgpu_irqdomain_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hwirq)

建立虛擬 IRQ 編號和硬體 IRQ 編號之間的對映

引數

struct irq_domain *d

amdgpu IRQ 域指標(未使用)

unsigned int irq

虛擬 IRQ 編號

irq_hw_number_t hwirq

硬體 IRQ 編號

描述

當前實現將簡單的中斷處理程式分配給給定的虛擬 IRQ。

返回

成功時為 0,否則為錯誤程式碼

int amdgpu_irq_add_domain(struct amdgpu_device *adev)

建立線性 IRQ 域

引數

struct amdgpu_device *adev

amdgpu 裝置指標

描述

為 GPU 中斷源建立 IRQ 域,這些中斷源可能由另一個驅動程式驅動(例如,ACP)。

返回

成功時為 0,否則為錯誤程式碼

void amdgpu_irq_remove_domain(struct amdgpu_device *adev)

移除 IRQ 域

引數

struct amdgpu_device *adev

amdgpu 裝置指標

描述

移除 GPU 中斷源的 IRQ 域,這些中斷源可能由另一個驅動程式驅動(例如,ACP)。

unsigned int amdgpu_irq_create_mapping(struct amdgpu_device *adev, unsigned int src_id)

建立域 Linux IRQ 之間的對映

引數

struct amdgpu_device *adev

amdgpu 裝置指標

unsigned int src_id

IH 源 ID

描述

建立域 IRQ(GPU IH src id)和 Linux IRQ 之間的對映。 將其用於生成 GPU 中斷但由其他驅動程式驅動的元件(例如,ACP)。

返回

Linux IRQ

IP 塊

GPU 由 IP(智慧財產權)塊組成。 這些 IP 塊提供各種功能:顯示、圖形、影片解碼等。 構成特定 GPU 的 IP 塊在 GPU 的相應 SoC 檔案中列出。 amdgpu_device.c 在初始化時獲取正在使用的 GPU 的 IP 塊列表。 然後,它可以對此列表進行操作以執行標準驅動程式操作,例如:初始化、完成、暫停、恢復等。

IP 塊實現的命名使用以下約定:<功能>_v<版本>(例如:gfx_v6_0)。

enum amd_ip_block_type

用於按功能對 IP 塊進行分類。

常量

AMD_IP_BLOCK_TYPE_COMMON

GPU 系列

AMD_IP_BLOCK_TYPE_GMC

圖形儲存器控制器

AMD_IP_BLOCK_TYPE_IH

中斷處理程式

AMD_IP_BLOCK_TYPE_SMC

系統管理控制器

AMD_IP_BLOCK_TYPE_PSP

平臺安全處理器

AMD_IP_BLOCK_TYPE_DCE

顯示和合成引擎

AMD_IP_BLOCK_TYPE_GFX

圖形和計算引擎

AMD_IP_BLOCK_TYPE_SDMA

系統 DMA 引擎

AMD_IP_BLOCK_TYPE_UVD

統一影片解碼器

AMD_IP_BLOCK_TYPE_VCE

影片壓縮引擎

AMD_IP_BLOCK_TYPE_ACP

音訊協處理器

AMD_IP_BLOCK_TYPE_VCN

影片核心/編解碼器下一代

AMD_IP_BLOCK_TYPE_MES

微引擎排程器

AMD_IP_BLOCK_TYPE_JPEG

JPEG 引擎

AMD_IP_BLOCK_TYPE_VPE

影片處理引擎

AMD_IP_BLOCK_TYPE_UMSCH_MM

多媒體使用者模式排程器

AMD_IP_BLOCK_TYPE_ISP

影像訊號處理器

AMD_IP_BLOCK_TYPE_NUM

IP 塊型別的總數

enum DC_DEBUG_MASK

可用於除錯顯示核心 IP 的位

常量

DC_DISABLE_PIPE_SPLIT

如果設定,則停用管道拆分

DC_DISABLE_STUTTER

如果設定,則停用記憶體口吃模式

DC_DISABLE_DSC

如果設定,則停用顯示流壓縮

DC_DISABLE_CLOCK_GATING

如果設定,則停用時鐘門控最佳化

DC_DISABLE_PSR

如果設定,則停用面板自重新整理 v1 和 PSR-SU

DC_FORCE_SUBVP_MCLK_SWITCH

如果設定,則強制在 subvp 中進行 mclk 切換,即使可以在垂直消隱中進行 mclk 切換

DC_DISABLE_MPO

如果設定,則停用多平面解除安裝

DC_ENABLE_DPIA_TRACE

如果設定,則為 DPIA 啟用跟蹤日誌記錄

DC_ENABLE_DML2

如果設定,則強制使用 DML2,即使 DCN 版本沒有預設為此。

DC_DISABLE_PSR_SU

如果設定,則停用 PSR SU

DC_DISABLE_REPLAY

如果設定,則停用面板重放

DC_DISABLE_IPS

如果設定,則始終停用所有空閒電源狀態。 如果設定了多個 IPS 除錯位,則最低位優先。 例如,如果設定了 DC_FORCE_IPS_ENABLE 和 DC_DISABLE_IPS_DYNAMIC,則 DC_DISABLE_IPS_DYNAMIC 優先。

DC_DISABLE_IPS_DYNAMIC

如果設定,則始終停用所有 IPS,*除非*驅動程式進入掛起狀態。

DC_DISABLE_IPS2_DYNAMIC

如果設定,如果啟用了顯示器,則停用 IPS2(允許 IPS1)。 否則,啟用所有 IPS。

DC_FORCE_IPS_ENABLE

如果設定,則始終強制啟用所有 IPS。

DC_DISABLE_ACPI_EDID

如果設定,則不要嘗試從 ACPI _DDC 方法獲取 eDP 顯示器的 EDID。

DC_DISABLE_HDMI_CEC

如果設定,則停用 amdgpu 驅動程式中的 HDMI-CEC 功能。

DC_DISABLE_SUBVP_FAMS

如果設定,則停用 amdgpu 驅動程式中的 DCN 子視口和韌體輔助儲存時鐘切換 (FAMS) 功能。

DC_DISABLE_CUSTOM_BRIGHTNESS_CURVE

如果設定,則停用對自定義亮度曲線的支援

DC_HDCP_LC_FORCE_FW_ENABLE

如果設定,則使用 HDCP 區域性性檢查 FW 路徑,無論報告的 HW 功能如何。

DC_HDCP_LC_ENABLE_SW_FALLBACK

如果設定,在 HDCP 區域性性檢查 FW 路徑失敗時,使用舊版 SW 路徑重試。

DC_SKIP_DETECTION_LT

如果設定,則跳過檢測鏈路訓練

struct amd_ip_funcs

用於管理 amdgpu IP 塊的通用掛鉤

定義:

struct amd_ip_funcs {
    char *name;
    int (*early_init)(struct amdgpu_ip_block *ip_block);
    int (*late_init)(struct amdgpu_ip_block *ip_block);
    int (*sw_init)(struct amdgpu_ip_block *ip_block);
    int (*sw_fini)(struct amdgpu_ip_block *ip_block);
    int (*early_fini)(struct amdgpu_ip_block *ip_block);
    int (*hw_init)(struct amdgpu_ip_block *ip_block);
    int (*hw_fini)(struct amdgpu_ip_block *ip_block);
    void (*late_fini)(struct amdgpu_ip_block *ip_block);
    int (*prepare_suspend)(struct amdgpu_ip_block *ip_block);
    int (*suspend)(struct amdgpu_ip_block *ip_block);
    int (*resume)(struct amdgpu_ip_block *ip_block);
    bool (*is_idle)(struct amdgpu_ip_block *ip_block);
    int (*wait_for_idle)(struct amdgpu_ip_block *ip_block);
    bool (*check_soft_reset)(struct amdgpu_ip_block *ip_block);
    int (*pre_soft_reset)(struct amdgpu_ip_block *ip_block);
    int (*soft_reset)(struct amdgpu_ip_block *ip_block);
    int (*post_soft_reset)(struct amdgpu_ip_block *ip_block);
    int (*set_clockgating_state)(struct amdgpu_ip_block *ip_block, enum amd_clockgating_state state);
    int (*set_powergating_state)(struct amdgpu_ip_block *ip_block, enum amd_powergating_state state);
    void (*get_clockgating_state)(struct amdgpu_ip_block *ip_block, u64 *flags);
    void (*dump_ip_state)(struct amdgpu_ip_block *ip_block);
    void (*print_ip_state)(struct amdgpu_ip_block *ip_block, struct drm_printer *p);
};

成員

name

IP 塊的名稱

early_init

設定早期驅動程式狀態(sw_init 之前),不配置 hw - 可選

late_init

設定後期驅動程式/hw 狀態(hw_init 後)- 可選

sw_init

設定驅動程式狀態,不配置 hw

sw_fini

拆卸驅動程式狀態,不配置 hw

early_fini

從驅動程式分離 dev 之前拆卸內容

hw_init

設定 hw 狀態

hw_fini

拆卸 hw 狀態

late_fini

最終清理

prepare_suspend

處理 IP 特定更改以準備掛起(例如,分配任何所需的記憶體)

suspend

處理 IP 特定 hw/sw 更改以進行掛起

resume

處理 IP 特定 hw/sw 更改以進行恢復

is_idle

返回當前 IP 塊空閒狀態

wait_for_idle

輪詢以確定是否空閒

check_soft_reset

檢查軟重置 IP 塊

pre_soft_reset

預軟重置 IP 塊

soft_reset

軟重置 IP 塊

post_soft_reset

後軟重置 IP 塊

set_clockgating_state

啟用/停用 IP 塊的 cg

set_powergating_state

啟用/停用 IP 塊的 pg

get_clockgating_state

獲取當前時鐘門控狀態

dump_ip_state

在 GPU 掛起期間轉儲 ASIC 的 IP 狀態

print_ip_state

在 devcoredump 中列印 ASIC 的每個 IP 的 IP 狀態

描述

這些掛鉤提供了一個介面,用於控制 IP 塊的執行狀態。 在獲取正在使用的 GPU 的 IP 塊列表後,驅動程式可以透過遍歷此列表並呼叫每個 IP 塊中的掛鉤來進行晶片範圍的狀態更改。 對此列表進行排序,以確保驅動程式以安全的順序初始化 IP 塊。