diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 6f7a814fa8..837e4369b5 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -238,7 +238,7 @@ int Drm::queryGttSize(uint64_t >tSizeOutput) { int ret = ioctlHelper->ioctl(DrmIoctl::gemContextGetparam, &contextParam); if (ret == 0) { - gttSizeOutput = contextParam.value; + gttSizeOutput = Drm::alignUpGttSize(contextParam.value); } return ret; @@ -1579,6 +1579,17 @@ void Drm::waitOnUserFences(const OsContextLinux &osContext, uint64_t address, ui } const HardwareInfo *Drm::getHardwareInfo() const { return rootDeviceEnvironment.getHardwareInfo(); } +uint64_t Drm::alignUpGttSize(uint64_t inputGttSize) { + + constexpr uint64_t gttSize47bit = (1ull << 47) - 1; + constexpr uint64_t gttSize48bit = (1ull << 48) - 1; + + if (inputGttSize > gttSize47bit && inputGttSize < gttSize48bit) { + return gttSize48bit; + } + return inputGttSize; +} + template std::vector Drm::query(uint32_t queryId, uint32_t queryItemFlags); template std::vector Drm::query(uint32_t queryId, uint32_t queryItemFlags); template std::vector Drm::query(uint32_t queryId, uint32_t queryItemFlags); diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index bbb961d5dd..a5518a7063 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -269,6 +269,7 @@ class Drm : public DriverModel { void queryAndSetVmBindPatIndexProgrammingSupport(); bool queryDeviceIdAndRevision(); bool queryI915DeviceIdAndRevision(); + static uint64_t alignUpGttSize(uint64_t inputGttSize); #pragma pack(1) struct PCIConfig { diff --git a/shared/test/unit_test/os_interface/linux/drm_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_tests.cpp index 024ed89683..b0c1765d12 100644 --- a/shared/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_tests.cpp @@ -312,6 +312,24 @@ TEST(DrmTest, GivenDrmWhenAskedForGttSizeThenReturnCorrectValue) { EXPECT_EQ(0, drm->Drm::queryGttSize(queryGttSize)); EXPECT_EQ(drm->storedGTTSize, queryGttSize); + queryGttSize = 0; + drm->storedRetValForGetGttSize = 0; + drm->storedGTTSize = (1ull << 47) - 1; + EXPECT_EQ(0, drm->Drm::queryGttSize(queryGttSize)); + EXPECT_EQ(drm->storedGTTSize, queryGttSize); + + queryGttSize = 0; + drm->storedRetValForGetGttSize = 0; + drm->storedGTTSize = (1ull << 48) - 1; + EXPECT_EQ(0, drm->Drm::queryGttSize(queryGttSize)); + EXPECT_EQ(drm->storedGTTSize, queryGttSize); + + queryGttSize = 0; + drm->storedRetValForGetGttSize = 0; + drm->storedGTTSize = 1ull << 47; + EXPECT_EQ(0, drm->Drm::queryGttSize(queryGttSize)); + EXPECT_EQ((1ull << 48) - 1, queryGttSize); + queryGttSize = 0; drm->storedRetValForGetGttSize = -1; EXPECT_NE(0, drm->Drm::queryGttSize(queryGttSize));