Skip to content

Commit b9b3465

Browse files
Redesign ULT by mocking sysfs and implementing for frequency
Change-Id: I5979132fc775fe227ed83f4d49f932f4ce2800cc
1 parent 8f70ba9 commit b9b3465

File tree

10 files changed

+269
-218
lines changed

10 files changed

+269
-218
lines changed

level_zero/tools/source/sysman/frequency/frequency_imp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ ze_result_t FrequencyImp::frequencySetRange(const zet_freq_range_t *pLimits) {
5858
}
5959
}
6060
if (newMin > newMax || !newMinValid || !newMaxValid) {
61-
return ZE_RESULT_ERROR_UNKNOWN;
61+
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
6262
}
6363
double currentMax;
6464
pOsFrequency->getMax(currentMax);

level_zero/tools/source/sysman/frequency/linux/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
set(L0_SRCS_TOOLS_SYSMAN_FREQUENCY_LINUX
88
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
99
${CMAKE_CURRENT_SOURCE_DIR}/os_frequency_imp.cpp
10+
${CMAKE_CURRENT_SOURCE_DIR}/os_frequency_imp.h
1011
)
1112

1213
if(UNIX)

level_zero/tools/source/sysman/frequency/linux/os_frequency_imp.cpp

Lines changed: 9 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -5,52 +5,10 @@
55
*
66
*/
77

8-
#include "shared/source/os_interface/linux/drm_neo.h"
9-
#include "shared/source/os_interface/linux/os_interface.h"
10-
11-
#include "level_zero/core/source/device/device.h"
12-
13-
#include "sysman/frequency/frequency_imp.h"
14-
#include "sysman/frequency/os_frequency.h"
15-
#include "sysman/linux/fs_access.h"
16-
#include "sysman/linux/os_sysman_imp.h"
8+
#include "level_zero/tools/source/sysman/frequency/linux/os_frequency_imp.h"
179

1810
namespace L0 {
1911

20-
class LinuxFrequencyImp : public OsFrequency {
21-
public:
22-
ze_result_t getMin(double &min) override;
23-
ze_result_t setMin(double min) override;
24-
ze_result_t getMax(double &max) override;
25-
ze_result_t setMax(double max) override;
26-
ze_result_t getRequest(double &request) override;
27-
ze_result_t getTdp(double &tdp) override;
28-
ze_result_t getActual(double &actual) override;
29-
ze_result_t getEfficient(double &efficient) override;
30-
ze_result_t getMaxVal(double &maxVal) override;
31-
ze_result_t getMinVal(double &minVal) override;
32-
ze_result_t getThrottleReasons(uint32_t &throttleReasons) override;
33-
34-
LinuxFrequencyImp(OsSysman *pOsSysman);
35-
~LinuxFrequencyImp() override = default;
36-
37-
// Don't allow copies of the LinuxFrequencyImp object
38-
LinuxFrequencyImp(const LinuxFrequencyImp &obj) = delete;
39-
LinuxFrequencyImp &operator=(const LinuxFrequencyImp &obj) = delete;
40-
41-
private:
42-
SysfsAccess *pSysfsAccess;
43-
44-
static const std::string minFreqFile;
45-
static const std::string maxFreqFile;
46-
static const std::string requestFreqFile;
47-
static const std::string tdpFreqFile;
48-
static const std::string actualFreqFile;
49-
static const std::string efficientFreqFile;
50-
static const std::string maxValFreqFile;
51-
static const std::string minValFreqFile;
52-
};
53-
5412
const std::string LinuxFrequencyImp::minFreqFile("gt_min_freq_mhz");
5513
const std::string LinuxFrequencyImp::maxFreqFile("gt_max_freq_mhz");
5614
const std::string LinuxFrequencyImp::requestFreqFile("gt_cur_freq_mhz");
@@ -61,7 +19,7 @@ const std::string LinuxFrequencyImp::maxValFreqFile("gt_RP0_freq_mhz");
6119
const std::string LinuxFrequencyImp::minValFreqFile("gt_RPn_freq_mhz");
6220

6321
ze_result_t LinuxFrequencyImp::getMin(double &min) {
64-
int intval;
22+
double intval;
6523

6624
ze_result_t result = pSysfsAccess->read(minFreqFile, intval);
6725
if (ZE_RESULT_SUCCESS != result) {
@@ -80,7 +38,7 @@ ze_result_t LinuxFrequencyImp::setMin(double min) {
8038
}
8139

8240
ze_result_t LinuxFrequencyImp::getMax(double &max) {
83-
int intval;
41+
double intval;
8442

8543
ze_result_t result = pSysfsAccess->read(maxFreqFile, intval);
8644
if (ZE_RESULT_SUCCESS != result) {
@@ -99,7 +57,7 @@ ze_result_t LinuxFrequencyImp::setMax(double max) {
9957
}
10058

10159
ze_result_t LinuxFrequencyImp::getRequest(double &request) {
102-
int intval;
60+
double intval;
10361

10462
ze_result_t result = pSysfsAccess->read(requestFreqFile, intval);
10563
if (ZE_RESULT_SUCCESS != result) {
@@ -110,7 +68,7 @@ ze_result_t LinuxFrequencyImp::getRequest(double &request) {
11068
}
11169

11270
ze_result_t LinuxFrequencyImp::getTdp(double &tdp) {
113-
int intval;
71+
double intval;
11472

11573
ze_result_t result = pSysfsAccess->read(tdpFreqFile, intval);
11674
if (ZE_RESULT_SUCCESS != result) {
@@ -121,7 +79,7 @@ ze_result_t LinuxFrequencyImp::getTdp(double &tdp) {
12179
}
12280

12381
ze_result_t LinuxFrequencyImp::getActual(double &actual) {
124-
int intval;
82+
double intval;
12583

12684
ze_result_t result = pSysfsAccess->read(actualFreqFile, intval);
12785
if (ZE_RESULT_SUCCESS != result) {
@@ -132,7 +90,7 @@ ze_result_t LinuxFrequencyImp::getActual(double &actual) {
13290
}
13391

13492
ze_result_t LinuxFrequencyImp::getEfficient(double &efficient) {
135-
int intval;
93+
double intval;
13694

13795
ze_result_t result = pSysfsAccess->read(efficientFreqFile, intval);
13896
if (ZE_RESULT_SUCCESS != result) {
@@ -143,7 +101,7 @@ ze_result_t LinuxFrequencyImp::getEfficient(double &efficient) {
143101
}
144102

145103
ze_result_t LinuxFrequencyImp::getMaxVal(double &maxVal) {
146-
int intval;
104+
double intval;
147105

148106
ze_result_t result = pSysfsAccess->read(maxValFreqFile, intval);
149107
if (ZE_RESULT_SUCCESS != result) {
@@ -154,7 +112,7 @@ ze_result_t LinuxFrequencyImp::getMaxVal(double &maxVal) {
154112
}
155113

156114
ze_result_t LinuxFrequencyImp::getMinVal(double &minVal) {
157-
int intval;
115+
double intval;
158116

159117
ze_result_t result = pSysfsAccess->read(minValFreqFile, intval);
160118
if (ZE_RESULT_SUCCESS != result) {
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright (C) 2020 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#pragma once
9+
#include "shared/source/helpers/non_copyable_or_moveable.h"
10+
11+
#include "sysman/frequency/frequency_imp.h"
12+
#include "sysman/frequency/os_frequency.h"
13+
#include "sysman/linux/fs_access.h"
14+
#include "sysman/linux/os_sysman_imp.h"
15+
16+
namespace L0 {
17+
18+
class LinuxFrequencyImp : public NEO::NonCopyableClass, public OsFrequency {
19+
public:
20+
ze_result_t getMin(double &min) override;
21+
ze_result_t setMin(double min) override;
22+
ze_result_t getMax(double &max) override;
23+
ze_result_t setMax(double max) override;
24+
ze_result_t getRequest(double &request) override;
25+
ze_result_t getTdp(double &tdp) override;
26+
ze_result_t getActual(double &actual) override;
27+
ze_result_t getEfficient(double &efficient) override;
28+
ze_result_t getMaxVal(double &maxVal) override;
29+
ze_result_t getMinVal(double &minVal) override;
30+
ze_result_t getThrottleReasons(uint32_t &throttleReasons) override;
31+
LinuxFrequencyImp() = default;
32+
LinuxFrequencyImp(OsSysman *pOsSysman);
33+
~LinuxFrequencyImp() override = default;
34+
35+
protected:
36+
SysfsAccess *pSysfsAccess = nullptr;
37+
38+
private:
39+
static const std::string minFreqFile;
40+
static const std::string maxFreqFile;
41+
static const std::string requestFreqFile;
42+
static const std::string tdpFreqFile;
43+
static const std::string actualFreqFile;
44+
static const std::string efficientFreqFile;
45+
static const std::string maxValFreqFile;
46+
static const std::string minValFreqFile;
47+
};
48+
49+
} // namespace L0

level_zero/tools/source/sysman/linux/fs_access.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,13 @@ class SysfsAccess : private FsAccess {
8282
MOCKABLE_VIRTUAL ze_result_t read(const std::string file, std::string &val);
8383
MOCKABLE_VIRTUAL ze_result_t read(const std::string file, int &val);
8484
MOCKABLE_VIRTUAL ze_result_t read(const std::string file, uint64_t &val);
85-
ze_result_t read(const std::string file, double &val);
85+
MOCKABLE_VIRTUAL ze_result_t read(const std::string file, double &val);
8686
ze_result_t read(const std::string file, std::vector<std::string> &val);
8787

8888
ze_result_t write(const std::string file, const std::string val);
8989
MOCKABLE_VIRTUAL ze_result_t write(const std::string file, const int val);
9090
MOCKABLE_VIRTUAL ze_result_t write(const std::string file, const uint64_t val);
91-
ze_result_t write(const std::string file, const double val);
91+
MOCKABLE_VIRTUAL ze_result_t write(const std::string file, const double val);
9292

9393
MOCKABLE_VIRTUAL ze_result_t scanDirEntries(const std::string path, std::vector<std::string> &list);
9494
ze_result_t readSymLink(const std::string path, std::string &buf);

level_zero/tools/test/unit_tests/sources/sysman/frequency/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#
66

77
target_sources(${TARGET_NAME} PRIVATE
8-
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
9-
${CMAKE_CURRENT_SOURCE_DIR}/test_sysman_frequency.cpp
10-
${CMAKE_CURRENT_SOURCE_DIR}/mock_frequency.h
8+
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
119
)
10+
11+
add_subdirectories()
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#
2+
# Copyright (C) 2020 Intel Corporation
3+
#
4+
# SPDX-License-Identifier: MIT
5+
#
6+
7+
if(UNIX)
8+
target_sources(${TARGET_NAME}
9+
PRIVATE
10+
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
11+
${CMAKE_CURRENT_SOURCE_DIR}/test_sysman_frequency.cpp
12+
${CMAKE_CURRENT_SOURCE_DIR}/mock_sysfs_frequency.h
13+
)
14+
endif()
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/*
2+
* Copyright (C) 2020 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#pragma once
9+
#include "level_zero/core/test/unit_tests/mock.h"
10+
#include "level_zero/tools/source/sysman/frequency/linux/os_frequency_imp.h"
11+
12+
#include "sysman/frequency/frequency_imp.h"
13+
#include "sysman/frequency/os_frequency.h"
14+
#include "sysman/linux/fs_access.h"
15+
#include "sysman/sysman.h"
16+
#include "sysman/sysman_imp.h"
17+
18+
#if defined(__clang__)
19+
#pragma clang diagnostic push
20+
#pragma clang diagnostic ignored "-Winconsistent-missing-override"
21+
#endif
22+
23+
using ::testing::_;
24+
25+
namespace L0 {
26+
namespace ult {
27+
28+
const std::string minFreqFile("gt_min_freq_mhz");
29+
const std::string maxFreqFile("gt_max_freq_mhz");
30+
const std::string requestFreqFile("gt_cur_freq_mhz");
31+
const std::string tdpFreqFile("gt_boost_freq_mhz");
32+
const std::string actualFreqFile("gt_act_freq_mhz");
33+
const std::string efficientFreqFile("gt_RP1_freq_mhz");
34+
const std::string maxValFreqFile("gt_RP0_freq_mhz");
35+
const std::string minValFreqFile("gt_RPn_freq_mhz");
36+
37+
class FrequencySysfsAccess : public SysfsAccess {};
38+
39+
template <>
40+
struct Mock<FrequencySysfsAccess> : public FrequencySysfsAccess {
41+
double mockMin = 0;
42+
double mockMax = 0;
43+
double mockRequest = 0;
44+
double mockTdp = 0;
45+
double mockActual = 0;
46+
double mockEfficient = 0;
47+
double mockMaxVal = 0;
48+
double mockMinVal = 0;
49+
50+
MOCK_METHOD2(read, ze_result_t(const std::string file, double &val));
51+
MOCK_METHOD2(write, ze_result_t(const std::string file, const double val));
52+
53+
ze_result_t getVal(const std::string file, double &val) {
54+
if (file.compare(minFreqFile) == 0) {
55+
val = mockMin;
56+
}
57+
if (file.compare(maxFreqFile) == 0) {
58+
val = mockMax;
59+
}
60+
if (file.compare(requestFreqFile) == 0) {
61+
val = mockRequest;
62+
}
63+
if (file.compare(tdpFreqFile) == 0) {
64+
val = mockTdp;
65+
}
66+
if (file.compare(actualFreqFile) == 0) {
67+
val = mockActual;
68+
}
69+
if (file.compare(efficientFreqFile) == 0) {
70+
val = mockEfficient;
71+
}
72+
if (file.compare(maxValFreqFile) == 0) {
73+
val = mockMaxVal;
74+
}
75+
if (file.compare(minValFreqFile) == 0) {
76+
val = mockMinVal;
77+
}
78+
return ZE_RESULT_SUCCESS;
79+
}
80+
ze_result_t setVal(const std::string file, const double val) {
81+
if (file.compare(minFreqFile) == 0) {
82+
mockMin = val;
83+
}
84+
if (file.compare(maxFreqFile) == 0) {
85+
mockMax = val;
86+
}
87+
if (file.compare(requestFreqFile) == 0) {
88+
mockRequest = val;
89+
}
90+
if (file.compare(tdpFreqFile) == 0) {
91+
mockTdp = val;
92+
}
93+
if (file.compare(actualFreqFile) == 0) {
94+
mockActual = val;
95+
}
96+
if (file.compare(efficientFreqFile) == 0) {
97+
mockEfficient = val;
98+
}
99+
if (file.compare(maxValFreqFile) == 0) {
100+
mockMaxVal = val;
101+
}
102+
if (file.compare(minValFreqFile) == 0) {
103+
mockMinVal = val;
104+
}
105+
return ZE_RESULT_SUCCESS;
106+
}
107+
108+
Mock<FrequencySysfsAccess>() = default;
109+
};
110+
111+
class PublicLinuxFrequencyImp : public L0::LinuxFrequencyImp {
112+
public:
113+
using LinuxFrequencyImp::pSysfsAccess;
114+
};
115+
116+
} // namespace ult
117+
} // namespace L0
118+
119+
#if defined(__clang__)
120+
#pragma clang diagnostic pop
121+
#endif

0 commit comments

Comments
 (0)