diff --git a/runtime/os_interface/linux/drm_neo.cpp b/runtime/os_interface/linux/drm_neo.cpp index bf82008fb3..ff0843b20b 100644 --- a/runtime/os_interface/linux/drm_neo.cpp +++ b/runtime/os_interface/linux/drm_neo.cpp @@ -113,15 +113,16 @@ std::string Drm::getSysFsPciPath(int deviceID) { return nullPath; } -bool Drm::is48BitAddressRangeSupported() { +int Drm::queryGttSize(uint64_t >tSizeOutput) { drm_i915_gem_context_param contextParam = {0}; contextParam.param = I915_CONTEXT_PARAM_GTT_SIZE; - auto ret = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM, &contextParam); + int ret = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM, &contextParam); if (ret == 0) { - return contextParam.value > MemoryConstants::max64BitAppAddress; + gttSizeOutput = contextParam.value; } - return true; + + return ret; } void Drm::checkPreemptionSupport() { diff --git a/runtime/os_interface/linux/drm_neo.h b/runtime/os_interface/linux/drm_neo.h index 0ce2112da2..d7a7839094 100644 --- a/runtime/os_interface/linux/drm_neo.h +++ b/runtime/os_interface/linux/drm_neo.h @@ -60,7 +60,7 @@ class Drm { int getEnabledPooledEu(int &enabled); int getMinEuInPool(int &minEUinPool); - bool is48BitAddressRangeSupported(); + int queryGttSize(uint64_t >tSizeOutput); bool isPreemptionSupported() const { return preemptionSupported; } MOCKABLE_VIRTUAL void checkPreemptionSupport(); int getFileDescriptor() const { return fd; } diff --git a/runtime/os_interface/linux/hw_info_config.cpp b/runtime/os_interface/linux/hw_info_config.cpp index afa05de4d8..d52528ef7c 100644 --- a/runtime/os_interface/linux/hw_info_config.cpp +++ b/runtime/os_interface/linux/hw_info_config.cpp @@ -109,7 +109,15 @@ int HwInfoConfig::configureHwInfo(const HardwareInfo *inHwInfo, HardwareInfo *ou } gtSystemInfo->SubSliceCount = static_cast(subSliceCount); - featureTable->ftrSVM = drm->is48BitAddressRangeSupported(); + uint64_t gttSizeQuery = 0; + featureTable->ftrSVM = true; + + ret = drm->queryGttSize(gttSizeQuery); + + if (ret == 0) { + featureTable->ftrSVM = (gttSizeQuery > MemoryConstants::max64BitAppAddress); + outHwInfo->capabilityTable.gpuAddressSpace = gttSizeQuery - 1; // gttSizeQuery = (1 << bits) + } int maxGpuFreq = 0; drm->getMaxGpuFrequency(maxGpuFreq); diff --git a/unit_tests/os_interface/linux/drm_mock.cpp b/unit_tests/os_interface/linux/drm_mock.cpp index b153a91908..5cfa6ba98b 100644 --- a/unit_tests/os_interface/linux/drm_mock.cpp +++ b/unit_tests/os_interface/linux/drm_mock.cpp @@ -92,7 +92,7 @@ int DrmMock::ioctl(unsigned long request, void *arg) { receivedContextParamRequest = *static_cast(arg); if (receivedContextParamRequest.param == I915_CONTEXT_PARAM_GTT_SIZE) { static_cast(arg)->value = this->storedGTTSize; - return this->StoredRetVal; + return this->StoredRetValForGetGttSize; } if (receivedContextParamRequest.param == I915_CONTEXT_PARAM_SSEU) { if (StoredRetValForGetSSEU == 0) { diff --git a/unit_tests/os_interface/linux/drm_mock.h b/unit_tests/os_interface/linux/drm_mock.h index 222460057a..be09813824 100644 --- a/unit_tests/os_interface/linux/drm_mock.h +++ b/unit_tests/os_interface/linux/drm_mock.h @@ -87,6 +87,7 @@ class DrmMock : public Drm { int StoredHasPooledEU = 1; int StoredMinEUinPool = 1; int StoredRetVal = 0; + int StoredRetValForGetGttSize = 0; int StoredRetValForGetSSEU = 0; int StoredRetValForSetSSEU = 0; int StoredRetValForDeviceID = 0; diff --git a/unit_tests/os_interface/linux/drm_tests.cpp b/unit_tests/os_interface/linux/drm_tests.cpp index a30e3dea8d..89fe4f3dd8 100644 --- a/unit_tests/os_interface/linux/drm_tests.cpp +++ b/unit_tests/os_interface/linux/drm_tests.cpp @@ -119,18 +119,19 @@ TEST(DrmTest, GetRevisionID) { delete pDrm; } -TEST(DrmTest, GivenDrmWhenAskedFor48BitAddressCorrectValueReturned) { +TEST(DrmTest, GivenDrmWhenAskedForGttSizeThenReturnCorrectValue) { auto drm = make_unique(); - EXPECT_TRUE(drm->is48BitAddressRangeSupported()); - drm->StoredRetVal = -1; - EXPECT_TRUE(drm->is48BitAddressRangeSupported()); - drm->StoredRetVal = 0; + uint64_t queryGttSize = 0; + + drm->StoredRetValForGetGttSize = 0; drm->storedGTTSize = 1ull << 31; - EXPECT_FALSE(drm->is48BitAddressRangeSupported()); - drm->storedGTTSize = MemoryConstants::max64BitAppAddress + 1; - EXPECT_TRUE(drm->is48BitAddressRangeSupported()); - drm->storedGTTSize = MemoryConstants::max64BitAppAddress; - EXPECT_FALSE(drm->is48BitAddressRangeSupported()); + EXPECT_EQ(0, drm->queryGttSize(queryGttSize)); + EXPECT_EQ(drm->storedGTTSize, queryGttSize); + + queryGttSize = 0; + drm->StoredRetValForGetGttSize = -1; + EXPECT_NE(0, drm->queryGttSize(queryGttSize)); + EXPECT_EQ(0u, queryGttSize); } TEST(DrmTest, GivenDrmWhenAskedForPreemptionCorrectValueReturned) { diff --git a/unit_tests/os_interface/linux/hw_info_config_linux_tests.cpp b/unit_tests/os_interface/linux/hw_info_config_linux_tests.cpp index a03d400dcb..f4c56279d7 100644 --- a/unit_tests/os_interface/linux/hw_info_config_linux_tests.cpp +++ b/unit_tests/os_interface/linux/hw_info_config_linux_tests.cpp @@ -392,4 +392,33 @@ TEST_F(HwInfoConfigTestLinuxDummy, givenInstrumentationForHardwareIsEnabledOrDis ret = hwConfig.configureHwInfo(&pInHwInfo, &outHwInfo, osInterface); ASSERT_EQ(0, ret); EXPECT_TRUE(outHwInfo.capabilityTable.instrumentationEnabled == haveInstrumentation); -} \ No newline at end of file +} + +TEST_F(HwInfoConfigTestLinuxDummy, givenGttSizeReturnedWhenInitializingHwInfoThenSetSvmFtr) { + drm->storedGTTSize = MemoryConstants::max64BitAppAddress; + int ret = hwConfig.configureHwInfo(&pInHwInfo, &outHwInfo, osInterface); + EXPECT_EQ(0, ret); + EXPECT_FALSE(outHwInfo.capabilityTable.ftrSvm); + + drm->storedGTTSize = MemoryConstants::max64BitAppAddress + 1; + ret = hwConfig.configureHwInfo(&pInHwInfo, &outHwInfo, osInterface); + EXPECT_EQ(0, ret); + EXPECT_TRUE(outHwInfo.capabilityTable.ftrSvm); +} + +TEST_F(HwInfoConfigTestLinuxDummy, givenGttSizeReturnedWhenInitializingHwInfoThenSetGpuAddressSpace) { + drm->storedGTTSize = maxNBitValue(40) + 1; + int ret = hwConfig.configureHwInfo(&pInHwInfo, &outHwInfo, osInterface); + EXPECT_EQ(0, ret); + EXPECT_EQ(drm->storedGTTSize - 1, outHwInfo.capabilityTable.gpuAddressSpace); +} + +TEST_F(HwInfoConfigTestLinuxDummy, givenFailingGttSizeIoctlWhenInitializingHwInfoThenSetDefaultValues) { + drm->StoredRetValForGetGttSize = -1; + int ret = hwConfig.configureHwInfo(&pInHwInfo, &outHwInfo, osInterface); + EXPECT_EQ(0, ret); + + EXPECT_TRUE(outHwInfo.capabilityTable.ftrSvm); + EXPECT_NE(0u, outHwInfo.capabilityTable.gpuAddressSpace); + EXPECT_EQ(pInHwInfo.capabilityTable.gpuAddressSpace, outHwInfo.capabilityTable.gpuAddressSpace); +}