Enable KMD fallback for User Fence wait call

Related-To: NEO-5845

Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
Zbigniew Zdanowicz
2021-06-15 11:31:12 +00:00
committed by Compute-Runtime-Automation
parent 6c7ccddae0
commit ad18099ed8
16 changed files with 154 additions and 59 deletions

View File

@ -356,18 +356,37 @@ class DrmMockCustom : public Drm {
uint64_t value = 0u;
uint32_t ctxId = 0u;
ValueWidth dataWidth = ValueWidth::U8;
int64_t timeout = 0;
uint32_t called = 0u;
};
WaitUserFenceCall waitUserFenceCall{};
int waitUserFence(uint32_t ctxId, uint64_t address, uint64_t value, ValueWidth dataWidth) override {
int waitUserFence(uint32_t ctxId, uint64_t address, uint64_t value, ValueWidth dataWidth, int64_t timeout) override {
waitUserFenceCall.called++;
waitUserFenceCall.ctxId = ctxId;
waitUserFenceCall.address = address;
waitUserFenceCall.dataWidth = dataWidth;
waitUserFenceCall.value = value;
return Drm::waitUserFence(ctxId, address, value, dataWidth);
waitUserFenceCall.timeout = timeout;
return Drm::waitUserFence(ctxId, address, value, dataWidth, timeout);
}
struct IsVmBindAvailableCall {
bool callParent = true;
bool returnValue = true;
uint32_t called = 0u;
};
IsVmBindAvailableCall isVmBindAvailableCall{};
bool isVmBindAvailable() override {
isVmBindAvailableCall.called++;
if (isVmBindAvailableCall.callParent) {
return Drm::isVmBindAvailable();
} else {
return isVmBindAvailableCall.returnValue;
}
}
};

View File

@ -1691,32 +1691,26 @@ HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenWaitUserFenceFlagSetWhenDr
mm->freeGraphicsMemory(commandBuffer);
}
HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenWaitUserFenceFlagSetWhenDrmCsrThenExpectUseDrmWaitUserFenceCallWithZeroContext) {
DebugManagerStateRestore restorer;
DebugManager.flags.EnableUserFenceForCompletionWait.set(1);
HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenWaitUserFenceFlagNotSetWhenDrmCsrWaitsForFlushStampThenExpectUseDrmGemWaitCall) {
TestedDrmCommandStreamReceiver<FamilyType> *testedCsr =
new TestedDrmCommandStreamReceiver<FamilyType>(gemCloseWorkerMode::gemCloseWorkerInactive,
*this->executionEnvironment,
1);
EXPECT_TRUE(testedCsr->useUserFenceWait);
EXPECT_FALSE(testedCsr->useContextForUserFenceWait);
EXPECT_FALSE(testedCsr->useUserFenceWait);
EXPECT_TRUE(testedCsr->useContextForUserFenceWait);
device->resetCommandStreamReceiver(testedCsr);
mock->ioctl_cnt.gemWait = 0;
FlushStamp handleToWait = 123;
testedCsr->waitForFlushStamp(handleToWait);
EXPECT_EQ(1u, testedCsr->waitUserFenceResult.called);
EXPECT_EQ(123u, testedCsr->waitUserFenceResult.waitValue);
EXPECT_EQ(0u, mock->waitUserFenceCall.ctxId);
EXPECT_EQ(1u, mock->waitUserFenceCall.called);
EXPECT_EQ(Drm::ValueWidth::U32, mock->waitUserFenceCall.dataWidth);
EXPECT_EQ(1, mock->ioctl_cnt.gemWait);
EXPECT_EQ(0u, testedCsr->waitUserFenceResult.called);
}
HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenWaitUserFenceAndUseCtxFlagsSetWhenDrmCsrThenExpectUseDrmWaitUserFenceCallWithNonZeroContext) {
HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenWaitUserFenceFlagSetWhenDrmCsrWaitsForFlushStampThenExpectUseDrmWaitUserFenceCallWithNonZeroContext) {
DebugManagerStateRestore restorer;
DebugManager.flags.EnableUserFenceForCompletionWait.set(1);
DebugManager.flags.EnableUserFenceUseCtxId.set(1);
TestedDrmCommandStreamReceiver<FamilyType> *testedCsr =
new TestedDrmCommandStreamReceiver<FamilyType>(gemCloseWorkerMode::gemCloseWorkerInactive,
@ -1725,6 +1719,7 @@ HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenWaitUserFenceAndUseCtxFlag
EXPECT_TRUE(testedCsr->useUserFenceWait);
EXPECT_TRUE(testedCsr->useContextForUserFenceWait);
device->resetCommandStreamReceiver(testedCsr);
mock->ioctl_cnt.gemWait = 0;
auto osContextLinux = static_cast<const OsContextLinux *>(device->getDefaultEngine().osContext);
std::vector<uint32_t> &drmCtxIds = const_cast<std::vector<uint32_t> &>(osContextLinux->getDrmContextIds());
@ -1736,9 +1731,87 @@ HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenWaitUserFenceAndUseCtxFlag
FlushStamp handleToWait = 123;
testedCsr->waitForFlushStamp(handleToWait);
EXPECT_EQ(0, mock->ioctl_cnt.gemWait);
EXPECT_EQ(1u, testedCsr->waitUserFenceResult.called);
EXPECT_EQ(123u, testedCsr->waitUserFenceResult.waitValue);
EXPECT_NE(0u, mock->waitUserFenceCall.ctxId);
EXPECT_EQ(1u, mock->waitUserFenceCall.called);
EXPECT_NE(0u, mock->waitUserFenceCall.ctxId);
EXPECT_EQ(-1, mock->waitUserFenceCall.timeout);
EXPECT_EQ(Drm::ValueWidth::U32, mock->waitUserFenceCall.dataWidth);
}
HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenWaitUserFenceSetAndUseCtxFlagsNotSetWhenDrmCsrWaitsForFlushStampThenExpectUseDrmWaitUserFenceCallWithZeroContext) {
DebugManagerStateRestore restorer;
DebugManager.flags.EnableUserFenceForCompletionWait.set(1);
DebugManager.flags.EnableUserFenceUseCtxId.set(0);
TestedDrmCommandStreamReceiver<FamilyType> *testedCsr =
new TestedDrmCommandStreamReceiver<FamilyType>(gemCloseWorkerMode::gemCloseWorkerInactive,
*this->executionEnvironment,
1);
EXPECT_TRUE(testedCsr->useUserFenceWait);
EXPECT_FALSE(testedCsr->useContextForUserFenceWait);
device->resetCommandStreamReceiver(testedCsr);
mock->ioctl_cnt.gemWait = 0;
FlushStamp handleToWait = 123;
testedCsr->waitForFlushStamp(handleToWait);
EXPECT_EQ(0, mock->ioctl_cnt.gemWait);
EXPECT_EQ(1u, testedCsr->waitUserFenceResult.called);
EXPECT_EQ(123u, testedCsr->waitUserFenceResult.waitValue);
EXPECT_EQ(1u, mock->waitUserFenceCall.called);
EXPECT_EQ(0u, mock->waitUserFenceCall.ctxId);
EXPECT_EQ(-1, mock->waitUserFenceCall.timeout);
EXPECT_EQ(Drm::ValueWidth::U32, mock->waitUserFenceCall.dataWidth);
}
HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenVmBindNotAvailableWhenCheckingForKmdWaitModeActiveThenReturnTrue) {
auto testDrmCsr = static_cast<TestedDrmCommandStreamReceiver<FamilyType> *>(csr);
mock->isVmBindAvailableCall.called = 0u;
mock->isVmBindAvailableCall.callParent = false;
mock->isVmBindAvailableCall.returnValue = false;
EXPECT_TRUE(testDrmCsr->isKmdWaitModeActive());
EXPECT_EQ(1u, mock->isVmBindAvailableCall.called);
}
HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenVmBindAvailableUseWaitCallAndUseContextIdTrueWhenCheckingForKmdWaitModeActiveThenReturnTrue) {
auto testDrmCsr = static_cast<TestedDrmCommandStreamReceiver<FamilyType> *>(csr);
mock->isVmBindAvailableCall.called = 0u;
mock->isVmBindAvailableCall.callParent = false;
mock->isVmBindAvailableCall.returnValue = true;
testDrmCsr->useUserFenceWait = true;
testDrmCsr->useContextForUserFenceWait = true;
EXPECT_TRUE(testDrmCsr->isKmdWaitModeActive());
EXPECT_EQ(1u, mock->isVmBindAvailableCall.called);
}
HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenVmBindAvailableUseWaitCallFalseAndUseContextIdTrueWhenCheckingForKmdWaitModeActiveThenReturnFalse) {
auto testDrmCsr = static_cast<TestedDrmCommandStreamReceiver<FamilyType> *>(csr);
mock->isVmBindAvailableCall.called = 0u;
mock->isVmBindAvailableCall.callParent = false;
mock->isVmBindAvailableCall.returnValue = true;
testDrmCsr->useUserFenceWait = false;
testDrmCsr->useContextForUserFenceWait = true;
EXPECT_FALSE(testDrmCsr->isKmdWaitModeActive());
EXPECT_EQ(1u, mock->isVmBindAvailableCall.called);
}
HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, givenVmBindAvailableUseWaitCallTrueAndUseContextIdFalseWhenCheckingForKmdWaitModeActiveThenReturnFalse) {
auto testDrmCsr = static_cast<TestedDrmCommandStreamReceiver<FamilyType> *>(csr);
mock->isVmBindAvailableCall.called = 0u;
mock->isVmBindAvailableCall.callParent = false;
mock->isVmBindAvailableCall.returnValue = true;
testDrmCsr->useUserFenceWait = true;
testDrmCsr->useContextForUserFenceWait = false;
EXPECT_FALSE(testDrmCsr->isKmdWaitModeActive());
EXPECT_EQ(1u, mock->isVmBindAvailableCall.called);
}