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