From 40e00e5c08346119c7f4518a9232d2855eeb514e Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Thu, 12 May 2022 13:46:22 +0000 Subject: [PATCH] Create a wrapper struct for drm_i915_reg_read Related-To: NEO-6852 Signed-off-by: Mateusz Jablonski --- .../unit_test/linux/drm_null_device_tests.cpp | 12 +++---- .../os_interface/linux/device_time_drm.cpp | 32 +++++++++---------- .../os_interface/linux/drm_null_device.h | 5 ++- .../os_interface/linux/ioctl_helper.cpp | 4 +++ .../source/os_interface/linux/ioctl_helper.h | 5 +++ .../linux/device_command_stream_fixture.h | 6 ++-- 6 files changed, 35 insertions(+), 29 deletions(-) diff --git a/opencl/test/unit_test/linux/drm_null_device_tests.cpp b/opencl/test/unit_test/linux/drm_null_device_tests.cpp index 51c5f882f4..d3cebe6932 100644 --- a/opencl/test/unit_test/linux/drm_null_device_tests.cpp +++ b/opencl/test/unit_test/linux/drm_null_device_tests.cpp @@ -59,14 +59,14 @@ TEST_F(DrmNullDeviceTests, GIVENdrmNullDeviceWHENcallIoctlTHENalwaysSuccess) { } TEST_F(DrmNullDeviceTests, GIVENdrmNullDeviceWHENregReadOtherThenTimestampReadTHENalwaysSuccess) { - struct drm_i915_reg_read arg; + RegisterRead arg; arg.offset = 0; ASSERT_EQ(drmNullDevice->ioctl(DRM_IOCTL_I915_REG_READ, &arg), 0); } TEST_F(DrmNullDeviceTests, GIVENdrmNullDeviceWHENgetGpuTimestamp32bOr64bTHENerror) { - struct drm_i915_reg_read arg; + RegisterRead arg; arg.offset = REG_GLOBAL_TIMESTAMP_LDW; ASSERT_EQ(drmNullDevice->ioctl(DRM_IOCTL_I915_REG_READ, &arg), -1); @@ -76,15 +76,15 @@ TEST_F(DrmNullDeviceTests, GIVENdrmNullDeviceWHENgetGpuTimestamp32bOr64bTHENerro } TEST_F(DrmNullDeviceTests, GIVENdrmNullDeviceWHENgetGpuTimestamp36bTHENproperValues) { - struct drm_i915_reg_read arg; + RegisterRead arg; arg.offset = REG_GLOBAL_TIMESTAMP_LDW | 1; ASSERT_EQ(drmNullDevice->ioctl(DRM_IOCTL_I915_REG_READ, &arg), 0); - EXPECT_EQ(arg.val, 1000ULL); + EXPECT_EQ(arg.value, 1000ULL); ASSERT_EQ(drmNullDevice->ioctl(DRM_IOCTL_I915_REG_READ, &arg), 0); - EXPECT_EQ(arg.val, 2000ULL); + EXPECT_EQ(arg.value, 2000ULL); ASSERT_EQ(drmNullDevice->ioctl(DRM_IOCTL_I915_REG_READ, &arg), 0); - EXPECT_EQ(arg.val, 3000ULL); + EXPECT_EQ(arg.value, 3000ULL); } diff --git a/shared/source/os_interface/linux/device_time_drm.cpp b/shared/source/os_interface/linux/device_time_drm.cpp index 55a416a959..cf7d9a34cb 100644 --- a/shared/source/os_interface/linux/device_time_drm.cpp +++ b/shared/source/os_interface/linux/device_time_drm.cpp @@ -25,7 +25,7 @@ DeviceTimeDrm::DeviceTimeDrm(OSInterface *osInterface) { } void DeviceTimeDrm::timestampTypeDetect() { - struct drm_i915_reg_read reg = {}; + RegisterRead reg = {}; int err; if (pDrm == nullptr) @@ -47,50 +47,50 @@ void DeviceTimeDrm::timestampTypeDetect() { } bool DeviceTimeDrm::getGpuTime32(uint64_t *timestamp) { - struct drm_i915_reg_read reg = {}; + RegisterRead reg = {}; reg.offset = REG_GLOBAL_TIMESTAMP_LDW; if (pDrm->ioctl(DRM_IOCTL_I915_REG_READ, ®)) { return false; } - *timestamp = reg.val >> 32; + *timestamp = reg.value >> 32; return true; } bool DeviceTimeDrm::getGpuTime36(uint64_t *timestamp) { - struct drm_i915_reg_read reg = {}; + RegisterRead reg = {}; reg.offset = REG_GLOBAL_TIMESTAMP_LDW | 1; if (pDrm->ioctl(DRM_IOCTL_I915_REG_READ, ®)) { return false; } - *timestamp = reg.val; + *timestamp = reg.value; return true; } bool DeviceTimeDrm::getGpuTimeSplitted(uint64_t *timestamp) { - struct drm_i915_reg_read reg_hi = {}; - struct drm_i915_reg_read reg_lo = {}; - uint64_t tmp_hi; + RegisterRead regHi = {}; + RegisterRead regLo = {}; + uint64_t tmpHi; int err = 0, loop = 3; - reg_hi.offset = REG_GLOBAL_TIMESTAMP_UN; - reg_lo.offset = REG_GLOBAL_TIMESTAMP_LDW; + regHi.offset = REG_GLOBAL_TIMESTAMP_UN; + regLo.offset = REG_GLOBAL_TIMESTAMP_LDW; - err += pDrm->ioctl(DRM_IOCTL_I915_REG_READ, ®_hi); + err += pDrm->ioctl(DRM_IOCTL_I915_REG_READ, ®Hi); do { - tmp_hi = reg_hi.val; - err += pDrm->ioctl(DRM_IOCTL_I915_REG_READ, ®_lo); - err += pDrm->ioctl(DRM_IOCTL_I915_REG_READ, ®_hi); - } while (err == 0 && reg_hi.val != tmp_hi && --loop); + tmpHi = regHi.value; + err += pDrm->ioctl(DRM_IOCTL_I915_REG_READ, ®Lo); + err += pDrm->ioctl(DRM_IOCTL_I915_REG_READ, ®Hi); + } while (err == 0 && regHi.value != tmpHi && --loop); if (err) { return false; } - *timestamp = reg_lo.val | (reg_hi.val << 32); + *timestamp = regLo.value | (regHi.value << 32); return true; } diff --git a/shared/source/os_interface/linux/drm_null_device.h b/shared/source/os_interface/linux/drm_null_device.h index 3c466b72e9..eef7474b30 100644 --- a/shared/source/os_interface/linux/drm_null_device.h +++ b/shared/source/os_interface/linux/drm_null_device.h @@ -23,12 +23,11 @@ class DrmNullDevice : public Drm { if (request == DRM_IOCTL_I915_GETPARAM || request == DRM_IOCTL_I915_QUERY) { return Drm::ioctl(request, arg); } else if (request == DRM_IOCTL_I915_REG_READ) { - struct drm_i915_reg_read *regArg = static_cast(arg); - + auto *regArg = static_cast(arg); // Handle only 36b timestamp if (regArg->offset == (REG_GLOBAL_TIMESTAMP_LDW | 1)) { gpuTimestamp += 1000; - regArg->val = gpuTimestamp & 0x0000000FFFFFFFFF; + regArg->value = gpuTimestamp & 0x0000000FFFFFFFFF; } else if (regArg->offset == REG_GLOBAL_TIMESTAMP_LDW || regArg->offset == REG_GLOBAL_TIMESTAMP_UN) { return -1; } diff --git a/shared/source/os_interface/linux/ioctl_helper.cpp b/shared/source/os_interface/linux/ioctl_helper.cpp index 40902e22d5..591dfadbae 100644 --- a/shared/source/os_interface/linux/ioctl_helper.cpp +++ b/shared/source/os_interface/linux/ioctl_helper.cpp @@ -18,6 +18,10 @@ uint32_t IoctlHelper::ioctl(Drm *drm, unsigned long request, void *arg) { return drm->ioctl(request, arg); } +static_assert(sizeof(RegisterRead) == sizeof(drm_i915_reg_read)); +static_assert(offsetof(RegisterRead, offset) == offsetof(drm_i915_reg_read, offset)); +static_assert(offsetof(RegisterRead, value) == offsetof(drm_i915_reg_read, val)); + static_assert(sizeof(ExecObject) == sizeof(drm_i915_gem_exec_object2)); void IoctlHelper::fillExecObject(ExecObject &execObject, uint32_t handle, uint64_t gpuAddress, uint32_t drmContextId, bool bindInfo, bool isMarkedForCapture) { diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index 4d2170ce8e..1cf0e25b02 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -71,6 +71,11 @@ struct UuidRegisterResult { uint32_t handle; }; +struct RegisterRead { + uint64_t offset; + uint64_t value; +}; + using MemRegionsVec = StackVec; using VmBindExtSetPatT = uint8_t[40]; using VmBindExtUserFenceT = uint8_t[56]; diff --git a/shared/test/common/os_interface/linux/device_command_stream_fixture.h b/shared/test/common/os_interface/linux/device_command_stream_fixture.h index 83157cbcfe..720d0363e6 100644 --- a/shared/test/common/os_interface/linux/device_command_stream_fixture.h +++ b/shared/test/common/os_interface/linux/device_command_stream_fixture.h @@ -12,13 +12,11 @@ #include "shared/source/os_interface/linux/drm_neo.h" #include "shared/test/common/helpers/default_hw_info.h" -#include "drm/i915_drm.h" #include "engine_node.h" #include "gtest/gtest.h" #include #include -#include using NEO::Drm; using NEO::HwDeviceIdDrm; @@ -76,8 +74,8 @@ class DrmMockTime : public DrmMockSuccess { public: using DrmMockSuccess::DrmMockSuccess; int ioctl(unsigned long request, void *arg) override { - drm_i915_reg_read *reg = reinterpret_cast(arg); - reg->val = getVal() << 32; + auto *reg = reinterpret_cast(arg); + reg->value = getVal() << 32; return 0; };