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:
Harish Kasiviswanathan committed 2017-02-17 16:59:51 -05:00
1 parent b6c8f1f4c9
commit b7f6ed08ee
5 files changed
+158 -1

No files matched your search

+2
View File
@@ -30,6 +30,8 @@ hsaKmtRegisterGraphicsHandleToNodes;
hsaKmtShareMemory;
hsaKmtRegisterSharedHandle;
hsaKmtRegisterSharedHandleToNodes;
hsaKmtProcessVMRead;
hsaKmtProcessVMWrite;
hsaKmtDeregisterMemory;
hsaKmtMapMemoryToGPU;
hsaKmtMapMemoryToGPUNodes;
+85
View File
@@ -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(