diff --git a/level_zero/core/source/event/event_impl.inl b/level_zero/core/source/event/event_impl.inl index 12973df6b8..bc528eed64 100644 --- a/level_zero/core/source/event/event_impl.inl +++ b/level_zero/core/source/event/event_impl.inl @@ -98,15 +98,16 @@ Event *Event::create(const EventDescriptor &eventDescriptor, const ze_event_desc bool interruptMode = false; bool kmdWaitMode = false; + bool externalInterruptWait = false; if (extendedDesc && (extendedDesc->stype == ZEX_INTEL_STRUCTURE_TYPE_EVENT_SYNC_MODE_EXP_DESC)) { auto eventSyncModeDesc = reinterpret_cast(extendedDesc); interruptMode = (eventSyncModeDesc->syncModeFlags & ZEX_INTEL_EVENT_SYNC_MODE_EXP_FLAG_SIGNAL_INTERRUPT); kmdWaitMode = (eventSyncModeDesc->syncModeFlags & ZEX_INTEL_EVENT_SYNC_MODE_EXP_FLAG_LOW_POWER_WAIT); - bool externalInterrupt = (eventSyncModeDesc->syncModeFlags & ZEX_INTEL_EVENT_SYNC_MODE_EXP_FLAG_EXTERNAL_INTERRUPT_WAIT); + externalInterruptWait = (eventSyncModeDesc->syncModeFlags & ZEX_INTEL_EVENT_SYNC_MODE_EXP_FLAG_EXTERNAL_INTERRUPT_WAIT); - if (externalInterrupt) { + if (externalInterruptWait) { event->setExternalInterruptId(eventSyncModeDesc->externalInterruptId); UNRECOVERABLE_IF(eventSyncModeDesc->externalInterruptId > 0 && eventDescriptor.eventPoolAllocation); } @@ -117,10 +118,10 @@ Event *Event::create(const EventDescriptor &eventDescriptor, const ze_event_desc if (interruptMode) { event->enableInterruptMode(); + } - if (kmdWaitMode) { - event->enableKmdWaitMode(); - } + if (externalInterruptWait || (interruptMode && kmdWaitMode)) { + event->enableKmdWaitMode(); } return event.release(); diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp index 5f65fc5319..ac0c43e576 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp @@ -83,7 +83,7 @@ HWTEST2_F(InOrderCmdListTests, givenInvalidPnextStructWhenCreatingEventThenIgnor HWTEST2_F(InOrderCmdListTests, givenEventSyncModeDescPassedWhenCreatingEventThenEnableNewModes, MatchAny) { ze_event_pool_desc_t eventPoolDesc = {}; eventPoolDesc.flags = ZE_EVENT_POOL_FLAG_HOST_VISIBLE; - eventPoolDesc.count = 6; + eventPoolDesc.count = 7; auto eventPool = std::unique_ptr(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue)); @@ -4518,10 +4518,17 @@ HWTEST2_F(InOrderCmdListTests, givenStandaloneCbEventWhenPassingExternalInterrup syncModeDesc.syncModeFlags = ZEX_INTEL_EVENT_SYNC_MODE_EXP_FLAG_SIGNAL_INTERRUPT; auto event1 = createStandaloneCbEvent(reinterpret_cast(&syncModeDesc)); EXPECT_EQ(NEO::InterruptId::notUsed, event1->externalInterruptId); + EXPECT_FALSE(event1->isKmdWaitModeEnabled()); syncModeDesc.syncModeFlags = ZEX_INTEL_EVENT_SYNC_MODE_EXP_FLAG_EXTERNAL_INTERRUPT_WAIT; auto event2 = createStandaloneCbEvent(reinterpret_cast(&syncModeDesc)); EXPECT_EQ(syncModeDesc.externalInterruptId, event2->externalInterruptId); + EXPECT_TRUE(event2->isKmdWaitModeEnabled()); + + syncModeDesc.syncModeFlags = ZEX_INTEL_EVENT_SYNC_MODE_EXP_FLAG_EXTERNAL_INTERRUPT_WAIT | ZEX_INTEL_EVENT_SYNC_MODE_EXP_FLAG_LOW_POWER_WAIT; + auto event3 = createStandaloneCbEvent(reinterpret_cast(&syncModeDesc)); + EXPECT_EQ(syncModeDesc.externalInterruptId, event3->externalInterruptId); + EXPECT_TRUE(event3->isKmdWaitModeEnabled()); } HWTEST2_F(InOrderCmdListTests, givenStandaloneEventWhenCallingAppendThenSuccess, IsAtLeastXeHpCore) {