From 57f46b53ecc8cefe4d84747736077e86465b92f6 Mon Sep 17 00:00:00 2001 From: Harish Kasiviswanathan Date: Sun, 27 Dec 2020 11:05:19 -0500 Subject: [PATCH] kfdtest: A+A: CP writes to NC mem need flush Refer to commit "Mark buffers accessed by CP as UC" A+A buffers are mapped as NC. CP (PM4Writes) need ReleaseMem function to ensure the write go through to the memory Signed-off-by: Harish Kasiviswanathan Change-Id: I4ee55a6e40fba078f5950d95c8fee7ee076260bf --- tests/kfdtest/src/KFDLocalMemoryTest.cpp | 6 +++- tests/kfdtest/src/KFDMemoryTest.cpp | 7 +++- tests/kfdtest/src/KFDPMTest.cpp | 8 +++-- tests/kfdtest/src/KFDQMTest.cpp | 42 +++++++++++++++++------- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/tests/kfdtest/src/KFDLocalMemoryTest.cpp b/tests/kfdtest/src/KFDLocalMemoryTest.cpp index 33f33dc869..6af6765ac3 100644 --- a/tests/kfdtest/src/KFDLocalMemoryTest.cpp +++ b/tests/kfdtest/src/KFDLocalMemoryTest.cpp @@ -58,6 +58,8 @@ TEST_F(KFDLocalMemoryTest, AccessLocalMem) { //local memory HsaMemoryBuffer destBuf(PAGE_SIZE, defaultGPUNode, false, true); + HsaEvent *event; + ASSERT_SUCCESS(CreateQueueTypeEvent(false, false, defaultGPUNode, &event)); PM4Queue queue; @@ -65,10 +67,12 @@ TEST_F(KFDLocalMemoryTest, AccessLocalMem) { queue.PlaceAndSubmitPacket(PM4WriteDataPacket(destBuf.As(), 0, 0)); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); + hsaKmtDestroyEvent(event); EXPECT_SUCCESS(queue.Destroy()); + TEST_END } diff --git a/tests/kfdtest/src/KFDMemoryTest.cpp b/tests/kfdtest/src/KFDMemoryTest.cpp index c5c0c0afde..ea24938116 100644 --- a/tests/kfdtest/src/KFDMemoryTest.cpp +++ b/tests/kfdtest/src/KFDMemoryTest.cpp @@ -432,14 +432,18 @@ TEST_F(KFDMemoryTest, AccessPPRMem) { ASSERT_SUCCESS(queue.Create(defaultGPUNode)); + HsaEvent *event; + ASSERT_SUCCESS(CreateQueueTypeEvent(false, false, defaultGPUNode, &event)); + queue.PlaceAndSubmitPacket(PM4WriteDataPacket(destBuf, 0xABCDEF09, 0x12345678)); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); WaitOnValue(destBuf, 0xABCDEF09); WaitOnValue(destBuf + 1, 0x12345678); + hsaKmtDestroyEvent(event); EXPECT_SUCCESS(queue.Destroy()); /* This sleep hides the dmesg PPR message storm on Raven, which happens @@ -1455,6 +1459,7 @@ TEST_F(KFDMemoryTest, PtraceAccessInvisibleVram) { mem1 = reinterpret_cast(reinterpret_cast(mem) + VRAM_OFFSET + sizeof(HSAuint64)); PM4Queue queue; ASSERT_SUCCESS(queue.Create(defaultGPUNode)); + queue.PlaceAndSubmitPacket(PM4WriteDataPacket((unsigned int *)mem0, data0[0], data0[1])); queue.PlaceAndSubmitPacket(PM4WriteDataPacket((unsigned int *)mem1, diff --git a/tests/kfdtest/src/KFDPMTest.cpp b/tests/kfdtest/src/KFDPMTest.cpp index 79b385cf72..98c2348a8c 100644 --- a/tests/kfdtest/src/KFDPMTest.cpp +++ b/tests/kfdtest/src/KFDPMTest.cpp @@ -78,8 +78,11 @@ TEST_F(KFDPMTest, SuspendWithIdleQueueAfterWork) { ASSERT_SUCCESS(queue.Create(defaultGPUNode)); + HsaEvent *event; + ASSERT_SUCCESS(CreateQueueTypeEvent(false, false, defaultGPUNode, &event)); + queue.PlaceAndSubmitPacket(PM4WriteDataPacket(destBuffer.As(), 0x1, 0x2)); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); WaitOnValue(&(destBuffer.As()[0]), 0x1); WaitOnValue(&(destBuffer.As()[1]), 0x2); @@ -88,7 +91,7 @@ TEST_F(KFDPMTest, SuspendWithIdleQueueAfterWork) { EXPECT_EQ(true, SuspendAndWakeUp()); queue.PlaceAndSubmitPacket(PM4WriteDataPacket(&(destBuffer.As()[2]), 0x3, 0x4)); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); EXPECT_EQ(destBuffer.As()[0], 0); EXPECT_EQ(destBuffer.As()[1], 0); @@ -96,6 +99,7 @@ TEST_F(KFDPMTest, SuspendWithIdleQueueAfterWork) { WaitOnValue(&(destBuffer.As()[2]), 0x3); WaitOnValue(&(destBuffer.As()[3]), 0x4); + hsaKmtDestroyEvent(event); EXPECT_SUCCESS(queue.Destroy()); TEST_END diff --git a/tests/kfdtest/src/KFDQMTest.cpp b/tests/kfdtest/src/KFDQMTest.cpp index 71768cc2cf..086d5e537b 100644 --- a/tests/kfdtest/src/KFDQMTest.cpp +++ b/tests/kfdtest/src/KFDQMTest.cpp @@ -78,13 +78,16 @@ TEST_F(KFDQMTest, SubmitNopCpQueue) { ASSERT_GE(defaultGPUNode, 0) << "failed to get default GPU Node"; PM4Queue queue; + HsaEvent *event; + ASSERT_SUCCESS(CreateQueueTypeEvent(false, false, defaultGPUNode, &event)); ASSERT_SUCCESS(queue.Create(defaultGPUNode)); queue.PlaceAndSubmitPacket(PM4NopPacket()); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); + hsaKmtDestroyEvent(event); EXPECT_SUCCESS(queue.Destroy()); TEST_END @@ -99,17 +102,19 @@ TEST_F(KFDQMTest, SubmitPacketCpQueue) { HsaMemoryBuffer destBuf(PAGE_SIZE, defaultGPUNode, false); destBuf.Fill(0xFF); + HsaEvent *event; + ASSERT_SUCCESS(CreateQueueTypeEvent(false, false, defaultGPUNode, &event)); PM4Queue queue; - ASSERT_SUCCESS(queue.Create(defaultGPUNode)); queue.PlaceAndSubmitPacket(PM4WriteDataPacket(destBuf.As(), 0, 0)); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); EXPECT_TRUE(WaitOnValue(destBuf.As(), 0)); + hsaKmtDestroyEvent(event); EXPECT_SUCCESS(queue.Destroy()); TEST_END @@ -132,7 +137,7 @@ TEST_F(KFDQMTest, AllCpQueues) { for (unsigned int qidx = 0; qidx < m_numCpQueues; ++qidx) { queues[qidx].PlaceAndSubmitPacket(PM4WriteDataPacket(destBuf.As()+qidx*2, qidx, qidx)); - + queues[qidx].PlaceAndSubmitPacket(PM4ReleaseMemoryPacket(m_FamilyId, true, 0, 0)); queues[qidx].Wait4PacketConsumption(); EXPECT_TRUE(WaitOnValue(destBuf.As()+qidx*2, qidx)); @@ -330,6 +335,7 @@ TEST_F(KFDQMTest, AllQueues) { for (i = 0; i < numCpQueues; ++i) { cpQueues[i].PlaceAndSubmitPacket(PM4WriteDataPacket(destBufCp.As()+i*2, i, i)); + cpQueues[i].PlaceAndSubmitPacket(PM4ReleaseMemoryPacket(m_FamilyId, true, 0, 0)); cpQueues[i].Wait4PacketConsumption(); @@ -460,9 +466,12 @@ TEST_F(KFDQMTest, DisableCpQueueByUpdateWithNullAddress) { ASSERT_SUCCESS(queue.Create(defaultGPUNode)); + HsaEvent *event; + ASSERT_SUCCESS(CreateQueueTypeEvent(false, false, defaultGPUNode, &event)); + queue.PlaceAndSubmitPacket(PM4WriteDataPacket(destBuf.As(), 0, 0)); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); WaitOnValue(destBuf.As(), 0); @@ -480,10 +489,11 @@ TEST_F(KFDQMTest, DisableCpQueueByUpdateWithNullAddress) { EXPECT_SUCCESS(queue.Update(BaseQueue::DEFAULT_QUEUE_PERCENTAGE, BaseQueue::DEFAULT_PRIORITY, false)); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); WaitOnValue(destBuf.As(), 1); + hsaKmtDestroyEvent(event); EXPECT_SUCCESS(queue.Destroy()); TEST_END @@ -544,13 +554,16 @@ TEST_F(KFDQMTest, DisableCpQueueByUpdateWithZeroPercentage) { ASSERT_SUCCESS(queue.Create(defaultGPUNode)); + HsaEvent *event; + ASSERT_SUCCESS(CreateQueueTypeEvent(false, false, defaultGPUNode, &event)); + PM4WriteDataPacket packet1, packet2; packet1.InitPacket(destBuf.As(), 0, 0); packet2.InitPacket(destBuf.As(), 1, 1); queue.PlaceAndSubmitPacket(packet1); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); WaitOnValue(destBuf.As(), 0); @@ -568,7 +581,7 @@ TEST_F(KFDQMTest, DisableCpQueueByUpdateWithZeroPercentage) { EXPECT_SUCCESS(queue.Update(BaseQueue::DEFAULT_QUEUE_PERCENTAGE, BaseQueue::DEFAULT_PRIORITY, false)); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); WaitOnValue(destBuf.As(), 1); @@ -1228,6 +1241,8 @@ TEST_F(KFDQMTest, CpuWriteCoherence) { HsaMemoryBuffer destBuf(PAGE_SIZE, defaultGPUNode); ASSERT_SUCCESS(queue.Create(defaultGPUNode)); + HsaEvent *event; + ASSERT_SUCCESS(CreateQueueTypeEvent(false, false, defaultGPUNode, &event)); /* The queue might be full and we fail to submit. There is always one word space unused in queue. * So let rptr one step ahead then we continually submit packet. @@ -1249,10 +1264,11 @@ TEST_F(KFDQMTest, CpuWriteCoherence) { */ queue.PlaceAndSubmitPacket(PM4WriteDataPacket(destBuf.As(), 0x42, 0x42)); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); WaitOnValue(destBuf.As(), 0x42); + hsaKmtDestroyEvent(event); TEST_END } @@ -1420,18 +1436,22 @@ TEST_F(KFDQMTest, CpQueueWraparound) { ASSERT_SUCCESS(queue.Create(defaultGPUNode)); + HsaEvent *event; + ASSERT_SUCCESS(CreateQueueTypeEvent(false, false, defaultGPUNode, &event)); + for (unsigned int pktIdx = 0; pktIdx <= PAGE_SIZE/sizeof(PM4WRITE_DATA_CI); ++pktIdx) { queue.PlaceAndSubmitPacket(PM4WriteDataPacket(destBuf.As(), pktIdx, pktIdx)); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); WaitOnValue(destBuf.As(), pktIdx); } for (unsigned int pktIdx = 0; pktIdx <= PAGE_SIZE/sizeof(PM4WRITE_DATA_CI); ++pktIdx) { queue.PlaceAndSubmitPacket(PM4WriteDataPacket(destBuf.As(), pktIdx, pktIdx)); - queue.Wait4PacketConsumption(); + queue.Wait4PacketConsumption(event); WaitOnValue(destBuf.As(), pktIdx); } + hsaKmtDestroyEvent(event); EXPECT_SUCCESS(queue.Destroy()); TEST_END