From 9f89a9167136e914175badaa0b418f9e7f8f7748 Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Fri, 3 Jun 2022 13:57:42 +0000 Subject: [PATCH] Unify shared code between ioctl helpers upstream and prelim Related-To: NEO-7028 Signed-off-by: Mateusz Jablonski --- .../os_interface/linux/ioctl_helper.cpp | 30 +++++++++++++++++ .../source/os_interface/linux/ioctl_helper.h | 17 ++++------ .../linux/ioctl_helper_prelim.cpp | 32 +------------------ .../linux/ioctl_helper_upstream.cpp | 32 +------------------ .../linux/local/dg1/ioctl_helper_dg1.cpp | 2 +- 5 files changed, 40 insertions(+), 73 deletions(-) diff --git a/shared/source/os_interface/linux/ioctl_helper.cpp b/shared/source/os_interface/linux/ioctl_helper.cpp index 5d7b862973..51fca6284d 100644 --- a/shared/source/os_interface/linux/ioctl_helper.cpp +++ b/shared/source/os_interface/linux/ioctl_helper.cpp @@ -106,6 +106,32 @@ uint32_t IoctlHelper::createDrmContext(Drm &drm, const OsContext &osContext, uin return drmContextId; } +std::vector IoctlHelper::translateToEngineCaps(const std::vector &data) { + auto engineInfo = reinterpret_cast(data.data()); + std::vector engines; + engines.reserve(engineInfo->num_engines); + for (uint32_t i = 0; i < engineInfo->num_engines; i++) { + EngineCapabilities engine{}; + engine.capabilities = engineInfo->engines[i].capabilities; + engine.engine.engineClass = engineInfo->engines[i].engine.engine_class; + engine.engine.engineInstance = engineInfo->engines[i].engine.engine_instance; + engines.push_back(engine); + } + return engines; +} + +std::vector IoctlHelper::translateToMemoryRegions(const std::vector ®ionInfo) { + auto *data = reinterpret_cast(regionInfo.data()); + auto memRegions = std::vector(data->num_regions); + for (uint32_t i = 0; i < data->num_regions; i++) { + memRegions[i].probedSize = data->regions[i].probed_size; + memRegions[i].unallocatedSize = data->regions[i].unallocated_size; + memRegions[i].region.memoryClass = data->regions[i].region.memory_class; + memRegions[i].region.memoryInstance = data->regions[i].region.memory_instance; + } + return memRegions; +} + unsigned int IoctlHelper::getIoctlRequestValueBase(DrmIoctl ioctlRequest) const { switch (ioctlRequest) { case DrmIoctl::GemExecbuffer2: @@ -170,6 +196,10 @@ int IoctlHelper::getDrmParamValueBase(DrmParam drmParam) const { return I915_ENGINE_CLASS_INVALID; case DrmParam::EngineClassInvalidNone: return I915_ENGINE_CLASS_INVALID_NONE; + case DrmParam::QueryEngineInfo: + return DRM_I915_QUERY_ENGINE_INFO; + case DrmParam::QueryMemoryRegions: + return DRM_I915_QUERY_MEMORY_REGIONS; default: UNRECOVERABLE_IF(true); return 0; diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index 086d6638fd..e768d9ecb6 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -72,7 +72,6 @@ class IoctlHelper { virtual bool isVmBindAvailable(Drm *drm) = 0; virtual uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, std::optional vmId) = 0; - virtual std::vector translateToMemoryRegions(const std::vector ®ionInfo) = 0; virtual CacheRegion closAlloc(Drm *drm) = 0; virtual uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) = 0; virtual CacheRegion closFree(Drm *drm, CacheRegion closIndex) = 0; @@ -85,7 +84,6 @@ class IoctlHelper { virtual uint32_t getDirectSubmissionFlag() = 0; virtual std::unique_ptr prepareVmBindExt(const StackVec &bindExtHandles) = 0; virtual uint64_t getFlagsForVmBind(bool bindCapture, bool bindImmediate, bool bindMakeResident) = 0; - virtual std::vector translateToEngineCaps(const std::vector &data) = 0; virtual uint32_t queryDistances(Drm *drm, std::vector &queryItems, std::vector &distanceInfos) = 0; virtual uint16_t getWaitUserFenceSoftFlag() = 0; virtual int execBuffer(Drm *drm, ExecBuffer *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) = 0; @@ -110,10 +108,13 @@ class IoctlHelper { virtual bool isContextDebugSupported(Drm *drm) = 0; virtual int setContextDebugFlag(Drm *drm, uint32_t drmContextId) = 0; virtual bool isDebugAttachAvailable() = 0; - virtual unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest) = 0; + virtual unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest) const = 0; virtual int getDrmParamValue(DrmParam drmParam) const = 0; + virtual std::vector translateToMemoryRegions(const std::vector ®ionInfo); + uint32_t createDrmContext(Drm &drm, const OsContext &osContext, uint32_t drmVmId); + std::vector translateToEngineCaps(const std::vector &data); void fillExecObject(ExecObject &execObject, uint32_t handle, uint64_t gpuAddress, uint32_t drmContextId, bool bindInfo, bool isMarkedForCapture); void logExecObject(const ExecObject &execObject, std::stringstream &logger, size_t size); @@ -130,7 +131,6 @@ class IoctlHelperUpstream : public IoctlHelper { bool isVmBindAvailable(Drm *drm) override; uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, std::optional vmId) override; - std::vector translateToMemoryRegions(const std::vector ®ionInfo) override; CacheRegion closAlloc(Drm *drm) override; uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) override; CacheRegion closFree(Drm *drm, CacheRegion closIndex) override; @@ -143,7 +143,6 @@ class IoctlHelperUpstream : public IoctlHelper { uint32_t getDirectSubmissionFlag() override; std::unique_ptr prepareVmBindExt(const StackVec &bindExtHandles) override; uint64_t getFlagsForVmBind(bool bindCapture, bool bindImmediate, bool bindMakeResident) override; - std::vector translateToEngineCaps(const std::vector &data) override; uint32_t queryDistances(Drm *drm, std::vector &queryItems, std::vector &distanceInfos) override; uint16_t getWaitUserFenceSoftFlag() override; int execBuffer(Drm *drm, ExecBuffer *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) override; @@ -168,7 +167,7 @@ class IoctlHelperUpstream : public IoctlHelper { bool isContextDebugSupported(Drm *drm) override; int setContextDebugFlag(Drm *drm, uint32_t drmContextId) override; bool isDebugAttachAvailable() override; - unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest) override; + unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest) const override; int getDrmParamValue(DrmParam drmParam) const override; }; @@ -183,7 +182,7 @@ class IoctlHelperImpl : public IoctlHelperUpstream { uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, std::optional vmId) override; std::vector translateToMemoryRegions(const std::vector ®ionInfo) override; - unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest) override; + unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest) const override; }; class IoctlHelperPrelim20 : public IoctlHelper { @@ -192,7 +191,6 @@ class IoctlHelperPrelim20 : public IoctlHelper { bool isVmBindAvailable(Drm *drm) override; uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, std::optional vmId) override; - std::vector translateToMemoryRegions(const std::vector ®ionInfo) override; CacheRegion closAlloc(Drm *drm) override; uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) override; CacheRegion closFree(Drm *drm, CacheRegion closIndex) override; @@ -205,7 +203,6 @@ class IoctlHelperPrelim20 : public IoctlHelper { uint32_t getDirectSubmissionFlag() override; std::unique_ptr prepareVmBindExt(const StackVec &bindExtHandles) override; uint64_t getFlagsForVmBind(bool bindCapture, bool bindImmediate, bool bindMakeResident) override; - std::vector translateToEngineCaps(const std::vector &data) override; uint32_t queryDistances(Drm *drm, std::vector &queryItems, std::vector &distanceInfos) override; uint16_t getWaitUserFenceSoftFlag() override; int execBuffer(Drm *drm, ExecBuffer *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) override; @@ -230,7 +227,7 @@ class IoctlHelperPrelim20 : public IoctlHelper { bool isContextDebugSupported(Drm *drm) override; int setContextDebugFlag(Drm *drm, uint32_t drmContextId) override; bool isDebugAttachAvailable() override; - unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest) override; + unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest) const override; int getDrmParamValue(DrmParam drmParam) const override; }; diff --git a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp index 6bdc18f2a9..2dd611858a 100644 --- a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp @@ -86,18 +86,6 @@ uint32_t IoctlHelperPrelim20::createGemExt(Drm *drm, const MemRegionsVec &memCla return ret; } -std::vector IoctlHelperPrelim20::translateToMemoryRegions(const std::vector ®ionInfo) { - auto *data = reinterpret_cast(regionInfo.data()); - auto memRegions = std::vector(data->num_regions); - for (uint32_t i = 0; i < data->num_regions; i++) { - memRegions[i].probedSize = data->regions[i].probed_size; - memRegions[i].unallocatedSize = data->regions[i].unallocated_size; - memRegions[i].region.memoryClass = data->regions[i].region.memory_class; - memRegions[i].region.memoryInstance = data->regions[i].region.memory_instance; - } - return memRegions; -} - CacheRegion IoctlHelperPrelim20::closAlloc(Drm *drm) { struct prelim_drm_i915_gem_clos_reserve clos = {}; @@ -277,20 +265,6 @@ uint64_t IoctlHelperPrelim20::getFlagsForVmBind(bool bindCapture, bool bindImmed return flags; } -std::vector IoctlHelperPrelim20::translateToEngineCaps(const std::vector &data) { - auto engineInfo = reinterpret_cast(data.data()); - std::vector engines; - engines.reserve(engineInfo->num_engines); - for (uint32_t i = 0; i < engineInfo->num_engines; i++) { - EngineCapabilities engine{}; - engine.capabilities = engineInfo->engines[i].capabilities; - engine.engine.engineClass = engineInfo->engines[i].engine.engine_class; - engine.engine.engineInstance = engineInfo->engines[i].engine.engine_instance; - engines.push_back(engine); - } - return engines; -} - prelim_drm_i915_query_distance_info translateToi915(const DistanceInfo &distanceInfo) { prelim_drm_i915_query_distance_info dist{}; dist.engine.engine_class = distanceInfo.engine.engineClass; @@ -542,7 +516,7 @@ bool IoctlHelperPrelim20::isDebugAttachAvailable() { return true; } -unsigned int IoctlHelperPrelim20::getIoctlRequestValue(DrmIoctl ioctlRequest) { +unsigned int IoctlHelperPrelim20::getIoctlRequestValue(DrmIoctl ioctlRequest) const { switch (ioctlRequest) { case DrmIoctl::GemVmBind: return PRELIM_DRM_IOCTL_I915_GEM_VM_BIND; @@ -577,14 +551,10 @@ int IoctlHelperPrelim20::getDrmParamValue(DrmParam drmParam) const { switch (drmParam) { case DrmParam::EngineClassCompute: return PRELIM_I915_ENGINE_CLASS_COMPUTE; - case DrmParam::QueryEngineInfo: - return DRM_I915_QUERY_ENGINE_INFO; case DrmParam::QueryHwconfigTable: return PRELIM_DRM_I915_QUERY_HWCONFIG_TABLE; case DrmParam::QueryComputeSlices: return PRELIM_DRM_I915_QUERY_COMPUTE_SLICES; - case DrmParam::QueryMemoryRegions: - return DRM_I915_QUERY_MEMORY_REGIONS; default: return getDrmParamValueBase(drmParam); } diff --git a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp index 15bb1ab7f1..d385a9430d 100644 --- a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp @@ -58,18 +58,6 @@ uint32_t IoctlHelperUpstream::createGemExt(Drm *drm, const MemRegionsVec &memCla return ret; } -std::vector IoctlHelperUpstream::translateToMemoryRegions(const std::vector ®ionInfo) { - auto *data = reinterpret_cast(regionInfo.data()); - auto memRegions = std::vector(data->num_regions); - for (uint32_t i = 0; i < data->num_regions; i++) { - memRegions[i].probedSize = data->regions[i].probed_size; - memRegions[i].unallocatedSize = data->regions[i].unallocated_size; - memRegions[i].region.memoryClass = data->regions[i].region.memory_class; - memRegions[i].region.memoryInstance = data->regions[i].region.memory_instance; - } - return memRegions; -} - CacheRegion IoctlHelperUpstream::closAlloc(Drm *drm) { return CacheRegion::None; } @@ -115,20 +103,6 @@ uint64_t IoctlHelperUpstream::getFlagsForVmBind(bool bindCapture, bool bindImmed return 0u; } -std::vector IoctlHelperUpstream::translateToEngineCaps(const std::vector &data) { - auto engineInfo = reinterpret_cast(data.data()); - std::vector engines; - engines.reserve(engineInfo->num_engines); - for (uint32_t i = 0; i < engineInfo->num_engines; i++) { - EngineCapabilities engine{}; - engine.capabilities = engineInfo->engines[i].capabilities; - engine.engine.engineClass = engineInfo->engines[i].engine.engine_class; - engine.engine.engineInstance = engineInfo->engines[i].engine.engine_instance; - engines.push_back(engine); - } - return engines; -} - uint32_t IoctlHelperUpstream::queryDistances(Drm *drm, std::vector &queryItems, std::vector &distanceInfos) { for (auto &query : queryItems) { query.length = -EINVAL; @@ -224,7 +198,7 @@ bool IoctlHelperUpstream::isDebugAttachAvailable() { return false; } -unsigned int IoctlHelperUpstream::getIoctlRequestValue(DrmIoctl ioctlRequest) { +unsigned int IoctlHelperUpstream::getIoctlRequestValue(DrmIoctl ioctlRequest) const { switch (ioctlRequest) { case DrmIoctl::GemCreateExt: return DRM_IOCTL_I915_GEM_CREATE_EXT; @@ -237,12 +211,8 @@ int IoctlHelperUpstream::getDrmParamValue(DrmParam drmParam) const { switch (drmParam) { case DrmParam::EngineClassCompute: return 4; - case DrmParam::QueryEngineInfo: - return DRM_I915_QUERY_ENGINE_INFO; case DrmParam::QueryHwconfigTable: return DRM_I915_QUERY_HWCONFIG_TABLE; - case DrmParam::QueryMemoryRegions: - return DRM_I915_QUERY_MEMORY_REGIONS; case DrmParam::QueryComputeSlices: return 0; default: diff --git a/shared/source/os_interface/linux/local/dg1/ioctl_helper_dg1.cpp b/shared/source/os_interface/linux/local/dg1/ioctl_helper_dg1.cpp index a14469129e..34c5a5371b 100644 --- a/shared/source/os_interface/linux/local/dg1/ioctl_helper_dg1.cpp +++ b/shared/source/os_interface/linux/local/dg1/ioctl_helper_dg1.cpp @@ -67,7 +67,7 @@ std::vector IoctlHelperImpl::translateToMemoryRegions( } template <> -unsigned int IoctlHelperImpl::getIoctlRequestValue(DrmIoctl ioctlRequest) { +unsigned int IoctlHelperImpl::getIoctlRequestValue(DrmIoctl ioctlRequest) const { switch (ioctlRequest) { case DrmIoctl::DG1GemCreateExt: return DRM_IOCTL_I915_GEM_CREATE_EXT;