Create a wrapper for drm_i915_query_item

Related-To: NEO-6852
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2022-05-17 21:40:34 +00:00
committed by Compute-Runtime-Automation
parent 771298c6e2
commit ac3005a463
29 changed files with 85 additions and 76 deletions

View File

@@ -12,8 +12,6 @@
#include "shared/source/os_interface/linux/drm_wrappers.h"
#include "shared/source/os_interface/os_interface.h"
#include "drm/i915_drm.h"
#include <time.h>
namespace NEO {

View File

@@ -19,8 +19,6 @@
#include "shared/source/os_interface/os_context.h"
#include "shared/source/utilities/stackvec.h"
#include "drm/i915_drm.h"
#include <errno.h>
#include <fcntl.h>
#include <map>

View File

@@ -31,8 +31,6 @@
#include "shared/source/os_interface/linux/os_context_linux.h"
#include "shared/source/os_interface/os_interface.h"
#include "drm/i915_drm.h"
#include <cstring>
#include <iostream>
#include <memory>

View File

@@ -24,6 +24,7 @@
#include "shared/source/os_interface/linux/drm_gem_close_worker.h"
#include "shared/source/os_interface/linux/drm_memory_manager.h"
#include "shared/source/os_interface/linux/drm_memory_operations_handler_bind.h"
#include "shared/source/os_interface/linux/drm_wrappers.h"
#include "shared/source/os_interface/linux/hw_device_id.h"
#include "shared/source/os_interface/linux/ioctl_helper.h"
#include "shared/source/os_interface/linux/ioctl_strings.h"
@@ -674,8 +675,8 @@ bool Drm::isi915Version(int fileDescriptor) {
std::vector<uint8_t> Drm::query(uint32_t queryId, uint32_t queryItemFlags) {
drm_i915_query query{};
drm_i915_query_item queryItem{};
queryItem.query_id = queryId;
QueryItem queryItem{};
queryItem.queryId = queryId;
queryItem.length = 0; // query length first
queryItem.flags = queryItemFlags;
query.items_ptr = reinterpret_cast<__u64>(&queryItem);
@@ -687,7 +688,7 @@ std::vector<uint8_t> Drm::query(uint32_t queryId, uint32_t queryItemFlags) {
}
auto data = std::vector<uint8_t>(queryItem.length, 0);
queryItem.data_ptr = castToUint64(data.data());
queryItem.dataPtr = castToUint64(data.data());
ret = this->ioctl(DRM_IOCTL_I915_QUERY, &query);
if (ret != 0 || queryItem.length <= 0) {
@@ -1093,14 +1094,14 @@ bool Drm::queryEngineInfo(bool isSysmanEnabled) {
return true;
}
std::vector<drm_i915_query_item> queryItems{distanceInfos.size()};
std::vector<QueryItem> queryItems{distanceInfos.size()};
auto ret = ioctlHelper->queryDistances(this, queryItems, distanceInfos);
if (ret != 0) {
return false;
}
const bool queryUnsupported = std::all_of(queryItems.begin(), queryItems.end(),
[](const drm_i915_query_item &item) { return item.length == -EINVAL; });
[](const QueryItem &item) { return item.length == -EINVAL; });
if (queryUnsupported) {
DEBUG_BREAK_IF(tileCount != 1);
this->engineInfo.reset(new EngineInfo(this, hwInfo, engines));

View File

@@ -20,6 +20,7 @@
#include "shared/source/utilities/api_intercept.h"
#include "shared/source/utilities/stackvec.h"
#include "drm/i915_drm.h"
#include "engine_node.h"
#include "igfxfmid.h"

View File

@@ -45,4 +45,10 @@ static_assert(sizeof(ExecObject) == sizeof(drm_i915_gem_exec_object2));
static_assert(sizeof(ExecBuffer) == sizeof(drm_i915_gem_execbuffer2));
static_assert(sizeof(QueryItem) == sizeof(drm_i915_query_item));
static_assert(offsetof(QueryItem, queryId) == offsetof(drm_i915_query_item, query_id));
static_assert(offsetof(QueryItem, length) == offsetof(drm_i915_query_item, length));
static_assert(offsetof(QueryItem, flags) == offsetof(drm_i915_query_item, flags));
static_assert(offsetof(QueryItem, dataPtr) == offsetof(drm_i915_query_item, data_ptr));
} // namespace NEO

View File

@@ -49,4 +49,12 @@ struct GemGetTiling {
uint32_t swizzleMode;
uint32_t physSwizzleMode;
};
struct QueryItem {
uint64_t queryId;
int32_t length;
uint32_t flags;
uint64_t dataPtr;
};
} // namespace NEO

View File

@@ -13,6 +13,7 @@
#include "shared/source/helpers/engine_node_helper.h"
#include "shared/source/helpers/hw_info.h"
#include "shared/source/os_interface/linux/drm_neo.h"
#include "shared/source/os_interface/linux/drm_wrappers.h"
#include <array>
@@ -76,7 +77,7 @@ EngineInfo::EngineInfo(Drm *drm, HardwareInfo *hwInfo, const std::vector<EngineC
setSupportedEnginesInfo(hwInfo, computeEngines, bcsInfoMask);
}
EngineInfo::EngineInfo(Drm *drm, HardwareInfo *hwInfo, uint32_t tileCount, const std::vector<DistanceInfo> &distanceInfos, const std::vector<drm_i915_query_item> &queryItems, const std::vector<EngineCapabilities> &engineInfos)
EngineInfo::EngineInfo(Drm *drm, HardwareInfo *hwInfo, uint32_t tileCount, const std::vector<DistanceInfo> &distanceInfos, const std::vector<QueryItem> &queryItems, const std::vector<EngineCapabilities> &engineInfos)
: engines(engineInfos), tileToEngineToInstanceMap(tileCount) {
auto tile = 0u;
auto computeEnginesPerTile = 0u;

View File

@@ -9,7 +9,6 @@
#include "shared/source/os_interface/linux/engine_info.h"
#include "shared/source/os_interface/linux/ioctl_helper.h"
#include "drm/i915_drm.h"
#include "engine_node.h"
#include "sku_info.h"
@@ -26,7 +25,7 @@ struct EngineInfo {
using EngineToInstanceMap = std::map<aub_stream::EngineType, EngineClassInstance>;
EngineInfo(Drm *drm, HardwareInfo *hwInfo, const std::vector<EngineCapabilities> &engineInfos);
EngineInfo(Drm *drm, HardwareInfo *hwInfo, uint32_t tileCount, const std::vector<DistanceInfo> &distanceInfos, const std::vector<drm_i915_query_item> &queryItems, const std::vector<EngineCapabilities> &engineInfos);
EngineInfo(Drm *drm, HardwareInfo *hwInfo, uint32_t tileCount, const std::vector<DistanceInfo> &distanceInfos, const std::vector<QueryItem> &queryItems, const std::vector<EngineCapabilities> &engineInfos);
~EngineInfo() = default;

View File

@@ -17,7 +17,6 @@
#include <string>
#include <vector>
struct drm_i915_query_item;
struct drm_i915_gem_context_create_ext;
namespace NEO {
@@ -27,6 +26,7 @@ enum class CacheRegion : uint16_t;
struct HardwareInfo;
struct ExecBuffer;
struct ExecObject;
struct QueryItem;
extern IoctlHelper *ioctlHelperFactory[IGFX_MAX_PRODUCT];
@@ -103,7 +103,7 @@ class IoctlHelper {
virtual std::unique_ptr<uint8_t[]> prepareVmBindExt(const StackVec<uint32_t, 2> &bindExtHandles) = 0;
virtual uint64_t getFlagsForVmBind(bool bindCapture, bool bindImmediate, bool bindMakeResident) = 0;
virtual std::vector<EngineCapabilities> translateToEngineCaps(const std::vector<uint8_t> &data) = 0;
virtual uint32_t queryDistances(Drm *drm, std::vector<drm_i915_query_item> &queryItems, std::vector<DistanceInfo> &distanceInfos) = 0;
virtual uint32_t queryDistances(Drm *drm, std::vector<QueryItem> &queryItems, std::vector<DistanceInfo> &distanceInfos) = 0;
virtual int32_t getComputeEngineClass() = 0;
virtual uint16_t getWaitUserFenceSoftFlag() = 0;
virtual int execBuffer(Drm *drm, ExecBuffer *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) = 0;
@@ -160,7 +160,7 @@ class IoctlHelperUpstream : public IoctlHelper {
std::unique_ptr<uint8_t[]> prepareVmBindExt(const StackVec<uint32_t, 2> &bindExtHandles) override;
uint64_t getFlagsForVmBind(bool bindCapture, bool bindImmediate, bool bindMakeResident) override;
std::vector<EngineCapabilities> translateToEngineCaps(const std::vector<uint8_t> &data) override;
uint32_t queryDistances(Drm *drm, std::vector<drm_i915_query_item> &queryItems, std::vector<DistanceInfo> &distanceInfos) override;
uint32_t queryDistances(Drm *drm, std::vector<QueryItem> &queryItems, std::vector<DistanceInfo> &distanceInfos) override;
int32_t getComputeEngineClass() override;
uint16_t getWaitUserFenceSoftFlag() override;
int execBuffer(Drm *drm, ExecBuffer *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) override;
@@ -224,7 +224,7 @@ class IoctlHelperPrelim20 : public IoctlHelper {
std::unique_ptr<uint8_t[]> prepareVmBindExt(const StackVec<uint32_t, 2> &bindExtHandles) override;
uint64_t getFlagsForVmBind(bool bindCapture, bool bindImmediate, bool bindMakeResident) override;
std::vector<EngineCapabilities> translateToEngineCaps(const std::vector<uint8_t> &data) override;
uint32_t queryDistances(Drm *drm, std::vector<drm_i915_query_item> &queryItems, std::vector<DistanceInfo> &distanceInfos) override;
uint32_t queryDistances(Drm *drm, std::vector<QueryItem> &queryItems, std::vector<DistanceInfo> &distanceInfos) override;
int32_t getComputeEngineClass() override;
uint16_t getWaitUserFenceSoftFlag() override;
int execBuffer(Drm *drm, ExecBuffer *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) override;

View File

@@ -311,15 +311,15 @@ prelim_drm_i915_query_distance_info translateToi915(const DistanceInfo &distance
return dist;
}
uint32_t IoctlHelperPrelim20::queryDistances(Drm *drm, std::vector<drm_i915_query_item> &queryItems, std::vector<DistanceInfo> &distanceInfos) {
uint32_t IoctlHelperPrelim20::queryDistances(Drm *drm, std::vector<QueryItem> &queryItems, std::vector<DistanceInfo> &distanceInfos) {
std::vector<prelim_drm_i915_query_distance_info> i915Distances(distanceInfos.size());
std::transform(distanceInfos.begin(), distanceInfos.end(), i915Distances.begin(), translateToi915);
for (auto i = 0u; i < i915Distances.size(); i++) {
queryItems[i].query_id = PRELIM_DRM_I915_QUERY_DISTANCE_INFO;
queryItems[i].queryId = PRELIM_DRM_I915_QUERY_DISTANCE_INFO;
queryItems[i].length = sizeof(prelim_drm_i915_query_distance_info);
queryItems[i].flags = 0u;
queryItems[i].data_ptr = reinterpret_cast<__u64>(&i915Distances[i]);
queryItems[i].dataPtr = reinterpret_cast<uint64_t>(&i915Distances[i]);
}
drm_i915_query query{};

View File

@@ -8,6 +8,7 @@
#include "shared/source/debug_settings/debug_settings_manager.h"
#include "shared/source/helpers/common_types.h"
#include "shared/source/os_interface/linux/cache_info.h"
#include "shared/source/os_interface/linux/drm_wrappers.h"
#include "shared/source/os_interface/linux/ioctl_helper.h"
#include "third_party/uapi/drm/i915_drm.h"
@@ -144,7 +145,7 @@ std::vector<EngineCapabilities> IoctlHelperUpstream::translateToEngineCaps(const
return engines;
}
uint32_t IoctlHelperUpstream::queryDistances(Drm *drm, std::vector<drm_i915_query_item> &queryItems, std::vector<DistanceInfo> &distanceInfos) {
uint32_t IoctlHelperUpstream::queryDistances(Drm *drm, std::vector<QueryItem> &queryItems, std::vector<DistanceInfo> &distanceInfos) {
for (auto &query : queryItems) {
query.length = -EINVAL;
}