Skip to content

Commit c9e2b4b

Browse files
Pass Drm to ioctl helper ctor
Related-To: NEO-6999 Signed-off-by: Mateusz Jablonski <[email protected]>
1 parent 115761b commit c9e2b4b

File tree

15 files changed

+97
-82
lines changed

15 files changed

+97
-82
lines changed

level_zero/tools/test/unit_tests/sources/metrics/linux/test_metric_ip_sampling_linux_pvc_prelim.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ namespace L0 {
2828
namespace ult {
2929

3030
class IoctlHelperPrelim20Mock : public NEO::IoctlHelperPrelim20 {
31-
31+
public:
32+
using NEO::IoctlHelperPrelim20::IoctlHelperPrelim20;
3233
bool getEuStallProperties(std::array<uint64_t, 12u> &properties, uint64_t dssBufferSize, uint64_t samplingRate,
3334
uint64_t pollPeriod, uint64_t engineInstance, uint64_t notifyNReports) override {
3435
return false;
@@ -43,7 +44,7 @@ class DrmPrelimMock : public DrmMock {
4344
&inputHwInfo->workaroundTable, &inputHwInfo->gtSystemInfo, inputHwInfo->capabilityTable);
4445
customHwInfo->gtSystemInfo.MaxDualSubSlicesSupported = 64;
4546
rootDeviceEnvironment.setHwInfo(customHwInfo.get());
46-
this->ioctlHelper = std::make_unique<IoctlHelperPrelim20>();
47+
this->ioctlHelper = std::make_unique<IoctlHelperPrelim20>(*this);
4748
if (invokeQueryEngineInfo) {
4849
queryEngineInfo(); // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall)
4950
}
@@ -101,7 +102,7 @@ class DrmPrelimMock : public DrmMock {
101102

102103
void setIoctlHelperPrelim20Mock() {
103104
backUpIoctlHelper = std::move(ioctlHelper);
104-
ioctlHelper = static_cast<std::unique_ptr<NEO::IoctlHelper>>(std::make_unique<IoctlHelperPrelim20Mock>());
105+
ioctlHelper = static_cast<std::unique_ptr<NEO::IoctlHelper>>(std::make_unique<IoctlHelperPrelim20Mock>(*this));
105106
}
106107

107108
void restoreIoctlHelperPrelim20() {

shared/source/os_interface/linux/drm_neo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ void Drm::setupIoctlHelper(const PRODUCT_FAMILY productFamily) {
989989
std::string prelimVersion = "";
990990
getPrelimVersion(prelimVersion);
991991
auto drmVersion = Drm::getDrmVersion(getFileDescriptor());
992-
this->ioctlHelper.reset(IoctlHelper::get(productFamily, prelimVersion, drmVersion));
992+
this->ioctlHelper = IoctlHelper::get(productFamily, prelimVersion, drmVersion, *this);
993993
}
994994
}
995995

shared/source/os_interface/linux/ioctl_helper.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ class IoctlHelper;
2525
enum class CacheRegion : uint16_t;
2626
struct HardwareInfo;
2727

28-
extern IoctlHelper *ioctlHelperFactory[IGFX_MAX_PRODUCT];
29-
3028
struct MemoryRegion {
3129
MemoryClassInstance region;
3230
uint64_t probedSize;
@@ -65,10 +63,10 @@ using VmBindExtUserFenceT = uint8_t[56];
6563

6664
class IoctlHelper {
6765
public:
66+
IoctlHelper(Drm &drmArg) : drm(drmArg){};
6867
virtual ~IoctlHelper() {}
69-
static IoctlHelper *get(const PRODUCT_FAMILY productFamily, const std::string &prelimVersion, const std::string &drmVersion);
68+
static std::unique_ptr<IoctlHelper> get(const PRODUCT_FAMILY productFamily, const std::string &prelimVersion, const std::string &drmVersion, Drm &drm);
7069
uint32_t ioctl(Drm *drm, DrmIoctl request, void *arg);
71-
virtual IoctlHelper *clone() = 0;
7270

7371
virtual bool isVmBindAvailable(Drm *drm) = 0;
7472
virtual uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, std::optional<uint32_t> vmId) = 0;
@@ -124,11 +122,14 @@ class IoctlHelper {
124122
void logExecBuffer(const ExecBuffer &execBuffer, std::stringstream &logger);
125123
int getDrmParamValueBase(DrmParam drmParam) const;
126124
unsigned int getIoctlRequestValueBase(DrmIoctl ioctlRequest) const;
125+
126+
protected:
127+
Drm &drm;
127128
};
128129

129130
class IoctlHelperUpstream : public IoctlHelper {
130131
public:
131-
IoctlHelper *clone() override;
132+
using IoctlHelper::IoctlHelper;
132133

133134
bool isVmBindAvailable(Drm *drm) override;
134135
uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, std::optional<uint32_t> vmId) override;
@@ -176,11 +177,10 @@ class IoctlHelperUpstream : public IoctlHelper {
176177
template <PRODUCT_FAMILY gfxProduct>
177178
class IoctlHelperImpl : public IoctlHelperUpstream {
178179
public:
179-
static IoctlHelper *get() {
180-
static IoctlHelperImpl<gfxProduct> instance;
181-
return &instance;
180+
using IoctlHelperUpstream::IoctlHelperUpstream;
181+
static std::unique_ptr<IoctlHelper> get(Drm &drm) {
182+
return std::make_unique<IoctlHelperImpl<gfxProduct>>(drm);
182183
}
183-
IoctlHelper *clone() override;
184184

185185
uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, std::optional<uint32_t> vmId) override;
186186
std::vector<MemoryRegion> translateToMemoryRegions(const std::vector<uint8_t> &regionInfo) override;
@@ -189,7 +189,7 @@ class IoctlHelperImpl : public IoctlHelperUpstream {
189189

190190
class IoctlHelperPrelim20 : public IoctlHelper {
191191
public:
192-
IoctlHelper *clone() override;
192+
using IoctlHelper::IoctlHelper;
193193

194194
bool isVmBindAvailable(Drm *drm) override;
195195
uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, std::optional<uint32_t> vmId) override;

shared/source/os_interface/linux/ioctl_helper_getter.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,22 @@
1010
#include "shared/source/os_interface/linux/drm_neo.h"
1111
#include "shared/source/os_interface/linux/ioctl_helper.h"
1212

13+
#include <functional>
1314
#include <string>
1415

1516
namespace NEO {
1617

17-
IoctlHelper *ioctlHelperFactory[IGFX_MAX_PRODUCT] = {};
18+
std::optional<std::function<std::unique_ptr<IoctlHelper>(Drm &drm)>> ioctlHelperFactory[IGFX_MAX_PRODUCT] = {};
1819

19-
std::map<std::string, std::shared_ptr<IoctlHelper>> ioctlHelperImpls{
20-
{"", std::make_shared<IoctlHelperUpstream>()},
21-
{"2.0", std::make_shared<IoctlHelperPrelim20>()}};
22-
23-
IoctlHelper *IoctlHelper::get(const PRODUCT_FAMILY productFamily, const std::string &prelimVersion, const std::string &drmVersion) {
24-
auto productSpecificIoctlHelper = ioctlHelperFactory[productFamily];
25-
if (productSpecificIoctlHelper) {
26-
return productSpecificIoctlHelper->clone();
20+
std::unique_ptr<IoctlHelper> IoctlHelper::get(const PRODUCT_FAMILY productFamily, const std::string &prelimVersion, const std::string &drmVersion, Drm &drm) {
21+
auto productSpecificIoctlHelperCreator = ioctlHelperFactory[productFamily];
22+
if (productSpecificIoctlHelperCreator) {
23+
return productSpecificIoctlHelperCreator.value()(drm);
2724
}
28-
if (ioctlHelperImpls.find(prelimVersion) != ioctlHelperImpls.end()) {
29-
return ioctlHelperImpls[prelimVersion]->clone();
25+
if (prelimVersion == "") {
26+
return std::make_unique<IoctlHelperUpstream>(drm);
3027
}
31-
return new IoctlHelperPrelim20{}; //fallback to 2.0 if no proper implementation has been found
28+
return std::make_unique<IoctlHelperPrelim20>(drm);
3229
}
3330

3431
} // namespace NEO

shared/source/os_interface/linux/ioctl_helper_getter_upstream.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@
88
#include "shared/source/helpers/hw_info.h"
99
#include "shared/source/os_interface/linux/ioctl_helper.h"
1010

11+
#include <functional>
1112
#include <memory>
1213

1314
namespace NEO {
14-
IoctlHelper *ioctlHelperFactory[IGFX_MAX_PRODUCT] = {};
15+
std::optional<std::function<std::unique_ptr<IoctlHelper>(Drm &drm)>> ioctlHelperFactory[IGFX_MAX_PRODUCT] = {};
1516

16-
IoctlHelper *IoctlHelper::get(const PRODUCT_FAMILY productFamily, const std::string &prelimVersion, const std::string &drmVersion) {
17-
auto productSpecificIoctlHelper = ioctlHelperFactory[productFamily];
18-
if (productSpecificIoctlHelper) {
19-
return productSpecificIoctlHelper->clone();
17+
std::unique_ptr<IoctlHelper> IoctlHelper::get(const PRODUCT_FAMILY productFamily, const std::string &prelimVersion, const std::string &drmVersion, Drm &drm) {
18+
auto productSpecificIoctlHelperCreator = ioctlHelperFactory[productFamily];
19+
if (productSpecificIoctlHelperCreator) {
20+
return productSpecificIoctlHelperCreator.value()(drm);
2021
}
21-
return new IoctlHelperUpstream{};
22+
return std::make_unique<IoctlHelperUpstream>(drm);
2223
}
2324

2425
} // namespace NEO

shared/source/os_interface/linux/ioctl_helper_prelim.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@
2424

2525
namespace NEO {
2626

27-
IoctlHelper *IoctlHelperPrelim20::clone() {
28-
return new IoctlHelperPrelim20{};
29-
}
30-
3127
bool IoctlHelperPrelim20::isVmBindAvailable(Drm *drm) {
3228
int vmBindSupported = 0;
3329
GetParam getParam{};

shared/source/os_interface/linux/ioctl_helper_upstream.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@
1515

1616
namespace NEO {
1717

18-
IoctlHelper *IoctlHelperUpstream::clone() {
19-
return new IoctlHelperUpstream{};
20-
}
21-
2218
bool IoctlHelperUpstream::isVmBindAvailable(Drm *drm) {
2319
return false;
2420
}

shared/source/os_interface/linux/local/dg1/enable_ioctl_helper_dg1.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
/*
2-
* Copyright (C) 2021 Intel Corporation
2+
* Copyright (C) 2021-2022 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
66
*/
77

88
#include "shared/source/os_interface/linux/ioctl_helper.h"
99

10+
#include <functional>
11+
1012
namespace NEO {
11-
extern IoctlHelper *ioctlHelperFactory[IGFX_MAX_PRODUCT];
13+
extern std::optional<std::function<std::unique_ptr<IoctlHelper>(Drm &drm)>> ioctlHelperFactory[IGFX_MAX_PRODUCT];
1214

1315
struct EnableProductIoctlHelperDg1 {
1416
EnableProductIoctlHelperDg1() {
15-
IoctlHelper *pIoctlHelper = IoctlHelperImpl<IGFX_DG1>::get();
16-
ioctlHelperFactory[IGFX_DG1] = pIoctlHelper;
17+
ioctlHelperFactory[IGFX_DG1] = IoctlHelperImpl<IGFX_DG1>::get;
1718
}
1819
};
1920

shared/source/os_interface/linux/local/dg1/ioctl_helper_dg1.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@ constexpr static auto gfxProduct = IGFX_DG1;
1717
extern bool isQueryDrmTip(const std::vector<uint8_t> &queryInfo);
1818
extern std::vector<uint8_t> translateToDrmTip(const uint8_t *dataQuery);
1919

20-
template <>
21-
IoctlHelper *IoctlHelperImpl<gfxProduct>::clone() {
22-
return new IoctlHelperImpl<gfxProduct>{};
23-
}
24-
2520
template <>
2621
uint32_t IoctlHelperImpl<gfxProduct>::createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, std::optional<uint32_t> vmId) {
2722
auto ret = IoctlHelperUpstream::createGemExt(drm, memClassInstances, allocSize, handle, vmId);

shared/test/common/libult/linux/drm_query_mock.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class DrmQueryMock : public DrmMock {
2525
context.hwInfo = rootDeviceEnvironment.getHardwareInfo();
2626
callBaseIsVmBindAvailable = true;
2727

28-
this->ioctlHelper = std::make_unique<IoctlHelperPrelim20>();
28+
this->ioctlHelper = std::make_unique<IoctlHelperPrelim20>(*this);
2929

3030
EXPECT_TRUE(queryMemoryInfo());
3131
EXPECT_EQ(2u + virtualMemoryIds.size(), ioctlCallsCount);

0 commit comments

Comments
 (0)