fix: improve media engine handling

Related-To: NEO-14462

Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:
Bartosz Dunajski 2025-03-28 12:19:17 +00:00 committed by Compute-Runtime-Automation
parent 03353ef73d
commit 831b488685
5 changed files with 40 additions and 10 deletions

View File

@ -231,22 +231,32 @@ bool IoctlHelperXe::initialize() {
}
xeGtListData = reinterpret_cast<drm_xe_query_gt_list *>(queryGtListData.data());
auto assignValue = [](auto &container, uint16_t id, uint16_t value) {
if (container.size() < id + 1u) {
container.resize(id + 1, invalidIndex);
}
container[id] = value;
};
gtIdToTileId.resize(xeGtListData->num_gt, invalidIndex);
for (auto i = 0u; i < xeGtListData->num_gt; i++) {
const auto &gt = xeGtListData->gt_list[i];
if (gt.type == DRM_XE_QUERY_GT_TYPE_MAIN) {
gtIdToTileId[gt.gt_id] = gt.tile_id;
if (tileIdToGtId.size() < gt.tile_id + 1u) {
tileIdToGtId.resize(gt.tile_id + 1, invalidIndex);
}
tileIdToGtId[gt.tile_id] = gt.gt_id;
assignValue(tileIdToGtId, gt.tile_id, gt.gt_id);
} else if (isMediaGt(gt.type)) {
assignValue(mediaGtIdToTileId, gt.gt_id, gt.tile_id);
}
}
querySupportedFeatures();
return true;
}
bool IoctlHelperXe::isMediaGt(uint16_t gtType) const {
return (gtType == DRM_XE_QUERY_GT_TYPE_MEDIA);
}
IoctlHelperXe::~IoctlHelperXe() {
xeLog("IoctlHelperXe::~IoctlHelperXe\n", "");
}
@ -307,17 +317,28 @@ std::unique_ptr<EngineInfo> IoctlHelperXe::createEngineInfo(bool isSysmanEnabled
auto hwInfo = drm.getRootDeviceEnvironment().getMutableHardwareInfo();
auto defaultEngineClass = getDefaultEngineClass(hwInfo->capabilityTable.defaultEngineType);
auto containsGtId = [](const auto &container, uint16_t gtId) {
return ((container.size() > gtId) && (container[gtId] != invalidIndex));
};
for (auto i = 0u; i < numberHwEngines; i++) {
const auto &engine = queryEngines->engines[i].instance;
if (gtIdToTileId[engine.gt_id] == invalidIndex) {
uint16_t tile = 0;
if (containsGtId(gtIdToTileId, engine.gt_id)) {
tile = static_cast<uint16_t>(gtIdToTileId[engine.gt_id]);
} else if (containsGtId(mediaGtIdToTileId, engine.gt_id)) {
tile = static_cast<uint16_t>(mediaGtIdToTileId[engine.gt_id]);
} else {
continue;
}
auto tile = static_cast<uint16_t>(gtIdToTileId[engine.gt_id]);
multiTileMask.set(tile);
EngineClassInstance engineClassInstance{};
engineClassInstance.engineClass = engine.engine_class;
engineClassInstance.engineInstance = engine.engine_instance;
xeLog("\t%s:%d:%d\n", xeGetClassName(engineClassInstance.engineClass), engineClassInstance.engineInstance, engine.gt_id);
xeLog("\t%s:%d:%d %d\n", xeGetClassName(engineClassInstance.engineClass), engineClassInstance.engineInstance, engine.gt_id, tile);
const bool isBaseEngineClass = engineClassInstance.engineClass == getDrmParamValue(DrmParam::engineClassCompute) ||
engineClassInstance.engineClass == getDrmParamValue(DrmParam::engineClassRender) ||

View File

@ -34,6 +34,8 @@ struct BindInfo {
class IoctlHelperXe : public IoctlHelper {
public:
using GtIdContainer = StackVec<int, 4>;
using IoctlHelper::IoctlHelper;
static std::unique_ptr<IoctlHelperXe> create(Drm &drmArg);
static bool queryDeviceIdAndRevision(Drm &drm);
@ -157,6 +159,7 @@ class IoctlHelperXe : public IoctlHelper {
virtual bool isExtraEngineClassAllowed(uint16_t engineClass) const { return false; }
virtual std::optional<uint32_t> getCxlType() { return {}; }
virtual uint32_t getNumEngines(uint64_t *enginesData) const;
virtual bool isMediaGt(uint16_t gtType) const;
struct UserFenceExtension {
static constexpr uint32_t tagValue = 0x123987;
@ -186,8 +189,9 @@ class IoctlHelperXe : public IoctlHelper {
std::vector<uint64_t> queryGtListData;
constexpr static int invalidIndex = -1;
StackVec<int, 2> gtIdToTileId;
StackVec<int, 2> tileIdToGtId;
GtIdContainer gtIdToTileId;
GtIdContainer tileIdToGtId;
GtIdContainer mediaGtIdToTileId;
XeDrm::drm_xe_query_gt_list *xeGtListData = nullptr;
std::unique_ptr<XeDrm::drm_xe_engine_class_instance> defaultEngine;

View File

@ -9,6 +9,10 @@
namespace NEO {
bool IoctlHelperXePrelim::isMediaGt(uint16_t gtType) const {
return IoctlHelperXe::isMediaGt(gtType);
}
bool IoctlHelperXePrelim::isPrimaryContext(const OsContextLinux &osContext, uint32_t deviceIndex) {
return false;
}

View File

@ -23,6 +23,7 @@ class IoctlHelperXePrelim : public IoctlHelperXe {
virtual bool isPrimaryContext(const OsContextLinux &osContext, uint32_t deviceIndex);
virtual uint32_t getPrimaryContextId(const OsContextLinux &osContext, uint32_t deviceIndex, size_t contextIndex);
void setContextProperties(const OsContextLinux &osContext, uint32_t deviceIndex, void *extProperties, uint32_t &extIndexInOut) override;
bool isMediaGt(uint16_t gtType) const override;
};
} // namespace NEO

View File

@ -306,7 +306,7 @@ void DrmMockXe::initInstance() {
MemoryConstants::gigaByte // used size
};
this->queryGtList.resize(49); // 1 qword for num gts and 12 qwords per gt
this->queryGtList.resize(1 + (6 * 12)); // 1 qword for num gts and 12 qwords per gt
auto xeQueryGtList = reinterpret_cast<drm_xe_query_gt_list *>(this->queryGtList.begin());
xeQueryGtList->num_gt = 4;
xeQueryGtList->gt_list[0] = tile0MainGt;