wsl/hsakmt: implement ipc signal

IPC Signal only support sys ram backend and CPU&GPU both accessible,
IPC Memory only support vram backend and only GPU accessible.

Reviewed-by: Flora Cui <flora.cui@amd.com>
Signed-off-by: tiancyin <tianci.yin@amd.com>
This commit is contained in:
tiancyin
2025-02-24 16:17:58 +08:00
committed by Frank Min
parent 2081ab01e6
commit 5f219029c2
2 changed files with 20 additions and 4 deletions
+12 -1
View File
@@ -110,6 +110,7 @@ public:
uint64_t PrivateApertureSize() { return device_info_.private_aperture_size; }
uint64_t SharedApertureBase() { return device_info_.shared_aperture_base; }
uint64_t SharedApertureSize() { return device_info_.shared_aperture_size; }
uint64_t SystemHeapSize() { return system_heap_space_size_; }
uint32_t LdsSize() { return device_info_.lds_size; }
uint64_t GPUCounterFrequency() { return device_info_.gpu_counter_frequency; }
uint32_t GetSwsQueueSize(void) const { return device_info_.user_queue_size; }
@@ -184,10 +185,18 @@ public:
const thunk_proxy::DeviceInfo& DeviceInfo() const { return device_info_; }
ErrorCode ReserveIPCSysMem(gpusize size,
gpusize *out_gpu_virtual_addr,
gpusize alignment,
int &memfd,
bool lock=false);
ErrorCode FreeIPCSysMem(gpusize gpu_addr, gpusize size, int &memfd);
ErrorCode ReserveGpuVirtualAddress(thunk_proxy::AllocDomain domain,
gpusize hit_base_addr,
gpusize size,
gpusize *out_gpu_virtual_addr,
gpusize *out_gpu_virtual_addr,
gpusize alignment,
bool lock=false);
@@ -219,6 +228,8 @@ private:
bool InitHandleApertureSpace(void);
bool CommitSystemHeapSpace(void* addr, int64_t size, bool lock=false);
bool DecommitSystemHeapSpace(void* addr, int64_t size);
bool CommitSystemHeapSpaceIPC(void* addr, int64_t size, int &fd, bool lock=false);
bool DecommitSystemHeapSpaceIPC(void* addr, int64_t size, int &memfd);
bool FreeLocalHeapSpace(void);
void InitVaMgr();
void InitHandleApertureMgr();
+8 -3
View File
@@ -63,7 +63,8 @@ union GpuMemoryCreateFlags {
uint64_t locked : 1; // lock virtual address space into RAM, preventing that memory from being paged to the swap area
uint64_t physical_contiguous : 1; // contiguous physical pages
uint64_t imported_vram_alloc_va : 1; // import buffer form dmabuf fd and allocate valid va (not from handle aperture)
uint64_t unused : 58;
uint64_t imported_sys_memfd : 1; // allocate system memory for IPC signal
uint64_t unused : 57;
};
uint64_t reserved;
};
@@ -78,7 +79,8 @@ union GpuMemoryDescFlags {
uint32_t is_queue_referenced : 1;
uint32_t is_physical_contiguous : 1;
uint32_t is_imported_vram_alloc_va : 1; // 0 - va from handle aperture; 1 - va from local heap;
uint32_t unused : 24;
uint32_t is_imported_sys_memfd : 1; // 0 - ignored; 1 - va from system heap
uint32_t unused : 23;
};
uint32_t reserved;
@@ -103,7 +105,7 @@ struct GpuMemoryCreateInfo {
gpusize alignment;
int mem_flags;
int engine_flag;
int dmabuf_fd; // Import from dmabuf
int dmabuf_fd; // Import from dmabuf
void *user_ptr;
gpusize va_hint;
@@ -162,6 +164,7 @@ public:
inline bool IsLocal() const { return desc_.domain == thunk_proxy::kLocal; }
inline bool IsUserMemory() const { return desc_.domain == thunk_proxy::kUserMemory; }
inline bool IsSystem() const { return desc_.domain == thunk_proxy::kSystem; }
inline bool IsSysMemFd() const { return desc_.flags.is_imported_sys_memfd; }
inline bool IsUserQueue() const { return desc_.domain == thunk_proxy::kUserQueue; }
inline bool IsPhysicalOnly() const { return desc_.flags.is_physical_only; }
inline bool IsPhysicalContiguous() const { return desc_.flags.is_physical_contiguous; }
@@ -221,6 +224,8 @@ private:
WinResourceHandle resource_; // Handle to a resource object that wraps the allocation. Used for shared resources
int mem_fd_; // IPC sigal's sys mem fd
DISALLOW_COPY_AND_ASSIGN(GpuMemory);
};