Modify handle create handle implementation for sysman engine

Signed-off-by: Mayank Raghuwanshi <mayank.raghuwanshi@intel.com>
This commit is contained in:
Mayank Raghuwanshi 2021-06-12 12:07:21 +05:30 committed by Compute-Runtime-Automation
parent 79c258977a
commit a19eab36fb
12 changed files with 59 additions and 46 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 Intel Corporation
* Copyright (C) 2020-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@ -22,16 +22,16 @@ EngineHandleContext::~EngineHandleContext() {
releaseEngines();
}
void EngineHandleContext::createHandle(zes_engine_group_t engineType, uint32_t engineInstance) {
Engine *pEngine = new EngineImp(pOsSysman, engineType, engineInstance);
void EngineHandleContext::createHandle(zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId) {
Engine *pEngine = new EngineImp(pOsSysman, engineType, engineInstance, subDeviceId);
handleList.push_back(pEngine);
}
void EngineHandleContext::init() {
std::multimap<zes_engine_group_t, uint32_t> engineGroupInstance = {};
std::set<std::pair<zes_engine_group_t, EngineInstanceSubDeviceId>> engineGroupInstance = {}; //set contains pair of engine group and struct containing engine instance and subdeviceId
OsEngine::getNumEngineTypeAndInstances(engineGroupInstance, pOsSysman);
for (auto itr = engineGroupInstance.begin(); itr != engineGroupInstance.end(); ++itr) {
createHandle(itr->first, itr->second);
createHandle(itr->first, itr->second.first, itr->second.second);
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 Intel Corporation
* Copyright (C) 2020-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@ -16,7 +16,7 @@ struct _zes_engine_handle_t {
};
namespace L0 {
using EngineInstanceSubDeviceId = std::pair<uint32_t, uint32_t>;
struct OsSysman;
class Engine : _zes_engine_handle_t {
@ -43,7 +43,7 @@ struct EngineHandleContext {
std::vector<Engine *> handleList = {};
private:
void createHandle(zes_engine_group_t engineType, uint32_t engineInstance);
void createHandle(zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId);
};
} // namespace L0

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 Intel Corporation
* Copyright (C) 2020-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@ -23,8 +23,8 @@ void EngineImp::init() {
pOsEngine->getProperties(engineProperties);
}
EngineImp::EngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance) {
pOsEngine = OsEngine::create(pOsSysman, engineType, engineInstance);
EngineImp::EngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId) {
pOsEngine = OsEngine::create(pOsSysman, engineType, engineInstance, subDeviceId);
init();
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 Intel Corporation
* Copyright (C) 2020-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@ -20,7 +20,7 @@ class EngineImp : public Engine, NEO::NonCopyableOrMovableClass {
ze_result_t engineGetActivity(zes_engine_stats_t *pStats) override;
EngineImp() = default;
EngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance);
EngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId);
~EngineImp() override;
OsEngine *pOsEngine = nullptr;

View File

@ -27,7 +27,7 @@ static const std::multimap<zes_engine_group_t, __u16> engineToI915Map = {
{ZES_ENGINE_GROUP_COPY_SINGLE, static_cast<__u16>(I915_ENGINE_CLASS_COPY)},
{ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE, static_cast<__u16>(I915_ENGINE_CLASS_VIDEO_ENHANCE)}};
ze_result_t OsEngine::getNumEngineTypeAndInstances(std::multimap<zes_engine_group_t, uint32_t> &engineGroupInstance, OsSysman *pOsSysman) {
ze_result_t OsEngine::getNumEngineTypeAndInstances(std::set<std::pair<zes_engine_group_t, EngineInstanceSubDeviceId>> &engineGroupInstance, OsSysman *pOsSysman) {
LinuxSysmanImp *pLinuxSysmanImp = static_cast<LinuxSysmanImp *>(pOsSysman);
NEO::Drm *pDrm = &pLinuxSysmanImp->getDrm();
@ -36,12 +36,11 @@ ze_result_t OsEngine::getNumEngineTypeAndInstances(std::multimap<zes_engine_grou
}
auto engineInfo = static_cast<NEO::EngineInfoImpl *>(pDrm->getEngineInfo());
for (auto itr = engineInfo->engines.begin(); itr != engineInfo->engines.end(); ++itr) {
auto L0EngineEntryInMap = i915ToEngineMap.find(static_cast<__u16>(itr->engine.engine_class));
if (L0EngineEntryInMap == i915ToEngineMap.end()) {
continue;
}
auto i915ToEngineMapRange = i915ToEngineMap.equal_range(static_cast<__u16>(itr->engine.engine_class));
for (auto L0EngineEntryInMap = i915ToEngineMapRange.first; L0EngineEntryInMap != i915ToEngineMapRange.second; L0EngineEntryInMap++) {
auto L0EngineType = L0EngineEntryInMap->second;
engineGroupInstance.insert({L0EngineType, static_cast<uint32_t>(itr->engine.engine_instance)});
engineGroupInstance.insert({L0EngineType, {static_cast<uint32_t>(itr->engine.engine_instance), 0}});
}
}
return ZE_RESULT_SUCCESS;
}
@ -63,7 +62,7 @@ ze_result_t LinuxEngineImp::getActivity(zes_engine_stats_t *pStats) {
ze_result_t LinuxEngineImp::getProperties(zes_engine_properties_t &properties) {
properties.type = engineGroup;
properties.onSubdevice = 0;
properties.subdeviceId = 0;
properties.subdeviceId = subDeviceId;
return ZE_RESULT_SUCCESS;
}
@ -73,7 +72,7 @@ void LinuxEngineImp::init() {
fd = pPmuInterface->pmuInterfaceOpen(I915_PMU_ENGINE_BUSY(i915EngineClass->second, engineInstance), -1, PERF_FORMAT_TOTAL_TIME_ENABLED);
}
LinuxEngineImp::LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance) : engineGroup(type), engineInstance(engineInstance) {
LinuxEngineImp::LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t subDeviceId) : engineGroup(type), engineInstance(engineInstance), subDeviceId(subDeviceId) {
LinuxSysmanImp *pLinuxSysmanImp = static_cast<LinuxSysmanImp *>(pOsSysman);
pDrm = &pLinuxSysmanImp->getDrm();
pDevice = pLinuxSysmanImp->getDeviceHandle();
@ -81,8 +80,8 @@ LinuxEngineImp::LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uin
init();
}
OsEngine *OsEngine::create(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance) {
LinuxEngineImp *pLinuxEngineImp = new LinuxEngineImp(pOsSysman, type, engineInstance);
OsEngine *OsEngine::create(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t subDeviceId) {
LinuxEngineImp *pLinuxEngineImp = new LinuxEngineImp(pOsSysman, type, engineInstance, subDeviceId);
return static_cast<OsEngine *>(pLinuxEngineImp);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 Intel Corporation
* Copyright (C) 2020-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@ -19,8 +19,9 @@ class LinuxEngineImp : public OsEngine, NEO::NonCopyableOrMovableClass {
public:
ze_result_t getActivity(zes_engine_stats_t *pStats) override;
ze_result_t getProperties(zes_engine_properties_t &properties) override;
static zes_engine_group_t getGroupFromEngineType(zes_engine_group_t type);
LinuxEngineImp() = default;
LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance);
LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t subDeviceId);
~LinuxEngineImp() override {
if (fd != -1) {
close(static_cast<int>(fd));
@ -34,6 +35,8 @@ class LinuxEngineImp : public OsEngine, NEO::NonCopyableOrMovableClass {
PmuInterface *pPmuInterface = nullptr;
NEO::Drm *pDrm = nullptr;
Device *pDevice = nullptr;
uint32_t subDeviceId = 0;
uint32_t onSubDevice = 0;
private:
void init();

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 Intel Corporation
* Copyright (C) 2020-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@ -7,9 +7,10 @@
#pragma once
#include "level_zero/tools/source/sysman/engine/engine.h"
#include <level_zero/zes_api.h>
#include <map>
#include <set>
namespace L0 {
@ -20,8 +21,8 @@ class OsEngine {
public:
virtual ze_result_t getActivity(zes_engine_stats_t *pStats) = 0;
virtual ze_result_t getProperties(zes_engine_properties_t &properties) = 0;
static OsEngine *create(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance);
static ze_result_t getNumEngineTypeAndInstances(std::multimap<zes_engine_group_t, uint32_t> &engineGroupInstance, OsSysman *pOsSysman);
static OsEngine *create(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId);
static ze_result_t getNumEngineTypeAndInstances(std::set<std::pair<zes_engine_group_t, EngineInstanceSubDeviceId>> &engineGroupInstance, OsSysman *pOsSysman);
virtual ~OsEngine() = default;
};

View File

@ -57,18 +57,18 @@ ze_result_t WddmEngineImp::getProperties(zes_engine_properties_t &properties) {
return ZE_RESULT_SUCCESS;
}
WddmEngineImp::WddmEngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance) {
WddmEngineImp::WddmEngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId) {
WddmSysmanImp *pWddmSysmanImp = static_cast<WddmSysmanImp *>(pOsSysman);
this->engineGroup = engineType;
pKmdSysManager = &pWddmSysmanImp->getKmdSysManager();
}
OsEngine *OsEngine::create(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance) {
WddmEngineImp *pWddmEngineImp = new WddmEngineImp(pOsSysman, engineType, engineInstance);
OsEngine *OsEngine::create(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId) {
WddmEngineImp *pWddmEngineImp = new WddmEngineImp(pOsSysman, engineType, engineInstance, subDeviceId);
return static_cast<OsEngine *>(pWddmEngineImp);
}
ze_result_t OsEngine::getNumEngineTypeAndInstances(std::multimap<zes_engine_group_t, uint32_t> &engineGroupInstance, OsSysman *pOsSysman) {
ze_result_t OsEngine::getNumEngineTypeAndInstances(std::set<std::pair<zes_engine_group_t, EngineInstanceSubDeviceId>> &engineGroupInstance, OsSysman *pOsSysman) {
WddmSysmanImp *pWddmSysmanImp = static_cast<WddmSysmanImp *>(pOsSysman);
KmdSysManager *pKmdSysManager = &pWddmSysmanImp->getKmdSysManager();
@ -93,7 +93,7 @@ ze_result_t OsEngine::getNumEngineTypeAndInstances(std::multimap<zes_engine_grou
}
for (uint32_t i = 0; i < maxNumEnginesSupported; i++) {
engineGroupInstance.insert({static_cast<zes_engine_group_t>(i), 0});
engineGroupInstance.insert({static_cast<zes_engine_group_t>(i), {0, 0}});
}
return status;

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 Intel Corporation
* Copyright (C) 2020-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@ -19,7 +19,7 @@ class WddmEngineImp : public OsEngine, NEO::NonCopyableOrMovableClass {
ze_result_t getProperties(zes_engine_properties_t &properties) override;
WddmEngineImp() = default;
WddmEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance);
WddmEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t subDeviceId);
~WddmEngineImp() override = default;
protected:

View File

@ -539,7 +539,13 @@ std::string getEngineType(zes_engine_group_t engineGroup) {
{ZES_ENGINE_GROUP_RENDER_SINGLE, "ZES_ENGINE_GROUP_RENDER_SINGLE"},
{ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE, "ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE"},
{ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE, "ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE"},
{ZES_ENGINE_GROUP_COPY_SINGLE, "ZES_ENGINE_GROUP_COPY_SINGLE"}};
{ZES_ENGINE_GROUP_COPY_SINGLE, "ZES_ENGINE_GROUP_COPY_SINGLE"},
{ZES_ENGINE_GROUP_ALL, "ZES_ENGINE_GROUP_ALL"},
{ZES_ENGINE_GROUP_COMPUTE_ALL, "ZES_ENGINE_GROUP_COMPUTE_ALL"},
{ZES_ENGINE_GROUP_COPY_ALL, "ZES_ENGINE_GROUP_COPY_ALL"},
{ZES_ENGINE_GROUP_RENDER_ALL, "ZES_ENGINE_GROUP_RENDER_ALL"},
{ZES_ENGINE_GROUP_MEDIA_ALL, "ZES_ENGINE_GROUP_MEDIA_ALL"},
{ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE, "ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE"}};
auto i = mgetEngineType.find(engineGroup);
if (i == mgetEngineType.end())
return "NOT SUPPORTED MODE Engine avalialbe";

View File

@ -44,8 +44,8 @@ struct Mock<EngineNeoDrm> : public EngineNeoDrm {
drm_i915_engine_info i915engineInfo[6] = {};
i915engineInfo[0].engine.engine_class = I915_ENGINE_CLASS_RENDER;
i915engineInfo[0].engine.engine_instance = 0;
i915engineInfo[1].engine.engine_class = I915_ENGINE_CLASS_VIDEO;
i915engineInfo[1].engine.engine_instance = 0;
i915engineInfo[1].engine.engine_class = I915_ENGINE_CLASS_RENDER;
i915engineInfo[1].engine.engine_instance = 1;
i915engineInfo[2].engine.engine_class = I915_ENGINE_CLASS_VIDEO;
i915engineInfo[2].engine.engine_instance = 1;
i915engineInfo[3].engine.engine_class = I915_ENGINE_CLASS_COPY;

View File

@ -14,7 +14,7 @@ using ::testing::Return;
class OsEngine;
namespace L0 {
namespace ult {
constexpr uint32_t handleComponentCount = 5u;
constexpr uint32_t handleComponentCount = 6u;
class ZesEngineFixture : public SysmanDeviceFixture {
protected:
std::unique_ptr<Mock<EngineNeoDrm>> pDrm;
@ -106,7 +106,7 @@ TEST_F(ZesEngineFixture, GivenValidEngineHandlesWhenCallingZesEngineGetPropertie
EXPECT_FALSE(properties.onSubdevice);
EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handle[1], &properties));
EXPECT_EQ(ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE, properties.type);
EXPECT_EQ(ZES_ENGINE_GROUP_RENDER_SINGLE, properties.type);
EXPECT_FALSE(properties.onSubdevice);
EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handle[2], &properties));
@ -114,10 +114,14 @@ TEST_F(ZesEngineFixture, GivenValidEngineHandlesWhenCallingZesEngineGetPropertie
EXPECT_FALSE(properties.onSubdevice);
EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handle[3], &properties));
EXPECT_EQ(ZES_ENGINE_GROUP_COPY_SINGLE, properties.type);
EXPECT_EQ(ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE, properties.type);
EXPECT_FALSE(properties.onSubdevice);
EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handle[4], &properties));
EXPECT_EQ(ZES_ENGINE_GROUP_COPY_SINGLE, properties.type);
EXPECT_FALSE(properties.onSubdevice);
EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handle[5], &properties));
EXPECT_EQ(ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE, properties.type);
EXPECT_FALSE(properties.onSubdevice);
}
@ -156,7 +160,7 @@ TEST_F(ZesEngineFixture, GivenTestDiscreteDevicesAndValidEngineHandleWhenCalling
ON_CALL(*pSysfsAccess.get(), readSymLink(_, _))
.WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<EngineSysfsAccess>::getValStringSymLinkFailure));
auto pOsEngineTest1 = OsEngine::create(pOsSysman, ZES_ENGINE_GROUP_RENDER_SINGLE, 0u);
auto pOsEngineTest1 = OsEngine::create(pOsSysman, ZES_ENGINE_GROUP_RENDER_SINGLE, 0u, 0u);
zes_engine_stats_t stats = {};
EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, pOsEngineTest1->getActivity(&stats));
@ -166,7 +170,7 @@ TEST_F(ZesEngineFixture, GivenTestDiscreteDevicesAndValidEngineHandleWhenCalling
ON_CALL(*pFsAccess.get(), read(_, _))
.WillByDefault(::testing::Invoke(pFsAccess.get(), &Mock<EngineFsAccess>::readValFailure));
auto pOsEngineTest2 = OsEngine::create(pOsSysman, ZES_ENGINE_GROUP_RENDER_SINGLE, 0u);
auto pOsEngineTest2 = OsEngine::create(pOsSysman, ZES_ENGINE_GROUP_RENDER_SINGLE, 0u, 0u);
EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, pOsEngineTest2->getActivity(&stats));
delete pOsEngineTest1;
delete pOsEngineTest2;
@ -178,7 +182,7 @@ TEST_F(ZesEngineFixture, GivenTestIntegratedDevicesAndValidEngineHandleWhenCalli
ON_CALL(*pFsAccess.get(), read(_, _))
.WillByDefault(::testing::Invoke(pFsAccess.get(), &Mock<EngineFsAccess>::readValFailure));
auto pOsEngineTest1 = OsEngine::create(pOsSysman, ZES_ENGINE_GROUP_RENDER_SINGLE, 0u);
auto pOsEngineTest1 = OsEngine::create(pOsSysman, ZES_ENGINE_GROUP_RENDER_SINGLE, 0u, 0u);
EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, pOsEngineTest1->getActivity(&stats));
delete pOsEngineTest1;
}
@ -204,7 +208,7 @@ TEST_F(ZesEngineFixture, GivenValidEngineHandleWhenCallingZesEngineGetActivityAn
}
TEST_F(ZesEngineFixture, GivenValidOsSysmanPointerWhenRetrievingEngineTypeAndInstancesAndIfEngineInfoQueryFailsThenErrorIsReturned) {
std::multimap<zes_engine_group_t, uint32_t> engineGroupInstance;
std::set<std::pair<zes_engine_group_t, EngineInstanceSubDeviceId>> engineGroupInstance;
ON_CALL(*pDrm.get(), sysmanQueryEngineInfo())
.WillByDefault(::testing::Invoke(pDrm.get(), &Mock<EngineNeoDrm>::queryEngineInfoMockReturnFalse));