Initial gfx9 debugger node suspend/resume
Change-Id: I2a5dac3d02265c11f5b6985ab457e2d1caa0a033
Signed-off-by: Philip Cox <Philip.Cox@amd.com>
[ROCm/ROCR-Runtime commit: 37858f2311]
此提交包含在:
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "linux/kfd_ioctl.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -61,6 +61,8 @@ hsaKmtDisableDebugTrap;
|
||||
hsaKmtSetDebugTrapData2;
|
||||
hsaKmtSetWaveLaunchTrapOverride;
|
||||
hsaKmtSetWaveLaunchMode;
|
||||
hsaKmtNodeSuspend;
|
||||
hsaKmtNodeResume;
|
||||
|
||||
local: *;
|
||||
};
|
||||
|
||||
新增問題並參考
封鎖使用者