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 77e67afd19..ab920aebc5 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp @@ -72,12 +72,39 @@ const char *IoctlHelperXe::xeGetBindOperationName(int bindOperation) { return "Unknown operation"; } -const char *IoctlHelperXe::xeGetBindFlagsName(int bindFlags) { - switch (bindFlags) { - case DRM_XE_VM_BIND_FLAG_NULL: - return "NULL"; +std::string IoctlHelperXe::xeGetBindFlagNames(int bindFlags) { + if (bindFlags == 0) { + return ""; } - return "Unknown flag"; + + std::string flags; + if (bindFlags & DRM_XE_VM_BIND_FLAG_READONLY) { + bindFlags &= ~DRM_XE_VM_BIND_FLAG_READONLY; + flags += "READONLY "; + } + if (bindFlags & DRM_XE_VM_BIND_FLAG_IMMEDIATE) { + bindFlags &= ~DRM_XE_VM_BIND_FLAG_IMMEDIATE; + flags += "IMMEDIATE "; + } + if (bindFlags & DRM_XE_VM_BIND_FLAG_NULL) { + bindFlags &= ~DRM_XE_VM_BIND_FLAG_NULL; + flags += "NULL "; + } + if (bindFlags & DRM_XE_VM_BIND_FLAG_DUMPABLE) { + bindFlags &= ~DRM_XE_VM_BIND_FLAG_DUMPABLE; + flags += "DUMPABLE "; + } + + if (bindFlags != 0) { + flags += "Unknown flag "; + } + + // Remove the trailing space + if (!flags.empty() && flags.back() == ' ') { + flags.pop_back(); + } + + return flags; } const char *IoctlHelperXe::xeGetengineClassName(uint32_t engineClass) { @@ -1277,7 +1304,7 @@ int IoctlHelperXe::xeVmBind(const VmBindParams &vmBindParams, bool isBind) { bind.bind.op, xeGetBindOperationName(bind.bind.op), bind.bind.flags, - xeGetBindFlagsName(bind.bind.flags), + xeGetBindFlagNames(bind.bind.flags).c_str(), bind.num_syncs, bind.bind.pat_index, 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 dff358235e..2a90948507 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h @@ -62,6 +62,7 @@ class IoctlHelperXe : public IoctlHelper { uint32_t getDirectSubmissionFlag() override; std::unique_ptr prepareVmBindExt(const StackVec &bindExtHandles) override; uint64_t getFlagsForVmBind(bool bindCapture, bool bindImmediate, bool bindMakeResident, bool bindLock, bool readOnlyResource) override; + virtual std::string xeGetBindFlagNames(int bindFlags); int queryDistances(std::vector &queryItems, std::vector &distanceInfos) override; uint16_t getWaitUserFenceSoftFlag() override; int execBuffer(ExecBuffer *execBuffer, uint64_t completionGpuAddress, TaskCountType counterValue) override; @@ -136,7 +137,6 @@ class IoctlHelperXe : public IoctlHelper { const char *xeGetClassName(int className); const char *xeGetBindOperationName(int bindOperation); - const char *xeGetBindFlagsName(int bindFlags); const char *xeGetengineClassName(uint32_t engineClass); template diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp index da2fbed305..bff0671614 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp @@ -459,7 +459,7 @@ TEST(IoctlHelperXeTest, verifyPublicFunctions) { }; auto verifyXeFlagsBindName = [&mockXeIoctlHelper](const char *name, auto flags) { - EXPECT_STREQ(name, mockXeIoctlHelper->xeGetBindFlagsName(flags)); + EXPECT_STREQ(name, mockXeIoctlHelper->xeGetBindFlagNames(flags).c_str()); }; auto verifyXeEngineClassName = [&mockXeIoctlHelper](const char *name, auto engineClass) { @@ -479,8 +479,12 @@ TEST(IoctlHelperXeTest, verifyPublicFunctions) { verifyXeOperationBindName("PREFETCH", DRM_XE_VM_BIND_OP_PREFETCH); verifyXeOperationBindName("Unknown operation", -1); + verifyXeFlagsBindName("", 0); verifyXeFlagsBindName("NULL", DRM_XE_VM_BIND_FLAG_NULL); - verifyXeFlagsBindName("Unknown flag", -1); + verifyXeFlagsBindName("READONLY", DRM_XE_VM_BIND_FLAG_READONLY); + verifyXeFlagsBindName("IMMEDIATE", DRM_XE_VM_BIND_FLAG_IMMEDIATE); + verifyXeFlagsBindName("DUMPABLE", DRM_XE_VM_BIND_FLAG_DUMPABLE); + verifyXeFlagsBindName("Unknown flag", 1 << 31); verifyXeEngineClassName("DRM_XE_ENGINE_CLASS_RENDER", DRM_XE_ENGINE_CLASS_RENDER); verifyXeEngineClassName("DRM_XE_ENGINE_CLASS_COPY", DRM_XE_ENGINE_CLASS_COPY); 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 ed423a85ac..a605a41fc6 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 @@ -41,7 +41,7 @@ struct MockIoctlHelperXe : IoctlHelperXe { using IoctlHelperXe::supportedFeatures; using IoctlHelperXe::tileIdToGtId; using IoctlHelperXe::UserFenceExtension; - using IoctlHelperXe::xeGetBindFlagsName; + using IoctlHelperXe::xeGetBindFlagNames; using IoctlHelperXe::xeGetBindOperationName; using IoctlHelperXe::xeGetClassName; using IoctlHelperXe::xeGetengineClassName;