From 4513e42ddb09436ed022e4e8733841771e5aab13 Mon Sep 17 00:00:00 2001 From: Brandon Yates Date: Fri, 12 Jul 2024 18:11:41 +0000 Subject: [PATCH] build: Update to latest eudebug xe uapi Remove implementation of some unused and removed uapis Signed-off-by: Brandon Yates --- .../source/debugger/linux/debug_xe_includes.h | 3 +- .../os_interface/linux/xe/ioctl_helper_xe.cpp | 8 - .../os_interface/linux/xe/ioctl_helper_xe.h | 4 - .../linux/xe/ioctl_helper_xe_debugger.cpp | 78 ---- .../xe/ioctl_helper_xe_debugger_stubs.cpp | 16 - .../common/mocks/linux/debug_mock_drm_xe.h | 9 - .../xe/ioctl_helper_xe_debugger_tests.cpp | 113 ----- .../linux/xe/ioctl_helper_xe_tests.h | 1 - third_party/uapi-eudebug/drm/.version | 2 +- third_party/uapi-eudebug/drm/xe_drm.h | 422 ++++++++++++++++-- .../drm/{xe_drm_tmp.h => xe_drm_eudebug.h} | 193 +++----- 11 files changed, 443 insertions(+), 406 deletions(-) rename third_party/uapi-eudebug/drm/{xe_drm_tmp.h => xe_drm_eudebug.h} (69%) diff --git a/shared/source/debugger/linux/debug_xe_includes.h b/shared/source/debugger/linux/debug_xe_includes.h index 8a02645c3c..d2ecb5daba 100644 --- a/shared/source/debugger/linux/debug_xe_includes.h +++ b/shared/source/debugger/linux/debug_xe_includes.h @@ -7,5 +7,4 @@ #pragma once -#include "third_party/uapi-eudebug/drm/xe_drm.h" -#include "third_party/uapi-eudebug/drm/xe_drm_tmp.h" \ No newline at end of file +#include "third_party/uapi-eudebug/drm/xe_drm.h" \ No newline at end of file diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp index 927056fbb1..ecaf4e8a95 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp @@ -1074,15 +1074,7 @@ int IoctlHelperXe::ioctl(DrmIoctl request, void *arg) { GemVmControl *vmControl = static_cast(arg); struct drm_xe_vm_create args = {}; args.flags = vmControl->flags; - - if (drm.getRootDeviceEnvironment().executionEnvironment.getDebuggingMode() != DebuggingMode::disabled) { - args.extensions = reinterpret_cast(allocateDebugMetadata()); - } ret = IoctlHelper::ioctl(request, &args); - if (drm.getRootDeviceEnvironment().executionEnvironment.getDebuggingMode() != DebuggingMode::disabled) { - args.extensions = reinterpret_cast(freeDebugMetadata(reinterpret_cast(args.extensions))); - } - vmControl->vmId = args.vm_id; xeLog(" -> IoctlHelperXe::ioctl gemVmCreate f=0x%x vmid=0x%x r=%d\n", vmControl->flags, vmControl->vmId, ret); diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h index 33bec04956..ce57a08fde 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h @@ -124,7 +124,6 @@ class IoctlHelperXe : public IoctlHelper { bool setDomainCpu(uint32_t handle, bool writeEnable) override; uint16_t getCpuCachingMode(std::optional isCoherent, bool allocationInSystemMemory) const; void addDebugMetadata(DrmResourceClass type, uint64_t *offset, uint64_t size); - void addDebugMetadataCookie(uint64_t cookie); uint32_t registerResource(DrmResourceClass classType, const void *data, size_t size) override; void unregisterResource(uint32_t handle) override; void insertEngineToContextParams(ContextParamEngines<> &contextParamEngines, uint32_t engineId, const EngineClassInstance *engineClassInstance, uint32_t tileId, bool hasVirtualEngines) override; @@ -147,11 +146,9 @@ class IoctlHelperXe : public IoctlHelper { int xeVmBind(const VmBindParams &vmBindParams, bool bindOp); void xeShowBindTable(); void updateBindInfo(uint32_t handle, uint64_t userPtr, uint64_t size); - void *allocateDebugMetadata(); int debuggerOpenIoctl(DrmIoctl request, void *arg); int debuggerMetadataCreateIoctl(DrmIoctl request, void *arg); int debuggerMetadataDestroyIoctl(DrmIoctl request, void *arg); - void *freeDebugMetadata(void *metadata); int getRunaloneExtProperty(); virtual bool isExtraEngineClassAllowed(uint16_t engineClass) const { return false; } virtual uint32_t getCxlType(struct drm_xe_query_config *config) { return 0u; } @@ -194,7 +191,6 @@ class IoctlHelperXe : public IoctlHelper { uint64_t size; bool isCookie; }; - std::vector debugMetadata; template void xeLog(XeLogArgs &&...args) const; diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger.cpp b/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger.cpp index 1855a7fc5b..28d0db659a 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger.cpp @@ -57,84 +57,6 @@ int IoctlHelperXe::debuggerMetadataDestroyIoctl(DrmIoctl request, void *arg) { return ret; } -void *IoctlHelperXe::allocateDebugMetadata() { - drm_xe_ext_vm_set_debug_metadata *prev = nullptr; - drm_xe_ext_vm_set_debug_metadata *xeMetadataRoot = nullptr; - - for (auto &metadata : debugMetadata) { - auto *xeMetadata = new drm_xe_ext_vm_set_debug_metadata(); - if (!xeMetadataRoot) { - xeMetadataRoot = xeMetadata; - } - xeMetadata->base.name = DRM_XE_VM_EXTENSION_SET_DEBUG_METADATA; - xeMetadata->offset = metadata.offset; - xeMetadata->len = metadata.size; - if (metadata.isCookie) { - xeMetadata->type = DRM_XE_VM_DEBUG_METADATA_COOKIE; - } else { - - switch (metadata.type) { - case DrmResourceClass::contextSaveArea: - xeMetadata->type = DRM_XE_VM_DEBUG_METADATA_SIP_AREA; - break; - case DrmResourceClass::sbaTrackingBuffer: - xeMetadata->type = DRM_XE_VM_DEBUG_METADATA_SBA_AREA; - break; - case DrmResourceClass::moduleHeapDebugArea: - xeMetadata->type = DRM_XE_VM_DEBUG_METADATA_MODULE_AREA; - break; - default: - UNRECOVERABLE_IF(true); - } - } - PRINT_DEBUGGER_INFO_LOG("drm_xe_ext_vm_set_debug_metadata: type = %ul, offset = %ul, len = %ul\n", xeMetadata->type, xeMetadata->offset, xeMetadata->len); - if (prev) { - prev->base.next_extension = reinterpret_cast(xeMetadata); - } - prev = xeMetadata; - } - return xeMetadataRoot; -} - -void *IoctlHelperXe::freeDebugMetadata(void *metadata) { - drm_xe_user_extension *ext = static_cast(metadata); - drm_xe_user_extension *prev = nullptr; - drm_xe_user_extension *newRoot = nullptr; - while (ext) { - drm_xe_user_extension *temp = reinterpret_cast(ext->next_extension); - if (ext->name == DRM_XE_VM_EXTENSION_SET_DEBUG_METADATA) { - if (prev) { - prev->next_extension = ext->next_extension; - } - delete ext; - } else { - if (!newRoot) { - newRoot = ext; - } - prev = ext; - } - ext = temp; - } - return newRoot; -} - -void IoctlHelperXe::addDebugMetadataCookie(uint64_t cookie) { - - DebugMetadata metadata = {DrmResourceClass::cookie, cookie, 0, true}; - debugMetadata.push_back(metadata); - return; -} - -void IoctlHelperXe::addDebugMetadata(DrmResourceClass type, uint64_t *offset, uint64_t size) { - - if (type != DrmResourceClass::moduleHeapDebugArea && type != DrmResourceClass::contextSaveArea && type != DrmResourceClass::sbaTrackingBuffer) { - return; - } - DebugMetadata metadata = {type, reinterpret_cast(offset), size, false}; - debugMetadata.push_back(metadata); - return; -} - int IoctlHelperXe::getRunaloneExtProperty() { return DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG; } diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger_stubs.cpp b/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger_stubs.cpp index c60b58a826..fd5e9e1a0d 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger_stubs.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger_stubs.cpp @@ -29,22 +29,6 @@ int IoctlHelperXe::debuggerMetadataDestroyIoctl(DrmIoctl request, void *arg) { return 0; } -void *IoctlHelperXe::allocateDebugMetadata() { - UNRECOVERABLE_IF(true); - return nullptr; -} - -void *IoctlHelperXe::freeDebugMetadata(void *metadata) { - UNRECOVERABLE_IF(true); - return nullptr; -} - -void IoctlHelperXe::addDebugMetadataCookie(uint64_t cookie) { -} - -void IoctlHelperXe::addDebugMetadata(DrmResourceClass type, uint64_t *offset, uint64_t size) { -} - int IoctlHelperXe::getRunaloneExtProperty() { UNRECOVERABLE_IF(true); return 0; diff --git a/shared/test/common/mocks/linux/debug_mock_drm_xe.h b/shared/test/common/mocks/linux/debug_mock_drm_xe.h index 53c965170d..80a0ed288f 100644 --- a/shared/test/common/mocks/linux/debug_mock_drm_xe.h +++ b/shared/test/common/mocks/linux/debug_mock_drm_xe.h @@ -29,8 +29,6 @@ using namespace NEO; struct MockIoctlHelperXeDebug : IoctlHelperXe { using IoctlHelperXe::bindInfo; - using IoctlHelperXe::debugMetadata; - using IoctlHelperXe::freeDebugMetadata; using IoctlHelperXe::getRunaloneExtProperty; using IoctlHelperXe::IoctlHelperXe; using IoctlHelperXe::tileIdToGtId; @@ -121,12 +119,6 @@ struct DrmMockXeDebug : public DrmMockCustom { ret = 0; } break; case DrmIoctl::gemVmCreate: { - struct drm_xe_vm_create *v = static_cast(arg); - drm_xe_ext_vm_set_debug_metadata *metadata = reinterpret_cast(v->extensions); - while (metadata) { - vmCreateMetadata.push_back(*metadata); - metadata = reinterpret_cast(metadata->base.next_extension); - } ret = 0; } break; case DrmIoctl::debuggerOpen: { @@ -209,7 +201,6 @@ struct DrmMockXeDebug : public DrmMockCustom { uint64_t metadataType = 9999; alignas(64) std::vector queryTopology; - std::vector vmCreateMetadata; std::vector execQueueEngineInstances; drm_xe_exec_queue_create execQueueCreateParams = {}; StackVec waitUserFenceInputs; diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp index 6699b17d6a..4a3aa3626c 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp @@ -58,119 +58,6 @@ TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingGetIoctForDebuggerThenCorre verifyIoctlRequestValue(DRM_IOCTL_XE_EUDEBUG_CONNECT, DrmIoctl::debuggerOpen); } -TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingaddDebugMetadataThenDataIsAdded) { - auto executionEnvironment = std::make_unique(); - auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]); - auto xeIoctlHelper = static_cast(drm->ioctlHelper.get()); - uint64_t temp = 0; - xeIoctlHelper->addDebugMetadata(DrmResourceClass::moduleHeapDebugArea, &temp, 8000u); - ASSERT_EQ(1u, xeIoctlHelper->debugMetadata.size()); - xeIoctlHelper->addDebugMetadata(DrmResourceClass::contextSaveArea, &temp, 8000u); - ASSERT_EQ(2u, xeIoctlHelper->debugMetadata.size()); - xeIoctlHelper->addDebugMetadata(DrmResourceClass::sbaTrackingBuffer, &temp, 8000u); - ASSERT_EQ(3u, xeIoctlHelper->debugMetadata.size()); - xeIoctlHelper->addDebugMetadata(DrmResourceClass::isa, &temp, 8000u); // ISA should be ignored - ASSERT_EQ(3u, xeIoctlHelper->debugMetadata.size()); -} - -TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingVmCreateThenDebugMetadadaIsAttached) { - auto executionEnvironment = std::make_unique(); - executionEnvironment->setDebuggingMode(DebuggingMode::offline); - auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]); - auto xeIoctlHelper = static_cast(drm->ioctlHelper.get()); - uint64_t temp = 0; - xeIoctlHelper->addDebugMetadata(DrmResourceClass::moduleHeapDebugArea, &temp, 8000u); - xeIoctlHelper->addDebugMetadata(DrmResourceClass::contextSaveArea, &temp, 8000u); - xeIoctlHelper->addDebugMetadata(DrmResourceClass::sbaTrackingBuffer, &temp, 8000u); - xeIoctlHelper->addDebugMetadata(DrmResourceClass::isa, &temp, 8000u); // ISA should be ignored - xeIoctlHelper->addDebugMetadataCookie(123u); - - GemVmControl test = {}; - xeIoctlHelper->ioctl(DrmIoctl::gemVmCreate, &test); - - ASSERT_EQ(4u, drm->vmCreateMetadata.size()); - ASSERT_EQ(drm->vmCreateMetadata[0].type, static_cast(DRM_XE_VM_DEBUG_METADATA_MODULE_AREA)); - ASSERT_EQ(drm->vmCreateMetadata[0].offset, reinterpret_cast(&temp)); - ASSERT_EQ(drm->vmCreateMetadata[0].len, 8000ul); - - ASSERT_EQ(drm->vmCreateMetadata[1].type, static_cast(DRM_XE_VM_DEBUG_METADATA_SIP_AREA)); - ASSERT_EQ(drm->vmCreateMetadata[1].offset, reinterpret_cast(&temp)); - ASSERT_EQ(drm->vmCreateMetadata[1].len, 8000ul); - - ASSERT_EQ(drm->vmCreateMetadata[2].type, static_cast(DRM_XE_VM_DEBUG_METADATA_SBA_AREA)); - ASSERT_EQ(drm->vmCreateMetadata[2].offset, reinterpret_cast(&temp)); - ASSERT_EQ(drm->vmCreateMetadata[2].len, 8000ul); - - ASSERT_EQ(drm->vmCreateMetadata[3].type, static_cast(DRM_XE_VM_DEBUG_METADATA_COOKIE)); - ASSERT_EQ(drm->vmCreateMetadata[3].offset, 123ul); - ASSERT_EQ(drm->vmCreateMetadata[3].len, 0ul); - ASSERT_EQ(drm->vmCreateMetadata[3].base.next_extension, 0ul); -} - -TEST(IoctlHelperXeTest, givenFreeDebugMetadataWhenVmCreateHasMultipleExtTypesThenOnlyDebugMetadataIsDeleted) { - - auto executionEnvironment = std::make_unique(); - executionEnvironment->setDebuggingMode(DebuggingMode::offline); - auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]); - auto xeIoctlHelper = static_cast(drm->ioctlHelper.get()); - - drm_xe_ext_vm_set_debug_metadata *node1 = new drm_xe_ext_vm_set_debug_metadata(); - drm_xe_ext_vm_set_debug_metadata *node2 = new drm_xe_ext_vm_set_debug_metadata(); - drm_xe_ext_vm_set_debug_metadata *node3 = new drm_xe_ext_vm_set_debug_metadata(); - node1->base.name = DRM_XE_VM_EXTENSION_SET_DEBUG_METADATA; - node2->base.name = 0x1234ul; - node3->base.name = DRM_XE_VM_EXTENSION_SET_DEBUG_METADATA; - node1->base.next_extension = reinterpret_cast(node2); - node2->base.next_extension = reinterpret_cast(node3); - - drm_xe_ext_vm_set_debug_metadata *newRoot = static_cast(xeIoctlHelper->freeDebugMetadata(node1)); - ASSERT_EQ(newRoot, node2); - ASSERT_EQ(newRoot->base.next_extension, 0ul); - delete node2; - - node1 = new drm_xe_ext_vm_set_debug_metadata(); - node2 = new drm_xe_ext_vm_set_debug_metadata(); - node3 = new drm_xe_ext_vm_set_debug_metadata(); - node1->base.name = DRM_XE_VM_EXTENSION_SET_DEBUG_METADATA; - node2->base.name = DRM_XE_VM_EXTENSION_SET_DEBUG_METADATA; - node3->base.name = DRM_XE_VM_EXTENSION_SET_DEBUG_METADATA; - node1->base.next_extension = reinterpret_cast(node2); - node2->base.next_extension = reinterpret_cast(node3); - - newRoot = static_cast(xeIoctlHelper->freeDebugMetadata(node1)); - ASSERT_EQ(newRoot, nullptr); - - node1 = new drm_xe_ext_vm_set_debug_metadata(); - node2 = new drm_xe_ext_vm_set_debug_metadata(); - node3 = new drm_xe_ext_vm_set_debug_metadata(); - node1->base.name = 0x1234; - node2->base.name = DRM_XE_VM_EXTENSION_SET_DEBUG_METADATA; - node3->base.name = DRM_XE_VM_EXTENSION_SET_DEBUG_METADATA; - node1->base.next_extension = reinterpret_cast(node2); - node2->base.next_extension = reinterpret_cast(node3); - - newRoot = static_cast(xeIoctlHelper->freeDebugMetadata(node1)); - ASSERT_EQ(newRoot, node1); - ASSERT_EQ(newRoot->base.next_extension, 0ul); - delete node1; - - node1 = new drm_xe_ext_vm_set_debug_metadata(); - node2 = new drm_xe_ext_vm_set_debug_metadata(); - node3 = new drm_xe_ext_vm_set_debug_metadata(); - node1->base.name = 0x1234; - node2->base.name = 0x1234; - node3->base.name = 0x1234; - node1->base.next_extension = reinterpret_cast(node2); - node2->base.next_extension = reinterpret_cast(node3); - - newRoot = static_cast(xeIoctlHelper->freeDebugMetadata(node1)); - ASSERT_EQ(newRoot, node1); - ASSERT_EQ(newRoot->base.next_extension, reinterpret_cast(node2)); - delete node1; - delete node2; - delete node3; -} - TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingGetRunaloneExtPropertyThenCorrectValueReturned) { auto executionEnvironment = std::make_unique(); executionEnvironment->setDebuggingMode(DebuggingMode::offline); diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h index 029aa8adad..ed423a85ac 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h @@ -29,7 +29,6 @@ using namespace NEO; struct MockIoctlHelperXe : IoctlHelperXe { using IoctlHelperXe::bindInfo; using IoctlHelperXe::contextParamEngine; - using IoctlHelperXe::debugMetadata; using IoctlHelperXe::defaultEngine; using IoctlHelperXe::getDefaultEngineClass; using IoctlHelperXe::getFdFromVmExport; diff --git a/third_party/uapi-eudebug/drm/.version b/third_party/uapi-eudebug/drm/.version index da5e72903e..290c6f09ac 100644 --- a/third_party/uapi-eudebug/drm/.version +++ b/third_party/uapi-eudebug/drm/.version @@ -1,3 +1,3 @@ git_url: https://gitlab.freedesktop.org/miku/kernel/-/tree/eudebug-dev -git_revision: 48236857dc7f41e5d28c25651428c4394a58966a +git_revision: 7e0438726de3a0175f8a51b029917726cad62868 diff --git a/third_party/uapi-eudebug/drm/xe_drm.h b/third_party/uapi-eudebug/drm/xe_drm.h index 03f642b0ee..ff09984dd5 100644 --- a/third_party/uapi-eudebug/drm/xe_drm.h +++ b/third_party/uapi-eudebug/drm/xe_drm.h @@ -80,6 +80,7 @@ extern "C" { * - &DRM_IOCTL_XE_EXEC_QUEUE_GET_PROPERTY * - &DRM_IOCTL_XE_EXEC * - &DRM_IOCTL_XE_WAIT_USER_FENCE + * - &DRM_IOCTL_XE_OBSERVATION */ /* @@ -100,8 +101,10 @@ extern "C" { #define DRM_XE_EXEC_QUEUE_GET_PROPERTY 0x08 #define DRM_XE_EXEC 0x09 #define DRM_XE_WAIT_USER_FENCE 0x0a -#define DRM_XE_DEBUG_METADATA_CREATE 0x0b -#define DRM_XE_DEBUG_METADATA_DESTROY 0x0c +#define DRM_XE_OBSERVATION 0x0b +#define DRM_XE_EUDEBUG_CONNECT 0x0c +#define DRM_XE_DEBUG_METADATA_CREATE 0x0d +#define DRM_XE_DEBUG_METADATA_DESTROY 0x0e /* Must be kept compact -- no holes */ #define DRM_IOCTL_XE_DEVICE_QUERY DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_DEVICE_QUERY, struct drm_xe_device_query) @@ -115,6 +118,8 @@ extern "C" { #define DRM_IOCTL_XE_EXEC_QUEUE_GET_PROPERTY DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_EXEC_QUEUE_GET_PROPERTY, struct drm_xe_exec_queue_get_property) #define DRM_IOCTL_XE_EXEC DRM_IOW(DRM_COMMAND_BASE + DRM_XE_EXEC, struct drm_xe_exec) #define DRM_IOCTL_XE_WAIT_USER_FENCE DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_WAIT_USER_FENCE, struct drm_xe_wait_user_fence) +#define DRM_IOCTL_XE_OBSERVATION DRM_IOW(DRM_COMMAND_BASE + DRM_XE_OBSERVATION, struct drm_xe_observation_param) +#define DRM_IOCTL_XE_EUDEBUG_CONNECT DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_EUDEBUG_CONNECT, struct drm_xe_eudebug_connect) #define DRM_IOCTL_XE_DEBUG_METADATA_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_DEBUG_METADATA_CREATE, struct drm_xe_debug_metadata_create) #define DRM_IOCTL_XE_DEBUG_METADATA_DESTROY DRM_IOW(DRM_COMMAND_BASE + DRM_XE_DEBUG_METADATA_DESTROY, struct drm_xe_debug_metadata_destroy) @@ -463,8 +468,16 @@ struct drm_xe_gt { * by struct drm_xe_query_mem_regions' mem_class. */ __u64 far_mem_regions; + /** @ip_ver_major: Graphics/media IP major version on GMD_ID platforms */ + __u16 ip_ver_major; + /** @ip_ver_minor: Graphics/media IP minor version on GMD_ID platforms */ + __u16 ip_ver_minor; + /** @ip_ver_rev: Graphics/media IP revision version on GMD_ID platforms */ + __u16 ip_ver_rev; + /** @pad2: MBZ */ + __u16 pad2; /** @reserved: Reserved */ - __u64 reserved[8]; + __u64 reserved[7]; }; /** @@ -504,6 +517,7 @@ struct drm_xe_query_gt_list { * containing the following in mask: * ``DSS_COMPUTE ff ff ff ff 00 00 00 00`` * means 32 DSS are available for compute. + * - %DRM_XE_TOPO_L3_BANK - To query the mask of enabled L3 banks * - %DRM_XE_TOPO_EU_PER_DSS - To query the mask of Execution Units (EU) * available per Dual Sub Slices (DSS). For example a query response * containing the following in mask: @@ -514,9 +528,10 @@ struct drm_xe_query_topology_mask { /** @gt_id: GT ID the mask is associated with */ __u16 gt_id; -#define DRM_XE_TOPO_DSS_GEOMETRY (1 << 0) -#define DRM_XE_TOPO_DSS_COMPUTE (1 << 1) -#define DRM_XE_TOPO_EU_PER_DSS (1 << 2) +#define DRM_XE_TOPO_DSS_GEOMETRY 1 +#define DRM_XE_TOPO_DSS_COMPUTE 2 +#define DRM_XE_TOPO_L3_BANK 3 +#define DRM_XE_TOPO_EU_PER_DSS 4 /** @type: type of mask */ __u16 type; @@ -578,6 +593,37 @@ struct drm_xe_query_engine_cycles { __u64 cpu_delta; }; +/** + * struct drm_xe_query_uc_fw_version - query a micro-controller firmware version + * + * Given a uc_type this will return the branch, major, minor and patch version + * of the micro-controller firmware. + */ +struct drm_xe_query_uc_fw_version { + /** @uc_type: The micro-controller type to query firmware version */ +#define XE_QUERY_UC_TYPE_GUC_SUBMISSION 0 +#define XE_QUERY_UC_TYPE_HUC 1 + __u16 uc_type; + + /** @pad: MBZ */ + __u16 pad; + + /** @branch_ver: branch uc fw version */ + __u32 branch_ver; + /** @major_ver: major uc fw version */ + __u32 major_ver; + /** @minor_ver: minor uc fw version */ + __u32 minor_ver; + /** @patch_ver: patch uc fw version */ + __u32 patch_ver; + + /** @pad2: MBZ */ + __u32 pad2; + + /** @reserved: Reserved */ + __u64 reserved; +}; + /** * struct drm_xe_device_query - Input of &DRM_IOCTL_XE_DEVICE_QUERY - main * structure to query device information @@ -647,6 +693,8 @@ struct drm_xe_device_query { #define DRM_XE_DEVICE_QUERY_HWCONFIG 4 #define DRM_XE_DEVICE_QUERY_GT_TOPOLOGY 5 #define DRM_XE_DEVICE_QUERY_ENGINE_CYCLES 6 +#define DRM_XE_DEVICE_QUERY_UC_FW_VERSION 7 +#define DRM_XE_DEVICE_QUERY_OA_UNITS 8 /** @query: The type of data to query */ __u32 query; @@ -794,7 +842,6 @@ struct drm_xe_gem_mmap_offset { * this. */ struct drm_xe_vm_create { -#define DRM_XE_VM_EXTENSION_SET_DEBUG_METADATA 0 /** @extensions: Pointer to the first extension struct, if any */ __u64 extensions; @@ -829,8 +876,8 @@ struct drm_xe_vm_bind_op_ext_attach_debug { /** @base: base user extension */ struct drm_xe_user_extension base; - /** @metadata_id: Debug object id from create metadata */ - __u32 metadata_id; + /** @id: Debug object id from create metadata */ + __u64 metadata_id; /** @flags: Flags */ __u64 flags; @@ -1071,11 +1118,8 @@ struct drm_xe_exec_queue_create { #define DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY 0 #define DRM_XE_EXEC_QUEUE_SET_PROPERTY_PRIORITY 0 #define DRM_XE_EXEC_QUEUE_SET_PROPERTY_TIMESLICE 1 - -/* Set eu debug specific flags */ #define DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG 2 #define DRM_XE_EXEC_QUEUE_EUDEBUG_FLAG_ENABLE (1 << 0) -#define DRM_XE_EXEC_QUEUE_EUDEBUG_FLAG_PAGEFAULT_ENABLE (1 << 1) /** @extensions: Pointer to the first extension struct, if any */ __u64 extensions; @@ -1356,6 +1400,328 @@ struct drm_xe_wait_user_fence { __u64 reserved[2]; }; +/** + * enum drm_xe_observation_type - Observation stream types + */ +enum drm_xe_observation_type { + /** @DRM_XE_OBSERVATION_TYPE_OA: OA observation stream type */ + DRM_XE_OBSERVATION_TYPE_OA, +}; + +/** + * enum drm_xe_observation_op - Observation stream ops + */ +enum drm_xe_observation_op { + /** @DRM_XE_OBSERVATION_OP_STREAM_OPEN: Open an observation stream */ + DRM_XE_OBSERVATION_OP_STREAM_OPEN, + + /** @DRM_XE_OBSERVATION_OP_ADD_CONFIG: Add observation stream config */ + DRM_XE_OBSERVATION_OP_ADD_CONFIG, + + /** @DRM_XE_OBSERVATION_OP_REMOVE_CONFIG: Remove observation stream config */ + DRM_XE_OBSERVATION_OP_REMOVE_CONFIG, +}; + +/** + * struct drm_xe_observation_param - Input of &DRM_XE_OBSERVATION + * + * The observation layer enables multiplexing observation streams of + * multiple types. The actual params for a particular stream operation are + * supplied via the @param pointer (use __copy_from_user to get these + * params). + */ +struct drm_xe_observation_param { + /** @extensions: Pointer to the first extension struct, if any */ + __u64 extensions; + /** @observation_type: observation stream type, of enum @drm_xe_observation_type */ + __u64 observation_type; + /** @observation_op: observation stream op, of enum @drm_xe_observation_op */ + __u64 observation_op; + /** @param: Pointer to actual stream params */ + __u64 param; +}; + +/** + * enum drm_xe_observation_ioctls - Observation stream fd ioctl's + * + * Information exchanged between userspace and kernel for observation fd + * ioctl's is stream type specific + */ +enum drm_xe_observation_ioctls { + /** @DRM_XE_OBSERVATION_IOCTL_ENABLE: Enable data capture for an observation stream */ + DRM_XE_OBSERVATION_IOCTL_ENABLE = _IO('i', 0x0), + + /** @DRM_XE_OBSERVATION_IOCTL_DISABLE: Disable data capture for a observation stream */ + DRM_XE_OBSERVATION_IOCTL_DISABLE = _IO('i', 0x1), + + /** @DRM_XE_OBSERVATION_IOCTL_CONFIG: Change observation stream configuration */ + DRM_XE_OBSERVATION_IOCTL_CONFIG = _IO('i', 0x2), + + /** @DRM_XE_OBSERVATION_IOCTL_STATUS: Return observation stream status */ + DRM_XE_OBSERVATION_IOCTL_STATUS = _IO('i', 0x3), + + /** @DRM_XE_OBSERVATION_IOCTL_INFO: Return observation stream info */ + DRM_XE_OBSERVATION_IOCTL_INFO = _IO('i', 0x4), +}; + +/** + * enum drm_xe_oa_unit_type - OA unit types + */ +enum drm_xe_oa_unit_type { + /** + * @DRM_XE_OA_UNIT_TYPE_OAG: OAG OA unit. OAR/OAC are considered + * sub-types of OAG. For OAR/OAC, use OAG. + */ + DRM_XE_OA_UNIT_TYPE_OAG, + + /** @DRM_XE_OA_UNIT_TYPE_OAM: OAM OA unit */ + DRM_XE_OA_UNIT_TYPE_OAM, +}; + +/** + * struct drm_xe_oa_unit - describe OA unit + */ +struct drm_xe_oa_unit { + /** @extensions: Pointer to the first extension struct, if any */ + __u64 extensions; + + /** @oa_unit_id: OA unit ID */ + __u32 oa_unit_id; + + /** @oa_unit_type: OA unit type of @drm_xe_oa_unit_type */ + __u32 oa_unit_type; + + /** @capabilities: OA capabilities bit-mask */ + __u64 capabilities; +#define DRM_XE_OA_CAPS_BASE (1 << 0) + + /** @oa_timestamp_freq: OA timestamp freq */ + __u64 oa_timestamp_freq; + + /** @reserved: MBZ */ + __u64 reserved[4]; + + /** @num_engines: number of engines in @eci array */ + __u64 num_engines; + + /** @eci: engines attached to this OA unit */ + struct drm_xe_engine_class_instance eci[]; +}; + +/** + * struct drm_xe_query_oa_units - describe OA units + * + * If a query is made with a struct drm_xe_device_query where .query + * is equal to DRM_XE_DEVICE_QUERY_OA_UNITS, then the reply uses struct + * drm_xe_query_oa_units in .data. + * + * OA unit properties for all OA units can be accessed using a code block + * such as the one below: + * + * .. code-block:: C + * + * struct drm_xe_query_oa_units *qoa; + * struct drm_xe_oa_unit *oau; + * u8 *poau; + * + * // malloc qoa and issue DRM_XE_DEVICE_QUERY_OA_UNITS. Then: + * poau = (u8 *)&qoa->oa_units[0]; + * for (int i = 0; i < qoa->num_oa_units; i++) { + * oau = (struct drm_xe_oa_unit *)poau; + * // Access 'struct drm_xe_oa_unit' fields here + * poau += sizeof(*oau) + oau->num_engines * sizeof(oau->eci[0]); + * } + */ +struct drm_xe_query_oa_units { + /** @extensions: Pointer to the first extension struct, if any */ + __u64 extensions; + /** @num_oa_units: number of OA units returned in oau[] */ + __u32 num_oa_units; + /** @pad: MBZ */ + __u32 pad; + /** + * @oa_units: struct @drm_xe_oa_unit array returned for this device. + * Written below as a u64 array to avoid problems with nested flexible + * arrays with some compilers + */ + __u64 oa_units[]; +}; + +/** + * enum drm_xe_oa_format_type - OA format types as specified in PRM/Bspec + * 52198/60942 + */ +enum drm_xe_oa_format_type { + /** @DRM_XE_OA_FMT_TYPE_OAG: OAG report format */ + DRM_XE_OA_FMT_TYPE_OAG, + /** @DRM_XE_OA_FMT_TYPE_OAR: OAR report format */ + DRM_XE_OA_FMT_TYPE_OAR, + /** @DRM_XE_OA_FMT_TYPE_OAM: OAM report format */ + DRM_XE_OA_FMT_TYPE_OAM, + /** @DRM_XE_OA_FMT_TYPE_OAC: OAC report format */ + DRM_XE_OA_FMT_TYPE_OAC, + /** @DRM_XE_OA_FMT_TYPE_OAM_MPEC: OAM SAMEDIA or OAM MPEC report format */ + DRM_XE_OA_FMT_TYPE_OAM_MPEC, + /** @DRM_XE_OA_FMT_TYPE_PEC: PEC report format */ + DRM_XE_OA_FMT_TYPE_PEC, +}; + +/** + * enum drm_xe_oa_property_id - OA stream property id's + * + * Stream params are specified as a chain of @drm_xe_ext_set_property + * struct's, with @property values from enum @drm_xe_oa_property_id and + * @drm_xe_user_extension base.name set to @DRM_XE_OA_EXTENSION_SET_PROPERTY. + * @param field in struct @drm_xe_observation_param points to the first + * @drm_xe_ext_set_property struct. + * + * Exactly the same mechanism is also used for stream reconfiguration using the + * @DRM_XE_OBSERVATION_IOCTL_CONFIG observation stream fd ioctl, though only a + * subset of properties below can be specified for stream reconfiguration. + */ +enum drm_xe_oa_property_id { +#define DRM_XE_OA_EXTENSION_SET_PROPERTY 0 + /** + * @DRM_XE_OA_PROPERTY_OA_UNIT_ID: ID of the OA unit on which to open + * the OA stream, see @oa_unit_id in 'struct + * drm_xe_query_oa_units'. Defaults to 0 if not provided. + */ + DRM_XE_OA_PROPERTY_OA_UNIT_ID = 1, + + /** + * @DRM_XE_OA_PROPERTY_SAMPLE_OA: A value of 1 requests inclusion of raw + * OA unit reports or stream samples in a global buffer attached to an + * OA unit. + */ + DRM_XE_OA_PROPERTY_SAMPLE_OA, + + /** + * @DRM_XE_OA_PROPERTY_OA_METRIC_SET: OA metrics defining contents of OA + * reports, previously added via @DRM_XE_OBSERVATION_OP_ADD_CONFIG. + */ + DRM_XE_OA_PROPERTY_OA_METRIC_SET, + + /** @DRM_XE_OA_PROPERTY_OA_FORMAT: OA counter report format */ + DRM_XE_OA_PROPERTY_OA_FORMAT, + /* + * OA_FORMAT's are specified the same way as in PRM/Bspec 52198/60942, + * in terms of the following quantities: a. enum @drm_xe_oa_format_type + * b. Counter select c. Counter size and d. BC report. Also refer to the + * oa_formats array in drivers/gpu/drm/xe/xe_oa.c. + */ +#define DRM_XE_OA_FORMAT_MASK_FMT_TYPE (0xff << 0) +#define DRM_XE_OA_FORMAT_MASK_COUNTER_SEL (0xff << 8) +#define DRM_XE_OA_FORMAT_MASK_COUNTER_SIZE (0xff << 16) +#define DRM_XE_OA_FORMAT_MASK_BC_REPORT (0xff << 24) + + /** + * @DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT: Requests periodic OA unit + * sampling with sampling frequency proportional to 2^(period_exponent + 1) + */ + DRM_XE_OA_PROPERTY_OA_PERIOD_EXPONENT, + + /** + * @DRM_XE_OA_PROPERTY_OA_DISABLED: A value of 1 will open the OA + * stream in a DISABLED state (see @DRM_XE_OBSERVATION_IOCTL_ENABLE). + */ + DRM_XE_OA_PROPERTY_OA_DISABLED, + + /** + * @DRM_XE_OA_PROPERTY_EXEC_QUEUE_ID: Open the stream for a specific + * @exec_queue_id. OA queries can be executed on this exec queue. + */ + DRM_XE_OA_PROPERTY_EXEC_QUEUE_ID, + + /** + * @DRM_XE_OA_PROPERTY_OA_ENGINE_INSTANCE: Optional engine instance to + * pass along with @DRM_XE_OA_PROPERTY_EXEC_QUEUE_ID or will default to 0. + */ + DRM_XE_OA_PROPERTY_OA_ENGINE_INSTANCE, + + /** + * @DRM_XE_OA_PROPERTY_NO_PREEMPT: Allow preemption and timeslicing + * to be disabled for the stream exec queue. + */ + DRM_XE_OA_PROPERTY_NO_PREEMPT, +}; + +/** + * struct drm_xe_oa_config - OA metric configuration + * + * Multiple OA configs can be added using @DRM_XE_OBSERVATION_OP_ADD_CONFIG. A + * particular config can be specified when opening an OA stream using + * @DRM_XE_OA_PROPERTY_OA_METRIC_SET property. + */ +struct drm_xe_oa_config { + /** @extensions: Pointer to the first extension struct, if any */ + __u64 extensions; + + /** @uuid: String formatted like "%\08x-%\04x-%\04x-%\04x-%\012x" */ + char uuid[36]; + + /** @n_regs: Number of regs in @regs_ptr */ + __u32 n_regs; + + /** + * @regs_ptr: Pointer to (register address, value) pairs for OA config + * registers. Expected length of buffer is: (2 * sizeof(u32) * @n_regs). + */ + __u64 regs_ptr; +}; + +/** + * struct drm_xe_oa_stream_status - OA stream status returned from + * @DRM_XE_OBSERVATION_IOCTL_STATUS observation stream fd ioctl. Userspace can + * call the ioctl to query stream status in response to EIO errno from + * observation fd read(). + */ +struct drm_xe_oa_stream_status { + /** @extensions: Pointer to the first extension struct, if any */ + __u64 extensions; + + /** @oa_status: OA stream status (see Bspec 46717/61226) */ + __u64 oa_status; +#define DRM_XE_OASTATUS_MMIO_TRG_Q_FULL (1 << 3) +#define DRM_XE_OASTATUS_COUNTER_OVERFLOW (1 << 2) +#define DRM_XE_OASTATUS_BUFFER_OVERFLOW (1 << 1) +#define DRM_XE_OASTATUS_REPORT_LOST (1 << 0) + + /** @reserved: reserved for future use */ + __u64 reserved[3]; +}; + +/** + * struct drm_xe_oa_stream_info - OA stream info returned from + * @DRM_XE_OBSERVATION_IOCTL_INFO observation stream fd ioctl + */ +struct drm_xe_oa_stream_info { + /** @extensions: Pointer to the first extension struct, if any */ + __u64 extensions; + + /** @oa_buf_size: OA buffer size */ + __u64 oa_buf_size; + + /** @reserved: reserved for future use */ + __u64 reserved[3]; +}; + +/* + * Debugger ABI (ioctl and events) Version History: + * 0 - No debugger available + * 1 - Initial version + */ +#define DRM_XE_EUDEBUG_VERSION 1 + +struct drm_xe_eudebug_connect { + /** @extensions: Pointer to the first extension struct, if any */ + __u64 extensions; + + __u64 pid; /* input: Target process ID */ + __u32 flags; /* MBZ */ + + __u32 version; /* output: current ABI (ioctl / events) version */ +}; + /* * struct drm_xe_debug_metadata_create - Create debug metadata * @@ -1404,37 +1770,7 @@ struct drm_xe_debug_metadata_destroy { __u32 metadata_id; }; -/** - * struct drm_xe_ext_vm_set_debug_metadata - Annotate metadata in vm - * - * Annotate static regions of vm to be noted as debug metadata. - * These will be communicated to a debugger and (XXX: selectively?) - * included in gpu error state. - * - */ -struct drm_xe_ext_vm_set_debug_metadata { - /** @base: base user extension */ - struct drm_xe_user_extension base; - -#define DRM_XE_VM_DEBUG_METADATA_COOKIE 0 -#define DRM_XE_VM_DEBUG_METADATA_MODULE_AREA 1 -#define DRM_XE_VM_DEBUG_METADATA_SBA_AREA 2 -#define DRM_XE_VM_DEBUG_METADATA_SIP_AREA 3 -#define DRM_XE_VM_DEBUG_METADATA_NUM (1 + DRM_XE_VM_DEBUG_METADATA_SIP_AREA) - /** @type: Type of metadata at offset if not cookie */ - __u64 type; - - union { - /**@cookie: Cookie value to attach if type is METADATA_COOKIE */ - __u64 cookie; - - /**@offset: Offset into vm where metadata starts */ - __u64 offset; - }; - - /** @len: Length of metadata in bytes or zero for cookie */ - __u64 len; -}; +#include "xe_drm_eudebug.h" #if defined(__cplusplus) } diff --git a/third_party/uapi-eudebug/drm/xe_drm_tmp.h b/third_party/uapi-eudebug/drm/xe_drm_eudebug.h similarity index 69% rename from third_party/uapi-eudebug/drm/xe_drm_tmp.h rename to third_party/uapi-eudebug/drm/xe_drm_eudebug.h index 8ad29a53ec..acf8de34f1 100644 --- a/third_party/uapi-eudebug/drm/xe_drm_tmp.h +++ b/third_party/uapi-eudebug/drm/xe_drm_eudebug.h @@ -2,19 +2,11 @@ /* * Copyright © 2023 Intel Corporation */ -#ifndef _UAPI_XE_DRM_TMP_H_ -#define _UAPI_XE_DRM_TMP_H_ -#include "xe_drm.h" - -#if defined(__cplusplus) -extern "C" { +#if !defined(_UAPI_XE_DRM_H_) + error "Do not include this directly" #endif -#define DRM_XE_EUDEBUG_CONNECT 0x5f - -#define DRM_IOCTL_XE_EUDEBUG_CONNECT DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_EUDEBUG_CONNECT, struct drm_xe_eudebug_connect) - /** * Do a eudebug event read for a debugger connection. * @@ -22,30 +14,27 @@ extern "C" { */ #define DRM_XE_EUDEBUG_IOCTL_READ_EVENT _IO('j', 0x0) #define DRM_XE_EUDEBUG_IOCTL_EU_CONTROL _IOWR('j', 0x2, struct drm_xe_eudebug_eu_control) +#define DRM_XE_EUDEBUG_IOCTL_ACK_EVENT _IOW('j', 0x4, struct drm_xe_eudebug_ack_event) #define DRM_XE_EUDEBUG_IOCTL_VM_OPEN _IOW('j', 0x1, struct drm_xe_eudebug_vm_open) #define DRM_XE_EUDEBUG_IOCTL_READ_METADATA _IOWR('j', 0x3, struct drm_xe_eudebug_read_metadata) -#define DRM_XE_EUDEBUG_IOCTL_ACK_EVENT _IOW('j', 0x4, struct drm_xe_eudebug_ack_event) /* XXX: Document events to match their internal counterparts when moved to xe_drm.h */ struct drm_xe_eudebug_event { __u32 len; __u16 type; -#define DRM_XE_EUDEBUG_EVENT_NONE 0 -#define DRM_XE_EUDEBUG_EVENT_READ 1 -#define DRM_XE_EUDEBUG_EVENT_OPEN 2 -#define DRM_XE_EUDEBUG_EVENT_VM 3 -#define DRM_XE_EUDEBUG_EVENT_EXEC_QUEUE 4 -#define DRM_XE_EUDEBUG_EVENT_EU_ATTENTION 5 -#define DRM_XE_EUDEBUG_EVENT_VM_BIND 6 -#define DRM_XE_EUDEBUG_EVENT_VM_BIND_OP 7 -#define DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE 8 -#define DRM_XE_EUDEBUG_EVENT_METADATA 9 +#define DRM_XE_EUDEBUG_EVENT_NONE 0 +#define DRM_XE_EUDEBUG_EVENT_READ 1 +#define DRM_XE_EUDEBUG_EVENT_OPEN 2 +#define DRM_XE_EUDEBUG_EVENT_VM 3 +#define DRM_XE_EUDEBUG_EVENT_EXEC_QUEUE 4 +#define DRM_XE_EUDEBUG_EVENT_EU_ATTENTION 5 +#define DRM_XE_EUDEBUG_EVENT_VM_BIND 6 +#define DRM_XE_EUDEBUG_EVENT_VM_BIND_OP 7 +#define DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE 8 +#define DRM_XE_EUDEBUG_EVENT_METADATA 9 #define DRM_XE_EUDEBUG_EVENT_VM_BIND_OP_METADATA 10 -#define DRM_XE_EUDEBUG_EVENT_VM_SET_METADATA 11 -#define DRM_XE_EUDEBUG_EVENT_PAGEFAULT 12 -#define DRM_XE_EUDEBUG_EVENT_SYNC_HOST 13 -#define DRM_XE_EUDEBUG_EVENT_MAX_EVENT DRM_XE_EUDEBUG_EVENT_SYNC_HOST +#define DRM_XE_EUDEBUG_EVENT_MAX_EVENT DRM_XE_EUDEBUG_EVENT_VM_BIND_OP_METADATA __u16 flags; #define DRM_XE_EUDEBUG_EVENT_CREATE (1 << 0) @@ -55,20 +44,20 @@ struct drm_xe_eudebug_event { __u64 seqno; __u64 reserved; -} __attribute__((packed)); +}; struct drm_xe_eudebug_event_client { struct drm_xe_eudebug_event base; __u64 client_handle; /* This is unique per debug connection */ -} __attribute__((packed)); +}; struct drm_xe_eudebug_event_vm { struct drm_xe_eudebug_event base; __u64 client_handle; __u64 vm_handle; -} __attribute__((packed)); +}; struct drm_xe_eudebug_event_exec_queue { struct drm_xe_eudebug_event base; @@ -78,8 +67,8 @@ struct drm_xe_eudebug_event_exec_queue { __u64 exec_queue_handle; __u32 engine_class; __u32 width; - __u64 lrc_handle[0]; -} __attribute__((packed)); + __u64 lrc_handle[]; +}; struct drm_xe_eudebug_event_eu_attention { struct drm_xe_eudebug_event base; @@ -89,8 +78,26 @@ struct drm_xe_eudebug_event_eu_attention { __u64 lrc_handle; __u32 flags; __u32 bitmask_size; - __u8 bitmask[0]; -} __attribute__((packed)); + __u8 bitmask[]; +}; + +struct drm_xe_eudebug_eu_control { + __u64 client_handle; + +#define DRM_XE_EUDEBUG_EU_CONTROL_CMD_INTERRUPT_ALL 0 +#define DRM_XE_EUDEBUG_EU_CONTROL_CMD_STOPPED 1 +#define DRM_XE_EUDEBUG_EU_CONTROL_CMD_RESUME 2 + __u32 cmd; + __u32 flags; + + __u64 seqno; + + __u64 exec_queue_handle; + __u64 lrc_handle; + __u32 reserved; + __u32 bitmask_size; + __u64 bitmask_ptr; +}; /* * When client (debuggee) does vm_bind_ioctl() following event @@ -126,7 +133,7 @@ struct drm_xe_eudebug_event_eu_attention { * * Client's UFENCE sync will be held by the driver: client's * drm_xe_wait_ufence will not complete and the value of the ufence - * wont appear until ufence is acked by the debugger process calling + * won't appear until ufence is acked by the debugger process calling * DRM_XE_EUDEBUG_IOCTL_ACK_EVENT with the event_ufence.base.seqno. * This will signal the fence, .value will update and the wait will * complete allowing the client to continue. @@ -138,11 +145,12 @@ struct drm_xe_eudebug_event_vm_bind { __u64 client_handle; __u64 vm_handle; + __u32 flags; #define DRM_XE_EUDEBUG_EVENT_VM_BIND_FLAG_UFENCE (1 << 0) __u32 num_binds; -} __attribute__((packed)); +}; struct drm_xe_eudebug_event_vm_bind_op { struct drm_xe_eudebug_event base; @@ -151,102 +159,19 @@ struct drm_xe_eudebug_event_vm_bind_op { __u64 addr; /* XXX: Zero for unmap all? */ __u64 range; /* XXX: Zero for unmap all? */ -} __attribute__((packed)); +}; struct drm_xe_eudebug_event_vm_bind_ufence { struct drm_xe_eudebug_event base; __u64 vm_bind_ref_seqno; /* *_event_vm_bind.base.seqno */ -} __attribute__((packed)); +}; -struct drm_xe_eudebug_event_metadata { - struct drm_xe_eudebug_event base; - - __u64 client_handle; - __u64 metadata_handle; - /* XXX: Refer to xe_drm.h for fields */ - __u64 type; - __u64 len; -} __attribute__((packed)); - -struct drm_xe_eudebug_event_vm_bind_op_metadata { - struct drm_xe_eudebug_event base; - __u64 vm_bind_op_ref_seqno; /* *_event_vm_bind_op.base.seqno */ - - __u64 metadata_handle; - __u64 metadata_cookie; -} __attribute__((packed)); - -struct drm_xe_eudebug_event_vm_set_metadata { - struct drm_xe_eudebug_event base; - - __u64 client_handle; - __u64 vm_handle; - - /* XXX: Refer to xe_drm.h for fields */ - __u64 type; - union { - __u64 cookie; - __u64 offset; - }; - __u64 len; -} __attribute__((packed)); - -struct drm_xe_eudebug_event_pagefault { - struct drm_xe_eudebug_event base; - - __u64 client_handle; - __u64 exec_queue_handle; - __u64 lrc_handle; - __u64 pagefault_address; - - __u32 fault_flags; - - __u32 bitmask_size; - __u8 bitmask[0]; -} __attribute__((packed)); - -struct drm_xe_eudebug_event_sync_host { - struct drm_xe_eudebug_event base; - __u64 client_handle; - __u64 exec_queue_handle; - __u64 lrc_handle; -} __attribute__((packed)); - -/* - * Debugger ABI (ioctl and events) Version History: - * 0 - No debugger available - * 1 - Initial version - */ -#define DRM_XE_EUDEBUG_VERSION 1 - -struct drm_xe_eudebug_connect { - /** @extensions: Pointer to the first extension struct, if any */ - __u64 extensions; - - __u64 pid; /* input: Target process ID */ +struct drm_xe_eudebug_ack_event { + __u32 type; __u32 flags; /* MBZ */ - - __u32 version; /* output: current ABI (ioctl / events) version */ -}; - -struct drm_xe_eudebug_eu_control { - __u64 client_handle; - -#define DRM_XE_EUDEBUG_EU_CONTROL_CMD_INTERRUPT_ALL 0 -#define DRM_XE_EUDEBUG_EU_CONTROL_CMD_STOPPED 1 -#define DRM_XE_EUDEBUG_EU_CONTROL_CMD_RESUME 2 -#define DRM_XE_EUDEBUG_EU_CONTROL_CMD_UNLOCK 3 - __u32 cmd; - - __u32 flags; __u64 seqno; - - __u64 exec_queue_handle; - __u64 lrc_handle; - __u32 bitmask_size; - __u64 bitmask_ptr; }; - + struct drm_xe_eudebug_vm_open { /** @extensions: Pointer to the first extension struct, if any */ __u64 extensions; @@ -268,19 +193,25 @@ struct drm_xe_eudebug_read_metadata { __u64 client_handle; __u64 metadata_handle; __u32 flags; - + __u32 reserved; __u64 ptr; __u64 size; }; -struct drm_xe_eudebug_ack_event { - __u32 type; - __u32 flags; /* MBZ */ - __u64 seqno; +struct drm_xe_eudebug_event_metadata { + struct drm_xe_eudebug_event base; + + __u64 client_handle; + __u64 metadata_handle; + /* XXX: Refer to xe_drm.h for fields */ + __u64 type; + __u64 len; }; -#if defined(__cplusplus) -} -#endif +struct drm_xe_eudebug_event_vm_bind_op_metadata { + struct drm_xe_eudebug_event base; + __u64 vm_bind_op_ref_seqno; /* *_event_vm_bind_op.base.seqno */ -#endif /* _UAPI_XE_DRM_TMP_H_ */ + __u64 metadata_handle; + __u64 metadata_cookie; +};