I915 Small BAR RFC 章節

從 DG2 開始,我們將支援裝置本地記憶體(即 I915_MEMORY_CLASS_DEVICE)的可調整大小的 BAR 支援,但在某些情況下,最終的 BAR 大小可能仍小於總探測大小。在這種情況下,只有 I915_MEMORY_CLASS_DEVICE 的一部分可以被 CPU 訪問(例如前 256M),而其餘部分只能透過 GPU 訪問。

I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS 標誌

新的 gem_create_ext 標誌,用於告知核心一個 BO 將需要 CPU 訪問。當將物件放置在 I915_MEMORY_CLASS_DEVICE 中時,這變得非常重要,因為底層裝置具有一個小的 BAR,這意味著只有一部分可以被 CPU 訪問。如果沒有此標誌,核心將假定不需要 CPU 訪問,並優先使用 I915_MEMORY_CLASS_DEVICE 中非 CPU 可見的部分。

struct __drm_i915_gem_create_ext

現有的 gem_create 行為,使用 struct i915_user_extension 添加了擴充套件支援。

定義:

struct __drm_i915_gem_create_ext {
    __u64 size;
    __u32 handle;
#define I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS (1 << 0);
    __u32 flags;
#define I915_GEM_CREATE_EXT_MEMORY_REGIONS 0;
#define I915_GEM_CREATE_EXT_PROTECTED_CONTENT 1;
    __u64 extensions;
};

成員

size

物件請求的大小。

將返回物件的(頁對齊的)已分配大小。

請注意,對於某些裝置,我們可能還有其他最小頁面大小限制(大於 4K),例如對於裝置本地記憶體。但是,通常,如果使用 I915_GEM_CREATE_EXT_MEMORY_REGIONS 擴充套件將物件放置在裝置本地記憶體中,則此處的最終大小應始終反映任何向上舍入。核心將始終為一組可能的放置選擇最大的最小頁面大小作為向上舍入 **size** 時使用的值。

handle

返回物件的控制代碼。

物件控制代碼為非零。

flags

可選標誌。

支援的值

I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS - 向核心發出訊號,表明該物件將需要透過 CPU 訪問。

僅在將物件放置在 I915_MEMORY_CLASS_DEVICE 中時有效,並且僅在裝置記憶體的某些子集可以直接透過 CPU 可見/對映的配置中嚴格需要(我們也稱之為 small BAR),例如在某些 DG2+ 系統上。請注意,這是非常不受歡迎的,但由於各種因素(如客戶端 CPU、BIOS 等),我們可能會在實際情況中看到這種情況。請參閱 __drm_i915_memory_region_info.probed_cpu_visible_size,瞭解如何確定此係統是否適用。

請注意,其中一個放置必須是 I915_MEMORY_CLASS_SYSTEM,以確保核心始終可以將分配溢位到系統記憶體,如果該物件無法在 I915_MEMORY_CLASS_DEVICE 的可對映部分中分配。

另請注意,由於核心僅支援可以*僅*放置在 I915_MEMORY_CLASS_DEVICE 中的物件的平面 CCS,因此我們不支援 I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS 與平面 CCS 一起使用。

如果沒有此提示,核心將假定非可對映的 I915_MEMORY_CLASS_DEVICE 是此物件的首選。請注意,如果使用者空間發生 CPU 故障,核心仍然可以將該物件遷移到可對映部分,作為最後的手段,但這可能會很昂貴,因此理想情況下應避免這種情況。

在缺少相關 small-bar uAPI 支援的舊核心上(另請參見 __drm_i915_memory_region_info.probed_cpu_visible_size),使用該標誌將導致錯誤,但假設我們也可以成功載入 i915 核心模組,則永遠不可能最終得到 small BAR 配置。在這種情況下,整個 I915_MEMORY_CLASS_DEVICE 區域都可以被 CPU 訪問,因此對物件的放置位置沒有任何限制。

extensions

要應用於此物件的擴充套件鏈。

當我們需要支援幾個不同的擴充套件時,並且在建立物件時需要應用多個擴充套件時,這將非常有用。請參閱 struct i915_user_extension

如果我們不提供任何擴充套件,那麼我們將獲得相同的舊 gem_create 行為。

有關 I915_GEM_CREATE_EXT_MEMORY_REGIONS 的用法,請參見 struct drm_i915_gem_create_ext_memory_regions

有關 I915_GEM_CREATE_EXT_PROTECTED_CONTENT 的用法,請參見 struct drm_i915_gem_create_ext_protected_content

描述

請注意,新的緩衝區標誌應該在此處新增,至少對於不可變的東西。以前,我們將有兩個 ioctl,一個用於使用 gem_create 建立物件,另一個用於應用各種引數,但是這為被認為是不可變的引數建立了一些歧義。通常,我們也在逐步淘汰各種 SET/GET ioctl。

probed_cpu_visible_size 屬性

新的 struct__drm_i915_memory_region 屬性,用於返回特定區域的 CPU 可訪問部分的總大小。這應該僅適用於 I915_MEMORY_CLASS_DEVICE。我們還報告 unallocated_cpu_visible_size,以及 unallocated_size。

Vulkan 將需要此作為建立具有 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT 設定的單獨 VkMemoryHeap 的一部分,以表示 CPU 可見部分,其中需要知道堆的總大小。它還希望能夠大致估計記憶體的潛在分配方式。

struct __drm_i915_memory_region_info

描述驅動程式已知的一個區域。

定義:

struct __drm_i915_memory_region_info {
    struct drm_i915_gem_memory_class_instance region;
    __u32 rsvd0;
    __u64 probed_size;
    __u64 unallocated_size;
    union {
        __u64 rsvd1[8];
        struct {
            __u64 probed_cpu_visible_size;
            __u64 unallocated_cpu_visible_size;
        };
    };
};

成員

region

類:例項對編碼

rsvd0

MBZ

probed_size

驅動程式探測到的記憶體

請注意,永遠不可能遇到零值,還請注意,當前沒有區域型別會在此處返回 -1。雖然對於將來的區域型別,這可能是一種可能性。其他大小欄位也適用。

unallocated_size

剩餘記憶體的估計

需要 CAP_PERFMON 或 CAP_SYS_ADMIN 才能獲得可靠的帳戶資訊。如果沒有此許可權(或者如果這是一箇舊核心),則此處的值將始終等於 **probed_size**。請注意,這目前僅針對 I915_MEMORY_CLASS_DEVICE 區域進行跟蹤(對於其他型別,此處的值將始終等於 **probed_size**)。

{unnamed_union}

anonymous

rsvd1

MBZ

{unnamed_struct}

anonymous

probed_cpu_visible_size

驅動程式探測到的 CPU 可訪問的記憶體。

這將始終 <= **probed_size**,其餘部分(如果有)將無法被 CPU 訪問。

在沒有 small BAR 的系統上,**probed_size** 將始終等於 **probed_cpu_visible_size**,因為所有這些都將被 CPU 訪問。

請注意,這僅針對 I915_MEMORY_CLASS_DEVICE 區域進行跟蹤(對於其他型別,此處的值將始終等於 **probed_size**)。

請注意,如果此處返回的值為零,那麼這必須是缺少相關 small-bar uAPI 支援的舊核心(包括 I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS),但在這樣的系統上,我們實際上永遠不應該最終得到 small BAR 配置,假設我們能夠載入核心模組。因此,可以安全地將其視為 **probed_cpu_visible_size** == **probed_size**。

unallocated_cpu_visible_size

剩餘的 CPU 可見記憶體的估計

請注意,這僅針對 I915_MEMORY_CLASS_DEVICE 區域進行跟蹤(對於其他型別,此處的值將始終等於 **probed_cpu_visible_size**)。

需要 CAP_PERFMON 或 CAP_SYS_ADMIN 才能獲得可靠的帳戶資訊。如果沒有此許可權,則此處的值將始終等於 **probed_cpu_visible_size**。請注意,這目前僅針對 I915_MEMORY_CLASS_DEVICE 區域進行跟蹤(對於其他型別,此處的值也將始終等於 **probed_cpu_visible_size**)。

如果這是一箇舊核心,則此處的值將為零,另請參見 **probed_cpu_visible_size**。

描述

請注意,這同時使用了 struct drm_i915_query_itemstruct drm_i915_query。對於這個新查詢,我們正在 drm_i915_query_item.query_id 新增新的查詢 id DRM_I915_QUERY_MEMORY_REGIONS。

錯誤捕獲限制

使用錯誤捕獲,我們有兩個新的限制

1) 在 small BAR 系統上,錯誤捕獲是盡力而為的;如果在捕獲時頁面無法被 CPU 訪問,則核心可以自由地跳過嘗試捕獲它們。

2) 在獨立和較新的整合平臺上,我們現在拒絕在可恢復的上下文中進行錯誤捕獲。將來,當某些內容當前無法被 CPU 訪問時,核心可能希望在錯誤捕獲期間進行 blit。