fix: improve media engine handling
Related-To: NEO-14462 Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:
parent
03353ef73d
commit
831b488685
|
@ -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 > = 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) ||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue