From 75c654cfea0dcec1ab905f17a0cd9f707f67609a Mon Sep 17 00:00:00 2001 From: Yong Zhao Date: Sun, 22 Sep 2019 17:13:17 -0400 Subject: [PATCH] kfdtest: Add SDMANopPacket class The class is very useful for triaging complex SDMA issues. Change-Id: Ib5de729f7fc62f41e894ef98d3967e7e1745d454 Signed-off-by: Yong Zhao --- tests/kfdtest/include/sdma_pkt_struct.h | 30 +++++++++++++++++++++++++ tests/kfdtest/src/SDMAPacket.cpp | 13 +++++++++++ tests/kfdtest/src/SDMAPacket.hpp | 15 +++++++++++++ 3 files changed, 58 insertions(+) diff --git a/tests/kfdtest/include/sdma_pkt_struct.h b/tests/kfdtest/include/sdma_pkt_struct.h index 127c44f43d..e87f789eb7 100644 --- a/tests/kfdtest/include/sdma_pkt_struct.h +++ b/tests/kfdtest/include/sdma_pkt_struct.h @@ -25,6 +25,7 @@ #define __SDMA_PKT_STRUCT_H__ +const unsigned int SDMA_OP_NOP = 0; const unsigned int SDMA_OP_COPY = 1; const unsigned int SDMA_OP_WRITE = 2; @@ -354,4 +355,33 @@ typedef struct SDMA_PKT_TIMESTAMP_TAG } ADDR_HI_UNION; } SDMA_PKT_TIMESTAMP, *PSDMA_PKT_TIMESTAMP; + +/* +** Definitions for SDMA_PKT_NOP packet +*/ + +typedef struct SDMA_PKT_NOP_TAG +{ + union + { + struct + { + unsigned int op:8; + unsigned int sub_op:8; + unsigned int count:14; + unsigned int reserved_0:2; + }; + unsigned int DW_0_DATA; + } HEADER_UNION; + + union + { + struct + { + unsigned int data0:32; + }; + unsigned int DW_1_DATA; + } DATA0_UNION; +} SDMA_PKT_NOP, *PSDMA_PKT_NOP; + #endif // __SDMA_PKT_STRUCT_H__ diff --git a/tests/kfdtest/src/SDMAPacket.cpp b/tests/kfdtest/src/SDMAPacket.cpp index df5eb6b18f..251e019d7c 100644 --- a/tests/kfdtest/src/SDMAPacket.cpp +++ b/tests/kfdtest/src/SDMAPacket.cpp @@ -246,3 +246,16 @@ void SDMATimePacket::InitPacket(void *destaddr) { packetData.ADDR_LO_UNION.DW_1_DATA, /*dst_addr_31_0*/ packetData.ADDR_HI_UNION.DW_2_DATA); /*dst_addr_63_32*/ } + +SDMANopPacket::SDMANopPacket(unsigned int count) { + packetSize = count; + packetData = reinterpret_cast(calloc(count, sizeof(unsigned int))); + + packetData->HEADER_UNION.op = SDMA_OP_NOP; + packetData->HEADER_UNION.sub_op = 0; + packetData->HEADER_UNION.count = count - 1; +} + +SDMANopPacket::~SDMANopPacket() { + free(packetData); +} diff --git a/tests/kfdtest/src/SDMAPacket.hpp b/tests/kfdtest/src/SDMAPacket.hpp index 03f837806b..009ddea251 100644 --- a/tests/kfdtest/src/SDMAPacket.hpp +++ b/tests/kfdtest/src/SDMAPacket.hpp @@ -158,5 +158,20 @@ class SDMATimePacket : public SDMAPacket { SDMA_PKT_TIMESTAMP packetData; }; +class SDMANopPacket : public SDMAPacket { + public: + SDMANopPacket(unsigned int count = 1); + virtual ~SDMANopPacket(void); + + // @returns Pointer to the packet + virtual const void *GetPacket() const { return packetData; } + // @returns Packet size in bytes + virtual unsigned int SizeInBytes() const { return packetSize; } + + private: + SDMA_PKT_NOP *packetData; + unsigned int packetSize; +}; + #endif // __KFD_SDMA_PACKET__H__