/* * Copyright (C) 2018-2024 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/source/command_stream/command_stream_receiver_simulated_hw.h" #include "shared/source/memory_manager/residency_container.h" namespace NEO { class PDPE; class PML4; class AubSubCaptureManager; template class AUBCommandStreamReceiverHw : public CommandStreamReceiverSimulatedHw { protected: typedef CommandStreamReceiverSimulatedHw BaseClass; using AUB = typename AUBFamilyMapper::AUB; using ExternalAllocationsContainer = std::vector; using BaseClass::getParametersForMemory; using BaseClass::osContext; public: using BaseClass::peekExecutionEnvironment; using CommandStreamReceiverSimulatedCommonHw::initAdditionalMMIO; using CommandStreamReceiverSimulatedCommonHw::aubManager; using CommandStreamReceiverSimulatedCommonHw::hardwareContextController; using CommandStreamReceiverSimulatedCommonHw::engineInfo; using CommandStreamReceiverSimulatedCommonHw::stream; using CommandStreamReceiverSimulatedCommonHw::writeMemory; SubmissionStatus flush(BatchBuffer &batchBuffer, ResidencyContainer &allocationsForResidency) override; SubmissionStatus processResidency(const ResidencyContainer &allocationsForResidency, uint32_t handleId) override; void makeResidentExternal(AllocationView &allocationView); void makeNonResidentExternal(uint64_t gpuAddress); AubMemDump::AubFileStream *getAubStream() const { return static_cast(this->stream); } void writeMemory(uint64_t gpuAddress, void *cpuAddress, size_t size, uint32_t memoryBank, uint64_t entryBits) override; bool writeMemory(GraphicsAllocation &gfxAllocation, bool isChunkCopy, uint64_t gpuVaChunkOffset, size_t chunkSize) override; MOCKABLE_VIRTUAL bool writeMemory(AllocationView &allocationView); void writeMMIO(uint32_t offset, uint32_t value) override; void expectMMIO(uint32_t mmioRegister, uint32_t expectedValue); bool expectMemory(const void *gfxAddress, const void *srcAddress, size_t length, uint32_t compareOperation) override; AubSubCaptureStatus checkAndActivateAubSubCapture(const std::string &kernelName) override; void addAubComment(const char *message) override; // Family specific version MOCKABLE_VIRTUAL void submitBatchBufferAub(uint64_t batchBufferGpuAddress, const void *batchBuffer, size_t batchBufferSize, uint32_t memoryBank, uint64_t entryBits); void pollForCompletion() override; void pollForCompletionImpl() override; WaitStatus waitForTaskCountWithKmdNotifyFallback(TaskCountType taskCountToWait, FlushStamp flushStampToWait, bool useQuickKmdSleep, QueueThrottle throttle) override; uint32_t getDumpHandle(); MOCKABLE_VIRTUAL void addContextToken(uint32_t dumpHandle); void dumpAllocation(GraphicsAllocation &gfxAllocation) override; static CommandStreamReceiver *create(const std::string &fileName, bool standalone, ExecutionEnvironment &executionEnvironment, uint32_t rootDeviceIndex, const DeviceBitfield deviceBitfield); AUBCommandStreamReceiverHw(const std::string &fileName, bool standalone, ExecutionEnvironment &executionEnvironment, uint32_t rootDeviceIndex, const DeviceBitfield deviceBitfield); ~AUBCommandStreamReceiverHw() override; AUBCommandStreamReceiverHw(const AUBCommandStreamReceiverHw &) = delete; AUBCommandStreamReceiverHw &operator=(const AUBCommandStreamReceiverHw &) = delete; MOCKABLE_VIRTUAL void openFile(const std::string &fileName); MOCKABLE_VIRTUAL bool reopenFile(const std::string &fileName); MOCKABLE_VIRTUAL void initFile(const std::string &fileName); MOCKABLE_VIRTUAL void closeFile(); MOCKABLE_VIRTUAL bool isFileOpen() const; MOCKABLE_VIRTUAL const std::string getFileName(); void initializeEngine() override; std::unique_ptr subCaptureManager; uint32_t aubDeviceId; bool standalone; std::unique_ptr::type> ppgtt; std::unique_ptr ggtt; // remap CPU VA -> GGTT VA AddressMapper *gttRemap; MOCKABLE_VIRTUAL bool addPatchInfoComments(); void addGUCStartMessage(uint64_t batchBufferAddress); uint32_t getGUCWorkQueueItemHeader(); CommandStreamReceiverType getType() const override { return CommandStreamReceiverType::aub; } int getAddressSpaceFromPTEBits(uint64_t entryBits) const; protected: constexpr static uint32_t getMaskAndValueForPollForCompletion(); bool dumpAubNonWritable = false; bool isEngineInitialized = false; ExternalAllocationsContainer externalAllocations; TaskCountType pollForCompletionTaskCount = 0u; SpinLock pollForCompletionLock; }; } // namespace NEO