1 /*
2  * Copyright (C) 2018-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #pragma once
9 #include "shared/source/device/device.h"
10 #include "shared/source/memory_manager/os_agnostic_memory_manager.h"
11 #include "shared/test/common/mocks/mock_device.h"
12 
13 #include "opencl/test/unit_test/mocks/mock_cl_device.h"
14 #include "opencl/test/unit_test/mocks/mock_command_queue.h"
15 #include "opencl/test/unit_test/mocks/mock_context.h"
16 
17 namespace NEO {
18 
19 //////////////////////////////////////////////////////
20 // Metrics Library types
21 //////////////////////////////////////////////////////
22 using MetricsLibraryApi::ClientApi;
23 using MetricsLibraryApi::ClientData_1_0;
24 using MetricsLibraryApi::ClientGen;
25 using MetricsLibraryApi::ClientType_1_0;
26 using MetricsLibraryApi::CommandBufferData_1_0;
27 using MetricsLibraryApi::CommandBufferSize_1_0;
28 using MetricsLibraryApi::ConfigurationHandle_1_0;
29 using MetricsLibraryApi::ContextCreateData_1_0;
30 using MetricsLibraryApi::ContextHandle_1_0;
31 using MetricsLibraryApi::GpuMemory_1_0;
32 using MetricsLibraryApi::QueryHandle_1_0;
33 
34 //////////////////////////////////////////////////////
35 // MI_REPORT_PERF_COUNT definition for all GENs
36 //////////////////////////////////////////////////////
37 struct MI_REPORT_PERF_COUNT {
38     uint32_t DwordLength : BITFIELD_RANGE(0, 5);
39     uint32_t Reserved_6 : BITFIELD_RANGE(6, 22);
40     uint32_t MiCommandOpcode : BITFIELD_RANGE(23, 28);
41     uint32_t CommandType : BITFIELD_RANGE(29, 31);
42     uint64_t UseGlobalGtt : BITFIELD_RANGE(0, 0);
43     uint64_t Reserved_33 : BITFIELD_RANGE(1, 3);
44     uint64_t CoreModeEnable : BITFIELD_RANGE(4, 4);
45     uint64_t Reserved_37 : BITFIELD_RANGE(5, 5);
46     uint64_t MemoryAddress : BITFIELD_RANGE(6, 63);
47     uint32_t ReportId;
48 
49     typedef enum tagDWORD_LENGTH {
50         DWORD_LENGTH_EXCLUDES_DWORD_0_1 = 0x2,
51     } DWORD_LENGTH;
52 
53     typedef enum tagMI_COMMAND_OPCODE {
54         MI_COMMAND_OPCODE_MI_REPORT_PERF_COUNT = 0x28,
55     } MI_COMMAND_OPCODE;
56 
57     typedef enum tagCOMMAND_TYPE {
58         COMMAND_TYPE_MI_COMMAND = 0x0,
59     } COMMAND_TYPE;
60 
initMI_REPORT_PERF_COUNT61     inline void init(void) {
62         memset(this, 0, sizeof(MI_REPORT_PERF_COUNT));
63         DwordLength = DWORD_LENGTH_EXCLUDES_DWORD_0_1;
64         MiCommandOpcode = MI_COMMAND_OPCODE_MI_REPORT_PERF_COUNT;
65         CommandType = COMMAND_TYPE_MI_COMMAND;
66     }
67 };
68 
69 // clang-format off
70 //////////////////////////////////////////////////////
71 // MockMetricsLibrary
72 //////////////////////////////////////////////////////
73 class MockMetricsLibrary : public MetricsLibrary {
74   public:
75     uint32_t openCount    = 0;
76     uint32_t contextCount = 0;
77     uint32_t queryCount   = 0;
78     bool     validOpen    = true;
79     bool     validGetData = true;
80 
81     // Library open / close functions.
82     bool open() override;
83 
84     // Context create / destroy functions.
85     bool contextCreate              (const ClientType_1_0 &client, ClientOptionsSubDeviceData_1_0 &subDevice, ClientOptionsSubDeviceIndexData_1_0 &subDeviceIndex, ClientOptionsSubDeviceCountData_1_0 &subDeviceCount, ClientData_1_0& clientData, ContextCreateData_1_0 &createData, ContextHandle_1_0 &handle) override;
86     bool contextDelete              (const ContextHandle_1_0 &handle) override;
87 
88     // HwCounters functions.
89     bool hwCountersCreate           (const ContextHandle_1_0 &context, const uint32_t slots, const ConfigurationHandle_1_0 mmio, QueryHandle_1_0 &handle) override;
90     bool hwCountersDelete           (const QueryHandle_1_0 &handle) override;
91     bool hwCountersGetReport        (const QueryHandle_1_0 &handle, const uint32_t slot, const uint32_t slotsCount, const uint32_t dataSize, void *data) override;
92     uint32_t hwCountersGetApiReportSize() override;
93     uint32_t hwCountersGetGpuReportSize() override;
94 
95     // Command buffer functions.
96     bool commandBufferGet           (CommandBufferData_1_0 &data) override;
97     bool commandBufferGetSize       (const CommandBufferData_1_0 &commandBufferData, CommandBufferSize_1_0 &commandBufferSize) override;
98 
99     // Oa configuration functions.
oaConfigurationCreate(const ContextHandle_1_0 & context,ConfigurationHandle_1_0 & handle)100     bool oaConfigurationCreate      (const ContextHandle_1_0 &context, ConfigurationHandle_1_0 &handle) override { return true; }
oaConfigurationDelete(const ConfigurationHandle_1_0 & handle)101     bool oaConfigurationDelete      (const ConfigurationHandle_1_0 &handle) override { return true; }
oaConfigurationActivate(const ConfigurationHandle_1_0 & handle)102     bool oaConfigurationActivate    (const ConfigurationHandle_1_0 &handle) override { return true; }
oaConfigurationDeactivate(const ConfigurationHandle_1_0 & handle)103     bool oaConfigurationDeactivate  (const ConfigurationHandle_1_0 &handle) override { return true; }
104 
105     // User mmio configuration functions.
userConfigurationCreate(const ContextHandle_1_0 & context,ConfigurationHandle_1_0 & handle)106     bool userConfigurationCreate    (const ContextHandle_1_0 &context, ConfigurationHandle_1_0 &handle) override { return true; }
userConfigurationDelete(const ConfigurationHandle_1_0 & handle)107     bool userConfigurationDelete    (const ConfigurationHandle_1_0 &handle) override { return true; }
108 };
109 
110 //////////////////////////////////////////////////////
111 // MockMetricsLibraryValidInterface
112 //////////////////////////////////////////////////////
113 class MockMetricsLibraryValidInterface: public MetricsLibraryInterface {
114   public:
115     uint32_t contextCount                 = 0;
116     bool     validCreateConfigurationOa   = true;
117     bool     validCreateConfigurationUser = true;
118     bool     validActivateConfigurationOa = true;
119     bool     validGpuReportSize           = true;
120 
121     static StatusCode ML_STDCALL ContextCreate             ( ClientType_1_0 clientType, ContextCreateData_1_0* createData, ContextHandle_1_0* handle );
122     static StatusCode ML_STDCALL ContextDelete             (const ContextHandle_1_0 handle);
123     static StatusCode ML_STDCALL GetParameter              (const ParameterType parameter, ValueType *type, TypedValue_1_0 *value);
124     static StatusCode ML_STDCALL CommandBufferGet          (const CommandBufferData_1_0 *data);
125     static StatusCode ML_STDCALL CommandBufferGetSize      (const CommandBufferData_1_0 *data, CommandBufferSize_1_0 *size);
126     static StatusCode ML_STDCALL QueryCreate               (const QueryCreateData_1_0 *createData, QueryHandle_1_0 *handle);
127     static StatusCode ML_STDCALL QueryDelete               (const QueryHandle_1_0 handle);
128     static StatusCode ML_STDCALL ConfigurationCreate       (const ConfigurationCreateData_1_0 *createData, ConfigurationHandle_1_0 *handle);
129     static StatusCode ML_STDCALL ConfigurationActivate     (const ConfigurationHandle_1_0 handle, const ConfigurationActivateData_1_0 *activateData);
ConfigurationDeactivate(const ConfigurationHandle_1_0 handle)130     static StatusCode ML_STDCALL ConfigurationDeactivate   (const ConfigurationHandle_1_0 handle) { return StatusCode::Success; }
131     static StatusCode ML_STDCALL ConfigurationDelete       (const ConfigurationHandle_1_0 handle);
132     static StatusCode ML_STDCALL GetData                   (GetReportData_1_0 *data);
133 
MockMetricsLibraryValidInterface()134     MockMetricsLibraryValidInterface()
135     {
136         contextCreate                     = &ContextCreate;
137         contextDelete                     = &ContextDelete;
138         functions.GetParameter            = &GetParameter;
139         functions.CommandBufferGet        = &CommandBufferGet;
140         functions.CommandBufferGetSize    = &CommandBufferGetSize;
141         functions.QueryCreate             = &QueryCreate;
142         functions.QueryDelete             = &QueryDelete;
143         functions.ConfigurationCreate     = &ConfigurationCreate;
144         functions.ConfigurationActivate   = &ConfigurationActivate;
145         functions.ConfigurationDeactivate = &ConfigurationDeactivate;
146         functions.ConfigurationDelete     = &ConfigurationDelete;
147         functions.GetData                 = &GetData;
148     }
149 };
150 
151 //////////////////////////////////////////////////////
152 // MockMetricsLibraryInvalidInterface
153 //////////////////////////////////////////////////////
154 class MockMetricsLibraryInvalidInterface: public MetricsLibraryInterface {
155   public:
ContextCreate(ClientType_1_0 clientType,ContextCreateData_1_0 * createData,ContextHandle_1_0 * handle)156     static StatusCode ML_STDCALL ContextCreate             ( ClientType_1_0 clientType, ContextCreateData_1_0* createData, ContextHandle_1_0* handle ){ return StatusCode::Failed;}
ContextDelete(const ContextHandle_1_0 handle)157     static StatusCode ML_STDCALL ContextDelete             (const ContextHandle_1_0 handle){ return StatusCode::Failed;}
GetParameter(const ParameterType parameter,ValueType * type,TypedValue_1_0 * value)158     static StatusCode ML_STDCALL GetParameter              (const ParameterType parameter, ValueType *type, TypedValue_1_0 *value){ return StatusCode::Failed;}
CommandBufferGet(const CommandBufferData_1_0 * data)159     static StatusCode ML_STDCALL CommandBufferGet          (const CommandBufferData_1_0 *data){ return StatusCode::Failed;}
CommandBufferGetSize(const CommandBufferData_1_0 * data,CommandBufferSize_1_0 * size)160     static StatusCode ML_STDCALL CommandBufferGetSize      (const CommandBufferData_1_0 *data, CommandBufferSize_1_0 *size){ return StatusCode::Failed;}
QueryCreate(const QueryCreateData_1_0 * createData,QueryHandle_1_0 * handle)161     static StatusCode ML_STDCALL QueryCreate               (const QueryCreateData_1_0 *createData, QueryHandle_1_0 *handle){ return StatusCode::Failed;}
QueryDelete(const QueryHandle_1_0 handle)162     static StatusCode ML_STDCALL QueryDelete               (const QueryHandle_1_0 handle){ return StatusCode::Failed;}
ConfigurationCreate(const ConfigurationCreateData_1_0 * createData,ConfigurationHandle_1_0 * handle)163     static StatusCode ML_STDCALL ConfigurationCreate       (const ConfigurationCreateData_1_0 *createData, ConfigurationHandle_1_0 *handle){ return StatusCode::Failed;}
ConfigurationActivate(const ConfigurationHandle_1_0 handle,const ConfigurationActivateData_1_0 * activateData)164     static StatusCode ML_STDCALL ConfigurationActivate     (const ConfigurationHandle_1_0 handle, const ConfigurationActivateData_1_0 *activateData){ return StatusCode::Failed;}
ConfigurationDeactivate(const ConfigurationHandle_1_0 handle)165     static StatusCode ML_STDCALL ConfigurationDeactivate   (const ConfigurationHandle_1_0 handle){ return StatusCode::Failed;}
ConfigurationDelete(const ConfigurationHandle_1_0 handle)166     static StatusCode ML_STDCALL ConfigurationDelete       (const ConfigurationHandle_1_0 handle){ return StatusCode::Failed;}
GetData(GetReportData_1_0 * data)167     static StatusCode ML_STDCALL GetData                   (GetReportData_1_0 *data){ return StatusCode::Failed;}
168 
MockMetricsLibraryInvalidInterface()169     MockMetricsLibraryInvalidInterface()
170     {
171         contextCreate                     = &ContextCreate;
172         contextDelete                     = &ContextDelete;
173         functions.GetParameter            = &GetParameter;
174         functions.CommandBufferGet        = &CommandBufferGet;
175         functions.CommandBufferGetSize    = &CommandBufferGetSize;
176         functions.QueryCreate             = &QueryCreate;
177         functions.QueryDelete             = &QueryDelete;
178         functions.ConfigurationCreate     = &ConfigurationCreate;
179         functions.ConfigurationActivate   = &ConfigurationActivate;
180         functions.ConfigurationDeactivate = &ConfigurationDeactivate;
181         functions.ConfigurationDelete     = &ConfigurationDelete;
182         functions.GetData                 = &GetData;
183     }
184 };
185 // clang-format on
186 
187 //////////////////////////////////////////////////////
188 // MockMetricsLibraryDll
189 //////////////////////////////////////////////////////
190 class MockMetricsLibraryDll : public OsLibrary {
191   public:
192     bool validContextCreate = true;
193     bool validContextDelete = true;
194     bool validIsLoaded = true;
195 
196     void *getProcAddress(const std::string &procName) override;
197     bool isLoaded() override;
198 };
199 
200 //////////////////////////////////////////////////////
201 // MockPerformanceCounters
202 //////////////////////////////////////////////////////
203 class MockPerformanceCounters {
204   public:
205     static std::unique_ptr<PerformanceCounters> create(Device *device);
206 };
207 
208 //////////////////////////////////////////////////////
209 // PerformanceCountersDeviceFixture
210 //////////////////////////////////////////////////////
211 struct PerformanceCountersDeviceFixture {
212     virtual void SetUp();
213     virtual void TearDown();
214     decltype(&PerformanceCounters::create) createFunc;
215 };
216 
217 struct MockExecutionEnvironment;
218 struct RootDeviceEnvironment;
219 /////////////////////////////////////////////////////
220 // PerformanceCountersFixture
221 //////////////////////////////////////////////////////
222 struct PerformanceCountersFixture {
223     PerformanceCountersFixture();
224     ~PerformanceCountersFixture();
225     virtual void SetUp();
226     virtual void TearDown();
227     virtual void createPerfCounters();
228     cl_queue_properties queueProperties = {};
229     std::unique_ptr<MockClDevice> device;
230     std::unique_ptr<MockContext> context;
231     std::unique_ptr<MockCommandQueue> queue;
232     std::unique_ptr<PerformanceCounters> performanceCountersBase;
233     std::unique_ptr<MockExecutionEnvironment> executionEnvironment;
234     std::unique_ptr<RootDeviceEnvironment> rootDeviceEnvironment;
235     std::unique_ptr<OSInterface> osInterface;
236 };
237 
238 //////////////////////////////////////////////////////
239 // PerformanceCountersMetricsLibraryFixture
240 //////////////////////////////////////////////////////
241 struct PerformanceCountersMetricsLibraryFixture : PerformanceCountersFixture {
242 
243     void SetUp() override;
244     void TearDown() override;
245 
246     void createPerformanceCounters(const bool validMetricsLibraryApi, const bool mockMatricsLibrary);
247 
248     std::unique_ptr<PerformanceCounters> performanceCountersBase;
249 };
250 
251 } // namespace NEO
252