Drm: call ioctl using ioctl helper if possible

Related-To: NEO-6999
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski 2022-06-28 17:56:14 +00:00 committed by Compute-Runtime-Automation
parent a8e2bd3f98
commit b72fcad1be
6 changed files with 64 additions and 43 deletions

View File

@ -15,7 +15,7 @@ namespace L0 {
int DrmHelper::ioctl(Device *device, NEO::DrmIoctl request, void *arg) {
auto drm = device->getOsInterface().getDriverModel()->as<NEO::Drm>();
return drm->ioctl(request, arg);
return drm->getIoctlHelper()->ioctl(drm, request, arg);
}
int DrmHelper::getErrno(Device *device) {

View File

@ -31,10 +31,11 @@ void DeviceTimeDrm::timestampTypeDetect() {
return;
reg.offset = (REG_GLOBAL_TIMESTAMP_LDW | 1);
err = pDrm->ioctl(DrmIoctl::RegRead, &reg);
auto ioctlHelper = pDrm->getIoctlHelper();
err = ioctlHelper->ioctl(pDrm, DrmIoctl::RegRead, &reg);
if (err) {
reg.offset = REG_GLOBAL_TIMESTAMP_UN;
err = pDrm->ioctl(DrmIoctl::RegRead, &reg);
err = ioctlHelper->ioctl(pDrm, DrmIoctl::RegRead, &reg);
if (err) {
getGpuTime = &DeviceTimeDrm::getGpuTime32;
} else {
@ -50,7 +51,8 @@ bool DeviceTimeDrm::getGpuTime32(uint64_t *timestamp) {
reg.offset = REG_GLOBAL_TIMESTAMP_LDW;
if (pDrm->ioctl(DrmIoctl::RegRead, &reg)) {
auto ioctlHelper = pDrm->getIoctlHelper();
if (ioctlHelper->ioctl(pDrm, DrmIoctl::RegRead, &reg)) {
return false;
}
*timestamp = reg.value >> 32;
@ -62,7 +64,8 @@ bool DeviceTimeDrm::getGpuTime36(uint64_t *timestamp) {
reg.offset = REG_GLOBAL_TIMESTAMP_LDW | 1;
if (pDrm->ioctl(DrmIoctl::RegRead, &reg)) {
auto ioctlHelper = pDrm->getIoctlHelper();
if (ioctlHelper->ioctl(pDrm, DrmIoctl::RegRead, &reg)) {
return false;
}
*timestamp = reg.value;
@ -78,11 +81,12 @@ bool DeviceTimeDrm::getGpuTimeSplitted(uint64_t *timestamp) {
regHi.offset = REG_GLOBAL_TIMESTAMP_UN;
regLo.offset = REG_GLOBAL_TIMESTAMP_LDW;
err += pDrm->ioctl(DrmIoctl::RegRead, &regHi);
auto ioctlHelper = pDrm->getIoctlHelper();
err += ioctlHelper->ioctl(pDrm, DrmIoctl::RegRead, &regHi);
do {
tmpHi = regHi.value;
err += pDrm->ioctl(DrmIoctl::RegRead, &regLo);
err += pDrm->ioctl(DrmIoctl::RegRead, &regHi);
err += ioctlHelper->ioctl(pDrm, DrmIoctl::RegRead, &regLo);
err += ioctlHelper->ioctl(pDrm, DrmIoctl::RegRead, &regHi);
} while (err == 0 && regHi.value != tmpHi && --loop);
if (err) {

View File

@ -68,7 +68,8 @@ bool BufferObject::close() {
PRINT_DEBUG_STRING(DebugManager.flags.PrintBOCreateDestroyResult.get(), stdout, "Calling gem close on handle: BO-%d\n", this->handle);
int ret = this->drm->ioctl(DrmIoctl::GemClose, &close);
auto ioctlHelper = this->drm->getIoctlHelper();
int ret = ioctlHelper->ioctl(drm, DrmIoctl::GemClose, &close);
if (ret != 0) {
int err = errno;
PRINT_DEBUG_STRING(DebugManager.flags.PrintDebugMessages.get(), stderr, "ioctl(GEM_CLOSE) failed with %d. errno=%d(%s)\n", ret, err, strerror(err));
@ -101,8 +102,9 @@ bool BufferObject::setTiling(uint32_t mode, uint32_t stride) {
setTiling.handle = this->handle;
setTiling.tilingMode = mode;
setTiling.stride = stride;
auto ioctlHelper = this->drm->getIoctlHelper();
if (this->drm->ioctl(DrmIoctl::GemSetTiling, &setTiling) != 0) {
if (ioctlHelper->ioctl(drm, DrmIoctl::GemSetTiling, &setTiling) != 0) {
return false;
}

View File

@ -246,8 +246,9 @@ NEO::BufferObject *DrmMemoryManager::allocUserptr(uintptr_t address, size_t size
userptr.userSize = size;
auto &drm = this->getDrm(rootDeviceIndex);
auto ioctlHelper = drm.getIoctlHelper();
if (drm.ioctl(DrmIoctl::GemUserptr, &userptr) != 0) {
if (ioctlHelper->ioctl(&drm, DrmIoctl::GemUserptr, &userptr) != 0) {
return nullptr;
}
@ -520,8 +521,9 @@ GraphicsAllocation *DrmMemoryManager::allocateMemoryByKMD(const AllocationData &
create.size = bufferSize;
auto &drm = getDrm(allocationData.rootDeviceIndex);
auto ioctlHelper = drm.getIoctlHelper();
[[maybe_unused]] auto ret = drm.ioctl(DrmIoctl::GemCreate, &create);
[[maybe_unused]] auto ret = ioctlHelper->ioctl(&drm, DrmIoctl::GemCreate, &create);
DEBUG_BREAK_IF(ret != 0);
auto patIndex = drm.getPatIndex(gmm.get(), allocationData.type, CacheRegion::Default, CachePolicy::WriteBack, false);
@ -553,8 +555,9 @@ GraphicsAllocation *DrmMemoryManager::allocateGraphicsMemoryForImageImpl(const A
create.size = allocationData.imgInfo->size;
auto &drm = this->getDrm(allocationData.rootDeviceIndex);
auto ioctlHelper = drm.getIoctlHelper();
[[maybe_unused]] auto ret = drm.ioctl(DrmIoctl::GemCreate, &create);
[[maybe_unused]] auto ret = ioctlHelper->ioctl(&drm, DrmIoctl::GemCreate, &create);
DEBUG_BREAK_IF(ret != 0);
auto patIndex = drm.getPatIndex(gmm.get(), allocationData.type, CacheRegion::Default, CachePolicy::WriteBack, false);
@ -565,7 +568,6 @@ GraphicsAllocation *DrmMemoryManager::allocateGraphicsMemoryForImageImpl(const A
}
bo->setAddress(gpuRange);
auto ioctlHelper = drm.getIoctlHelper();
[[maybe_unused]] auto ret2 = bo->setTiling(ioctlHelper->getDrmParamValue(DrmParam::TilingY), static_cast<uint32_t>(allocationData.imgInfo->rowPitch));
DEBUG_BREAK_IF(ret2 != true);
@ -682,12 +684,13 @@ GraphicsAllocation *DrmMemoryManager::createGraphicsAllocationFromMultipleShared
auto &drm = this->getDrm(properties.rootDeviceIndex);
bool areBosSharedObjects = true;
auto ioctlHelper = drm.getIoctlHelper();
for (auto handle : handles) {
PrimeHandle openFd = {0, 0, 0};
openFd.fileDescriptor = handle;
auto ret = this->getDrm(properties.rootDeviceIndex).ioctl(DrmIoctl::PrimeFdToHandle, &openFd);
auto ret = ioctlHelper->ioctl(&drm, DrmIoctl::PrimeFdToHandle, &openFd);
if (ret != 0) {
[[maybe_unused]] int err = errno;
@ -772,8 +775,9 @@ GraphicsAllocation *DrmMemoryManager::createGraphicsAllocationFromSharedHandle(o
openFd.fileDescriptor = handle;
auto &drm = this->getDrm(properties.rootDeviceIndex);
auto ioctlHelper = drm.getIoctlHelper();
auto ret = drm.ioctl(DrmIoctl::PrimeFdToHandle, &openFd);
auto ret = ioctlHelper->ioctl(&drm, DrmIoctl::PrimeFdToHandle, &openFd);
if (ret != 0) {
[[maybe_unused]] int err = errno;
@ -825,7 +829,8 @@ GraphicsAllocation *DrmMemoryManager::createGraphicsAllocationFromSharedHandle(o
if (properties.imgInfo) {
GemGetTiling getTiling{};
getTiling.handle = boHandle;
ret = drm.ioctl(DrmIoctl::GemGetTiling, &getTiling);
auto ioctlHelper = drm.getIoctlHelper();
ret = ioctlHelper->ioctl(&drm, DrmIoctl::GemGetTiling, &getTiling);
if (ret == 0) {
auto ioctlHelper = drm.getIoctlHelper();
@ -1045,7 +1050,9 @@ bool DrmMemoryManager::setDomainCpu(GraphicsAllocation &graphicsAllocation, bool
setDomain.readDomains = I915_GEM_DOMAIN_CPU;
setDomain.writeDomain = writeEnable ? I915_GEM_DOMAIN_CPU : 0;
return getDrm(graphicsAllocation.getRootDeviceIndex()).ioctl(DrmIoctl::GemSetDomain, &setDomain) == 0;
auto &drm = this->getDrm(graphicsAllocation.getRootDeviceIndex());
auto ioctlHelper = drm.getIoctlHelper();
return ioctlHelper->ioctl(&drm, DrmIoctl::GemSetDomain, &setDomain) == 0;
}
void *DrmMemoryManager::lockResourceImpl(GraphicsAllocation &graphicsAllocation) {
@ -1076,13 +1083,15 @@ void DrmMemoryManager::unlockResourceImpl(GraphicsAllocation &graphicsAllocation
return unlockBufferObject(static_cast<DrmAllocation &>(graphicsAllocation).getBO());
}
int DrmMemoryManager::obtainFdFromHandle(int boHandle, uint32_t rootDeviceindex) {
int DrmMemoryManager::obtainFdFromHandle(int boHandle, uint32_t rootDeviceIndex) {
PrimeHandle openFd{};
openFd.flags = DRM_CLOEXEC | DRM_RDWR;
openFd.handle = boHandle;
getDrm(rootDeviceindex).ioctl(DrmIoctl::PrimeHandleToFd, &openFd);
auto &drm = this->getDrm(rootDeviceIndex);
auto ioctlHelper = drm.getIoctlHelper();
ioctlHelper->ioctl(&drm, DrmIoctl::PrimeHandleToFd, &openFd);
return openFd.fileDescriptor;
}
@ -1568,11 +1577,12 @@ bool DrmMemoryManager::retrieveMmapOffsetForBufferObject(uint32_t rootDeviceInde
GemMmapOffset mmapOffset = {};
mmapOffset.handle = bo.peekHandle();
mmapOffset.flags = isLocalMemorySupported(rootDeviceIndex) ? mmapOffsetFixed : flags;
auto &drm = getDrm(rootDeviceIndex);
auto ret = drm.ioctl(DrmIoctl::GemMmapOffset, &mmapOffset);
auto &drm = this->getDrm(rootDeviceIndex);
auto ioctlHelper = drm.getIoctlHelper();
auto ret = ioctlHelper->ioctl(&drm, DrmIoctl::GemMmapOffset, &mmapOffset);
if (ret != 0 && isLocalMemorySupported(rootDeviceIndex)) {
mmapOffset.flags = flags;
ret = drm.ioctl(DrmIoctl::GemMmapOffset, &mmapOffset);
ret = ioctlHelper->ioctl(&drm, DrmIoctl::GemMmapOffset, &mmapOffset);
}
if (ret != 0) {
int err = drm.getErrno();
@ -1818,8 +1828,9 @@ DrmAllocation *DrmMemoryManager::createUSMHostAllocationFromSharedHandle(osHandl
auto &drm = this->getDrm(properties.rootDeviceIndex);
auto patIndex = drm.getPatIndex(nullptr, properties.allocationType, CacheRegion::Default, CachePolicy::WriteBack, false);
auto ioctlHelper = drm.getIoctlHelper();
auto ret = drm.ioctl(DrmIoctl::PrimeFdToHandle, &openFd);
auto ret = ioctlHelper->ioctl(&drm, DrmIoctl::PrimeFdToHandle, &openFd);
if (ret != 0) {
int err = drm.getErrno();
PRINT_DEBUG_STRING(DebugManager.flags.PrintDebugMessages.get(), stderr, "ioctl(PRIME_FD_TO_HANDLE) failed with %d. errno=%d(%s)\n", ret, err, strerror(err));

View File

@ -119,7 +119,7 @@ int Drm::getParamIoctl(DrmParam param, int *dstValue) {
getParam.param = getDrmParamValue(param, ioctlHelper.get());
getParam.value = dstValue;
int retVal = ioctl(DrmIoctl::Getparam, &getParam);
int retVal = ioctlHelper ? ioctlHelper->ioctl(this, DrmIoctl::Getparam, &getParam) : ioctl(DrmIoctl::Getparam, &getParam);
if (DebugManager.flags.PrintIoctlEntries.get()) {
printf("DRM_IOCTL_I915_GETPARAM: param: %s, output value: %d, retCode:% d\n",
getDrmParamString(param).c_str(),
@ -152,7 +152,7 @@ int Drm::enableTurboBoost() {
contextParam.param = I915_CONTEXT_PRIVATE_PARAM_BOOST;
contextParam.value = 1;
return ioctl(DrmIoctl::GemContextSetparam, &contextParam);
return ioctlHelper->ioctl(this, DrmIoctl::GemContextSetparam, &contextParam);
}
int Drm::getEnabledPooledEu(int &enabled) {
@ -175,7 +175,7 @@ int Drm::queryGttSize(uint64_t &gttSizeOutput) {
GemContextParam contextParam = {0};
contextParam.param = I915_CONTEXT_PARAM_GTT_SIZE;
int ret = ioctl(DrmIoctl::GemContextGetparam, &contextParam);
int ret = ioctlHelper->ioctl(this, DrmIoctl::GemContextGetparam, &contextParam);
if (ret == 0) {
gttSizeOutput = contextParam.value;
}
@ -191,7 +191,7 @@ bool Drm::isGpuHangDetected(OsContext &osContext) {
ResetStats resetStats{};
resetStats.contextId = drmContextId;
const auto retVal{ioctl(DrmIoctl::GetResetStats, &resetStats)};
const auto retVal{ioctlHelper->ioctl(this, DrmIoctl::GetResetStats, &resetStats)};
UNRECOVERABLE_IF(retVal != 0);
if (resetStats.batchActive > 0 || resetStats.batchPending > 0) {
@ -219,7 +219,7 @@ void Drm::setLowPriorityContextParam(uint32_t drmContextId) {
gcp.param = I915_CONTEXT_PARAM_PRIORITY;
gcp.value = -1023;
auto retVal = ioctl(DrmIoctl::GemContextSetparam, &gcp);
auto retVal = ioctlHelper->ioctl(this, DrmIoctl::GemContextSetparam, &gcp);
UNRECOVERABLE_IF(retVal != 0);
}
@ -231,7 +231,7 @@ int Drm::getQueueSliceCount(GemContextParamSseu *sseu) {
contextParam.value = reinterpret_cast<uint64_t>(sseu);
contextParam.size = sizeof(struct GemContextParamSseu);
return ioctl(DrmIoctl::GemContextGetparam, &contextParam);
return ioctlHelper->ioctl(this, DrmIoctl::GemContextGetparam, &contextParam);
}
uint64_t Drm::getSliceMask(uint64_t sliceCount) {
@ -246,7 +246,7 @@ bool Drm::setQueueSliceCount(uint64_t sliceCount) {
contextParam.contextId = 0;
contextParam.value = reinterpret_cast<uint64_t>(&sseu);
contextParam.size = sizeof(struct GemContextParamSseu);
int retVal = ioctl(DrmIoctl::GemContextSetparam, &contextParam);
int retVal = ioctlHelper->ioctl(this, DrmIoctl::GemContextSetparam, &contextParam);
if (retVal == 0) {
return true;
}
@ -258,7 +258,7 @@ void Drm::checkNonPersistentContextsSupport() {
GemContextParam contextParam = {};
contextParam.param = I915_CONTEXT_PARAM_PERSISTENCE;
auto retVal = ioctl(DrmIoctl::GemContextGetparam, &contextParam);
auto retVal = ioctlHelper->ioctl(this, DrmIoctl::GemContextGetparam, &contextParam);
if (retVal == 0 && contextParam.value == 1) {
nonPersistentContextsSupported = true;
} else {
@ -271,7 +271,7 @@ void Drm::setNonPersistentContext(uint32_t drmContextId) {
contextParam.contextId = drmContextId;
contextParam.param = I915_CONTEXT_PARAM_PERSISTENCE;
ioctl(DrmIoctl::GemContextSetparam, &contextParam);
ioctlHelper->ioctl(this, DrmIoctl::GemContextSetparam, &contextParam);
}
void Drm::setUnrecoverableContext(uint32_t drmContextId) {
@ -281,7 +281,7 @@ void Drm::setUnrecoverableContext(uint32_t drmContextId) {
contextParam.value = 0;
contextParam.size = 0;
ioctl(DrmIoctl::GemContextSetparam, &contextParam);
ioctlHelper->ioctl(this, DrmIoctl::GemContextSetparam, &contextParam);
}
uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isDirectSubmissionRequested, bool isCooperativeContextRequested) {
@ -314,7 +314,7 @@ uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isDirectSubmissionRequeste
if (isCooperativeContextRequested) {
return ioctlHelper->createCooperativeContext(this, gcc);
}
auto ioctlResult = ioctl(DrmIoctl::GemContextCreateExt, &gcc);
auto ioctlResult = ioctlHelper->ioctl(this, DrmIoctl::GemContextCreateExt, &gcc);
UNRECOVERABLE_IF(ioctlResult != 0);
return gcc.contextId;
@ -323,7 +323,7 @@ uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isDirectSubmissionRequeste
void Drm::destroyDrmContext(uint32_t drmContextId) {
GemContextDestroy destroy{};
destroy.contextId = drmContextId;
auto retVal = ioctl(DrmIoctl::GemContextDestroy, &destroy);
auto retVal = ioctlHelper->ioctl(this, DrmIoctl::GemContextDestroy, &destroy);
UNRECOVERABLE_IF(retVal != 0);
}
@ -339,7 +339,7 @@ int Drm::queryVmId(uint32_t drmContextId, uint32_t &vmId) {
param.contextId = drmContextId;
param.value = 0;
param.param = I915_CONTEXT_PARAM_VM;
auto retVal = this->ioctl(DrmIoctl::GemContextGetparam, &param);
auto retVal = ioctlHelper->ioctl(this, DrmIoctl::GemContextGetparam, &param);
vmId = static_cast<uint32_t>(param.value);
@ -538,7 +538,7 @@ std::vector<uint8_t> Drm::query(uint32_t queryId, uint32_t queryItemFlags) {
query.itemsPtr = reinterpret_cast<uint64_t>(&queryItem);
query.numItems = 1;
auto ret = this->ioctl(DrmIoctl::Query, &query);
auto ret = ioctlHelper->ioctl(this, DrmIoctl::Query, &query);
if (ret != 0 || queryItem.length <= 0) {
return {};
}
@ -546,7 +546,7 @@ std::vector<uint8_t> Drm::query(uint32_t queryId, uint32_t queryItemFlags) {
auto data = std::vector<uint8_t>(queryItem.length, 0);
queryItem.dataPtr = castToUint64(data.data());
ret = this->ioctl(DrmIoctl::Query, &query);
ret = ioctlHelper->ioctl(this, DrmIoctl::Query, &query);
if (ret != 0 || queryItem.length <= 0) {
return {};
}
@ -734,7 +734,7 @@ int Drm::waitHandle(uint32_t waitHandle, int64_t timeout) {
wait.boHandle = waitHandle;
wait.timeoutNs = timeout;
int ret = ioctl(DrmIoctl::GemWait, &wait);
int ret = ioctlHelper->ioctl(this, DrmIoctl::GemWait, &wait);
if (ret != 0) {
int err = errno;
PRINT_DEBUG_STRING(DebugManager.flags.PrintDebugMessages.get(), stderr, "ioctl(I915_GEM_WAIT) failed with %d. errno=%d(%s)\n", ret, err, strerror(err));
@ -1178,7 +1178,7 @@ unsigned int Drm::bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, au
param.param = I915_CONTEXT_PARAM_ENGINES;
param.value = castToUint64(&contextEngines);
auto ioctlValue = ioctl(DrmIoctl::GemContextSetparam, &param);
auto ioctlValue = ioctlHelper->ioctl(this, DrmIoctl::GemContextSetparam, &param);
UNRECOVERABLE_IF(ioctlValue != 0);
retVal = static_cast<unsigned int>(ioctlHelper->getDrmParamValue(DrmParam::ExecDefault));

View File

@ -61,14 +61,18 @@ class Ioctls {
class DrmMockSuccess : public Drm {
public:
using Drm::setupIoctlHelper;
DrmMockSuccess(int fd, RootDeviceEnvironment &rootDeviceEnvironment) : Drm(std::make_unique<HwDeviceIdDrm>(fd, mockPciPath), rootDeviceEnvironment) {}
DrmMockSuccess(int fd, RootDeviceEnvironment &rootDeviceEnvironment) : Drm(std::make_unique<HwDeviceIdDrm>(fd, mockPciPath), rootDeviceEnvironment) {
setupIoctlHelper(NEO::defaultHwInfo->platform.eProductFamily);
}
int ioctl(DrmIoctl request, void *arg) override { return 0; };
};
class DrmMockFail : public Drm {
public:
DrmMockFail(RootDeviceEnvironment &rootDeviceEnvironment) : Drm(std::make_unique<HwDeviceIdDrm>(mockFd, mockPciPath), rootDeviceEnvironment) {}
DrmMockFail(RootDeviceEnvironment &rootDeviceEnvironment) : Drm(std::make_unique<HwDeviceIdDrm>(mockFd, mockPciPath), rootDeviceEnvironment) {
setupIoctlHelper(NEO::defaultHwInfo->platform.eProductFamily);
}
int ioctl(DrmIoctl request, void *arg) override { return -1; };
};