Add API entrypoints for Cross Memory Attach
Implement two new API for cross memory read and write operation.
- hsaKmtProcessVMRead
- hsaKmtProcessVMWrite
Add new ioclts necessary for the above APIs.
Change-Id: I0c153e3b4e1f32b7a8b102ad5c774d9ae9bfc2fa
Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
[ROCm/ROCR-Runtime commit: e79521b556]
This commit is contained in:
1 parent
b6c8f1f4c9
commit
b7f6ed08ee
5 files changed
+158
-1
No files matched your search
@@ -30,6 +30,8 @@ hsaKmtRegisterGraphicsHandleToNodes;
|
||||
hsaKmtShareMemory;
|
||||
hsaKmtRegisterSharedHandle;
|
||||
hsaKmtRegisterSharedHandleToNodes;
|
||||
hsaKmtProcessVMRead;
|
||||
hsaKmtProcessVMWrite;
|
||||
hsaKmtDeregisterMemory;
|
||||
hsaKmtMapMemoryToGPU;
|
||||
hsaKmtMapMemoryToGPUNodes;
|
||||
|
||||
@@ -340,6 +340,91 @@ error:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static uint64_t convertHsaToKfdRange(
|
||||
HsaMemoryRange *HsaRange)
|
||||
{
|
||||
if (sizeof(struct kfd_memory_range) !=
|
||||
sizeof(HsaMemoryRange)) {
|
||||
fprintf(stderr, "Struct size mismatch in thunk."
|
||||
"Cannot cast Hsa Range to KFD IOCTL range\n");
|
||||
return 0;
|
||||
}
|
||||
return (uint64_t) HsaRange;
|
||||
}
|
||||
|
||||
HSAKMT_STATUS
|
||||
HSAKMTAPI
|
||||
hsaKmtProcessVMRead(
|
||||
HSAuint32 Pid, /* IN */
|
||||
HsaMemoryRange *LocalMemoryArray, /* IN */
|
||||
HSAuint64 LocalMemoryArrayCount, /* IN */
|
||||
HsaMemoryRange *RemoteMemoryArray, /* IN */
|
||||
HSAuint64 RemoteMemoryArrayCount,/* IN */
|
||||
HSAuint64 *SizeCopied /* OUT */
|
||||
)
|
||||
{
|
||||
struct kfd_ioctl_cross_memory_copy_args args;
|
||||
|
||||
if (LocalMemoryArray == NULL || RemoteMemoryArray == NULL ||
|
||||
LocalMemoryArrayCount == 0 || RemoteMemoryArrayCount == 0)
|
||||
return HSAKMT_STATUS_ERROR;
|
||||
|
||||
args.flags = 0;
|
||||
KFD_SET_CROSS_MEMORY_READ(args.flags);
|
||||
args.pid = Pid;
|
||||
args.src_mem_range_array = convertHsaToKfdRange(RemoteMemoryArray);
|
||||
args.src_mem_array_size = RemoteMemoryArrayCount;
|
||||
args.dst_mem_range_array = convertHsaToKfdRange(LocalMemoryArray);
|
||||
args.dst_mem_array_size = LocalMemoryArrayCount;
|
||||
args.bytes_copied = 0;
|
||||
|
||||
int err = kmtIoctl(kfd_fd, AMDKFD_IOC_CROSS_MEMORY_COPY, &args);
|
||||
if (err)
|
||||
return HSAKMT_STATUS_ERROR;
|
||||
|
||||
if (SizeCopied)
|
||||
*SizeCopied = args.bytes_copied;
|
||||
|
||||
return HSAKMT_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
HSAKMT_STATUS
|
||||
HSAKMTAPI
|
||||
hsaKmtProcessVMWrite(
|
||||
HSAuint32 Pid, /* IN */
|
||||
HsaMemoryRange *LocalMemoryArray, /* IN */
|
||||
HSAuint64 LocalMemoryArrayCount, /* IN */
|
||||
HsaMemoryRange *RemoteMemoryArray, /* IN */
|
||||
HSAuint64 RemoteMemoryArrayCount, /* IN */
|
||||
HSAuint64 *SizeCopied /* OUT */
|
||||
)
|
||||
{
|
||||
struct kfd_ioctl_cross_memory_copy_args args;
|
||||
|
||||
if (LocalMemoryArray == NULL || RemoteMemoryArray == NULL ||
|
||||
LocalMemoryArrayCount == 0 || RemoteMemoryArrayCount == 0)
|
||||
return HSAKMT_STATUS_ERROR;
|
||||
|
||||
args.flags = 0;
|
||||
KFD_SET_CROSS_MEMORY_WRITE(args.flags);
|
||||
args.pid = Pid;
|
||||
args.src_mem_range_array = convertHsaToKfdRange(LocalMemoryArray);
|
||||
args.src_mem_array_size = LocalMemoryArrayCount;
|
||||
args.dst_mem_range_array = convertHsaToKfdRange(RemoteMemoryArray);
|
||||
args.dst_mem_array_size = RemoteMemoryArrayCount;
|
||||
args.bytes_copied = 0;
|
||||
|
||||
int err = kmtIoctl(kfd_fd, AMDKFD_IOC_CROSS_MEMORY_COPY, &args);
|
||||
if (err)
|
||||
return HSAKMT_STATUS_ERROR;
|
||||
|
||||
if (SizeCopied)
|
||||
*SizeCopied = args.bytes_copied;
|
||||
|
||||
return HSAKMT_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
HSAKMT_STATUS
|
||||
HSAKMTAPI
|
||||
hsaKmtDeregisterMemory(
|
||||
|
||||
Reference in new issue
Block a user