L0 Debugger - DebugSession linux implementation

- new feature, enabled with PRELIM build
- implementation of debug session for linux
- move ResourceClass enum from Drm to drm_debug.h

Resolves: NEO-6814


Signed-off-by: Mateusz Hoppe <mateusz.hoppe@intel.com>
This commit is contained in:
Mateusz Hoppe
2022-05-09 15:52:12 +00:00
committed by Compute-Runtime-Automation
parent 4e4560fe91
commit c021e2ec5e
27 changed files with 7906 additions and 85 deletions

View File

@@ -175,26 +175,26 @@ void DrmAllocation::registerBOBindExtHandle(Drm *drm) {
return;
}
Drm::ResourceClass resourceClass = Drm::ResourceClass::MaxSize;
DrmResourceClass resourceClass = DrmResourceClass::MaxSize;
switch (this->allocationType) {
case AllocationType::DEBUG_CONTEXT_SAVE_AREA:
resourceClass = Drm::ResourceClass::ContextSaveArea;
resourceClass = DrmResourceClass::ContextSaveArea;
break;
case AllocationType::DEBUG_SBA_TRACKING_BUFFER:
resourceClass = Drm::ResourceClass::SbaTrackingBuffer;
resourceClass = DrmResourceClass::SbaTrackingBuffer;
break;
case AllocationType::KERNEL_ISA:
resourceClass = Drm::ResourceClass::Isa;
resourceClass = DrmResourceClass::Isa;
break;
case AllocationType::DEBUG_MODULE_AREA:
resourceClass = Drm::ResourceClass::ModuleHeapDebugArea;
resourceClass = DrmResourceClass::ModuleHeapDebugArea;
break;
default:
break;
}
if (resourceClass != Drm::ResourceClass::MaxSize) {
if (resourceClass != DrmResourceClass::MaxSize) {
uint64_t gpuAddress = getGpuAddress();
auto handle = drm->registerResource(resourceClass, &gpuAddress, sizeof(gpuAddress));
registeredBoBindHandles.push_back(handle);
@@ -205,7 +205,7 @@ void DrmAllocation::registerBOBindExtHandle(Drm *drm) {
if (bo) {
bo->addBindExtHandle(handle);
bo->markForCapture();
if (resourceClass == Drm::ResourceClass::Isa) {
if (resourceClass == DrmResourceClass::Isa) {
auto cookieHandle = drm->registerIsaCookie(handle);
bo->addBindExtHandle(cookieHandle);
registeredBoBindHandles.push_back(cookieHandle);

View File

@@ -30,13 +30,13 @@ bool Drm::registerResourceClasses() {
return true;
}
uint32_t Drm::registerResource(ResourceClass classType, const void *data, size_t size) {
uint32_t Drm::registerResource(DrmResourceClass classType, const void *data, size_t size) {
if (classHandles.size() < static_cast<uint32_t>(classType)) {
return 0;
}
std::string uuid;
if (classType == NEO::Drm::ResourceClass::Elf) {
if (classType == NEO::DrmResourceClass::Elf) {
uuid = generateElfUUID(data);
} else {
uuid = generateUUID();
@@ -85,7 +85,7 @@ std::string Drm::generateUUID() {
}
std::string Drm::generateElfUUID(const void *data) {
std::string elf_class_uuid = classNamesToUuid[static_cast<uint32_t>(Drm::ResourceClass::Elf)].second;
std::string elf_class_uuid = classNamesToUuid[static_cast<uint32_t>(DrmResourceClass::Elf)].second;
std::string UUID1st = elf_class_uuid.substr(0, 18);
const char uuidString[] = "%s-%04" SCNx64 "-%012" SCNx64;

View File

@@ -5,12 +5,22 @@
*
*/
#include "shared/source/os_interface/linux/drm_neo.h"
#pragma once
#include <array>
#include <string>
#include <utility>
namespace NEO {
enum class DrmResourceClass : uint32_t {
Elf,
Isa,
ModuleHeapDebugArea,
ContextSaveArea,
SbaTrackingBuffer,
L0ZebinModule,
MaxSize
};
/*
@@ -44,7 +54,7 @@ UUID('285208b2-c5e0-5fcb-90bb-7576ed7a9697')
*/
using ClassNamesArray = std::array<std::pair<const char *, const std::string>, size_t(Drm::ResourceClass::MaxSize)>;
using ClassNamesArray = std::array<std::pair<const char *, const std::string>, size_t(DrmResourceClass::MaxSize)>;
const ClassNamesArray classNamesToUuid = {std::make_pair("I915_UUID_CLASS_ELF_BINARY", "31203221-8069-5a0a-9d43-94a4d3395ee1"),
std::make_pair("I915_UUID_CLASS_ISA_BYTECODE", "53baed0a-12c3-5d19-aa69-ab9c51aa1039"),
std::make_pair("I915_UUID_L0_MODULE_AREA", "a411e82e-16c9-58b7-bfb5-b209b8601d5f"),
@@ -57,7 +67,7 @@ constexpr auto uuidL0CommandQueueHash = "285208b2-c5e0-5fcb-90bb-7576ed7a9697";
struct DrmUuid {
static bool getClassUuidIndex(std::string uuid, uint32_t &index) {
for (uint32_t i = 0; i < uint32_t(Drm::ResourceClass::MaxSize); i++) {
for (uint32_t i = 0; i < uint32_t(DrmResourceClass::MaxSize); i++) {
if (uuid == classNamesToUuid[i].second) {
index = i;
return true;

View File

@@ -12,6 +12,7 @@
#include "shared/source/memory_manager/definitions/engine_limits.h"
#include "shared/source/os_interface/driver_info.h"
#include "shared/source/os_interface/linux/cache_info.h"
#include "shared/source/os_interface/linux/drm_debug.h"
#include "shared/source/os_interface/linux/engine_info.h"
#include "shared/source/os_interface/linux/hw_device_id.h"
#include "shared/source/os_interface/linux/memory_info.h"
@@ -66,16 +67,6 @@ class Drm : public DriverModel {
static constexpr DriverModelType driverModelType = DriverModelType::DRM;
static constexpr size_t completionFenceOffset = 1024;
enum class ResourceClass : uint32_t {
Elf,
Isa,
ModuleHeapDebugArea,
ContextSaveArea,
SbaTrackingBuffer,
L0ZebinModule,
MaxSize
};
struct QueryTopologyData {
int sliceCount;
int subSliceCount;
@@ -174,7 +165,7 @@ class Drm : public DriverModel {
MOCKABLE_VIRTUAL void queryPageFaultSupport();
MOCKABLE_VIRTUAL bool hasPageFaultSupport() const;
MOCKABLE_VIRTUAL uint32_t registerResource(ResourceClass classType, const void *data, size_t size);
MOCKABLE_VIRTUAL uint32_t registerResource(DrmResourceClass classType, const void *data, size_t size);
MOCKABLE_VIRTUAL void unregisterResource(uint32_t handle);
MOCKABLE_VIRTUAL uint32_t registerIsaCookie(uint32_t isaHandle);
@@ -318,7 +309,7 @@ class Drm : public DriverModel {
std::mutex bindFenceMutex;
std::array<uint64_t, EngineLimits::maxHandleCount> pagingFence;
std::array<uint64_t, EngineLimits::maxHandleCount> fenceVal;
StackVec<uint32_t, size_t(ResourceClass::MaxSize)> classHandles;
StackVec<uint32_t, size_t(DrmResourceClass::MaxSize)> classHandles;
std::vector<uint32_t> virtualMemoryIds;
std::unique_ptr<HwDeviceIdDrm> hwDeviceId;