kfdtest: Add SDMA poll memory register packet support

The SDMA can wait on poll user memory.  This is being added to
support per-SDMA queue reset testing.


[ROCm/ROCR-Runtime commit: a957b24153]
This commit is contained in:
Jonathan Kim
2025-01-30 13:01:28 -05:00
committed by Kim, Jonathan
parent 599a20ee2d
commit 303cdb8f7e
3 changed files with 98 additions and 0 deletions
@@ -31,6 +31,7 @@ const unsigned int SDMA_OP_WRITE = 2;
const unsigned int SDMA_OP_FENCE = 5;
const unsigned int SDMA_OP_TRAP = 6;
const unsigned int SDMA_OP_POLL_REGMEM = 8;
const unsigned int SDMA_OP_TIMESTAMP = 13;
const unsigned int SDMA_OP_CONST_FILL = 11;
@@ -317,6 +318,61 @@ typedef struct SDMA_PKT_TRAP_TAG
} INT_CONTEXT_UNION;
} SDMA_PKT_TRAP, *PSDMA_PKT_TRAP;
/*
** Definitions for SDMA_PKT_POLL_REGMEM_TAG packet
*/
typedef struct SDMA_PKT_POLL_REGMEM_TAG {
union {
struct {
unsigned int op : 8;
unsigned int sub_op : 8;
unsigned int reserved_0 : 10;
unsigned int hdp_flush : 1;
unsigned int reserved_1 : 1;
unsigned int func : 3;
unsigned int mem_poll : 1;
};
unsigned int DW_0_DATA;
} HEADER_UNION;
union {
struct {
unsigned int addr_31_0 : 32;
};
unsigned int DW_1_DATA;
} ADDR_LO_UNION;
union {
struct {
unsigned int addr_63_32 : 32;
};
unsigned int DW_2_DATA;
} ADDR_HI_UNION;
union {
struct {
unsigned int value : 32;
};
unsigned int DW_3_DATA;
} VALUE_UNION;
union {
struct {
unsigned int mask : 32;
};
unsigned int DW_4_DATA;
} MASK_UNION;
union {
struct {
unsigned int interval : 16;
unsigned int retry_count : 12;
unsigned int reserved_0 : 4;
};
unsigned int DW_5_DATA;
} DW5_UNION;
} SDMA_PKT_POLL_REGMEM, *PSDMA_PKT_POLL_REGMEM;
/*
** Definitions for SDMA_PKT_TIMESTAMP packet
@@ -213,6 +213,28 @@ void SDMATrapPacket::InitPacket(unsigned int eventID) {
packetData.INT_CONTEXT_UNION.int_context = eventID;
}
SDMAPollRegMemPacket::SDMAPollRegMemPacket(void *addr, int value) {
InitPacket(addr, value);
}
SDMAPollRegMemPacket::~SDMAPollRegMemPacket(void) {
}
void SDMAPollRegMemPacket::InitPacket(void *addr, int value) {
memset(&packetData, 0, SizeInBytes());
packetData.HEADER_UNION.op = SDMA_OP_POLL_REGMEM;
packetData.HEADER_UNION.mem_poll = 1;
packetData.HEADER_UNION.func = 0x3; // IsEqual.
SplitU64(reinterpret_cast<unsigned long long>(addr),
packetData.ADDR_LO_UNION.DW_1_DATA,
packetData.ADDR_HI_UNION.DW_2_DATA);
packetData.VALUE_UNION.value = value;
packetData.MASK_UNION.mask = 0xffffffff; // Compare the whole content.
packetData.DW5_UNION.interval = 0x04;
packetData.DW5_UNION.retry_count = 0xfff;
}
SDMATimePacket::SDMATimePacket(void *destaddr) {
InitPacket(destaddr);
}
@@ -140,6 +140,26 @@ class SDMATrapPacket : public SDMAPacket {
SDMA_PKT_TRAP packetData;
};
class SDMAPollRegMemPacket : public SDMAPacket {
public:
// This contructor will also init the packet, no need for additional calls
SDMAPollRegMemPacket(void* addr, int value);
virtual ~SDMAPollRegMemPacket(void);
// @returns Pointer to the packet
virtual const void *GetPacket() const { return &packetData; }
// @breif Initialise the packet
void InitPacket(void* addr, int value);
// @returns Packet size in bytes
virtual unsigned int SizeInBytes() const { return sizeof(SDMA_PKT_POLL_REGMEM); }
protected:
// SDMA_PKT_WRITE_UNTILED struct contains all the packet's data
SDMA_PKT_POLL_REGMEM packetData;
unsigned int packetSize;
};
class SDMATimePacket : public SDMAPacket {
public:
// Empty constructor, before using the packet call the init func