From 26709ba1244687235023b7026e58b2ba17a09dd5 Mon Sep 17 00:00:00 2001 From: Jitendra Sharma Date: Sat, 19 Oct 2024 02:24:34 +0000 Subject: [PATCH] fix: Implement polling of SW FIFO Related-To: NEO-12955 Signed-off-by: Jitendra Sharma --- .../tools/source/debug/debug_session_imp.cpp | 55 +++++++++++++++---- .../tools/source/debug/debug_session_imp.h | 14 +++++ .../source/debug/linux/debug_session.cpp | 2 +- .../tools/source/debug/linux/debug_session.h | 12 +--- .../source/debug/linux/prelim/debug_session.h | 2 +- .../source/debug/linux/xe/debug_session.cpp | 7 ++- .../source/debug/linux/xe/debug_session.h | 2 +- .../source/debug/windows/debug_session.h | 4 +- .../sources/debug/debug_session_tests.cpp | 48 ++++++++++++++++ .../xe/debug_session_fixtures_linux_xe.h | 1 + .../linux/xe/test_debug_api_linux_xe.cpp | 15 +++++ .../sources/debug/mock_debug_session.h | 12 ++++ .../debug_settings/debug_variables_base.inl | 1 + shared/test/common/test_files/igdrcl.config | 1 + 14 files changed, 149 insertions(+), 27 deletions(-) diff --git a/level_zero/tools/source/debug/debug_session_imp.cpp b/level_zero/tools/source/debug/debug_session_imp.cpp index 6dc9d42ef1..8999268110 100644 --- a/level_zero/tools/source/debug/debug_session_imp.cpp +++ b/level_zero/tools/source/debug/debug_session_imp.cpp @@ -1664,7 +1664,6 @@ ze_result_t DebugSessionImp::readFifo(uint64_t vmHandle, std::vectorversionHeader.size * 8) + stateSaveAreaHeader->regHeaderV3.fifo_offset; @@ -1688,6 +1687,8 @@ ze_result_t DebugSessionImp::readFifo(uint64_t vmHandle, std::vector nodes(readSize); @@ -1730,22 +1731,52 @@ ze_result_t DebugSessionImp::readFifo(uint64_t vmHandle, std::vector(&fifoTailIndex), sizeof(uint32_t), gpuVa + offsetTail); - if (retVal != ZE_RESULT_SUCCESS) { - PRINT_DEBUGGER_ERROR_LOG("Writing FIFO failed, error = %d\n", retVal); - return retVal; + if (updateTailIndex) { + retVal = writeGpuMemory(vmHandle, reinterpret_cast(&fifoTailIndex), sizeof(uint32_t), gpuVa + offsetTail); + if (retVal != ZE_RESULT_SUCCESS) { + PRINT_DEBUGGER_ERROR_LOG("Writing FIFO failed, error = %d\n", retVal); + return retVal; + } + NEO::sleep(std::chrono::milliseconds(failsafeTimeoutWait)); + } else { + break; } - - retVal = readGpuMemory(vmHandle, reinterpret_cast(&lastHead), sizeof(uint32_t), gpuVa + offsetHead); - if (retVal != ZE_RESULT_SUCCESS) { - PRINT_DEBUGGER_ERROR_LOG("Reading fifo_head failed, error = %d\n", retVal); - return retVal; - } - NEO::sleep(std::chrono::milliseconds(failsafeTimeoutWait)); } return ZE_RESULT_SUCCESS; } +void DebugSessionImp::pollFifo() { + if (attentionEventContext.empty()) { + return; + } + auto now = std::chrono::steady_clock::now(); + auto currentTime = std::chrono::duration_cast(now.time_since_epoch()); + + auto timeSinceLastFifoRead = currentTime - lastFifoReadTime; + if (timeSinceLastFifoRead.count() > fifoPollInterval) { + handleStoppedThreads(); + } +} + +void DebugSessionImp::handleStoppedThreads() { + for (const auto &entry : attentionEventContext) { + auto vmHandle = entry.first; + std::vector threadsWithAttention; + auto result = readFifo(vmHandle, threadsWithAttention); + if (result != ZE_RESULT_SUCCESS) { + return; + } + auto now = std::chrono::steady_clock::now(); + lastFifoReadTime = std::chrono::duration_cast(now.time_since_epoch()); + + if (threadsWithAttention.empty()) { + return; + } + updateStoppedThreadsAndCheckTriggerEvents(entry.second, 0, threadsWithAttention); + } +} + } // namespace L0 diff --git a/level_zero/tools/source/debug/debug_session_imp.h b/level_zero/tools/source/debug/debug_session_imp.h index 0852af20ef..0172cae9b4 100644 --- a/level_zero/tools/source/debug/debug_session_imp.h +++ b/level_zero/tools/source/debug/debug_session_imp.h @@ -166,6 +166,20 @@ struct DebugSessionImp : DebugSession { } } + struct AttentionEventFields { + uint64_t clientHandle; + uint64_t contextHandle; + uint64_t lrcHandle; + uint32_t bitmaskSize; + uint8_t *bitmask; + }; + void handleStoppedThreads(); + void pollFifo(); + int32_t fifoPollInterval = 150; + std::unordered_map attentionEventContext{}; + std::chrono::milliseconds lastFifoReadTime = std::chrono::milliseconds(0); + virtual void updateStoppedThreadsAndCheckTriggerEvents(const AttentionEventFields &attention, uint32_t tileIndex, std::vector &threadsWithAttention) = 0; + std::chrono::high_resolution_clock::time_point interruptTime; std::atomic interruptSent = false; std::atomic triggerEvents = false; diff --git a/level_zero/tools/source/debug/linux/debug_session.cpp b/level_zero/tools/source/debug/linux/debug_session.cpp index 2e07c50209..8e81249a5d 100644 --- a/level_zero/tools/source/debug/linux/debug_session.cpp +++ b/level_zero/tools/source/debug/linux/debug_session.cpp @@ -686,7 +686,7 @@ ze_result_t DebugSessionLinux::getElfOffset(const zet_debug_memory_space_desc_t return status; } -void DebugSessionLinux::updateStoppedThreadsAndCheckTriggerEvents(AttentionEventFields &attention, uint32_t tileIndex, std::vector &threadsWithAttention) { +void DebugSessionLinux::updateStoppedThreadsAndCheckTriggerEvents(const AttentionEventFields &attention, uint32_t tileIndex, std::vector &threadsWithAttention) { auto vmHandle = getVmHandleFromClientAndlrcHandle(attention.clientHandle, attention.lrcHandle); if (vmHandle == invalidHandle) { return; diff --git a/level_zero/tools/source/debug/linux/debug_session.h b/level_zero/tools/source/debug/linux/debug_session.h index 6c239664f0..331e122dfd 100644 --- a/level_zero/tools/source/debug/linux/debug_session.h +++ b/level_zero/tools/source/debug/linux/debug_session.h @@ -175,14 +175,6 @@ struct DebugSessionLinux : DebugSessionImp { interruptAll }; - struct AttentionEventFields { - uint64_t clientHandle; - uint64_t contextHandle; - uint64_t lrcHandle; - uint32_t bitmaskSize; - uint8_t *bitmask; - }; - std::vector> eventsToAck; // debug event, handle to module void enqueueApiEvent(zet_debug_event_t &debugEvent) override { pushApiEvent(debugEvent); @@ -205,8 +197,8 @@ struct DebugSessionLinux : DebugSessionImp { apiEventCondition.notify_all(); } - MOCKABLE_VIRTUAL void updateStoppedThreadsAndCheckTriggerEvents(AttentionEventFields &attention, uint32_t tileIndex, std::vector &threadsWithAttention); - virtual void updateContextAndLrcHandlesForThreadsWithAttention(EuThread::ThreadId threadId, AttentionEventFields &attention) = 0; + void updateStoppedThreadsAndCheckTriggerEvents(const AttentionEventFields &attention, uint32_t tileIndex, std::vector &threadsWithAttention) override; + virtual void updateContextAndLrcHandlesForThreadsWithAttention(EuThread::ThreadId threadId, const AttentionEventFields &attention) = 0; virtual uint64_t getVmHandleFromClientAndlrcHandle(uint64_t clientHandle, uint64_t lrcHandle) = 0; virtual std::unique_lock getThreadStateMutexForTileSession(uint32_t tileIndex) = 0; virtual void checkTriggerEventsForAttentionForTileSession(uint32_t tileIndex) = 0; diff --git a/level_zero/tools/source/debug/linux/prelim/debug_session.h b/level_zero/tools/source/debug/linux/prelim/debug_session.h index a986f94c2b..caa71eadcf 100644 --- a/level_zero/tools/source/debug/linux/prelim/debug_session.h +++ b/level_zero/tools/source/debug/linux/prelim/debug_session.h @@ -111,7 +111,7 @@ struct DebugSessionLinuxi915 : DebugSessionLinux { bool handleInternalEvent() override; - void updateContextAndLrcHandlesForThreadsWithAttention(EuThread::ThreadId threadId, AttentionEventFields &attention) override {} + void updateContextAndLrcHandlesForThreadsWithAttention(EuThread::ThreadId threadId, const AttentionEventFields &attention) override {} uint64_t getVmHandleFromClientAndlrcHandle(uint64_t clientHandle, uint64_t lrcHandle) override; bool handleVmBindEvent(prelim_drm_i915_debug_event_vm_bind *vmBind); void handleContextParamEvent(prelim_drm_i915_debug_event_context_param *contextParam); diff --git a/level_zero/tools/source/debug/linux/xe/debug_session.cpp b/level_zero/tools/source/debug/linux/xe/debug_session.cpp index 71a601404d..4620d9198f 100644 --- a/level_zero/tools/source/debug/linux/xe/debug_session.cpp +++ b/level_zero/tools/source/debug/linux/xe/debug_session.cpp @@ -75,12 +75,17 @@ bool DebugSessionLinuxXe::handleInternalEvent() { void *DebugSessionLinuxXe::asyncThreadFunction(void *arg) { DebugSessionLinuxXe *self = reinterpret_cast(arg); + if (NEO::debugManager.flags.FifoPollInterval.get() != -1) { + self->fifoPollInterval = NEO::debugManager.flags.FifoPollInterval.get(); + } + PRINT_DEBUGGER_INFO_LOG("Debugger async thread start\n", ""); while (self->asyncThread.threadActive) { self->handleEventsAsync(); self->generateEventsAndResumeStoppedThreads(); self->sendInterrupts(); + self->pollFifo(); } PRINT_DEBUGGER_INFO_LOG("Debugger async thread closing\n", ""); @@ -769,7 +774,7 @@ int DebugSessionLinuxXe::threadControl(const std::vector &th return -1; } -void DebugSessionLinuxXe::updateContextAndLrcHandlesForThreadsWithAttention(EuThread::ThreadId threadId, AttentionEventFields &attention) { +void DebugSessionLinuxXe::updateContextAndLrcHandlesForThreadsWithAttention(EuThread::ThreadId threadId, const AttentionEventFields &attention) { allThreads[threadId]->setContextHandle(attention.contextHandle); allThreads[threadId]->setLrcHandle(attention.lrcHandle); } diff --git a/level_zero/tools/source/debug/linux/xe/debug_session.h b/level_zero/tools/source/debug/linux/xe/debug_session.h index b580e0576e..103cf25c8d 100644 --- a/level_zero/tools/source/debug/linux/xe/debug_session.h +++ b/level_zero/tools/source/debug/linux/xe/debug_session.h @@ -69,7 +69,7 @@ struct DebugSessionLinuxXe : DebugSessionLinux { MOCKABLE_VIRTUAL void handleAttentionEvent(drm_xe_eudebug_event_eu_attention *attention); void handleMetadataEvent(drm_xe_eudebug_event_metadata *pMetaData); bool handleMetadataOpEvent(drm_xe_eudebug_event_vm_bind_op_metadata *vmBindOpMetadata); - void updateContextAndLrcHandlesForThreadsWithAttention(EuThread::ThreadId threadId, AttentionEventFields &attention) override; + void updateContextAndLrcHandlesForThreadsWithAttention(EuThread::ThreadId threadId, const AttentionEventFields &attention) override; int eventAckIoctl(EventToAck &event) override; MOCKABLE_VIRTUAL int getEuControlCmdUnlock() const; Module &getModule(uint64_t moduleHandle) override { diff --git a/level_zero/tools/source/debug/windows/debug_session.h b/level_zero/tools/source/debug/windows/debug_session.h index 218c072e7e..8cf2f23cc8 100644 --- a/level_zero/tools/source/debug/windows/debug_session.h +++ b/level_zero/tools/source/debug/windows/debug_session.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022-2023 Intel Corporation + * Copyright (C) 2022-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -95,6 +95,8 @@ struct DebugSessionWindows : DebugSessionImp { UNRECOVERABLE_IF(true); } + void updateStoppedThreadsAndCheckTriggerEvents(const AttentionEventFields &attention, uint32_t tileIndex, std::vector &threadsWithAttention) override {} + static void *asyncThreadFunction(void *arg); MOCKABLE_VIRTUAL void getSbaBufferGpuVa(uint64_t &gpuVa); diff --git a/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp b/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp index 1f212466cd..91c0df9ef8 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp +++ b/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp @@ -1937,6 +1937,54 @@ TEST_F(DebugSessionTestSwFifoFixture, GivenSwFifoWithHeadIndexAtZeroWhenReadingS } } +TEST_F(DebugSessionTestSwFifoFixture, GivenSwFifoAndAttentionEventContextEmptyWhenPollSwFifoThenReadFifoIsNotCalled) { + EXPECT_FALSE(session->stateSaveAreaHeader.empty()); + session->pollFifo(); + + EXPECT_TRUE(session->attentionEventContext.empty()); + EXPECT_EQ(session->readFifoCallCount, 0u); +} + +TEST_F(DebugSessionTestSwFifoFixture, GivenTimeSinceLastFifoReadLessThanPollIntervalWhenPollSwFifoThenReadFifoIsNotCalled) { + EXPECT_FALSE(session->stateSaveAreaHeader.empty()); + + auto now = std::chrono::steady_clock::now(); + session->lastFifoReadTime = std::chrono::duration_cast(now.time_since_epoch()); + session->fifoPollInterval = INT32_MAX; + session->attentionEventContext[10] = {11, 12, 1}; + session->pollFifo(); + + EXPECT_EQ(session->readFifoCallCount, 0u); +} + +TEST_F(DebugSessionTestSwFifoFixture, GivenSwFifoWithHeadAndTailIndexEqualWhenPollSwFifoThenOneReadAndNoWriteIsDone) { + EXPECT_FALSE(session->stateSaveAreaHeader.empty()); + stateSaveAreaHeaderPtr = reinterpret_cast(session->stateSaveAreaHeader.data()); + stateSaveAreaHeaderPtr->regHeaderV3.fifo_head = fifoTail; + + DebugManagerStateRestore stateRestore; + debugManager.flags.FifoPollInterval.set(0); + session->attentionEventContext[10] = {11, 12, 1}; + session->pollFifo(); + + EXPECT_EQ(session->readFifoCallCount, 1u); + EXPECT_LE(session->readGpuMemoryCallCount, 1u); + EXPECT_EQ(session->writeGpuMemoryCallCount, 0u); +} + +TEST_F(DebugSessionTestSwFifoFixture, GivenSwFifoWithHeadAndTailIndexEqualWhenSwFifoReadThenOneReadAndNoWriteIsDone) { + EXPECT_FALSE(session->stateSaveAreaHeader.empty()); + stateSaveAreaHeaderPtr = reinterpret_cast(session->stateSaveAreaHeader.data()); + stateSaveAreaHeaderPtr->regHeaderV3.fifo_head = fifoTail; + + std::vector threadsWithAttention; + session->readFifo(0, threadsWithAttention); + + EXPECT_EQ(session->readFifoCallCount, 1u); + EXPECT_LE(session->readGpuMemoryCallCount, 1u); + EXPECT_EQ(session->writeGpuMemoryCallCount, 0u); +} + TEST_F(DebugSessionTestSwFifoFixture, GivenSwFifoWhenWriteGpuMemoryFailsWhileInValidatingNodeDuringFifoReadThenErrorReturned) { EXPECT_FALSE(session->stateSaveAreaHeader.empty()); session->writeMemoryResult = ZE_RESULT_ERROR_UNKNOWN; diff --git a/level_zero/tools/test/unit_tests/sources/debug/linux/xe/debug_session_fixtures_linux_xe.h b/level_zero/tools/test/unit_tests/sources/debug/linux/xe/debug_session_fixtures_linux_xe.h index c258087d1b..cf6ac91687 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/linux/xe/debug_session_fixtures_linux_xe.h +++ b/level_zero/tools/test/unit_tests/sources/debug/linux/xe/debug_session_fixtures_linux_xe.h @@ -148,6 +148,7 @@ struct MockDebugSessionLinuxXe : public L0::DebugSessionLinuxXe { using L0::DebugSessionImp::allThreads; using L0::DebugSessionImp::apiEvents; using L0::DebugSessionImp::expectedAttentionEvents; + using L0::DebugSessionImp::fifoPollInterval; using L0::DebugSessionImp::interruptSent; using L0::DebugSessionImp::readFifo; using L0::DebugSessionImp::stateSaveAreaHeader; diff --git a/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp b/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp index 8d6c382906..44adfcd55d 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp +++ b/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp @@ -2308,6 +2308,21 @@ TEST_F(DebugApiLinuxTestXe, GivenBindInfoForVmHandleWhenReadingModuleDebugAreaTh EXPECT_EQ(4u, session->debugArea.pgsize); } +TEST_F(DebugApiLinuxTestXe, GivenFifoPollEnvironmentVariableWhenAsyncThreadLaunchedThenFifoPollIntervalUpdated) { + DebugManagerStateRestore stateRestore; + NEO::debugManager.flags.FifoPollInterval.set(100); + auto session = std::make_unique(zet_debug_config_t{0x1234}, device, 10); + ASSERT_NE(nullptr, session); + + EXPECT_EQ(150, session->fifoPollInterval); + session->asyncThread.threadActive = false; + session->asyncThreadFunction(session.get()); + + EXPECT_EQ(100, session->fifoPollInterval); + + session->closeAsyncThread(); +} + TEST(DebugSessionLinuxXeTest, GivenRootDebugSessionWhenCreateTileSessionCalledThenSessionIsNotCreated) { auto hwInfo = *NEO::defaultHwInfo.get(); NEO::MockDevice *neoDevice(NEO::MockDevice::createWithNewExecutionEnvironment(&hwInfo, 0)); diff --git a/level_zero/tools/test/unit_tests/sources/debug/mock_debug_session.h b/level_zero/tools/test/unit_tests/sources/debug/mock_debug_session.h index 5b18af03e4..3b8826db6e 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/mock_debug_session.h +++ b/level_zero/tools/test/unit_tests/sources/debug/mock_debug_session.h @@ -151,6 +151,7 @@ struct MockDebugSession : public L0::DebugSessionImp { using L0::DebugSessionImp::allocateStateSaveAreaMemory; using L0::DebugSessionImp::apiEvents; using L0::DebugSessionImp::applyResumeWa; + using L0::DebugSessionImp::attentionEventContext; using L0::DebugSessionImp::calculateSrMagicOffset; using L0::DebugSessionImp::calculateThreadSlotOffset; using L0::DebugSessionImp::checkTriggerEventsForAttention; @@ -162,6 +163,7 @@ struct MockDebugSession : public L0::DebugSessionImp { using L0::DebugSessionImp::getStateSaveAreaHeader; using L0::DebugSessionImp::isValidNode; using L0::DebugSessionImp::newAttentionRaised; + using L0::DebugSessionImp::pollFifo; using L0::DebugSessionImp::readDebugScratchRegisters; using L0::DebugSessionImp::readFifo; using L0::DebugSessionImp::readModeFlags; @@ -172,6 +174,7 @@ struct MockDebugSession : public L0::DebugSessionImp { using L0::DebugSessionImp::sendInterrupts; using L0::DebugSessionImp::stateSaveAreaMemory; using L0::DebugSessionImp::typeToRegsetDesc; + using L0::DebugSessionImp::updateStoppedThreadsAndCheckTriggerEvents; using L0::DebugSessionImp::validateAndSetStateSaveAreaHeader; using L0::DebugSessionImp::interruptSent; @@ -179,9 +182,11 @@ struct MockDebugSession : public L0::DebugSessionImp { using L0::DebugSessionImp::triggerEvents; using L0::DebugSessionImp::expectedAttentionEvents; + using L0::DebugSessionImp::fifoPollInterval; using L0::DebugSessionImp::interruptMutex; using L0::DebugSessionImp::interruptRequests; using L0::DebugSessionImp::isValidGpuAddress; + using L0::DebugSessionImp::lastFifoReadTime; using L0::DebugSessionImp::minSlmSipVersion; using L0::DebugSessionImp::newlyStoppedThreads; using L0::DebugSessionImp::pendingInterrupts; @@ -345,6 +350,7 @@ struct MockDebugSession : public L0::DebugSessionImp { return DebugSessionImp::readThreadScratchRegisters(thread, start, count, pRegisterValues); } + void updateStoppedThreadsAndCheckTriggerEvents(const AttentionEventFields &attention, uint32_t tileIndex, std::vector &threadsWithAttention) override {} void resumeAccidentallyStoppedThreads(const std::vector &threadIds) override { resumeAccidentallyStoppedCalled++; return DebugSessionImp::resumeAccidentallyStoppedThreads(threadIds); @@ -521,8 +527,14 @@ struct MockDebugSession : public L0::DebugSessionImp { return L0::DebugSessionImp::checkStoppedThreadsAndGenerateEvents(threads, memoryHandle, deviceIndex); } + ze_result_t readFifo(uint64_t vmHandle, std::vector &threadsWithAttention) override { + readFifoCallCount++; + return L0::DebugSessionImp::readFifo(vmHandle, threadsWithAttention); + } + NEO::TopologyMap topologyMap; + uint32_t readFifoCallCount = 0; uint32_t interruptImpCalled = 0; uint32_t resumeImpCalled = 0; uint32_t resumeAccidentallyStoppedCalled = 0; diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 3827942d9a..5b473f8602 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -293,6 +293,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, ForceComputeWalkerPostSyncFlushWithWrite, -1, "- DECLARE_DEBUG_VARIABLE(int32_t, DeferStateInitSubmissionToFirstRegularUsage, -1, "-1: ignore, 0: disabled, 1: enabled. If set, instead of initializing at Device creation, submit initial state during first usage (eg. kernel submission)") DECLARE_DEBUG_VARIABLE(int32_t, ForceNonWalkerSplitMemoryCopy, -1, "-1: default, 0: disabled, 1: enabled. If set, memory copy will be executed as single byte copy Walker without performance optimizations") DECLARE_DEBUG_VARIABLE(int32_t, OverrideTimestampWidth, -1, "-1: default from KMD, > 0: Override timestamp width used for profiling. Requires XeKMD kernel.") +DECLARE_DEBUG_VARIABLE(int32_t, FifoPollInterval, -1, "-1: default , > 0: Fifo will be polled based on input in milliseconds.") /*LOGGING FLAGS*/ DECLARE_DEBUG_VARIABLE(int32_t, PrintDriverDiagnostics, -1, "prints driver diagnostics messages to standard output, value corresponds to hint level") diff --git a/shared/test/common/test_files/igdrcl.config b/shared/test/common/test_files/igdrcl.config index 3b81493388..9656f6adf7 100644 --- a/shared/test/common/test_files/igdrcl.config +++ b/shared/test/common/test_files/igdrcl.config @@ -627,4 +627,5 @@ ForceNonWalkerSplitMemoryCopy = -1 DirectSubmissionSwitchSemaphoreMode = -1 OverrideTimestampWidth = -1 IgnoreZebinUnknownAttributes = 0 +FifoPollInterval = -1 # Please don't edit below this line