/* * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/debugger/debugger_l0.h" #include "shared/source/device/device.h" #include "shared/source/helpers/hw_helper.h" #include "shared/source/kernel/debug_data.h" #include "shared/source/os_interface/linux/drm_allocation.h" #include "shared/source/os_interface/linux/drm_neo.h" #include "shared/source/os_interface/os_interface.h" namespace NEO { bool DebuggerL0::initDebuggingInOs(NEO::OSInterface *osInterface) { if (osInterface != nullptr) { auto drm = osInterface->getDriverModel()->as(); if (drm->isVmBindAvailable() && drm->isPerContextVMRequired()) { drm->registerResourceClasses(); return true; } } return false; } void DebuggerL0::initSbaTrackingMode() { singleAddressSpaceSbaTracking = false; } void DebuggerL0::registerElf(NEO::DebugData *debugData, NEO::GraphicsAllocation *isaAllocation) { if (device->getRootDeviceEnvironment().osInterface.get() != nullptr) { auto drm = device->getRootDeviceEnvironment().osInterface->getDriverModel()->as(); auto handle = drm->registerResource(NEO::DrmResourceClass::Elf, debugData->vIsa, debugData->vIsaSize); static_cast(isaAllocation)->linkWithRegisteredHandle(handle); } } bool DebuggerL0::attachZebinModuleToSegmentAllocations(const StackVec &allocs, uint32_t &moduleHandle) { if (device->getRootDeviceEnvironment().osInterface == nullptr) { return false; } auto drm = device->getRootDeviceEnvironment().osInterface->getDriverModel()->as(); uint32_t segmentCount = static_cast(allocs.size()); moduleHandle = drm->registerResource(NEO::DrmResourceClass::L0ZebinModule, &segmentCount, sizeof(uint32_t)); for (auto &allocation : allocs) { auto drmAllocation = static_cast(allocation); drmAllocation->linkWithRegisteredHandle(moduleHandle); } return true; } bool DebuggerL0::removeZebinModule(uint32_t moduleHandle) { if (device->getRootDeviceEnvironment().osInterface == nullptr || moduleHandle == 0) { return false; } auto drm = device->getRootDeviceEnvironment().osInterface->getDriverModel()->as(); drm->unregisterResource(moduleHandle); return true; } void DebuggerL0::notifyCommandQueueCreated() { if (device->getRootDeviceEnvironment().osInterface.get() != nullptr) { if (++commandQueueCount == 1) { auto drm = device->getRootDeviceEnvironment().osInterface->getDriverModel()->as(); uuidL0CommandQueueHandle = drm->notifyFirstCommandQueueCreated(); } } } void DebuggerL0::notifyCommandQueueDestroyed() { if (device->getRootDeviceEnvironment().osInterface.get() != nullptr) { if (--commandQueueCount == 0) { auto drm = device->getRootDeviceEnvironment().osInterface->getDriverModel()->as(); drm->notifyLastCommandQueueDestroyed(uuidL0CommandQueueHandle); } } } } // namespace NEO