From e29c0b9726017fdd452c7014c66971664fd29656 Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Thu, 11 Jul 2019 14:29:45 +0200 Subject: [PATCH] Many DRM context ids per OsContextLinux. Related-To: NEO-3008 Change-Id: Id6d1c919109d22ccfc64abdaf11aef875dc33615 Signed-off-by: Piotr Fusik --- runtime/os_interface/linux/drm_neo.h | 4 ++-- runtime/os_interface/linux/drm_query.cpp | 2 +- .../os_interface/linux/os_context_linux.cpp | 18 ++++++++++++------ runtime/os_interface/linux/os_context_linux.h | 6 ++++-- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/runtime/os_interface/linux/drm_neo.h b/runtime/os_interface/linux/drm_neo.h index e91af3b86f..fbff51b596 100644 --- a/runtime/os_interface/linux/drm_neo.h +++ b/runtime/os_interface/linux/drm_neo.h @@ -6,11 +6,11 @@ */ #pragma once -#include "runtime/memory_manager/memory_manager.h" #include "runtime/os_interface/linux/engine_info.h" #include "runtime/os_interface/linux/memory_info.h" #include "runtime/utilities/api_intercept.h" +#include "engine_node.h" #include "igfxfmid.h" #include @@ -65,7 +65,7 @@ class Drm { uint32_t createDrmContext(); void destroyDrmContext(uint32_t drmContextId); void setLowPriorityContextParam(uint32_t drmContextId); - unsigned int bindDrmContext(uint32_t drmContextId, DeviceBitfield deviceBitfield, aub_stream::EngineType engineType); + unsigned int bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, aub_stream::EngineType engineType); void setGtType(GTTYPE eGtType) { this->eGtType = eGtType; } GTTYPE getGtType() const { return this->eGtType; } diff --git a/runtime/os_interface/linux/drm_query.cpp b/runtime/os_interface/linux/drm_query.cpp index 3daa9ea1ce..7a4db05cc8 100644 --- a/runtime/os_interface/linux/drm_query.cpp +++ b/runtime/os_interface/linux/drm_query.cpp @@ -21,7 +21,7 @@ void Drm::queryEngineInfo() { void Drm::queryMemoryInfo() { } -unsigned int Drm::bindDrmContext(uint32_t drmContextId, DeviceBitfield deviceBitfield, aub_stream::EngineType engineType) { +unsigned int Drm::bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, aub_stream::EngineType engineType) { return DrmEngineMapper::engineNodeMap(engineType); } diff --git a/runtime/os_interface/linux/os_context_linux.cpp b/runtime/os_interface/linux/os_context_linux.cpp index 5451e9cc27..5bbf3d0039 100644 --- a/runtime/os_interface/linux/os_context_linux.cpp +++ b/runtime/os_interface/linux/os_context_linux.cpp @@ -24,15 +24,21 @@ OsContext *OsContext::create(OSInterface *osInterface, uint32_t contextId, Devic OsContextLinux::OsContextLinux(Drm &drm, uint32_t contextId, DeviceBitfield deviceBitfield, aub_stream::EngineType engineType, PreemptionMode preemptionMode, bool lowPriority) : OsContext(contextId, deviceBitfield, engineType, preemptionMode, lowPriority), drm(drm) { - - this->drmContextId = drm.createDrmContext(); - if (drm.isPreemptionSupported() && lowPriority) { - drm.setLowPriorityContextParam(this->drmContextId); + for (auto deviceIndex = 0u; deviceIndex < deviceBitfield.size(); deviceIndex++) { + if (deviceBitfield.test(deviceIndex)) { + auto drmContextId = drm.createDrmContext(); + if (drm.isPreemptionSupported() && lowPriority) { + drm.setLowPriorityContextParam(drmContextId); + } + this->engineFlag = drm.bindDrmContext(drmContextId, deviceIndex, engineType); + this->drmContextIds.push_back(drmContextId); + } } - this->engineFlag = drm.bindDrmContext(this->drmContextId, deviceBitfield, engineType); } OsContextLinux::~OsContextLinux() { - drm.destroyDrmContext(drmContextId); + for (auto drmContextId : drmContextIds) { + drm.destroyDrmContext(drmContextId); + } } } // namespace NEO diff --git a/runtime/os_interface/linux/os_context_linux.h b/runtime/os_interface/linux/os_context_linux.h index 62bf2b68f6..adbe2971c5 100644 --- a/runtime/os_interface/linux/os_context_linux.h +++ b/runtime/os_interface/linux/os_context_linux.h @@ -7,6 +7,8 @@ #include "runtime/os_interface/os_context.h" +#include + namespace NEO { class Drm; @@ -18,11 +20,11 @@ class OsContextLinux : public OsContext { aub_stream::EngineType engineType, PreemptionMode preemptionMode, bool lowPriority); unsigned int getEngineFlag() const { return engineFlag; } - uint32_t getDrmContextId() const { return drmContextId; } + uint32_t getDrmContextId() const { return drmContextIds[0]; } protected: unsigned int engineFlag = 0; - uint32_t drmContextId = 0; + std::vector drmContextIds; Drm &drm; }; } // namespace NEO