Add logic to change queue slice count

Change-Id: I4f5ccb4ecb290e1a05e3a312b9fa2a5d9c5c17f7
Signed-off-by: Katarzyna Cencelewska <katarzyna.cencelewska@intel.com>
This commit is contained in:
Katarzyna Cencelewska
2019-08-21 03:50:47 -07:00
committed by sys_ocldev
parent 7fa3865f0b
commit 260759268a
33 changed files with 599 additions and 119 deletions

View File

@@ -51,6 +51,12 @@ FlushStamp DrmCommandStreamReceiver<GfxFamily>::flush(BatchBuffer &batchBuffer,
return 0;
}
if (this->lastSentSliceCount != batchBuffer.sliceCount) {
if (drm->setQueueSliceCount(batchBuffer.sliceCount)) {
this->lastSentSliceCount = batchBuffer.sliceCount;
}
}
FlushStamp flushStamp = bb->peekHandle();
this->flushInternal(batchBuffer, allocationsForResidency);

View File

@@ -11,8 +11,6 @@
#include "core/utilities/directory.h"
#include "runtime/os_interface/os_inc_base.h"
#include "drm/i915_drm.h"
#include <cstdio>
#include <cstring>
#include <fstream>
@@ -131,6 +129,10 @@ void Drm::checkPreemptionSupport() {
preemptionSupported = ((0 == ret) && (value & I915_SCHEDULER_CAP_PREEMPTION));
}
void Drm::checkQueueSliceSupport() {
sliceCountChangeSupported = getQueueSliceCount(&sseu) == 0 ? true : false;
}
void Drm::setLowPriorityContextParam(uint32_t drmContextId) {
drm_i915_gem_context_param gcp = {};
gcp.ctx_id = drmContextId;
@@ -141,6 +143,37 @@ void Drm::setLowPriorityContextParam(uint32_t drmContextId) {
UNRECOVERABLE_IF(retVal != 0);
}
int Drm::getQueueSliceCount(drm_i915_gem_context_param_sseu *sseu) {
drm_i915_gem_context_param contextParam = {};
contextParam.param = I915_CONTEXT_PARAM_SSEU;
sseu->engine.engine_class = I915_ENGINE_CLASS_RENDER;
sseu->engine.engine_instance = I915_EXEC_DEFAULT;
contextParam.value = reinterpret_cast<uint64_t>(sseu);
contextParam.size = sizeof(struct drm_i915_gem_context_param_sseu);
return ioctl(DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM, &contextParam);
}
uint64_t Drm::getSliceMask(uint64_t sliceCount) {
return static_cast<uint64_t>((1 << sliceCount) - 1);
}
bool Drm::setQueueSliceCount(uint64_t sliceCount) {
if (sliceCountChangeSupported) {
drm_i915_gem_context_param contextParam = {};
sseu.slice_mask = getSliceMask(sliceCount);
contextParam.param = I915_CONTEXT_PARAM_SSEU;
contextParam.ctx_id = 0;
contextParam.value = reinterpret_cast<uint64_t>(&sseu);
contextParam.size = sizeof(struct drm_i915_gem_context_param_sseu);
int retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &contextParam);
if (retVal == 0) {
return true;
}
}
return false;
}
uint32_t Drm::createDrmContext() {
drm_i915_gem_context_create gcc = {};
auto retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &gcc);

View File

@@ -11,6 +11,7 @@
#include "runtime/os_interface/linux/memory_info.h"
#include "runtime/utilities/api_intercept.h"
#include "drm/i915_drm.h"
#include "engine_node.h"
#include "igfxfmid.h"
@@ -73,6 +74,9 @@ class Drm {
MOCKABLE_VIRTUAL int getErrno();
void setSimplifiedMocsTableUsage(bool value);
bool getSimplifiedMocsTableUsage() const;
bool setQueueSliceCount(uint64_t sliceCount);
void checkQueueSliceSupport();
uint64_t getSliceMask(uint64_t sliceCount);
void queryEngineInfo();
void queryMemoryInfo();
void setMemoryRegions();
@@ -82,6 +86,9 @@ class Drm {
}
protected:
int getQueueSliceCount(drm_i915_gem_context_param_sseu *sseu);
bool sliceCountChangeSupported = false;
drm_i915_gem_context_param_sseu sseu{};
bool useSimplifiedMocsTable = false;
bool preemptionSupported = false;
int fd;

View File

@@ -149,9 +149,10 @@ int HwInfoConfig::configureHwInfo(const HardwareInfo *inHwInfo, HardwareInfo *ou
outHwInfo->capabilityTable.instrumentationEnabled =
(outHwInfo->capabilityTable.instrumentationEnabled && haveInstrumentation);
outHwInfo->capabilityTable.ftrRenderCompressedBuffers = false;
outHwInfo->capabilityTable.ftrRenderCompressedImages = false;
drm->checkQueueSliceSupport();
drm->checkPreemptionSupport();
bool preemption = drm->isPreemptionSupported();
PreemptionHelper::adjustDefaultPreemptionMode(outHwInfo->capabilityTable,