libhsakmt: update dbg enable trap and add query debug events

Add data out for enable trap to return poll fd to user space.
Add query debug events interface.

Change-Id: Ia4afde1cf167e6aa61d502380a8b329ee89d5f44
Signed-off-by: Jonathan Kim <Jonathan.Kim@amd.com>
Cette révision appartient à :
Jonathan Kim
2019-07-11 10:48:54 -04:00
révisé par Jonathan Kim
Parent 632ad3a749
révision 836dfd0752
5 fichiers modifiés avec 155 ajouts et 15 suppressions
+84 -12
Voir le fichier
@@ -275,8 +275,8 @@ static HSAKMT_STATUS debug_trap(HSAuint32 NodeId,
HSAuint32 data2,
HSAuint32 data3,
HSAuint32 pid,
HSAuint64 pointer
)
HSAuint64 pointer,
struct kfd_ioctl_dbg_trap_args *argout)
{
uint32_t gpu_id;
HSAKMT_STATUS result;
@@ -320,6 +320,9 @@ static HSAKMT_STATUS debug_trap(HSAuint32 NodeId,
long err = kmtIoctl(kfd_fd, AMDKFD_IOC_DBG_TRAP, &args);
if (argout)
*argout = args;
if (err == 0)
result = HSAKMT_STATUS_SUCCESS;
else
@@ -328,21 +331,45 @@ static HSAKMT_STATUS debug_trap(HSAuint32 NodeId,
return result;
}
HSAKMT_STATUS HSAKMTAPI hsaKmtEnableDebugTrap(HSAuint32 NodeId,
HSA_QUEUEID QueueId)
HSAKMT_STATUS HSAKMTAPI hsaKmtEnableDebugTrapWithPollFd(HSAuint32 NodeId,
HSA_QUEUEID QueueId,
HSAint32 *PollFd) //OUT
{
int result;
struct kfd_ioctl_dbg_trap_args argout = {0};
if (QueueId != INVALID_QUEUEID)
return HSAKMT_STATUS_NOT_SUPPORTED;
return debug_trap(NodeId,
result = debug_trap(NodeId,
KFD_IOC_DBG_TRAP_ENABLE,
1,
QueueId,
0,
INVALID_PID,
0);
0,
&argout);
*PollFd = argout.data3;
return result;
}
HSAKMT_STATUS HSAKMTAPI hsaKmtEnableDebugTrap(HSAuint32 NodeId,
HSA_QUEUEID QueueId)
{
HSAint32 PollFd = 0;
HSAKMT_STATUS status = hsaKmtEnableDebugTrapWithPollFd(NodeId,
QueueId,
&PollFd);
if (status == HSAKMT_STATUS_SUCCESS)
close(PollFd);
return status;
}
HSAKMT_STATUS HSAKMTAPI hsaKmtDisableDebugTrap(HSAuint32 NodeId)
{
return debug_trap(NodeId,
@@ -351,7 +378,8 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtDisableDebugTrap(HSAuint32 NodeId)
0,
0,
INVALID_PID,
0);
0,
NULL);
}
HSAKMT_STATUS HSAKMTAPI hsaKmtSetDebugTrapData2(HSAuint32 NodeId,
@@ -364,7 +392,8 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtSetDebugTrapData2(HSAuint32 NodeId,
TrapData1,
0,
INVALID_PID,
0);
0,
NULL);
}
HSAKMT_STATUS HSAKMTAPI hsaKmtSetWaveLaunchTrapOverride(
@@ -381,7 +410,8 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtSetWaveLaunchTrapOverride(
TrapMask,
0,
INVALID_PID,
0);
0,
NULL);
}
HSAKMT_STATUS HSAKMTAPI hsaKmtSetWaveLaunchMode(
@@ -394,7 +424,8 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtSetWaveLaunchMode(
0,
0,
INVALID_PID,
0);
0,
NULL);
}
/**
@@ -455,7 +486,8 @@ hsaKmtQueueSuspend(
NumQueues,
GracePeriod,
Pid,
(HSAuint64)queue_ids_ptr);
(HSAuint64)queue_ids_ptr,
NULL);
free(queue_ids_ptr);
return result;
@@ -518,7 +550,47 @@ hsaKmtQueueResume(
NumQueues,
0,
Pid,
(HSAuint64)queue_ids_ptr);
(HSAuint64)queue_ids_ptr,
NULL);
free(queue_ids_ptr);
return result;
}
HSAKMT_STATUS
HSAKMTAPI
hsaKmtQueryDebugEvent(
HSAuint32 NodeId, //IN
HSAuint32 Pid, // IN
HSAuint32 *QueueId, // IN/OUT
bool ClearEvents, // IN
HSA_DEBUG_EVENT_TYPE *EventsReceived, // OUT
bool *IsSuspended // OUT
)
{
HSAKMT_STATUS result;
struct kfd_ioctl_dbg_trap_args argout = {0};
uint32_t flags = 0;
if (ClearEvents)
flags |= KFD_DBG_EV_FLAG_CLEAR_STATUS;
result = debug_trap(NodeId,
KFD_IOC_DBG_TRAP_QUERY_DEBUG_EVENT,
*QueueId,
flags,
0,
Pid,
0,
&argout);
if (result)
return result;
*QueueId = argout.data1;
*EventsReceived = argout.data3 &
(KFD_DBG_EV_STATUS_TRAP | KFD_DBG_EV_STATUS_VMFAULT);
*IsSuspended = (argout.data3 & KFD_DBG_EV_STATUS_SUSPENDED) >> 2;
return result;
}