diff --git a/opencl/test/unit_test/mocks/linux/mock_drm_command_stream_receiver.h b/opencl/test/unit_test/mocks/linux/mock_drm_command_stream_receiver.h index f6f0517982..81df543e19 100644 --- a/opencl/test/unit_test/mocks/linux/mock_drm_command_stream_receiver.h +++ b/opencl/test/unit_test/mocks/linux/mock_drm_command_stream_receiver.h @@ -17,6 +17,7 @@ class TestedDrmCommandStreamReceiver : public DrmCommandStreamReceiver::residency; + using CommandStreamReceiverHw::directSubmission; using CommandStreamReceiverHw::CommandStreamReceiver::lastSentSliceCount; TestedDrmCommandStreamReceiver(gemCloseWorkerMode mode, ExecutionEnvironment &executionEnvironment) diff --git a/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp b/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp index 1e1aa70d76..4ec0f478ed 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp @@ -6,6 +6,7 @@ */ #include "shared/source/command_stream/preemption.h" +#include "shared/source/direct_submission/linux/drm_direct_submission.h" #include "shared/source/gmm_helper/gmm_helper.h" #include "shared/source/gmm_helper/page_table_mngr.h" #include "shared/source/gmm_helper/resource_info.h" @@ -1288,7 +1289,6 @@ HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, FlushNotAligned) { } struct DrmCommandStreamDirectSubmissionTest : public DrmCommandStreamEnhancedTest { - template void SetUpT() { DebugManager.flags.EnableDirectSubmission.set(1u); @@ -1308,6 +1308,11 @@ struct DrmCommandStreamDirectSubmissionTest : public DrmCommandStreamEnhancedTes DebugManagerStateRestore restorer; }; +template +struct MockDrmDirectSubmission : public DrmDirectSubmission> { + using DrmDirectSubmission>::currentTagData; +}; + HWTEST_TEMPLATED_F(DrmCommandStreamDirectSubmissionTest, givenEnabledDirectSubmissionWhenFlushThenFlushStampIsNotUpdated) { auto &cs = csr->getCS(); CommandStreamReceiverHw::addBatchBufferEnd(cs, nullptr); @@ -1320,6 +1325,9 @@ HWTEST_TEMPLATED_F(DrmCommandStreamDirectSubmissionTest, givenEnabledDirectSubmi csr->flush(batchBuffer, csr->getResidencyAllocations()); EXPECT_EQ(csr->obtainCurrentFlushStamp(), flushStamp); + + auto directSubmission = static_cast *>(csr)->directSubmission.get(); + static_cast *>(directSubmission)->currentTagData.tagValue = 0u; } HWTEST_TEMPLATED_F(DrmCommandStreamDirectSubmissionTest, givenEnabledDirectSubmissionWhenFlushThenCommandBufferAllocationIsResident) { @@ -1334,6 +1342,9 @@ HWTEST_TEMPLATED_F(DrmCommandStreamDirectSubmissionTest, givenEnabledDirectSubmi auto memoryOperationsInterface = executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->memoryOperationsInterface.get(); EXPECT_EQ(memoryOperationsInterface->isResident(device.get(), *batchBuffer.commandBufferAllocation), MemoryOperationsStatus::SUCCESS); + + auto directSubmission = static_cast *>(csr)->directSubmission.get(); + static_cast *>(directSubmission)->currentTagData.tagValue = 0u; } HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, CheckDrmFree) { diff --git a/shared/source/direct_submission/direct_submission_hw.h b/shared/source/direct_submission/direct_submission_hw.h index d796b03704..0ec3bc18dc 100644 --- a/shared/source/direct_submission/direct_submission_hw.h +++ b/shared/source/direct_submission/direct_submission_hw.h @@ -19,7 +19,7 @@ namespace NEO { struct RingSemaphoreData { uint32_t QueueWorkCount; uint8_t ReservedCacheline[60]; - uint32_t Reserved1Uint32; + uint32_t tagAllocation; uint32_t Reserved2Uint32; uint32_t Reserved3Uint32; uint32_t Reserved4Uint32; diff --git a/shared/source/direct_submission/direct_submission_hw.inl b/shared/source/direct_submission/direct_submission_hw.inl index f26fe659c7..11fbdc9d80 100644 --- a/shared/source/direct_submission/direct_submission_hw.inl +++ b/shared/source/direct_submission/direct_submission_hw.inl @@ -86,7 +86,7 @@ bool DirectSubmissionHw::allocateResources() { memset(semaphorePtr, 0, sizeof(RingSemaphoreData)); semaphoreData->QueueWorkCount = 0; cpuCachelineFlush(semaphorePtr, MemoryConstants::cacheLineSize); - workloadModeOneStoreAddress = static_cast(&semaphoreData->Reserved1Uint32); + workloadModeOneStoreAddress = static_cast(&semaphoreData->Reserved4Uint32); *static_cast(workloadModeOneStoreAddress) = 0u; auto ret = makeResourcesResident(allocations); diff --git a/shared/source/direct_submission/linux/drm_direct_submission.h b/shared/source/direct_submission/linux/drm_direct_submission.h index 137d938001..a57cbdf87d 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.h +++ b/shared/source/direct_submission/linux/drm_direct_submission.h @@ -29,5 +29,10 @@ class DrmDirectSubmission : public DirectSubmissionHw { void handleSwitchRingBuffers() override; uint64_t updateTagValue() override; void getTagAddressValue(TagData &tagData) override; + + void wait(uint32_t taskCountToWait); + + TagData currentTagData; + volatile uint32_t *tagAddress; }; } // namespace NEO diff --git a/shared/source/direct_submission/linux/drm_direct_submission.inl b/shared/source/direct_submission/linux/drm_direct_submission.inl index 3b3bfbabe6..c1a64e927b 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.inl +++ b/shared/source/direct_submission/linux/drm_direct_submission.inl @@ -24,15 +24,14 @@ inline std::unique_ptr> DirectSubmissi template DrmDirectSubmission::DrmDirectSubmission(Device &device, OsContext &osContext) - : DirectSubmissionHw(device, osContext) { - this->disableMonitorFence = true; -} + : DirectSubmissionHw(device, osContext){}; template inline DrmDirectSubmission::~DrmDirectSubmission() { if (this->ringStart) { + this->wait(static_cast(this->currentTagData.tagValue)); this->stopRingBuffer(); - auto bb = static_cast(this->ringCommandStream.getGraphicsAllocation())->getBO(); + auto bb = static_cast(this->ringBuffer)->getBO(); bb->wait(-1); } this->deallocateResources(); @@ -40,6 +39,9 @@ inline DrmDirectSubmission::~DrmDirectSubmission() { template bool DrmDirectSubmission::allocateOsResources() { + this->currentTagData.tagAddress = this->semaphoreGpuVa + MemoryConstants::cacheLineSize; + this->currentTagData.tagValue = 0u; + this->tagAddress = reinterpret_cast(reinterpret_cast(this->semaphorePtr) + MemoryConstants::cacheLineSize); return true; } @@ -76,16 +78,30 @@ bool DrmDirectSubmission::handleResidency() { template void DrmDirectSubmission::handleSwitchRingBuffers() { + if (this->ringStart) { + if (this->completionRingBuffers[this->currentRingBuffer] != 0) { + this->wait(static_cast(this->completionRingBuffers[this->currentRingBuffer])); + } + } } template uint64_t DrmDirectSubmission::updateTagValue() { + this->currentTagData.tagValue++; + this->completionRingBuffers[this->currentRingBuffer] = this->currentTagData.tagValue; return 0ull; } template void DrmDirectSubmission::getTagAddressValue(TagData &tagData) { - tagData.tagAddress = 0ull; - tagData.tagValue = 0ull; + tagData.tagAddress = this->currentTagData.tagAddress; + tagData.tagValue = this->currentTagData.tagValue + 1; } + +template +void DrmDirectSubmission::wait(uint32_t taskCountToWait) { + while (taskCountToWait > *this->tagAddress) { + } +} + } // namespace NEO diff --git a/shared/test/unit_test/direct_submission/direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/direct_submission_tests.cpp index 600d910148..8ce1e3b3ef 100644 --- a/shared/test/unit_test/direct_submission/direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/direct_submission_tests.cpp @@ -461,7 +461,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, EXPECT_EQ(0x40u + 1u, storeData->getDataDword0()); uint64_t expectedGpuVa = directSubmission.semaphoreGpuVa; auto semaphore = static_cast(directSubmission.semaphorePtr); - expectedGpuVa += ptrDiff(&semaphore->Reserved1Uint32, directSubmission.semaphorePtr); + expectedGpuVa += ptrDiff(&semaphore->Reserved4Uint32, directSubmission.semaphorePtr); EXPECT_EQ(expectedGpuVa, storeData->getAddress()); } diff --git a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp index 6f3fb62cb7..c28156eab0 100644 --- a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp @@ -46,11 +46,13 @@ template struct MockDrmDirectSubmission : public DrmDirectSubmission { using BaseClass = DrmDirectSubmission; using BaseClass::allocateResources; + using BaseClass::currentTagData; using BaseClass::DrmDirectSubmission; using BaseClass::getTagAddressValue; using BaseClass::handleResidency; using BaseClass::submit; using BaseClass::switchRingBuffers; + using BaseClass::tagAddress; using BaseClass::updateTagValue; }; @@ -74,8 +76,8 @@ HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenCallingLinuxImplem TagData tagData = {1ull, 1ull}; drmDirectSubmission.getTagAddressValue(tagData); - EXPECT_EQ(0ull, tagData.tagAddress); - EXPECT_EQ(0ull, tagData.tagValue); + EXPECT_EQ(drmDirectSubmission.currentTagData.tagAddress, tagData.tagAddress); + EXPECT_EQ(drmDirectSubmission.currentTagData.tagValue + 1, tagData.tagValue); } HWTEST_F(DrmDirectSubmissionTest, whenCreateDirectSubmissionThenValidObjectIsReturned) {