/* * Copyright (C) 2018-2022 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/source/command_stream/task_count_helper.h" #include "shared/source/command_stream/wait_status.h" #include #include namespace NEO { enum QueueThrottle : uint32_t; using FlushStamp = uint64_t; struct KmdNotifyProperties { int64_t delayKmdNotifyMicroseconds; int64_t delayQuickKmdSleepMicroseconds; int64_t delayQuickKmdSleepForSporadicWaitsMicroseconds; int64_t delayQuickKmdSleepForDirectSubmissionMicroseconds; // Main switch for KMD Notify optimization - if its disabled, all below are disabled too bool enableKmdNotify; // Use smaller delay in specific situations (ie. from AsyncEventsHandler) bool enableQuickKmdSleep; // If waits are called sporadically use QuickKmdSleep mode, otherwise use standard delay bool enableQuickKmdSleepForSporadicWaits; // If direct submission is enabled, use direct submission delay, otherwise use standard delay bool enableQuickKmdSleepForDirectSubmission; }; namespace KmdNotifyConstants { inline constexpr int64_t timeoutInMicrosecondsForDisconnectedAcLine = 10000; inline constexpr uint32_t minimumTaskCountDiffToCheckAcLine = 10; } // namespace KmdNotifyConstants class KmdNotifyHelper { public: KmdNotifyHelper() = delete; KmdNotifyHelper(const KmdNotifyProperties *properties) : properties(properties){}; MOCKABLE_VIRTUAL ~KmdNotifyHelper() = default; WaitParams obtainTimeoutParams(bool quickKmdSleepRequest, TagAddressType currentHwTag, TaskCountType taskCountToWait, FlushStamp flushStampToWait, QueueThrottle throttle, bool kmdWaitModeActive, bool directSubmissionEnabled); bool quickKmdSleepForSporadicWaitsEnabled() const { return properties->enableQuickKmdSleepForSporadicWaits; } MOCKABLE_VIRTUAL void updateLastWaitForCompletionTimestamp(); MOCKABLE_VIRTUAL void updateAcLineStatus(); static void overrideFromDebugVariable(int32_t debugVariableValue, int64_t &destination); static void overrideFromDebugVariable(int32_t debugVariableValue, bool &destination); protected: bool applyQuickKmdSleepForSporadicWait() const; int64_t getBaseTimeout(const int64_t &multiplier) const; int64_t getMicrosecondsSinceEpoch() const; const KmdNotifyProperties *properties = nullptr; std::atomic lastWaitForCompletionTimestampUs{0}; std::atomic acLineConnected{true}; }; } // namespace NEO