From 303cdb8f7e0872f4355ec47a057345939300ee79 Mon Sep 17 00:00:00 2001 From: Jonathan Kim Date: Thu, 30 Jan 2025 13:01:28 -0500 Subject: [PATCH] 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: a957b2415366851adca93bd743764a0e8b00ccca] --- .../tests/kfdtest/include/sdma_pkt_struct.h | 56 +++++++++++++++++++ .../tests/kfdtest/src/SDMAPacket.cpp | 22 ++++++++ .../tests/kfdtest/src/SDMAPacket.hpp | 20 +++++++ 3 files changed, 98 insertions(+) diff --git a/projects/rocr-runtime/libhsakmt/tests/kfdtest/include/sdma_pkt_struct.h b/projects/rocr-runtime/libhsakmt/tests/kfdtest/include/sdma_pkt_struct.h index e87f789eb7..78218d2d3e 100644 --- a/projects/rocr-runtime/libhsakmt/tests/kfdtest/include/sdma_pkt_struct.h +++ b/projects/rocr-runtime/libhsakmt/tests/kfdtest/include/sdma_pkt_struct.h @@ -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 diff --git a/projects/rocr-runtime/libhsakmt/tests/kfdtest/src/SDMAPacket.cpp b/projects/rocr-runtime/libhsakmt/tests/kfdtest/src/SDMAPacket.cpp index f5a8a5787d..9aa087c112 100644 --- a/projects/rocr-runtime/libhsakmt/tests/kfdtest/src/SDMAPacket.cpp +++ b/projects/rocr-runtime/libhsakmt/tests/kfdtest/src/SDMAPacket.cpp @@ -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(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); } diff --git a/projects/rocr-runtime/libhsakmt/tests/kfdtest/src/SDMAPacket.hpp b/projects/rocr-runtime/libhsakmt/tests/kfdtest/src/SDMAPacket.hpp index 4630236236..e38b1e7837 100644 --- a/projects/rocr-runtime/libhsakmt/tests/kfdtest/src/SDMAPacket.hpp +++ b/projects/rocr-runtime/libhsakmt/tests/kfdtest/src/SDMAPacket.hpp @@ -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