diff --git a/projects/rocr-runtime/include/hsakmt.h b/projects/rocr-runtime/include/hsakmt.h index c05e34d114..2d987d91a9 100644 --- a/projects/rocr-runtime/include/hsakmt.h +++ b/projects/rocr-runtime/include/hsakmt.h @@ -633,14 +633,11 @@ hsaKmtDbgAddressWatch( - HSAKMT_STATUS_INVALID_HANDLE if any QueueId is invalid. */ HSAKMT_STATUS -HSAKMTAPI -hsaKmtQueueSuspend( - HSAuint32 NumQueues, //IN - HSA_QUEUEID QueueId[], //IN - bool NoGracePeriod, //IN - bool MemFence //IN - ); - + HSAKMTAPI + hsaKmtNodeSuspend( + HSAuint32 Pid, + HSAuint32 NodeId, + HSAuint32 Flags); /** Resume the execution of a set of queues. If a queue is not suspended by hsaKmtDbgQueueSuspend() then it remains executing. @@ -658,12 +655,11 @@ hsaKmtQueueSuspend( - HSAKMT_STATUS_INVALID_HANDLE if any QueueId is invalid. */ HSAKMT_STATUS -HSAKMTAPI -hsaKmtQueueResume( - HSAuint32 NumQueues, //IN - HSA_QUEUEID QueueId[], //IN - bool MemFence //IN - ); + HSAKMTAPI + hsaKmtNodeResume( + HSAuint32 Pid, + HSAuint32 NodeId, + HSAuint32 Flags); /** Enable debug trap for NodeId. If QueueId is INVALID_QUEUEID then diff --git a/projects/rocr-runtime/include/hsakmttypes.h b/projects/rocr-runtime/include/hsakmttypes.h index 6a92796b77..cbf3c1f579 100644 --- a/projects/rocr-runtime/include/hsakmttypes.h +++ b/projects/rocr-runtime/include/hsakmttypes.h @@ -75,6 +75,12 @@ typedef HSAuint64 HSA_QUEUEID; // An HSA_QUEUEID that is never a valid queue ID. #define INVALID_QUEUEID 0xFFFFFFFFFFFFFFFFULL +// A PID that is never a valid process ID. +#define INVALID_PID 0xFFFFFFFF + +// // A HSA_NODEID that is never a valid node ID. +#define INVALID_NODEID 0xFFFFFFFF + // This is included in order to force the alignments to be 4 bytes so that // it avoids extra padding added by the compiler when a 64-bit binary is generated. #pragma pack(push, hsakmttypes_h, 4) @@ -785,6 +791,13 @@ typedef enum _HSA_DBG_WAVE_LAUNCH_MODE HSA_DBG_WAVE_LAUNCH_MODE_NUM } HSA_DBG_WAVE_LAUNCH_MODE; +typedef enum HSA_DBG_NODE_CONTROL { + HSA_DBG_NODE_CONTROL_NO_GRACE_PERIOD = 0x01, + HSA_DBG_NODE_CONTROL_MEMORY_FENCE = 0x02, + HSA_DBG_NODE_CONTROL_UPDATE_CONTEXT = 0x04, +} HSA_DBG_NODE_CONTROL; + + //This structure is hardware specific and may change in the future typedef struct _HsaDbgWaveMsgAMDGen2 { diff --git a/projects/rocr-runtime/include/linux/kfd_ioctl.h b/projects/rocr-runtime/include/linux/kfd_ioctl.h index 609504954d..1fc43aefd3 100644 --- a/projects/rocr-runtime/include/linux/kfd_ioctl.h +++ b/projects/rocr-runtime/include/linux/kfd_ioctl.h @@ -193,32 +193,62 @@ struct kfd_ioctl_dbg_wave_control_args { /* KFD_IOC_DBG_TRAP_ENABLE: * data1: 0=disable, 1=enable * data2: queue ID (for future use) + * data3: unused + * data4: unused */ #define KFD_IOC_DBG_TRAP_ENABLE 0 /* KFD_IOC_DBG_TRAP_SET_TRAP_DATA: * data1: SPI_GDBG_TRAP_DATA0 * data2: SPI_GDBG_TRAP_DATA1 + * data3: unused + * data4: unused */ #define KFD_IOC_DBG_TRAP_SET_TRAP_DATA 1 /* KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_OVERRIDE: * data1: override mode: 0=OR, 1=REPLACE * data2: mask + * data3: unused + * data4: unused */ #define KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_OVERRIDE 2 /* KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_MODE: * data1: 0=normal, 1=halt, 2=kill, 3=singlestep, 4=disable * data2: unused + * data3: unused + * data4: unused */ #define KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_MODE 3 + +#define KFD__DBG_NODE_SUSPEND_NO_GRACE 0x01 +#define KFD__DBG_NODE_SUSPEND_MEMORY_FENCE 0x02 +#define KFD__DBG_NODE_SUSPEND_UPDATE_CONTEXT 0x04 +/* KFD_IOC_DBG_TRAP_NODE_SUSPEND: + * data1: pid + * data2: nodeid + * data3: flags no_grace=0x01 memory_fence=0x02 update_context=0x04 + * data4: unused + */ +#define KFD_IOC_DBG_TRAP_NODE_SUSPEND 4 + +/* KFD_IOC_DBG_TRAP_NODE_RESUME: + * data1: pid + * data2: nodeid + * data3: flags no_grace=0x01 memory_fence=0x02 update_context=0x04 + * data4: unused + */ +#define KFD_IOC_DBG_TRAP_NODE_RESUME 5 + struct kfd_ioctl_dbg_trap_args { __u32 gpu_id; /* to KFD */ __u32 op; /* to KFD */ __u32 data1; /* to KFD */ __u32 data2; /* to KFD */ + __u32 data3; /* to KFD */ + __u32 data4; /* to KFD */ }; /* Matching HSA_EVENTTYPE */ diff --git a/projects/rocr-runtime/src/debug.c b/projects/rocr-runtime/src/debug.c index fc32b925d8..521aaaaf14 100644 --- a/projects/rocr-runtime/src/debug.c +++ b/projects/rocr-runtime/src/debug.c @@ -27,6 +27,7 @@ #include "linux/kfd_ioctl.h" #include #include +#include static bool *is_device_debugged; int debug_get_reg_status(uint32_t node_id, bool *is_debugged); @@ -271,7 +272,8 @@ int debug_get_reg_status(uint32_t node_id, bool *is_debugged) static HSAKMT_STATUS debug_trap(HSAuint32 NodeId, HSAuint32 op, HSAuint32 data1, - HSAuint32 data2) + HSAuint32 data2, + HSAuint32 data3) { uint32_t gpu_id; HSAKMT_STATUS result; @@ -296,6 +298,8 @@ static HSAKMT_STATUS debug_trap(HSAuint32 NodeId, args.op = op; args.data1 = data1; args.data2 = data2; + args.data3 = data3; + args.data4 = 0; long err = kmtIoctl(kfd_fd, AMDKFD_IOC_DBG_TRAP, &args); @@ -313,12 +317,12 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtEnableDebugTrap(HSAuint32 NodeId, if (QueueId != INVALID_QUEUEID) return HSAKMT_STATUS_NOT_SUPPORTED; - return debug_trap(NodeId, KFD_IOC_DBG_TRAP_ENABLE, 1, QueueId); + return debug_trap(NodeId, KFD_IOC_DBG_TRAP_ENABLE, 1, QueueId, 0); } HSAKMT_STATUS HSAKMTAPI hsaKmtDisableDebugTrap(HSAuint32 NodeId) { - return debug_trap(NodeId, KFD_IOC_DBG_TRAP_ENABLE, 0, 0); + return debug_trap(NodeId, KFD_IOC_DBG_TRAP_ENABLE, 0, 0, 0); } HSAKMT_STATUS HSAKMTAPI hsaKmtSetDebugTrapData2(HSAuint32 NodeId, @@ -328,7 +332,8 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtSetDebugTrapData2(HSAuint32 NodeId, return debug_trap(NodeId, KFD_IOC_DBG_TRAP_SET_TRAP_DATA, TrapData0, - TrapData1); + TrapData1, + 0); } HSAKMT_STATUS HSAKMTAPI hsaKmtSetWaveLaunchTrapOverride( @@ -342,7 +347,8 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtSetWaveLaunchTrapOverride( return debug_trap(NodeId, KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_OVERRIDE, TrapOverride, - TrapMask); + TrapMask, + 0); } HSAKMT_STATUS HSAKMTAPI hsaKmtSetWaveLaunchMode( @@ -352,5 +358,52 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtSetWaveLaunchMode( return debug_trap(NodeId, KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_MODE, WaveLaunchMode, + 0, 0); } + +HSAKMT_STATUS HSAKMTAPI hsaKmtNodeSuspend( + HSAuint32 Pid, + HSAuint32 NodeId, + HSAuint32 Flags) +{ + pid_t current_pid = INVALID_PID; + + CHECK_KFD_OPEN(); + + if (Pid == INVALID_PID) { + current_pid = getpid(); + if (current_pid == 0) + return HSAKMT_STATUS_INVALID_HANDLE; + Pid = (HSAuint32) current_pid; + } + + return debug_trap(NodeId, + KFD_IOC_DBG_TRAP_NODE_SUSPEND, + Pid, + NodeId, + Flags); +} + +HSAKMT_STATUS HSAKMTAPI hsaKmtNodeResume( + HSAuint32 Pid, + HSAuint32 NodeId, + HSAuint32 Flags) +{ + pid_t current_pid = INVALID_PID; + + CHECK_KFD_OPEN(); + + if (Pid == INVALID_PID) { + current_pid = getpid(); + if (current_pid == 0) + return HSAKMT_STATUS_INVALID_HANDLE; + Pid = (HSAuint32) current_pid; + } + + return debug_trap(NodeId, + KFD_IOC_DBG_TRAP_NODE_RESUME, + Pid, + NodeId, + Flags); +} diff --git a/projects/rocr-runtime/src/libhsakmt.ver b/projects/rocr-runtime/src/libhsakmt.ver index 91b7721764..10a66a1dca 100644 --- a/projects/rocr-runtime/src/libhsakmt.ver +++ b/projects/rocr-runtime/src/libhsakmt.ver @@ -61,6 +61,8 @@ hsaKmtDisableDebugTrap; hsaKmtSetDebugTrapData2; hsaKmtSetWaveLaunchTrapOverride; hsaKmtSetWaveLaunchMode; +hsaKmtNodeSuspend; +hsaKmtNodeResume; local: *; };