From cf28e2b27a85f5b32662e9bed617e56b34c37676 Mon Sep 17 00:00:00 2001 From: kjayapra-amd Date: Mon, 15 Jul 2024 07:58:24 -0400 Subject: [PATCH] SWDEV-439234 - Implement Set/Get Access APIs in PAL/Windows. Change-Id: I997c330880da70c5128b187e1ef4d9c449218880 [ROCm/clr commit: 11817b4405ac13d0f13a6e4a7b2fa5c3bee01cf2] --- projects/clr/rocclr/device/device.cpp | 10 ++++ projects/clr/rocclr/device/device.hpp | 20 +++++++- projects/clr/rocclr/device/pal/paldevice.cpp | 51 ++++++++++++++++++++ projects/clr/rocclr/device/pal/paldevice.hpp | 11 ++--- 4 files changed, 84 insertions(+), 8 deletions(-) diff --git a/projects/clr/rocclr/device/device.cpp b/projects/clr/rocclr/device/device.cpp index f777a8a03f..dfc7d09928 100644 --- a/projects/clr/rocclr/device/device.cpp +++ b/projects/clr/rocclr/device/device.cpp @@ -83,6 +83,16 @@ bool VirtualDevice::ActiveWait() const { } +static_assert(static_cast(device::Memory::MemAccess::kMemAccessNone) + == static_cast(amd::Device::VmmAccess::kNone), + "Mem Access Flag None mismatch between Device and Memory!"); +static_assert(static_cast(device::Memory::MemAccess::kMemAccessRead) + == static_cast(amd::Device::VmmAccess::kReadOnly), + "Mem Access Flag Read mismatch between Device and Memory!"); +static_assert(static_cast(device::Memory::MemAccess::kMemAccessReadWrite) + == static_cast(amd::Device::VmmAccess::kReadWrite), + "Mem Access Flag Read Write mismatch between Device and Memory!"); + namespace amd { amd::Monitor Device::lockP2P_("Lock P2P ON/OFF"); diff --git a/projects/clr/rocclr/device/device.hpp b/projects/clr/rocclr/device/device.hpp index a86e4c05e0..005c498f0f 100644 --- a/projects/clr/rocclr/device/device.hpp +++ b/projects/clr/rocclr/device/device.hpp @@ -726,6 +726,13 @@ class Memory : public amd::HeapObject { CpuWriteOnly = 0x00000002, //!< Lock for CPU write only operation }; + //! Memory Access flags at device level + enum MemAccess { + kMemAccessNone = 0, //! No Access + kMemAccessRead = 1, //! Read Access + kMemAccessReadWrite = 3 //! Read and Write Access + }; + union SyncFlags { struct { uint skipParent_ : 1; //!< Skip parent synchronization @@ -766,11 +773,14 @@ class Memory : public amd::HeapObject { Memory(amd::Memory& owner) : flags_(0), owner_(&owner), version_(0), mapMemory_(NULL), indirectMapCount_(0) { size_ = owner.getSize(); + memAccess_ = MemAccess::kMemAccessNone; } //! Constructor (no owner), always eager allocation. Memory(size_t size) - : flags_(0), owner_(NULL), version_(0), mapMemory_(NULL), indirectMapCount_(0), size_(size) {} + : flags_(0), owner_(NULL), version_(0), mapMemory_(NULL), indirectMapCount_(0), size_(size) { + memAccess_ = MemAccess::kMemAccessNone; + } enum GLResourceOP { GLDecompressResource = 0, // orders the GL driver to decompress any depth-stencil or MSAA @@ -921,6 +931,12 @@ class Memory : public amd::HeapObject { } } + //! Set access to the memory in this device. + void SetAccess(MemAccess memAccess) { memAccess_ = memAccess; } + + //! Get current access of the memory in device. + MemAccess GetAccess() const { return memAccess_; } + protected: enum Flags { HostMemoryDirectAccess = 0x00000001, //!< GPU has direct access to the host memory @@ -934,6 +950,8 @@ class Memory : public amd::HeapObject { }; uint flags_; //!< Memory object flags + MemAccess memAccess_; //!< Memory Access flag + amd::Memory* owner_; //!< The Memory instance that we cache, //!< or NULL if we're device-private workspace. diff --git a/projects/clr/rocclr/device/pal/paldevice.cpp b/projects/clr/rocclr/device/pal/paldevice.cpp index fc5916d389..98954d529a 100644 --- a/projects/clr/rocclr/device/pal/paldevice.cpp +++ b/projects/clr/rocclr/device/pal/paldevice.cpp @@ -2505,6 +2505,57 @@ void Device::virtualFree(void* addr) { } } +// ================================================================================================ +bool Device::SetMemAccess(void* va_addr, size_t va_size, VmmAccess access_flags) { + + amd::Memory* phys_mem_obj = amd::MemObjMap::FindMemObj(va_addr); + if (phys_mem_obj == nullptr) { + // If the phys_mem_obj is null, the check if this is a valid va_addr, but not-mapped, + // if not-mapped then print a different error message. (No functional change due to this check). + amd::Memory* vaddr_mem_obj = amd::MemObjMap::FindVirtualMemObj(va_addr); + if (vaddr_mem_obj == nullptr) { + LogPrintfError("Cannot find virtual address: 0x%x \n", va_addr); + return false; + } + LogPrintfError("Virtual address present, but not mapped yet: 0x%x \n", va_addr); + return false; + } + + // Check for valid size. + if (va_size > phys_mem_obj->getSize()) { + LogPrintfError("Given size: %u cannot be greater than mem_size: %u \n", va_size, + phys_mem_obj->getSize()); + return false; + } + + device::Memory* phys_dev_mem = phys_mem_obj->getDeviceMemory(*this); + phys_dev_mem->SetAccess(static_cast(access_flags)); + + return true; +} + +// ================================================================================================ +bool Device::GetMemAccess(void* va_addr, VmmAccess* access_flags_ptr) { + + amd::Memory* phys_mem_obj = amd::MemObjMap::FindMemObj(va_addr); + if (phys_mem_obj == nullptr) { + // If the phys_mem_obj is null, the check if this is a valid va_addr, but not-mapped, + // if not-mapped then print a different error message. (No functional change due to this check). + amd::Memory* vaddr_mem_obj = amd::MemObjMap::FindVirtualMemObj(va_addr); + if (vaddr_mem_obj == nullptr) { + LogPrintfError("Cannot find virtual address: 0x%x \n", va_addr); + return false; + } + LogPrintfError("Virtual address present, but not mapped yet: 0x%x \n", va_addr); + return false; + } + + device::Memory* phys_dev_mem = phys_mem_obj->getDeviceMemory(*this); + device::Memory::MemAccess mem_access = phys_dev_mem->GetAccess(); + *access_flags_ptr = static_cast(mem_access); + + return true; +} // ================================================================================================ bool Device::AcquireExclusiveGpuAccess() { // Lock the virtual GPU list diff --git a/projects/clr/rocclr/device/pal/paldevice.hpp b/projects/clr/rocclr/device/pal/paldevice.hpp index 0c207fab79..feaf4429b0 100644 --- a/projects/clr/rocclr/device/pal/paldevice.hpp +++ b/projects/clr/rocclr/device/pal/paldevice.hpp @@ -555,16 +555,13 @@ class Device : public NullDevice { //! SVM free virtual void svmFree(void* ptr) const; + //! Virtual address space allocation(reservation) virtual void* virtualAlloc(void* addr, size_t size, size_t alignment); virtual void virtualFree(void* addr); - virtual bool SetMemAccess(void* va_addr, size_t va_size, VmmAccess access_flags) { - return true; - } - - virtual bool GetMemAccess(void* va_addr, VmmAccess* access_flags_ptr) { - return true; - } + //! Set/Get memory access set by the app + virtual bool SetMemAccess(void* va_addr, size_t va_size, VmmAccess access_flags); + virtual bool GetMemAccess(void* va_addr, VmmAccess* access_flags_ptr); virtual bool ExportShareableVMMHandle(amd::Memory& amd_mem_obj, int flags, void* shareableHandle);