247 lines
12 KiB
C++
247 lines
12 KiB
C++
/*
|
|
* Copyright (C) 2017-2019 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
#include "runtime/device/device.h"
|
|
#include "runtime/memory_manager/os_agnostic_memory_manager.h"
|
|
#include "unit_tests/libult/create_command_stream.h"
|
|
#include "unit_tests/mocks/mock_command_queue.h"
|
|
#include "unit_tests/mocks/mock_context.h"
|
|
#include "unit_tests/mocks/mock_device.h"
|
|
|
|
#include "instrumentation.h"
|
|
|
|
namespace NEO {
|
|
|
|
//////////////////////////////////////////////////////
|
|
// Metrics Library types
|
|
//////////////////////////////////////////////////////
|
|
using MetricsLibraryApi::ClientApi;
|
|
using MetricsLibraryApi::ClientData_1_0;
|
|
using MetricsLibraryApi::ClientGen;
|
|
using MetricsLibraryApi::ClientType_1_0;
|
|
using MetricsLibraryApi::CommandBufferData_1_0;
|
|
using MetricsLibraryApi::CommandBufferSize_1_0;
|
|
using MetricsLibraryApi::ConfigurationHandle_1_0;
|
|
using MetricsLibraryApi::ContextCreateData_1_0;
|
|
using MetricsLibraryApi::ContextHandle_1_0;
|
|
using MetricsLibraryApi::GpuMemory_1_0;
|
|
using MetricsLibraryApi::QueryHandle_1_0;
|
|
|
|
//////////////////////////////////////////////////////
|
|
// MI_REPORT_PERF_COUNT definition for all GENs
|
|
//////////////////////////////////////////////////////
|
|
struct MI_REPORT_PERF_COUNT {
|
|
uint32_t DwordLength : BITFIELD_RANGE(0, 5);
|
|
uint32_t Reserved_6 : BITFIELD_RANGE(6, 22);
|
|
uint32_t MiCommandOpcode : BITFIELD_RANGE(23, 28);
|
|
uint32_t CommandType : BITFIELD_RANGE(29, 31);
|
|
uint64_t UseGlobalGtt : BITFIELD_RANGE(0, 0);
|
|
uint64_t Reserved_33 : BITFIELD_RANGE(1, 3);
|
|
uint64_t CoreModeEnable : BITFIELD_RANGE(4, 4);
|
|
uint64_t Reserved_37 : BITFIELD_RANGE(5, 5);
|
|
uint64_t MemoryAddress : BITFIELD_RANGE(6, 63);
|
|
uint32_t ReportId;
|
|
|
|
typedef enum tagDWORD_LENGTH {
|
|
DWORD_LENGTH_EXCLUDES_DWORD_0_1 = 0x2,
|
|
} DWORD_LENGTH;
|
|
|
|
typedef enum tagMI_COMMAND_OPCODE {
|
|
MI_COMMAND_OPCODE_MI_REPORT_PERF_COUNT = 0x28,
|
|
} MI_COMMAND_OPCODE;
|
|
|
|
typedef enum tagCOMMAND_TYPE {
|
|
COMMAND_TYPE_MI_COMMAND = 0x0,
|
|
} COMMAND_TYPE;
|
|
|
|
inline void init(void) {
|
|
memset(this, 0, sizeof(MI_REPORT_PERF_COUNT));
|
|
DwordLength = DWORD_LENGTH_EXCLUDES_DWORD_0_1;
|
|
MiCommandOpcode = MI_COMMAND_OPCODE_MI_REPORT_PERF_COUNT;
|
|
CommandType = COMMAND_TYPE_MI_COMMAND;
|
|
}
|
|
};
|
|
|
|
// clang-format off
|
|
//////////////////////////////////////////////////////
|
|
// MockMetricsLibrary
|
|
//////////////////////////////////////////////////////
|
|
class MockMetricsLibrary : public MetricsLibrary {
|
|
public:
|
|
uint32_t openCount = 0;
|
|
uint32_t contextCount = 0;
|
|
uint32_t queryCount = 0;
|
|
bool validOpen = true;
|
|
bool validGetData = true;
|
|
|
|
// Library open / close functions.
|
|
bool open() override;
|
|
|
|
// Context create / destroy functions.
|
|
bool contextCreate (const ClientType_1_0 &client, ClientData_1_0& clientData, ContextCreateData_1_0 &createData, ContextHandle_1_0 &handle) override;
|
|
bool contextDelete (const ContextHandle_1_0 &handle) override;
|
|
|
|
// HwCounters functions.
|
|
bool hwCountersCreate (const ContextHandle_1_0 &context, const uint32_t slots, const ConfigurationHandle_1_0 mmio, QueryHandle_1_0 &handle) override;
|
|
bool hwCountersDelete (const QueryHandle_1_0 &handle) override;
|
|
bool hwCountersGetReport (const QueryHandle_1_0 &handle, const uint32_t slot, const uint32_t slotsCount, const uint32_t dataSize, void *data) override;
|
|
uint32_t hwCountersGetApiReportSize() override;
|
|
uint32_t hwCountersGetGpuReportSize() override;
|
|
|
|
// Command buffer functions.
|
|
bool commandBufferGet (CommandBufferData_1_0 &data) override;
|
|
bool commandBufferGetSize (const CommandBufferData_1_0 &commandBufferData, CommandBufferSize_1_0 &commandBufferSize) override;
|
|
|
|
// Oa configuration functions.
|
|
bool oaConfigurationCreate (const ContextHandle_1_0 &context, ConfigurationHandle_1_0 &handle) override { return true; }
|
|
bool oaConfigurationDelete (const ConfigurationHandle_1_0 &handle) override { return true; }
|
|
bool oaConfigurationActivate (const ConfigurationHandle_1_0 &handle) override { return true; }
|
|
bool oaConfigurationDeactivate (const ConfigurationHandle_1_0 &handle) override { return true; }
|
|
|
|
// User mmio configuration functions.
|
|
bool userConfigurationCreate (const ContextHandle_1_0 &context, ConfigurationHandle_1_0 &handle) override { return true; }
|
|
bool userConfigurationDelete (const ConfigurationHandle_1_0 &handle) override { return true; }
|
|
};
|
|
|
|
//////////////////////////////////////////////////////
|
|
// MockMetricsLibraryValidInterface
|
|
//////////////////////////////////////////////////////
|
|
class MockMetricsLibraryValidInterface: public MetricsLibraryInterface {
|
|
public:
|
|
uint32_t contextCount = 0;
|
|
bool validCreateConfigurationOa = true;
|
|
bool validCreateConfigurationUser = true;
|
|
bool validActivateConfigurationOa = true;
|
|
bool validGpuReportSize = true;
|
|
|
|
static StatusCode ML_STDCALL ContextCreate ( ClientType_1_0 clientType, ContextCreateData_1_0* createData, ContextHandle_1_0* handle );
|
|
static StatusCode ML_STDCALL ContextDelete (const ContextHandle_1_0 handle);
|
|
static StatusCode ML_STDCALL GetParameter (const ParameterType parameter, ValueType *type, TypedValue_1_0 *value);
|
|
static StatusCode ML_STDCALL CommandBufferGet (const CommandBufferData_1_0 *data);
|
|
static StatusCode ML_STDCALL CommandBufferGetSize (const CommandBufferData_1_0 *data, CommandBufferSize_1_0 *size);
|
|
static StatusCode ML_STDCALL QueryCreate (const QueryCreateData_1_0 *createData, QueryHandle_1_0 *handle);
|
|
static StatusCode ML_STDCALL QueryDelete (const QueryHandle_1_0 handle);
|
|
static StatusCode ML_STDCALL ConfigurationCreate (const ConfigurationCreateData_1_0 *createData, ConfigurationHandle_1_0 *handle);
|
|
static StatusCode ML_STDCALL ConfigurationActivate (const ConfigurationHandle_1_0 handle, const ConfigurationActivateData_1_0 *activateData);
|
|
static StatusCode ML_STDCALL ConfigurationDeactivate (const ConfigurationHandle_1_0 handle) { return StatusCode::Success; }
|
|
static StatusCode ML_STDCALL ConfigurationDelete (const ConfigurationHandle_1_0 handle);
|
|
static StatusCode ML_STDCALL GetData (GetReportData_1_0 *data);
|
|
|
|
MockMetricsLibraryValidInterface()
|
|
{
|
|
contextCreate = &ContextCreate;
|
|
contextDelete = &ContextDelete;
|
|
functions.GetParameter = &GetParameter;
|
|
functions.CommandBufferGet = &CommandBufferGet;
|
|
functions.CommandBufferGetSize = &CommandBufferGetSize;
|
|
functions.QueryCreate = &QueryCreate;
|
|
functions.QueryDelete = &QueryDelete;
|
|
functions.ConfigurationCreate = &ConfigurationCreate;
|
|
functions.ConfigurationActivate = &ConfigurationActivate;
|
|
functions.ConfigurationDeactivate = &ConfigurationDeactivate;
|
|
functions.ConfigurationDelete = &ConfigurationDelete;
|
|
functions.GetData = &GetData;
|
|
}
|
|
};
|
|
|
|
//////////////////////////////////////////////////////
|
|
// MockMetricsLibraryInvalidInterface
|
|
//////////////////////////////////////////////////////
|
|
class MockMetricsLibraryInvalidInterface: public MetricsLibraryInterface {
|
|
public:
|
|
static StatusCode ML_STDCALL ContextCreate ( ClientType_1_0 clientType, ContextCreateData_1_0* createData, ContextHandle_1_0* handle ){ return StatusCode::Failed;}
|
|
static StatusCode ML_STDCALL ContextDelete (const ContextHandle_1_0 handle){ return StatusCode::Failed;}
|
|
static StatusCode ML_STDCALL GetParameter (const ParameterType parameter, ValueType *type, TypedValue_1_0 *value){ return StatusCode::Failed;}
|
|
static StatusCode ML_STDCALL CommandBufferGet (const CommandBufferData_1_0 *data){ return StatusCode::Failed;}
|
|
static StatusCode ML_STDCALL CommandBufferGetSize (const CommandBufferData_1_0 *data, CommandBufferSize_1_0 *size){ return StatusCode::Failed;}
|
|
static StatusCode ML_STDCALL QueryCreate (const QueryCreateData_1_0 *createData, QueryHandle_1_0 *handle){ return StatusCode::Failed;}
|
|
static StatusCode ML_STDCALL QueryDelete (const QueryHandle_1_0 handle){ return StatusCode::Failed;}
|
|
static StatusCode ML_STDCALL ConfigurationCreate (const ConfigurationCreateData_1_0 *createData, ConfigurationHandle_1_0 *handle){ return StatusCode::Failed;}
|
|
static StatusCode ML_STDCALL ConfigurationActivate (const ConfigurationHandle_1_0 handle, const ConfigurationActivateData_1_0 *activateData){ return StatusCode::Failed;}
|
|
static StatusCode ML_STDCALL ConfigurationDeactivate (const ConfigurationHandle_1_0 handle){ return StatusCode::Failed;}
|
|
static StatusCode ML_STDCALL ConfigurationDelete (const ConfigurationHandle_1_0 handle){ return StatusCode::Failed;}
|
|
static StatusCode ML_STDCALL GetData (GetReportData_1_0 *data){ return StatusCode::Failed;}
|
|
|
|
MockMetricsLibraryInvalidInterface()
|
|
{
|
|
contextCreate = &ContextCreate;
|
|
contextDelete = &ContextDelete;
|
|
functions.GetParameter = &GetParameter;
|
|
functions.CommandBufferGet = &CommandBufferGet;
|
|
functions.CommandBufferGetSize = &CommandBufferGetSize;
|
|
functions.QueryCreate = &QueryCreate;
|
|
functions.QueryDelete = &QueryDelete;
|
|
functions.ConfigurationCreate = &ConfigurationCreate;
|
|
functions.ConfigurationActivate = &ConfigurationActivate;
|
|
functions.ConfigurationDeactivate = &ConfigurationDeactivate;
|
|
functions.ConfigurationDelete = &ConfigurationDelete;
|
|
functions.GetData = &GetData;
|
|
}
|
|
};
|
|
// clang-format on
|
|
|
|
//////////////////////////////////////////////////////
|
|
// MockMetricsLibraryDll
|
|
//////////////////////////////////////////////////////
|
|
class MockMetricsLibraryDll : public OsLibrary {
|
|
public:
|
|
bool validContextCreate = true;
|
|
bool validContextDelete = true;
|
|
bool validIsLoaded = true;
|
|
|
|
void *getProcAddress(const std::string &procName) override;
|
|
bool isLoaded() override;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////
|
|
// MockPerformanceCounters
|
|
//////////////////////////////////////////////////////
|
|
class MockPerformanceCounters {
|
|
public:
|
|
static std::unique_ptr<PerformanceCounters> create(Device *device);
|
|
};
|
|
|
|
//////////////////////////////////////////////////////
|
|
// PerformanceCountersDeviceFixture
|
|
//////////////////////////////////////////////////////
|
|
struct PerformanceCountersDeviceFixture {
|
|
virtual void SetUp();
|
|
virtual void TearDown();
|
|
decltype(&PerformanceCounters::create) createFunc;
|
|
};
|
|
|
|
/////////////////////////////////////////////////////
|
|
// PerformanceCountersFixture
|
|
//////////////////////////////////////////////////////
|
|
struct PerformanceCountersFixture {
|
|
virtual void SetUp();
|
|
virtual void TearDown();
|
|
virtual void createPerfCounters();
|
|
cl_queue_properties queueProperties = {};
|
|
std::unique_ptr<MockDevice> device;
|
|
std::unique_ptr<MockContext> context;
|
|
std::unique_ptr<MockCommandQueue> queue;
|
|
std::unique_ptr<OSInterface> osInterface;
|
|
std::unique_ptr<PerformanceCounters> performanceCountersBase;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////
|
|
// PerformanceCountersMetricsLibraryFixture
|
|
//////////////////////////////////////////////////////
|
|
struct PerformanceCountersMetricsLibraryFixture : PerformanceCountersFixture {
|
|
|
|
void SetUp() override;
|
|
void TearDown() override;
|
|
|
|
void createPerformanceCounters(const bool validMetricsLibraryApi, const bool mockMatricsLibrary);
|
|
|
|
std::unique_ptr<PerformanceCounters> performanceCountersBase;
|
|
};
|
|
|
|
} // namespace NEO
|