From 030945bcd335d74f769a7acc7011fc3fcc700f42 Mon Sep 17 00:00:00 2001 From: "Milczarek, Slawomir" Date: Wed, 31 Jul 2019 22:44:27 +0200 Subject: [PATCH] Extended DRM interface with function to set memory regions Related-To: NEO-3008 Change-Id: I3f2d5571d670b43225e77e4f80e121aee215d61a Signed-off-by: Milczarek, Slawomir --- runtime/dll/linux/drm_neo_create.cpp | 1 + runtime/os_interface/linux/drm_neo.h | 5 +++ runtime/os_interface/linux/drm_query.cpp | 3 ++ .../linux/drm_memory_info_tests.cpp | 34 +++++++++++++++++++ unit_tests/os_interface/linux/drm_mock.h | 6 ++++ 5 files changed, 49 insertions(+) diff --git a/runtime/dll/linux/drm_neo_create.cpp b/runtime/dll/linux/drm_neo_create.cpp index 959c4fdf4b..006d36d580 100644 --- a/runtime/dll/linux/drm_neo_create.cpp +++ b/runtime/dll/linux/drm_neo_create.cpp @@ -189,6 +189,7 @@ Drm *Drm::create(int32_t deviceOrdinal) { drmObject->queryEngineInfo(); if (HwHelper::get(device->pHwInfo->platform.eRenderCoreFamily).getEnableLocalMemory(*device->pHwInfo)) { drmObject->queryMemoryInfo(); + drmObject->setMemoryRegions(); } drms[deviceOrdinal % drms.size()] = drmObject.release(); diff --git a/runtime/os_interface/linux/drm_neo.h b/runtime/os_interface/linux/drm_neo.h index fbff51b596..bef49b8f2b 100644 --- a/runtime/os_interface/linux/drm_neo.h +++ b/runtime/os_interface/linux/drm_neo.h @@ -6,6 +6,7 @@ */ #pragma once +#include "core/helpers/basic_math.h" #include "runtime/os_interface/linux/engine_info.h" #include "runtime/os_interface/linux/memory_info.h" #include "runtime/utilities/api_intercept.h" @@ -74,6 +75,7 @@ class Drm { bool getSimplifiedMocsTableUsage() const; void queryEngineInfo(); void queryMemoryInfo(); + void setMemoryRegions(); MemoryInfo *getMemoryInfo() const { return memoryInfo.get(); @@ -99,6 +101,9 @@ class Drm { std::string getSysFsPciPath(int deviceID); void *query(uint32_t queryId); + static inline uint16_t getMemoryTypeFromRegion(uint32_t region) { return Math::log2(region >> 16); }; + static inline uint16_t getInstanceFromRegion(uint32_t region) { return Math::log2(region & 0xFFFF); }; + #pragma pack(1) struct PCIConfig { uint16_t VendorID; diff --git a/runtime/os_interface/linux/drm_query.cpp b/runtime/os_interface/linux/drm_query.cpp index 7a4db05cc8..3807bbce6f 100644 --- a/runtime/os_interface/linux/drm_query.cpp +++ b/runtime/os_interface/linux/drm_query.cpp @@ -21,6 +21,9 @@ void Drm::queryEngineInfo() { void Drm::queryMemoryInfo() { } +void Drm::setMemoryRegions() { +} + unsigned int Drm::bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, aub_stream::EngineType engineType) { return DrmEngineMapper::engineNodeMap(engineType); } diff --git a/unit_tests/os_interface/linux/drm_memory_info_tests.cpp b/unit_tests/os_interface/linux/drm_memory_info_tests.cpp index 5a9c66862f..5fc54d95b6 100644 --- a/unit_tests/os_interface/linux/drm_memory_info_tests.cpp +++ b/unit_tests/os_interface/linux/drm_memory_info_tests.cpp @@ -27,6 +27,15 @@ TEST(DrmTest, whenQueryingMemoryInfoThenMemoryInfoIsNotCreatedAndNoIoctlIsCalled EXPECT_EQ(0u, drm->ioctlCallsCount); } +TEST(DrmTest, whenSettingMemoryRegionsThenNoIoctlIsCalled) { + std::unique_ptr drm = std::make_unique(); + EXPECT_NE(nullptr, drm); + + drm->setMemoryRegions(); + + EXPECT_EQ(0u, drm->ioctlCallsCount); +} + TEST(DrmTest, givenMemoryInfoWhenGetMemoryInfoIsCalledThenValidPtrIsReturned) { std::unique_ptr drm = std::make_unique(); EXPECT_NE(nullptr, drm); @@ -39,3 +48,28 @@ TEST(DrmTest, givenMemoryInfoWhenGetMemoryInfoIsCalledThenValidPtrIsReturned) { TEST(MemoryInfo, givenMemoryInfoImplementationWhenDestructingThenDestructorIsCalled) { MemoryInfoImpl memoryInfoImpl; } + +TEST(MemoryInfo, givenMemoryRegionIdWhenGetMemoryTypeFromRegionAndGetInstanceFromRegionAreCalledThenMemoryTypeAndInstanceAreReturned) { + std::unique_ptr drm = std::make_unique(); + EXPECT_NE(nullptr, drm); + + auto regionSmem = drm->createMemoryRegionId(0, 0); + EXPECT_EQ(0u, drm->getMemoryTypeFromRegion(regionSmem)); + EXPECT_EQ(0u, drm->getInstanceFromRegion(regionSmem)); + + auto regionLmem = drm->createMemoryRegionId(1, 0); + EXPECT_EQ(1u, drm->getMemoryTypeFromRegion(regionLmem)); + EXPECT_EQ(0u, drm->getInstanceFromRegion(regionLmem)); + + auto regionLmem1 = drm->createMemoryRegionId(1, 1); + EXPECT_EQ(1u, drm->getMemoryTypeFromRegion(regionLmem1)); + EXPECT_EQ(1u, drm->getInstanceFromRegion(regionLmem1)); + + auto regionLmem2 = drm->createMemoryRegionId(1, 2); + EXPECT_EQ(1u, drm->getMemoryTypeFromRegion(regionLmem2)); + EXPECT_EQ(2u, drm->getInstanceFromRegion(regionLmem2)); + + auto regionLmem3 = drm->createMemoryRegionId(1, 3); + EXPECT_EQ(1u, drm->getMemoryTypeFromRegion(regionLmem3)); + EXPECT_EQ(3u, drm->getInstanceFromRegion(regionLmem3)); +} diff --git a/unit_tests/os_interface/linux/drm_mock.h b/unit_tests/os_interface/linux/drm_mock.h index 62d4996263..665a4a6cfc 100644 --- a/unit_tests/os_interface/linux/drm_mock.h +++ b/unit_tests/os_interface/linux/drm_mock.h @@ -20,6 +20,8 @@ using namespace NEO; // Mock DRM class that responds to DRM_IOCTL_I915_GETPARAMs class DrmMock : public Drm { public: + using Drm::getInstanceFromRegion; + using Drm::getMemoryTypeFromRegion; using Drm::memoryInfo; using Drm::preemptionSupported; using Drm::query; @@ -65,6 +67,10 @@ class DrmMock : public Drm { void setDeviceID(int deviceId) { this->deviceId = deviceId; } void setDeviceRevID(int revisionId) { this->revisionId = revisionId; } + inline uint32_t createMemoryRegionId(uint16_t type, uint16_t instance) const { + return (1u << (type + 16)) | (1u << instance); + } + static const int mockFd = 33; int StoredEUVal = -1;