Extended DRM interface with function to set memory regions

Related-To: NEO-3008

Change-Id: I3f2d5571d670b43225e77e4f80e121aee215d61a
Signed-off-by: Milczarek, Slawomir <slawomir.milczarek@intel.com>
This commit is contained in:
Milczarek, Slawomir
2019-07-31 22:44:27 +02:00
committed by sys_ocldev
parent 6b21ae07ad
commit 030945bcd3
5 changed files with 49 additions and 0 deletions

View File

@@ -189,6 +189,7 @@ Drm *Drm::create(int32_t deviceOrdinal) {
drmObject->queryEngineInfo(); drmObject->queryEngineInfo();
if (HwHelper::get(device->pHwInfo->platform.eRenderCoreFamily).getEnableLocalMemory(*device->pHwInfo)) { if (HwHelper::get(device->pHwInfo->platform.eRenderCoreFamily).getEnableLocalMemory(*device->pHwInfo)) {
drmObject->queryMemoryInfo(); drmObject->queryMemoryInfo();
drmObject->setMemoryRegions();
} }
drms[deviceOrdinal % drms.size()] = drmObject.release(); drms[deviceOrdinal % drms.size()] = drmObject.release();

View File

@@ -6,6 +6,7 @@
*/ */
#pragma once #pragma once
#include "core/helpers/basic_math.h"
#include "runtime/os_interface/linux/engine_info.h" #include "runtime/os_interface/linux/engine_info.h"
#include "runtime/os_interface/linux/memory_info.h" #include "runtime/os_interface/linux/memory_info.h"
#include "runtime/utilities/api_intercept.h" #include "runtime/utilities/api_intercept.h"
@@ -74,6 +75,7 @@ class Drm {
bool getSimplifiedMocsTableUsage() const; bool getSimplifiedMocsTableUsage() const;
void queryEngineInfo(); void queryEngineInfo();
void queryMemoryInfo(); void queryMemoryInfo();
void setMemoryRegions();
MemoryInfo *getMemoryInfo() const { MemoryInfo *getMemoryInfo() const {
return memoryInfo.get(); return memoryInfo.get();
@@ -99,6 +101,9 @@ class Drm {
std::string getSysFsPciPath(int deviceID); std::string getSysFsPciPath(int deviceID);
void *query(uint32_t queryId); 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) #pragma pack(1)
struct PCIConfig { struct PCIConfig {
uint16_t VendorID; uint16_t VendorID;

View File

@@ -21,6 +21,9 @@ void Drm::queryEngineInfo() {
void Drm::queryMemoryInfo() { void Drm::queryMemoryInfo() {
} }
void Drm::setMemoryRegions() {
}
unsigned int Drm::bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, aub_stream::EngineType engineType) { unsigned int Drm::bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, aub_stream::EngineType engineType) {
return DrmEngineMapper::engineNodeMap(engineType); return DrmEngineMapper::engineNodeMap(engineType);
} }

View File

@@ -27,6 +27,15 @@ TEST(DrmTest, whenQueryingMemoryInfoThenMemoryInfoIsNotCreatedAndNoIoctlIsCalled
EXPECT_EQ(0u, drm->ioctlCallsCount); EXPECT_EQ(0u, drm->ioctlCallsCount);
} }
TEST(DrmTest, whenSettingMemoryRegionsThenNoIoctlIsCalled) {
std::unique_ptr<DrmMock> drm = std::make_unique<DrmMock>();
EXPECT_NE(nullptr, drm);
drm->setMemoryRegions();
EXPECT_EQ(0u, drm->ioctlCallsCount);
}
TEST(DrmTest, givenMemoryInfoWhenGetMemoryInfoIsCalledThenValidPtrIsReturned) { TEST(DrmTest, givenMemoryInfoWhenGetMemoryInfoIsCalledThenValidPtrIsReturned) {
std::unique_ptr<DrmMock> drm = std::make_unique<DrmMock>(); std::unique_ptr<DrmMock> drm = std::make_unique<DrmMock>();
EXPECT_NE(nullptr, drm); EXPECT_NE(nullptr, drm);
@@ -39,3 +48,28 @@ TEST(DrmTest, givenMemoryInfoWhenGetMemoryInfoIsCalledThenValidPtrIsReturned) {
TEST(MemoryInfo, givenMemoryInfoImplementationWhenDestructingThenDestructorIsCalled) { TEST(MemoryInfo, givenMemoryInfoImplementationWhenDestructingThenDestructorIsCalled) {
MemoryInfoImpl memoryInfoImpl; MemoryInfoImpl memoryInfoImpl;
} }
TEST(MemoryInfo, givenMemoryRegionIdWhenGetMemoryTypeFromRegionAndGetInstanceFromRegionAreCalledThenMemoryTypeAndInstanceAreReturned) {
std::unique_ptr<DrmMock> drm = std::make_unique<DrmMock>();
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));
}

View File

@@ -20,6 +20,8 @@ using namespace NEO;
// Mock DRM class that responds to DRM_IOCTL_I915_GETPARAMs // Mock DRM class that responds to DRM_IOCTL_I915_GETPARAMs
class DrmMock : public Drm { class DrmMock : public Drm {
public: public:
using Drm::getInstanceFromRegion;
using Drm::getMemoryTypeFromRegion;
using Drm::memoryInfo; using Drm::memoryInfo;
using Drm::preemptionSupported; using Drm::preemptionSupported;
using Drm::query; using Drm::query;
@@ -65,6 +67,10 @@ class DrmMock : public Drm {
void setDeviceID(int deviceId) { this->deviceId = deviceId; } void setDeviceID(int deviceId) { this->deviceId = deviceId; }
void setDeviceRevID(int revisionId) { this->revisionId = revisionId; } 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; static const int mockFd = 33;
int StoredEUVal = -1; int StoredEUVal = -1;