核心驅動程式基礎設施¶
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 共享一種類似的操作形式,可以對其進行抽象以方便理解這些塊的行為。 請參見下圖,該圖說明了這些塊的常見元件
在此圖的中心部分,您可以看到兩個硬體元件,一個稱為 管道,另一個稱為 佇列; 重要的是要強調佇列必須與管道相關聯,反之亦然。 每個特定的硬體 IP 可能具有不同數量的管道,進而具有不同數量的佇列; 例如,GFX 11 每個管道有兩個管道和兩個佇列,用於 GFX 前端。
管道是處理佇列中可用指令的硬體; 換句話說,它是一個執行插入佇列中的操作的執行緒。 管道的一個關鍵特徵是它們一次只能執行一個佇列; 無論硬體在管道中有多少個佇列,它每個管道只執行一個佇列。
管道具有在硬體級別在佇列之間交換的機制。 然而,它們僅利用被認為是對映的佇列。 管道可以基於以下任何輸入在佇列之間切換
命令流;
逐個資料包;
其他硬體請求更改(例如,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 *aboamdgpu_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 *adevamdgpu 裝置物件
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 *adevamdgpu 裝置物件
uint64_t offsetBO 的偏移量
uint64_t sizeBO 的大小
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 *adevamdgpu 裝置物件
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 *adevamdgpu 裝置物件
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 *adevamdgpu 裝置物件
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 *boamdgpu_bo緩衝區物件
描述
呼叫 ttm_kmap_obj_virtual() 獲取核心虛擬地址
返回
緩衝區物件區域的虛擬地址。
-
void amdgpu_bo_kunmap(struct amdgpu_bo *bo)¶
取消對映
amdgpu_bo緩衝區物件
-
struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo)¶
引用
amdgpu_bo緩衝區物件
引數
struct amdgpu_bo *boamdgpu_bo緩衝區物件
描述
引用包含的 ttm_buffer_object。
返回
指向 amdgpu_bo 緩衝區物件的引用計數指標。
-
void amdgpu_bo_unref(struct amdgpu_bo **bo)¶
取消引用
amdgpu_bo緩衝區物件
引數
struct amdgpu_bo **boamdgpu_bo緩衝區物件
描述
取消引用包含的 ttm_buffer_object 並清除指標
-
int amdgpu_bo_pin(struct amdgpu_bo *bo, u32 domain)¶
固定
amdgpu_bo緩衝區物件
引數
struct amdgpu_bo *boamdgpu_bo要固定的緩衝區物件u32 domain要固定到的域
描述
根據請求的域固定緩衝區物件。 如果記憶體是未繫結的 gart 記憶體,則將頁面繫結到 gart 表中。 相應地調整 pin_count 和 pin_size。
固定意味著鎖定記憶體中的頁面以及將它們保持在固定的偏移量處。 當緩衝區無法移動時(例如,當顯示緩衝區正在掃描輸出時)需要這樣做。
返回
成功時為 0,失敗時為負錯誤程式碼。
-
void amdgpu_bo_unpin(struct amdgpu_bo *bo)¶
取消固定
amdgpu_bo緩衝區物件
引數
struct amdgpu_bo *boamdgpu_bo要取消固定的緩衝區物件
描述
減少 pin_count,如果 pin_count 達到 0,則清除標誌。 相應地更改放置位置和固定大小。
返回
成功時為 0,失敗時為負錯誤程式碼。
-
int amdgpu_bo_init(struct amdgpu_device *adev)¶
初始化記憶體管理器
引數
struct amdgpu_device *adevamdgpu 裝置物件
描述
呼叫 amdgpu_ttm_init() 初始化 amdgpu 記憶體管理器。
返回
成功時為 0,失敗時為負錯誤程式碼。
-
void amdgpu_bo_fini(struct amdgpu_device *adev)¶
拆除記憶體管理器
-
int amdgpu_bo_set_tiling_flags(struct amdgpu_bo *bo, u64 tiling_flags)¶
設定平鋪標誌
引數
struct amdgpu_bo *boamdgpu_bo緩衝區物件u64 tiling_flags新標誌
描述
使用新的平鋪標誌設定緩衝區物件的平鋪標誌。 由 GEM ioctl 或核心驅動程式用於設定緩衝區上的平鋪標誌。
返回
成功時為 0,失敗時為負錯誤程式碼。
-
void amdgpu_bo_get_tiling_flags(struct amdgpu_bo *bo, u64 *tiling_flags)¶
獲取平鋪標誌
引數
struct amdgpu_bo *boamdgpu_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 *boamdgpu_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 *boamdgpu_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,失敗時為負錯誤程式碼。
引數
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 *adevamdgpu 裝置指標
struct dma_resv *resv要同步到的預留物件
enum amdgpu_sync_mode sync_mode同步模式
void *ownerfence 所有者
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 *ownerfence 所有者
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)¶
獲取首選域
-
u64 amdgpu_bo_print_info(int id, struct amdgpu_bo *bo, struct seq_file *m)¶
在 debugfs 檔案中列印 BO 資訊
引數
int idBO 的索引或 Id
struct amdgpu_bo *bo請求列印資訊的 BO
struct seq_file *mdebugfs 檔案
描述
在 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)¶
引數
struct dma_buf *dmabuf我們附加到的 DMA-buf
struct dma_buf_attachment *attach要新增的附件
描述
將附件作為使用者新增到匯出的 DMA-buf。
-
int amdgpu_dma_buf_pin(struct dma_buf_attachment *attach)¶
引數
struct dma_buf_attachment *attach要鎖定的附件
描述
鎖定支援 DMA-buf 的 BO,使其無法再移動。
-
void amdgpu_dma_buf_unpin(struct dma_buf_attachment *attach)¶
引數
struct dma_buf_attachment *attach要解鎖的附件
描述
解鎖先前鎖定的 BO 以使其再次可移動。
-
struct sg_table *amdgpu_dma_buf_map(struct dma_buf_attachment *attach, enum dma_data_direction dir)¶
引數
struct dma_buf_attachment *attachDMA-buf 附件
enum dma_data_direction dirDMA 方向
描述
確保目標裝置可以訪問共享 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)¶
引數
struct dma_buf_attachment *attachDMA-buf 附件
struct sg_table *sgt要取消對映的 sg_table
enum dma_data_direction dirDMA 方向
描述
當共享 DMA 緩衝區不再需要被另一個裝置訪問時,將呼叫此函式。目前,只需從 GTT 中解鎖緩衝區。
引數
struct dma_buf *dma_buf共享 DMA 緩衝區
enum dma_data_direction directionDMA 傳輸方向
描述
在 CPU 訪問共享 DMA 緩衝區的記憶體之前呼叫此函式。如果是讀取訪問,則儘可能將緩衝區移動到 GTT 域,以獲得最佳 CPU 讀取效能。
返回
成功時為 0,失敗時為負錯誤程式碼。
-
struct dma_buf *amdgpu_gem_prime_export(struct drm_gem_object *gobj, int flags)¶
引數
struct drm_gem_object *gobjGEM BO
int flagsDRM_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 *devDRM 裝置
struct dma_buf *dma_bufDMA-buf
描述
為 DMA-buf 匯入建立空的 SG BO。
返回
給定 DRM 裝置的新 GEM BO,表示給定 DMA-buf 附件和分散/聚集表描述的記憶體。
-
void amdgpu_dma_buf_move_notify(struct dma_buf_attachment *attach)¶
引數
struct dma_buf_attachment *attachDMA-buf 附件
描述
使 DMA-buf 附件失效,確保我們在下次使用之前重新建立對映。
-
struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev, struct dma_buf *dma_buf)¶
引數
struct drm_device *devDRM 裝置
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 *boamdgpu 緩衝區物件
返回
如果可以透過 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 *boamdgpu 緩衝區物件
unsigned long addr我們應該監視的 userptr addr
描述
在指定地址為給定 BO 註冊 mmu_notifier。成功時返回 0,如果出現任何問題,則返回 -ERRNO。
-
void amdgpu_hmm_unregister(struct amdgpu_bo *bo)¶
登出 BO 以進行通知程式更新
引數
struct amdgpu_bo *boamdgpu 緩衝區物件
描述
從緩衝區物件中刪除 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;
};
成員
adevamdgpu 裝置
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 *adevamdgpu_device 指標
struct amdgpu_vm *vmamdgpu_vm 指標
u32 pasidVM 在此 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 物件移動到一種狀態,在該狀態下它們將在驗證期間再次更新。
用於更新共享記憶體統計資訊的助手函式
引數
struct amdgpu_vm_bo_base *base用於跟蹤 VM 中 BO 使用情況的基本結構
描述
獲取 vm status_lock 並更新共享記憶體統計資訊。如果基本統計資訊已更改(例如,緩衝區已移動),則也需要呼叫 amdgpu_vm_update_stats。
當 bo 被共享/取消共享時的回撥
引數
struct amdgpu_bo *boamdgpu 緩衝區物件
描述
如果需要,更新所有 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 *resttm_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 *resttm_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 *boamdgpu 緩衝區物件
描述
初始化 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 *execdrm 執行上下文
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 *adevamdgpu 裝置指標
struct amdgpu_vm *vm提供 BO 的 vm
描述
將所有 BO 移動到 LRU 的末尾,並記住它們的位置以將它們放在一起。
-
uint64_t amdgpu_vm_generation(struct amdgpu_device *adev, struct amdgpu_vm *vm)¶
返回頁表重新生成計數器
引數
struct amdgpu_device *adevamdgpu_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 *adevamdgpu 裝置指標
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 *adevamdgpu_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 *adevamdgpu_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 unlockedMM 回撥期間的解鎖失效
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_basevram 對映的基礎
struct ttm_resource *res要對映的 ttm_resource
dma_addr_t *pages_addr用於對映的 DMA 地址
struct dma_fence **fence可選的結果 fence
描述
填充 start 和 last 之間的頁表條目。
返回
成功則為 0,失敗則為負錯誤程式碼。
-
int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va, bool clear)¶
更新 vm 頁表中的所有 BO 對映
引數
struct amdgpu_device *adevamdgpu_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 *adevamdgpu_device 指標
-
void amdgpu_vm_prt_get(struct amdgpu_device *adev)¶
新增 PRT 使用者
引數
struct amdgpu_device *adevamdgpu_device 指標
-
void amdgpu_vm_prt_put(struct amdgpu_device *adev)¶
刪除 PRT 使用者
引數
struct amdgpu_device *adevamdgpu_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回撥函式
引數
struct amdgpu_device *adevamdgpu_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 *adevamdgpu_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 *adevamdgpu_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 *adevamdgpu_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 *adevamdgpu_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 *adevamdgpu_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 *adevamdgpu_device 指標
struct amdgpu_vm *vm請求的 vm
struct amdgpu_bo *boamdgpu 緩衝區物件
描述
將 **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 *adevamdgpu_device 指標
struct amdgpu_bo_va *bo_vabo_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 *adevamdgpu_device 指標
struct amdgpu_bo_va *bo_vabo_va 用於儲存地址
uint64_t saddrbo 對映的位置
uint64_t offsetbo 中請求的偏移量
uint64_t sizebo 大小,以位元組為單位
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 *adevamdgpu_device 指標
struct amdgpu_bo_va *bo_vabo_va 用於儲存地址
uint64_t saddrbo 對映的位置
uint64_t offsetbo 中請求的偏移量
uint64_t sizebo 大小,以位元組為單位
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 *adevamdgpu_device 指標
struct amdgpu_bo_va *bo_vabo_va 用於從中移除地址
uint64_t saddrBO 對映的位置
描述
從 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 *adevamdgpu_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 *ticketCS ticket
描述
跟蹤命令提交期間預留的 BO 的所有對映。
-
void amdgpu_vm_bo_del(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va)¶
從特定的 vm 中移除 bo
引數
struct amdgpu_device *adevamdgpu_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 *boVM 的頁表。
描述
檢查是否可以驅逐 VM。
-
void amdgpu_vm_bo_invalidate(struct amdgpu_bo *bo, bool evicted)¶
將 bo 標記為無效
引數
struct amdgpu_bo *boamdgpu 緩衝區物件
bool evictedBO 是否被驅逐
描述
將 **bo** 標記為無效。
-
void amdgpu_vm_bo_move(struct amdgpu_bo *bo, struct ttm_resource *new_mem, bool evicted)¶
處理 BO 移動
引數
struct amdgpu_bo *boamdgpu 緩衝區物件
struct ttm_resource *new_memBO 移動的新位置
bool evictedBO 是否被驅逐
描述
更新新位置的記憶體統計資訊,並將 **bo** 標記為無效。
-
uint32_t amdgpu_vm_get_block_size(uint64_t vm_size)¶
以 2 的冪計算 VM 頁表大小
引數
uint64_t vm_sizeVM 大小
返回
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 *adevamdgpu_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 *adevdrm 裝置指標
u32 pasidVM 的 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 *adevamdgpu_device 指標
struct amdgpu_vm *vm請求的 vm
int32_t xcp_idGPU 分割槽選擇 id
描述
初始化 **vm** 欄位。
返回
成功則為 0,失敗則為錯誤。
-
int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)¶
將 GFX VM 轉換為計算 VM
引數
struct amdgpu_device *adevamdgpu_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 *adevamdgpu_device 指標
struct amdgpu_vm *vm請求的 vm
描述
拆卸 **vm**。取消繫結 VM 並從 vm bo 列表中移除所有 bo
-
void amdgpu_vm_manager_init(struct amdgpu_device *adev)¶
初始化 VM 管理器
引數
struct amdgpu_device *adevamdgpu_device 指標
描述
初始化 VM 管理器結構
-
void amdgpu_vm_manager_fini(struct amdgpu_device *adev)¶
清理 VM 管理器
引數
struct amdgpu_device *adevamdgpu_device 指標
描述
清理 VM 管理器並釋放資源。
-
int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)¶
管理 vm hub 的 VMID 預留。
引數
struct drm_device *devdrm 裝置指標
void *datadrm_amdgpu_vm
struct drm_file *filpdrm 檔案指標
返回
成功返回 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 *adevamdgpu 裝置指標
u32 pasidVM 的 PASID
u32 vmidVMID,僅用於 GFX 9.4.3。
u32 node_idIH cookie 中接收的 Node_id。僅適用於 GFX 9.4.3。
uint64_t addr故障地址
uint64_t ts故障的時間戳
bool write_faulttrue 表示寫故障,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 *mdebugfs 檔案
描述
在 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 *adevamdgpu 裝置指標
unsigned int pasidVM 的 PASID
uint64_t addr故障地址
uint32_t statusGPUVM 故障狀態暫存器
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 *adevamdgpu 裝置指標
描述
停用來自所有來源的所有型別的中斷。
-
irqreturn_t amdgpu_irq_handler(int irq, void *arg)¶
IRQ 處理程式
引數
int irqIRQ 編號(未使用)
void *arg指向 DRM 裝置的指標
描述
amdgpu 驅動程式(所有 ASIC)的 IRQ 處理程式。
返回
處理 IRQ 的結果,由 irqreturn_t 定義
-
void amdgpu_irq_handle_ih1(struct work_struct *work)¶
啟動 IH1 的處理
引數
struct work_struct *workstruct amdgpu_irq 中的工作結構
描述
啟動處理 IH 環 1。
-
void amdgpu_irq_handle_ih2(struct work_struct *work)¶
啟動 IH2 的處理
引數
struct work_struct *workstruct amdgpu_irq 中的工作結構
描述
啟動 IH 環 2 的處理。
-
void amdgpu_irq_handle_ih_soft(struct work_struct *work)¶
啟動 ih_soft 的處理
引數
struct work_struct *workstruct amdgpu_irq 中的工作結構
描述
啟動 IH 軟環的處理。
-
bool amdgpu_msi_ok(struct amdgpu_device *adev)¶
檢查是否啟用了 MSI 功能
引數
struct amdgpu_device *adevamdgpu 裝置指標(未使用)
描述
檢查是否已透過模組引數停用 MSI 功能(所有 ASIC)。
返回
如果允許啟用 MSI,則為 *true*,否則為 *false*
-
int amdgpu_irq_init(struct amdgpu_device *adev)¶
初始化中斷處理
引數
struct amdgpu_device *adevamdgpu 裝置指標
描述
設定熱插拔和重置中斷的工作函式,啟用 MSI 功能,初始化垂直消隱、熱插拔和重置中斷處理。
返回
成功時為 0,失敗時為錯誤程式碼
-
void amdgpu_irq_fini_sw(struct amdgpu_device *adev)¶
關閉中斷處理
引數
struct amdgpu_device *adevamdgpu 裝置指標
描述
拆卸熱插拔和重置中斷的工作函式,停用 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 *adevamdgpu 裝置指標
unsigned int client_id客戶端 ID
unsigned int src_id源 ID
struct amdgpu_irq_src *sourceIRQ 源指標
描述
在客戶端上註冊 IRQ 源。
返回
成功時為 0,否則為錯誤程式碼
-
void amdgpu_irq_dispatch(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih)¶
將 IRQ 分派到 IP 塊
引數
struct amdgpu_device *adevamdgpu 裝置指標
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 *adevamdgpu 裝置指標
struct amdgpu_iv_entry *entryIV 條目
unsigned int num_dwIV 的大小
描述
將 IV 委託給軟 IH 環並安排對其進行處理。 如果由於某種原因硬體委託給 IH1 或 IH2 不起作用,則使用此方法。
-
int amdgpu_irq_update(struct amdgpu_device *adev, struct amdgpu_irq_src *src, unsigned int type)¶
更新硬體中斷狀態
引數
struct amdgpu_device *adevamdgpu 裝置指標
struct amdgpu_irq_src *src中斷源指標
unsigned int type中斷型別
描述
更新特定源的中斷狀態(所有 ASIC)。
-
void amdgpu_irq_gpu_reset_resume_helper(struct amdgpu_device *adev)¶
更新所有源的中斷狀態
引數
struct amdgpu_device *adevamdgpu 裝置指標
描述
重置後恢復時,更新所有源上所有型別中斷的狀態。
-
int amdgpu_irq_get(struct amdgpu_device *adev, struct amdgpu_irq_src *src, unsigned int type)¶
啟用中斷
引數
struct amdgpu_device *adevamdgpu 裝置指標
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 *adevamdgpu 裝置指標
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 *adevamdgpu 裝置指標
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 *damdgpu 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 *adevamdgpu 裝置指標
描述
為 GPU 中斷源建立 IRQ 域,這些中斷源可能由另一個驅動程式驅動(例如,ACP)。
返回
成功時為 0,否則為錯誤程式碼
-
void amdgpu_irq_remove_domain(struct amdgpu_device *adev)¶
移除 IRQ 域
引數
struct amdgpu_device *adevamdgpu 裝置指標
描述
移除 GPU 中斷源的 IRQ 域,這些中斷源可能由另一個驅動程式驅動(例如,ACP)。
-
unsigned int amdgpu_irq_create_mapping(struct amdgpu_device *adev, unsigned int src_id)¶
建立域 Linux IRQ 之間的對映
引數
struct amdgpu_device *adevamdgpu 裝置指標
unsigned int src_idIH 源 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_COMMONGPU 系列
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_JPEGJPEG 引擎
AMD_IP_BLOCK_TYPE_VPE影片處理引擎
AMD_IP_BLOCK_TYPE_UMSCH_MM多媒體使用者模式排程器
AMD_IP_BLOCK_TYPE_ISP影像訊號處理器
AMD_IP_BLOCK_TYPE_NUMIP 塊型別的總數
-
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);
};
成員
nameIP 塊的名稱
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 塊。