feature: assign external interrupt id to Event

Related-To: NEO-8179

Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:
Bartosz Dunajski
2024-04-17 12:02:39 +00:00
committed by Compute-Runtime-Automation
parent 4067b899cc
commit cd563c2761
4 changed files with 43 additions and 6 deletions

View File

@@ -288,6 +288,8 @@ struct Event : _ze_event_handle_t {
return this->signalAllEventPackets ? getMaxPacketsCount() : getPacketsInUse();
}
void setExternalInterruptId(uint32_t interruptId) { externalInterruptId = interruptId; }
protected:
Event(int index, Device *device) : device(device), index(index) {}
@@ -335,6 +337,8 @@ struct Event : _ze_event_handle_t {
uint32_t maxPacketCount = 0;
uint32_t totalEventSize = 0;
uint32_t counterBasedFlags = 0;
uint32_t externalInterruptId = 0;
CounterBasedMode counterBasedMode = CounterBasedMode::initiallyDisabled;
ze_event_scope_flags_t signalScope = 0u;

View File

@@ -30,8 +30,8 @@ Event *Event::create(const EventDescriptor &eventDescriptor, const ze_event_desc
auto csr = neoDevice->getDefaultEngine().commandStreamReceiver;
auto &hwInfo = neoDevice->getHardwareInfo();
auto event = new EventImp<TagSizeT>(desc->index, device, csr->isTbxMode());
UNRECOVERABLE_IF(event == nullptr);
auto event = std::make_unique<EventImp<TagSizeT>>(desc->index, device, csr->isTbxMode());
UNRECOVERABLE_IF(!event.get());
event->eventPoolAllocation = eventDescriptor.eventPoolAllocation;
@@ -103,6 +103,11 @@ Event *Event::create(const EventDescriptor &eventDescriptor, const ze_event_desc
interruptMode = (eventSyncModeDesc->syncModeFlags & ZE_INTEL_EVENT_SYNC_MODE_EXP_FLAG_SIGNAL_INTERRUPT);
kmdWaitMode = (eventSyncModeDesc->syncModeFlags & ZE_INTEL_EVENT_SYNC_MODE_EXP_FLAG_LOW_POWER_WAIT);
if (kmdWaitMode) {
event->setExternalInterruptId(eventSyncModeDesc->externalInterruptId);
UNRECOVERABLE_IF(eventSyncModeDesc->externalInterruptId > 0 && eventDescriptor.eventPoolAllocation);
}
}
interruptMode |= (NEO::debugManager.flags.WaitForUserFenceOnEventHostSynchronize.get() == 1);
@@ -116,7 +121,7 @@ Event *Event::create(const EventDescriptor &eventDescriptor, const ze_event_desc
event->enableInterruptMode();
}
return event;
return event.release();
}
template <typename TagSizeT>

View File

@@ -32,6 +32,7 @@ struct InOrderCmdListFixture : public ::Test<ModuleFixture> {
using EventImp<uint32_t>::csrs;
using EventImp<uint32_t>::signalScope;
using EventImp<uint32_t>::unsetCmdQueue;
using EventImp<uint32_t>::externalInterruptId;
void makeCounterBasedInitiallyDisabled() {
counterBasedMode = CounterBasedMode::initiallyDisabled;
@@ -59,7 +60,7 @@ struct InOrderCmdListFixture : public ::Test<ModuleFixture> {
::Test<ModuleFixture>::TearDown();
}
DestroyableZeUniquePtr<FixtureMockEvent> createStandaloneCbEvent() {
DestroyableZeUniquePtr<FixtureMockEvent> createStandaloneCbEvent(const ze_base_desc_t *pNext) {
constexpr uint32_t counterBasedFlags = (ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE | ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_NON_IMMEDIATE);
constexpr EventDescriptor eventDescriptor = {
@@ -82,6 +83,7 @@ struct InOrderCmdListFixture : public ::Test<ModuleFixture> {
auto inOrderExecInfo = NEO::InOrderExecInfo::createFromExternalAllocation(*device->getNEODevice(), castToUint64(deviceAddress), hostAddress, 1);
ze_event_desc_t eventDesc = {};
eventDesc.pNext = pNext;
auto event = static_cast<FixtureMockEvent *>(Event::create<uint64_t>(eventDescriptor, &eventDesc, device));
event->updateInOrderExecState(inOrderExecInfo, 1, 0);

View File

@@ -85,7 +85,7 @@ HWTEST2_F(InOrderCmdListTests, givenInvalidPnextStructWhenCreatingEventThenIgnor
HWTEST2_F(InOrderCmdListTests, givenEventSyncModeDescPassedWhenCreatingEventThenEnableNewModes, IsAtLeastSkl) {
ze_event_pool_desc_t eventPoolDesc = {};
eventPoolDesc.flags = ZE_EVENT_POOL_FLAG_HOST_VISIBLE;
eventPoolDesc.count = 4;
eventPoolDesc.count = 6;
auto eventPool = std::unique_ptr<L0::EventPool>(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, returnValue));
@@ -116,6 +116,16 @@ HWTEST2_F(InOrderCmdListTests, givenEventSyncModeDescPassedWhenCreatingEventThen
auto event3 = DestroyableZeUniquePtr<FixtureMockEvent>(static_cast<FixtureMockEvent *>(Event::create<typename FamilyType::TimestampPacketType>(eventPool.get(), &eventDesc, device)));
EXPECT_TRUE(event3->isInterruptModeEnabled());
EXPECT_TRUE(event3->isKmdWaitModeEnabled());
eventDesc.index = 4;
syncModeDesc.syncModeFlags = ZE_INTEL_EVENT_SYNC_MODE_EXP_FLAG_SIGNAL_INTERRUPT;
syncModeDesc.externalInterruptId = 123;
auto event4 = DestroyableZeUniquePtr<FixtureMockEvent>(static_cast<FixtureMockEvent *>(Event::create<typename FamilyType::TimestampPacketType>(eventPool.get(), &eventDesc, device)));
EXPECT_EQ(0u, event4->externalInterruptId);
eventDesc.index = 5;
syncModeDesc.syncModeFlags = ZE_INTEL_EVENT_SYNC_MODE_EXP_FLAG_LOW_POWER_WAIT;
EXPECT_ANY_THROW(Event::create<typename FamilyType::TimestampPacketType>(eventPool.get(), &eventDesc, device));
}
HWTEST2_F(InOrderCmdListTests, givenQueueFlagWhenCreatingCmdListThenEnableRelaxedOrdering, IsAtLeastXeHpCore) {
@@ -3292,7 +3302,7 @@ HWTEST2_F(InOrderCmdListTests, givenStandaloneCbEventWhenDispatchingThenProgramC
using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
auto immCmdList = createImmCmdList<gfxCoreFamily>();
auto event = createStandaloneCbEvent();
auto event = createStandaloneCbEvent(nullptr);
auto cmdStream = immCmdList->getCmdContainer().getCommandStream();
auto offset = cmdStream->getUsed();
@@ -3840,6 +3850,22 @@ HWTEST2_F(InOrderCmdListTests, givenStandaloneEventWhenCallingSynchronizeThenRet
zeEventDestroy(handle);
}
HWTEST2_F(InOrderCmdListTests, givenStandaloneCbEventWhenPassingExternalInterruptIdThenAssign, IsAtLeastSkl) {
ze_intel_event_sync_mode_exp_desc_t syncModeDesc = {ZE_INTEL_STRUCTURE_TYPE_EVENT_SYNC_MODE_EXP_DESC};
syncModeDesc.externalInterruptId = 123;
ze_event_desc_t eventDesc = {};
eventDesc.pNext = &syncModeDesc;
syncModeDesc.syncModeFlags = ZE_INTEL_EVENT_SYNC_MODE_EXP_FLAG_SIGNAL_INTERRUPT;
auto event1 = createStandaloneCbEvent(reinterpret_cast<const ze_base_desc_t *>(&syncModeDesc));
EXPECT_EQ(0u, event1->externalInterruptId);
syncModeDesc.syncModeFlags = ZE_INTEL_EVENT_SYNC_MODE_EXP_FLAG_LOW_POWER_WAIT;
auto event2 = createStandaloneCbEvent(reinterpret_cast<const ze_base_desc_t *>(&syncModeDesc));
EXPECT_EQ(syncModeDesc.externalInterruptId, event2->externalInterruptId);
}
HWTEST2_F(InOrderCmdListTests, givenStandaloneEventWhenCallingAppendThenSuccess, IsAtLeastXeHpCore) {
uint64_t counterValue = 2;
uint64_t *hostAddress = &counterValue;