/* * Copyright (C) 2021-2022 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/helpers/common_types.h" #include "shared/source/os_interface/linux/cache_info.h" #include "shared/source/os_interface/linux/drm_wrappers.h" #include "shared/source/os_interface/linux/ioctl_helper.h" #include "third_party/uapi/drm/i915_drm.h" namespace NEO { IoctlHelper *IoctlHelperUpstream::clone() { return new IoctlHelperUpstream{}; } bool IoctlHelperUpstream::isVmBindAvailable(Drm *drm) { return false; } uint32_t IoctlHelperUpstream::createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle) { uint32_t regionsSize = static_cast(memClassInstances.size()); std::vector regions(regionsSize); for (uint32_t i = 0; i < regionsSize; i++) { regions[i].memory_class = memClassInstances[i].memoryClass; regions[i].memory_instance = memClassInstances[i].memoryInstance; } drm_i915_gem_create_ext_memory_regions memRegions{}; memRegions.num_regions = regionsSize; memRegions.regions = reinterpret_cast(regions.data()); memRegions.base.name = I915_GEM_CREATE_EXT_MEMORY_REGIONS; drm_i915_gem_create_ext createExt{}; createExt.size = allocSize; createExt.extensions = reinterpret_cast(&memRegions); printDebugString(DebugManager.flags.PrintBOCreateDestroyResult.get(), stdout, "Performing GEM_CREATE_EXT with { size: %lu", allocSize); if (DebugManager.flags.PrintBOCreateDestroyResult.get()) { for (uint32_t i = 0; i < regionsSize; i++) { auto region = regions[i]; printDebugString(DebugManager.flags.PrintBOCreateDestroyResult.get(), stdout, ", memory class: %d, memory instance: %d", region.memory_class, region.memory_instance); } printDebugString(DebugManager.flags.PrintBOCreateDestroyResult.get(), stdout, "%s", " }\n"); } auto ret = ioctl(drm, DRM_IOCTL_I915_GEM_CREATE_EXT, &createExt); printDebugString(DebugManager.flags.PrintBOCreateDestroyResult.get(), stdout, "GEM_CREATE_EXT with EXT_MEMORY_REGIONS has returned: %d BO-%u with size: %lu\n", ret, createExt.handle, createExt.size); handle = createExt.handle; 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; } uint16_t IoctlHelperUpstream::closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) { return 0; } CacheRegion IoctlHelperUpstream::closFree(Drm *drm, CacheRegion closIndex) { return CacheRegion::None; } int IoctlHelperUpstream::waitUserFence(Drm *drm, uint32_t ctxId, uint64_t address, uint64_t value, uint32_t dataWidth, int64_t timeout, uint16_t flags) { return 0; } uint32_t IoctlHelperUpstream::getHwConfigIoctlVal() { return DRM_I915_QUERY_HWCONFIG_TABLE; } uint32_t IoctlHelperUpstream::getAtomicAdvise(bool isNonAtomic) { return 0; } uint32_t IoctlHelperUpstream::getPreferredLocationAdvise() { return 0; } bool IoctlHelperUpstream::setVmBoAdvise(Drm *drm, int32_t handle, uint32_t attribute, void *region) { return true; } bool IoctlHelperUpstream::setVmPrefetch(Drm *drm, uint64_t start, uint64_t length, uint32_t region) { return true; } uint32_t IoctlHelperUpstream::getDirectSubmissionFlag() { return 0u; } int32_t IoctlHelperUpstream::getMemRegionsIoctlVal() { return DRM_I915_QUERY_MEMORY_REGIONS; } int32_t IoctlHelperUpstream::getEngineInfoIoctlVal() { return DRM_I915_QUERY_ENGINE_INFO; } uint32_t IoctlHelperUpstream::getComputeSlicesIoctlVal() { return 0; } std::unique_ptr IoctlHelperUpstream::prepareVmBindExt(const StackVec &bindExtHandles) { return {}; } uint64_t IoctlHelperUpstream::getFlagsForVmBind(bool bindCapture, bool bindImmediate, bool bindMakeResident) { 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; } return 0; } int32_t IoctlHelperUpstream::getComputeEngineClass() { return 4; } uint16_t IoctlHelperUpstream::getWaitUserFenceSoftFlag() { return 0; } int IoctlHelperUpstream::execBuffer(Drm *drm, ExecBuffer *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) { return ioctl(drm, DRM_IOCTL_I915_GEM_EXECBUFFER2, execBuffer); } bool IoctlHelperUpstream::completionFenceExtensionSupported(const bool isVmBindAvailable) { return false; } std::optional IoctlHelperUpstream::getHasPageFaultParamId() { return std::nullopt; }; bool IoctlHelperUpstream::getEuStallProperties(std::array &properties, uint64_t dssBufferSize, uint64_t samplingRate, uint64_t pollPeriod, uint64_t engineInstance) { return false; } uint32_t IoctlHelperUpstream::getEuStallFdParameter() { return 0u; } std::unique_ptr IoctlHelperUpstream::createVmControlExtRegion(const std::optional ®ionInstanceClass) { return {}; } uint32_t IoctlHelperUpstream::getFlagsForVmCreate(bool disableScratch, bool enablePageFault, bool useVmBind) { return 0u; } uint32_t IoctlHelperUpstream::createContextWithAccessCounters(Drm *drm, GemContextCreateExt &gcc) { return EINVAL; } uint32_t IoctlHelperUpstream::createCooperativeContext(Drm *drm, GemContextCreateExt &gcc) { return EINVAL; } void IoctlHelperUpstream::fillVmBindExtSetPat(VmBindExtSetPatT &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) {} void IoctlHelperUpstream::fillVmBindExtUserFence(VmBindExtUserFenceT &vmBindExtUserFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) {} std::optional IoctlHelperUpstream::getCopyClassSaturatePCIECapability() { return std::nullopt; } std::optional IoctlHelperUpstream::getCopyClassSaturateLinkCapability() { return std::nullopt; } uint32_t IoctlHelperUpstream::getVmAdviseAtomicAttribute() { return 0; } int IoctlHelperUpstream::vmBind(Drm *drm, const VmBindParams &vmBindParams) { return 0; } int IoctlHelperUpstream::vmUnbind(Drm *drm, const VmBindParams &vmBindParams) { return 0; } UuidRegisterResult IoctlHelperUpstream::registerUuid(Drm *drm, const std::string &uuid, uint32_t uuidClass, uint64_t ptr, uint64_t size) { return {0, 0}; } UuidRegisterResult IoctlHelperUpstream::registerStringClassUuid(Drm *drm, const std::string &uuid, uint64_t ptr, uint64_t size) { return {0, 0}; } int IoctlHelperUpstream::unregisterUuid(Drm *drm, uint32_t handle) { return 0; } bool IoctlHelperUpstream::isContextDebugSupported(Drm *drm) { return false; } int IoctlHelperUpstream::setContextDebugFlag(Drm *drm, uint32_t drmContextId) { return 0; } bool IoctlHelperUpstream::isDebugAttachAvailable() { return false; } } // namespace NEO