2022-01-29 05:00:05 +08:00
|
|
|
/*
|
2023-03-27 07:22:14 +08:00
|
|
|
* Copyright (C) 2022-2023 Intel Corporation
|
2022-01-29 05:00:05 +08:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2022-02-03 19:13:44 +08:00
|
|
|
#include "shared/test/common/libult/linux/drm_mock_prelim_context.h"
|
|
|
|
|
2022-01-29 05:00:05 +08:00
|
|
|
#include "shared/source/helpers/basic_math.h"
|
2022-05-18 03:04:23 +08:00
|
|
|
#include "shared/source/helpers/constants.h"
|
2022-01-29 05:00:05 +08:00
|
|
|
#include "shared/source/helpers/ptr_math.h"
|
2022-02-28 21:56:41 +08:00
|
|
|
#include "shared/source/helpers/string.h"
|
2022-04-08 01:14:49 +08:00
|
|
|
#include "shared/source/os_interface/linux/cache_info.h"
|
2022-05-18 05:40:34 +08:00
|
|
|
#include "shared/source/os_interface/linux/drm_wrappers.h"
|
2022-07-15 19:12:14 +08:00
|
|
|
#include "shared/source/os_interface/linux/i915_prelim.h"
|
2022-02-15 20:56:31 +08:00
|
|
|
#include "shared/test/common/libult/linux/drm_mock_helper.h"
|
2022-01-29 05:00:05 +08:00
|
|
|
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
|
|
|
#include <cmath>
|
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
constexpr std::array<uint64_t, 9> copyEnginesCapsMap = {{
|
|
|
|
PRELIM_I915_COPY_CLASS_CAP_SATURATE_LMEM,
|
|
|
|
PRELIM_I915_COPY_CLASS_CAP_SATURATE_PCIE,
|
|
|
|
PRELIM_I915_COPY_CLASS_CAP_SATURATE_PCIE,
|
|
|
|
PRELIM_I915_COPY_CLASS_CAP_SATURATE_LINK,
|
|
|
|
PRELIM_I915_COPY_CLASS_CAP_SATURATE_LINK,
|
|
|
|
PRELIM_I915_COPY_CLASS_CAP_SATURATE_LINK,
|
|
|
|
PRELIM_I915_COPY_CLASS_CAP_SATURATE_LINK,
|
|
|
|
PRELIM_I915_COPY_CLASS_CAP_SATURATE_LINK,
|
|
|
|
PRELIM_I915_COPY_CLASS_CAP_SATURATE_LINK,
|
|
|
|
}};
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
2022-05-26 01:05:52 +08:00
|
|
|
int DrmMockPrelimContext::handlePrelimRequest(DrmIoctl request, void *arg) {
|
2022-02-03 19:13:44 +08:00
|
|
|
switch (request) {
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::Getparam: {
|
2022-05-25 00:13:02 +08:00
|
|
|
auto gp = static_cast<GetParam *>(arg);
|
2022-02-11 00:16:37 +08:00
|
|
|
if (gp->param == PRELIM_I915_PARAM_HAS_PAGE_FAULT) {
|
|
|
|
*gp->value = hasPageFaultQueryValue;
|
|
|
|
return hasPageFaultQueryReturn;
|
2022-02-15 17:33:27 +08:00
|
|
|
} else if (gp->param == PRELIM_I915_PARAM_HAS_VM_BIND) {
|
|
|
|
vmBindQueryCalled++;
|
|
|
|
*gp->value = vmBindQueryValue;
|
|
|
|
return vmBindQueryReturn;
|
2022-09-20 15:07:59 +08:00
|
|
|
} else if (gp->param == PRELIM_I915_PARAM_HAS_SET_PAIR) {
|
|
|
|
setPairQueryCalled++;
|
|
|
|
*gp->value = setPairQueryValue;
|
|
|
|
return setPairQueryReturn;
|
2022-02-11 00:16:37 +08:00
|
|
|
}
|
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemContextGetparam: {
|
2022-05-20 23:04:07 +08:00
|
|
|
auto gp = static_cast<GemContextParam *>(arg);
|
2022-02-28 21:56:41 +08:00
|
|
|
if (gp->param == PRELIM_I915_CONTEXT_PARAM_DEBUG_FLAGS) {
|
|
|
|
gp->value = contextDebugSupported ? PRELIM_I915_CONTEXT_PARAM_DEBUG_FLAG_SIP << 32 : 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemContextCreateExt: {
|
2022-05-24 22:36:24 +08:00
|
|
|
auto create = static_cast<GemContextCreateExt *>(arg);
|
2022-05-23 23:05:47 +08:00
|
|
|
auto setParam = reinterpret_cast<GemContextCreateExtSetParam *>(create->extensions);
|
2022-03-03 00:21:57 +08:00
|
|
|
if (setParam->param.param == PRELIM_I915_CONTEXT_PARAM_ACC) {
|
|
|
|
const auto paramAcc = reinterpret_cast<prelim_drm_i915_gem_context_param_acc *>(setParam->param.value);
|
|
|
|
receivedContextParamAcc = GemContextParamAcc{paramAcc->trigger, paramAcc->notify, paramAcc->granularity};
|
2022-03-05 01:37:36 +08:00
|
|
|
} else if (setParam->param.param == PRELIM_I915_CONTEXT_PARAM_RUNALONE) {
|
|
|
|
receivedContextCreateExtSetParamRunaloneCount++;
|
2022-03-03 00:21:57 +08:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemMmapOffset: {
|
2022-05-20 00:56:01 +08:00
|
|
|
auto mmapArg = static_cast<GemMmapOffset *>(arg);
|
2022-05-12 22:04:41 +08:00
|
|
|
mmapArg->offset = 0;
|
2022-03-26 01:52:33 +08:00
|
|
|
return mmapOffsetReturn;
|
2022-03-16 18:44:54 +08:00
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemClosReserve: {
|
2022-02-03 19:13:44 +08:00
|
|
|
auto closReserveArg = static_cast<prelim_drm_i915_gem_clos_reserve *>(arg);
|
|
|
|
closIndex++;
|
|
|
|
if (closIndex == 0) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
closReserveArg->clos_index = closIndex;
|
2022-03-03 00:21:57 +08:00
|
|
|
return 0;
|
2022-02-03 19:13:44 +08:00
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemClosFree: {
|
2022-02-03 19:13:44 +08:00
|
|
|
auto closFreeArg = static_cast<prelim_drm_i915_gem_clos_free *>(arg);
|
|
|
|
if (closFreeArg->clos_index > closIndex) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
closIndex--;
|
2022-03-03 00:21:57 +08:00
|
|
|
return 0;
|
2022-02-03 19:13:44 +08:00
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemCacheReserve: {
|
2022-02-03 19:13:44 +08:00
|
|
|
auto cacheReserveArg = static_cast<prelim_drm_i915_gem_cache_reserve *>(arg);
|
|
|
|
if (cacheReserveArg->clos_index > closIndex) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
2022-04-08 01:14:49 +08:00
|
|
|
auto maxReservationNumWays = cacheInfo ? cacheInfo->getMaxReservationNumWays() : maxNumWays;
|
2022-02-03 19:13:44 +08:00
|
|
|
if (cacheReserveArg->num_ways > maxReservationNumWays) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
auto freeNumWays = maxReservationNumWays - allocNumWays;
|
|
|
|
if (cacheReserveArg->num_ways > freeNumWays) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
allocNumWays += cacheReserveArg->num_ways;
|
2022-03-03 00:21:57 +08:00
|
|
|
return 0;
|
2022-02-03 19:13:44 +08:00
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemVmBind: {
|
2022-02-15 22:54:16 +08:00
|
|
|
vmBindCalled++;
|
2022-03-03 00:21:57 +08:00
|
|
|
const auto vmBind = reinterpret_cast<prelim_drm_i915_gem_vm_bind *>(arg);
|
|
|
|
receivedVmBind = VmBindParams{
|
|
|
|
vmBind->vm_id,
|
|
|
|
vmBind->handle,
|
|
|
|
vmBind->start,
|
|
|
|
vmBind->offset,
|
|
|
|
vmBind->length,
|
|
|
|
vmBind->flags,
|
|
|
|
vmBind->extensions,
|
|
|
|
};
|
2022-03-16 18:44:54 +08:00
|
|
|
storeVmBindExtensions(vmBind->extensions, true);
|
2022-02-15 22:54:16 +08:00
|
|
|
return vmBindReturn;
|
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemVmUnbind: {
|
2022-02-15 22:54:16 +08:00
|
|
|
vmUnbindCalled++;
|
2022-03-05 01:37:36 +08:00
|
|
|
const auto vmBind = reinterpret_cast<prelim_drm_i915_gem_vm_bind *>(arg);
|
|
|
|
receivedVmUnbind = VmBindParams{
|
|
|
|
vmBind->vm_id,
|
|
|
|
vmBind->handle,
|
|
|
|
vmBind->start,
|
|
|
|
vmBind->offset,
|
|
|
|
vmBind->length,
|
|
|
|
vmBind->flags,
|
|
|
|
vmBind->extensions,
|
|
|
|
};
|
2022-03-16 18:44:54 +08:00
|
|
|
storeVmBindExtensions(vmBind->extensions, false);
|
2022-02-15 22:54:16 +08:00
|
|
|
return vmUnbindReturn;
|
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemCreateExt: {
|
2022-02-24 23:17:31 +08:00
|
|
|
auto createExt = static_cast<prelim_drm_i915_gem_create_ext *>(arg);
|
|
|
|
if (createExt->size == 0) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto extension = reinterpret_cast<prelim_drm_i915_gem_create_ext_setparam *>(createExt->extensions);
|
|
|
|
if (!extension) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (extension->base.name != PRELIM_I915_GEM_CREATE_EXT_SETPARAM) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((extension->param.size == 0) ||
|
|
|
|
(extension->param.param != (PRELIM_I915_OBJECT_PARAM | PRELIM_I915_PARAM_MEMORY_REGIONS))) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
|
2022-04-27 19:21:53 +08:00
|
|
|
prelim_drm_i915_gem_create_ext_vm_private *vmPrivateExt = nullptr;
|
|
|
|
if (extension->base.next_extension != 0) {
|
2022-09-20 15:07:59 +08:00
|
|
|
|
|
|
|
prelim_drm_i915_gem_create_ext_setparam *pairSetparamRegion = nullptr;
|
|
|
|
pairSetparamRegion = reinterpret_cast<prelim_drm_i915_gem_create_ext_setparam *>(extension->base.next_extension);
|
|
|
|
if (pairSetparamRegion->base.name == PRELIM_I915_GEM_CREATE_EXT_SETPARAM) {
|
|
|
|
if ((pairSetparamRegion->base.name & PRELIM_I915_PARAM_SET_PAIR) == 0) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
vmPrivateExt = reinterpret_cast<prelim_drm_i915_gem_create_ext_vm_private *>(extension->base.next_extension);
|
|
|
|
if (vmPrivateExt->base.name != PRELIM_I915_GEM_CREATE_EXT_VM_PRIVATE) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
2022-04-27 19:21:53 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-19 23:07:45 +08:00
|
|
|
auto data = reinterpret_cast<MemoryClassInstance *>(extension->param.data);
|
2022-02-24 23:17:31 +08:00
|
|
|
if (!data) {
|
|
|
|
return EINVAL;
|
|
|
|
}
|
|
|
|
|
2022-03-26 01:52:33 +08:00
|
|
|
constexpr uint32_t createExtHandle{1u};
|
|
|
|
createExt->handle = createExtHandle;
|
|
|
|
receivedCreateGemExt = CreateGemExt{createExt->size, createExtHandle};
|
|
|
|
receivedCreateGemExt->setParamExt = CreateGemExt::SetParam{extension->param.handle, extension->param.size, extension->param.param};
|
2022-04-27 19:21:53 +08:00
|
|
|
if (vmPrivateExt != nullptr) {
|
|
|
|
receivedCreateGemExt->vmPrivateExt = CreateGemExt::VmPrivate{vmPrivateExt->vm_id};
|
|
|
|
}
|
2022-03-26 01:52:33 +08:00
|
|
|
|
2022-02-24 23:17:31 +08:00
|
|
|
receivedCreateGemExt->memoryRegions.clear();
|
|
|
|
for (uint32_t i = 0; i < extension->param.size; i++) {
|
2022-05-19 23:07:45 +08:00
|
|
|
receivedCreateGemExt->memoryRegions.push_back({data[i].memoryClass, data[i].memoryInstance});
|
2022-02-24 23:17:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
const auto firstMemoryRegion = receivedCreateGemExt->memoryRegions[0];
|
2022-07-18 20:53:55 +08:00
|
|
|
if ((firstMemoryRegion.memoryClass != prelim_drm_i915_gem_memory_class::PRELIM_I915_MEMORY_CLASS_SYSTEM) && (firstMemoryRegion.memoryClass != prelim_drm_i915_gem_memory_class::PRELIM_I915_MEMORY_CLASS_DEVICE)) {
|
2022-02-24 23:17:31 +08:00
|
|
|
return EINVAL;
|
|
|
|
}
|
2022-03-26 01:52:33 +08:00
|
|
|
|
|
|
|
return gemCreateExtReturn;
|
2022-03-03 00:21:57 +08:00
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemWaitUserFence: {
|
2022-03-03 00:21:57 +08:00
|
|
|
waitUserFenceCalled++;
|
|
|
|
const auto wait = reinterpret_cast<prelim_drm_i915_gem_wait_user_fence *>(arg);
|
|
|
|
receivedWaitUserFence = WaitUserFence{
|
|
|
|
wait->extensions,
|
|
|
|
wait->addr,
|
|
|
|
wait->ctx_id,
|
|
|
|
wait->op,
|
|
|
|
wait->flags,
|
|
|
|
wait->value,
|
|
|
|
wait->mask,
|
|
|
|
wait->timeout,
|
|
|
|
};
|
|
|
|
return 0;
|
2022-02-24 23:17:31 +08:00
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemContextSetparam: {
|
2022-05-20 23:04:07 +08:00
|
|
|
const auto req = reinterpret_cast<GemContextParam *>(arg);
|
2022-03-05 01:37:36 +08:00
|
|
|
if (req->param == PRELIM_I915_CONTEXT_PARAM_DEBUG_FLAGS) {
|
|
|
|
receivedSetContextParamValue = req->value;
|
2022-05-20 23:04:07 +08:00
|
|
|
receivedSetContextParamCtxId = req->contextId;
|
2022-03-05 01:37:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return !contextDebugSupported ? EINVAL : 0;
|
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::GemVmAdvise: {
|
2022-03-26 01:52:33 +08:00
|
|
|
const auto req = reinterpret_cast<prelim_drm_i915_gem_vm_advise *>(arg);
|
2023-03-30 20:42:02 +08:00
|
|
|
switch (req->attribute) {
|
|
|
|
case PRELIM_I915_VM_ADVISE_ATOMIC_NONE:
|
|
|
|
case PRELIM_I915_VM_ADVISE_ATOMIC_SYSTEM:
|
|
|
|
case PRELIM_I915_VM_ADVISE_ATOMIC_DEVICE:
|
|
|
|
receivedVmAdvise[0] = VmAdvise{req->handle, req->attribute};
|
|
|
|
break;
|
|
|
|
case PRELIM_I915_VM_ADVISE_PREFERRED_LOCATION:
|
|
|
|
receivedVmAdvise[1] = VmAdvise{req->handle, req->attribute, {req->region.memory_class, req->region.memory_instance}};
|
|
|
|
break;
|
|
|
|
}
|
2022-03-26 01:52:33 +08:00
|
|
|
return vmAdviseReturn;
|
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::UuidRegister: {
|
2022-02-28 21:56:41 +08:00
|
|
|
auto uuidControl = reinterpret_cast<prelim_drm_i915_uuid_control *>(arg);
|
|
|
|
|
|
|
|
if (uuidControl->uuid_class != uint32_t(PRELIM_I915_UUID_CLASS_STRING) && uuidControl->uuid_class > uuidHandle) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
uuidControl->handle = uuidHandle++;
|
|
|
|
|
|
|
|
receivedRegisterUuid = UuidControl{
|
|
|
|
{},
|
|
|
|
uuidControl->uuid_class,
|
|
|
|
reinterpret_cast<void *>(uuidControl->ptr),
|
|
|
|
uuidControl->size,
|
|
|
|
uuidControl->handle,
|
|
|
|
uuidControl->flags,
|
|
|
|
uuidControl->extensions,
|
|
|
|
};
|
|
|
|
memcpy_s(receivedRegisterUuid->uuid, sizeof(receivedRegisterUuid->uuid), uuidControl->uuid, sizeof(uuidControl->uuid));
|
|
|
|
return uuidControlReturn;
|
|
|
|
} break;
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::UuidUnregister: {
|
2022-02-28 21:56:41 +08:00
|
|
|
auto uuidControl = reinterpret_cast<prelim_drm_i915_uuid_control *>(arg);
|
|
|
|
receivedUnregisterUuid = UuidControl{
|
|
|
|
{},
|
|
|
|
uuidControl->uuid_class,
|
|
|
|
reinterpret_cast<void *>(uuidControl->ptr),
|
|
|
|
uuidControl->size,
|
|
|
|
uuidControl->handle,
|
|
|
|
uuidControl->flags,
|
|
|
|
uuidControl->extensions,
|
|
|
|
};
|
|
|
|
memcpy_s(receivedUnregisterUuid->uuid, sizeof(receivedUnregisterUuid->uuid), uuidControl->uuid, sizeof(uuidControl->uuid));
|
|
|
|
return uuidControlReturn;
|
|
|
|
} break;
|
2022-02-03 19:13:44 +08:00
|
|
|
|
2022-05-26 01:05:52 +08:00
|
|
|
case DrmIoctl::DebuggerOpen: {
|
2022-05-12 22:04:41 +08:00
|
|
|
auto debuggerOpen = reinterpret_cast<prelim_drm_i915_debugger_open_param *>(arg);
|
|
|
|
if (debuggerOpen->pid != 0 && debuggerOpen->events == 0) {
|
2022-11-14 23:52:05 +08:00
|
|
|
if (debuggerOpen->version != 0) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (debuggerOpenVersion != 0) {
|
|
|
|
debuggerOpen->version = debuggerOpenVersion;
|
|
|
|
}
|
2022-05-09 23:52:12 +08:00
|
|
|
return debuggerOpenRetval;
|
|
|
|
}
|
|
|
|
} break;
|
2022-02-03 19:13:44 +08:00
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2022-01-29 05:00:05 +08:00
|
|
|
}
|
|
|
|
|
2022-02-03 19:13:44 +08:00
|
|
|
bool DrmMockPrelimContext::handlePrelimQueryItem(void *arg) {
|
2022-05-18 05:40:34 +08:00
|
|
|
auto queryItem = reinterpret_cast<QueryItem *>(arg);
|
2022-01-29 05:00:05 +08:00
|
|
|
|
2022-02-03 19:13:44 +08:00
|
|
|
auto >SystemInfo = hwInfo->gtSystemInfo;
|
2022-02-15 20:56:31 +08:00
|
|
|
const auto numberOfCCS = gtSystemInfo.CCSInfo.IsValid && !disableCcsSupport ? gtSystemInfo.CCSInfo.NumberOfCCSEnabled : 0u;
|
2022-01-29 05:00:05 +08:00
|
|
|
|
2022-05-18 05:40:34 +08:00
|
|
|
switch (queryItem->queryId) {
|
2022-06-02 17:00:46 +08:00
|
|
|
case DRM_I915_QUERY_ENGINE_INFO: {
|
2022-01-29 05:00:05 +08:00
|
|
|
auto numberOfTiles = gtSystemInfo.MultiTileArchInfo.IsValid ? gtSystemInfo.MultiTileArchInfo.TileCount : 1u;
|
|
|
|
uint32_t numberOfEngines = numberOfTiles * (4u + numberOfCCS + static_cast<uint32_t>(supportedCopyEnginesMask.count()));
|
2022-06-02 17:00:46 +08:00
|
|
|
int engineInfoSize = sizeof(drm_i915_query_engine_info) + numberOfEngines * sizeof(drm_i915_engine_info);
|
2022-01-29 05:00:05 +08:00
|
|
|
if (queryItem->length == 0) {
|
|
|
|
queryItem->length = engineInfoSize;
|
|
|
|
} else {
|
|
|
|
EXPECT_EQ(engineInfoSize, queryItem->length);
|
2022-06-02 17:00:46 +08:00
|
|
|
auto queryEngineInfo = reinterpret_cast<drm_i915_query_engine_info *>(queryItem->dataPtr);
|
2022-01-29 05:00:05 +08:00
|
|
|
EXPECT_EQ(0u, queryEngineInfo->num_engines);
|
|
|
|
queryEngineInfo->num_engines = numberOfEngines;
|
|
|
|
auto p = queryEngineInfo->engines;
|
|
|
|
for (uint32_t tile = 0u; tile < numberOfTiles; tile++) {
|
2022-07-18 20:53:55 +08:00
|
|
|
p++->engine = {drm_i915_gem_engine_class::I915_ENGINE_CLASS_RENDER, DrmMockHelper::getEngineOrMemoryInstanceValue(tile, 0)};
|
2022-01-29 05:00:05 +08:00
|
|
|
for (uint32_t i = 0u; i < supportedCopyEnginesMask.size(); i++) {
|
|
|
|
if (supportedCopyEnginesMask.test(i)) {
|
|
|
|
auto copyEngineInfo = p++;
|
2022-07-18 20:53:55 +08:00
|
|
|
copyEngineInfo->engine = {drm_i915_gem_engine_class::I915_ENGINE_CLASS_COPY, DrmMockHelper::getEngineOrMemoryInstanceValue(tile, i)};
|
2022-01-29 05:00:05 +08:00
|
|
|
copyEngineInfo->capabilities = copyEnginesCapsMap[i];
|
|
|
|
}
|
|
|
|
}
|
2022-07-18 20:53:55 +08:00
|
|
|
p++->engine = {drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO, DrmMockHelper::getEngineOrMemoryInstanceValue(tile, 0)};
|
|
|
|
p++->engine = {drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO, DrmMockHelper::getEngineOrMemoryInstanceValue(tile, 0)};
|
|
|
|
p++->engine = {drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO_ENHANCE, DrmMockHelper::getEngineOrMemoryInstanceValue(tile, 0)};
|
2022-01-29 05:00:05 +08:00
|
|
|
for (auto i = 0u; i < numberOfCCS; i++) {
|
2022-07-18 20:53:55 +08:00
|
|
|
p++->engine = {prelim_drm_i915_gem_engine_class::PRELIM_I915_ENGINE_CLASS_COMPUTE, DrmMockHelper::getEngineOrMemoryInstanceValue(tile, i)};
|
2022-01-29 05:00:05 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2022-06-02 17:00:46 +08:00
|
|
|
case DRM_I915_QUERY_MEMORY_REGIONS: {
|
2022-02-24 23:17:31 +08:00
|
|
|
if (queryMemoryRegionInfoSuccessCount == 0) {
|
|
|
|
queryItem->length = -EINVAL;
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
queryMemoryRegionInfoSuccessCount--;
|
|
|
|
}
|
|
|
|
|
2022-01-29 05:00:05 +08:00
|
|
|
auto numberOfLocalMemories = gtSystemInfo.MultiTileArchInfo.IsValid ? gtSystemInfo.MultiTileArchInfo.TileCount : 0u;
|
|
|
|
auto numberOfRegions = 1u + numberOfLocalMemories;
|
|
|
|
|
2022-06-02 17:00:46 +08:00
|
|
|
int regionInfoSize = sizeof(drm_i915_query_memory_regions) + numberOfRegions * sizeof(drm_i915_memory_region_info);
|
2022-01-29 05:00:05 +08:00
|
|
|
if (queryItem->length == 0) {
|
|
|
|
queryItem->length = regionInfoSize;
|
|
|
|
} else {
|
|
|
|
EXPECT_EQ(regionInfoSize, queryItem->length);
|
2022-06-02 17:00:46 +08:00
|
|
|
auto queryMemoryRegionInfo = reinterpret_cast<drm_i915_query_memory_regions *>(queryItem->dataPtr);
|
2022-01-29 05:00:05 +08:00
|
|
|
EXPECT_EQ(0u, queryMemoryRegionInfo->num_regions);
|
|
|
|
queryMemoryRegionInfo->num_regions = numberOfRegions;
|
2022-07-18 20:53:55 +08:00
|
|
|
queryMemoryRegionInfo->regions[0].region.memory_class = prelim_drm_i915_gem_memory_class::PRELIM_I915_MEMORY_CLASS_SYSTEM;
|
2022-01-29 05:00:05 +08:00
|
|
|
queryMemoryRegionInfo->regions[0].region.memory_instance = 1;
|
|
|
|
queryMemoryRegionInfo->regions[0].probed_size = 2 * MemoryConstants::gigaByte;
|
|
|
|
for (auto tile = 0u; tile < numberOfLocalMemories; tile++) {
|
2022-07-18 20:53:55 +08:00
|
|
|
queryMemoryRegionInfo->regions[1 + tile].region.memory_class = prelim_drm_i915_gem_memory_class::PRELIM_I915_MEMORY_CLASS_DEVICE;
|
2022-02-15 20:56:31 +08:00
|
|
|
queryMemoryRegionInfo->regions[1 + tile].region.memory_instance = DrmMockHelper::getEngineOrMemoryInstanceValue(tile, 0);
|
2022-01-29 05:00:05 +08:00
|
|
|
queryMemoryRegionInfo->regions[1 + tile].probed_size = 2 * MemoryConstants::gigaByte;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} break;
|
|
|
|
|
|
|
|
case PRELIM_DRM_I915_QUERY_DISTANCE_INFO: {
|
2022-02-15 20:56:31 +08:00
|
|
|
if (failDistanceInfoQuery) {
|
2022-04-07 00:20:27 +08:00
|
|
|
queryItem->length = -EINVAL;
|
2022-02-15 20:56:31 +08:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-05-18 05:40:34 +08:00
|
|
|
auto queryDistanceInfo = reinterpret_cast<prelim_drm_i915_query_distance_info *>(queryItem->dataPtr);
|
2022-01-29 05:00:05 +08:00
|
|
|
switch (queryDistanceInfo->region.memory_class) {
|
2022-07-18 20:53:55 +08:00
|
|
|
case prelim_drm_i915_gem_memory_class::PRELIM_I915_MEMORY_CLASS_SYSTEM:
|
2022-01-29 05:00:05 +08:00
|
|
|
EXPECT_EQ(sizeof(prelim_drm_i915_query_distance_info), static_cast<size_t>(queryItem->length));
|
|
|
|
queryDistanceInfo->distance = -1;
|
|
|
|
break;
|
2022-07-18 20:53:55 +08:00
|
|
|
case prelim_drm_i915_gem_memory_class::PRELIM_I915_MEMORY_CLASS_DEVICE: {
|
2022-01-29 05:00:05 +08:00
|
|
|
EXPECT_EQ(sizeof(prelim_drm_i915_query_distance_info), static_cast<size_t>(queryItem->length));
|
|
|
|
|
2022-02-15 20:56:31 +08:00
|
|
|
auto engineTile = DrmMockHelper::getTileFromEngineOrMemoryInstance(queryDistanceInfo->engine.engine_instance);
|
|
|
|
auto memoryTile = DrmMockHelper::getTileFromEngineOrMemoryInstance(queryDistanceInfo->region.memory_instance);
|
2022-01-29 05:00:05 +08:00
|
|
|
|
|
|
|
queryDistanceInfo->distance = (memoryTile == engineTile) ? 0 : 100;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
queryItem->length = -EINVAL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} break;
|
|
|
|
|
2022-10-31 21:51:26 +08:00
|
|
|
case PRELIM_DRM_I915_QUERY_COMPUTE_SUBSLICES: {
|
2022-02-03 19:13:44 +08:00
|
|
|
auto >SystemInfo = rootDeviceEnvironment.getHardwareInfo()->gtSystemInfo;
|
2022-01-29 05:00:05 +08:00
|
|
|
auto maxEuPerSubslice = gtSystemInfo.MaxEuPerSubSlice;
|
|
|
|
auto maxSlices = gtSystemInfo.MaxSlicesSupported;
|
|
|
|
auto maxSubslices = gtSystemInfo.MaxSubSlicesSupported / maxSlices;
|
|
|
|
auto threadsPerEu = gtSystemInfo.ThreadCount / gtSystemInfo.EUCount;
|
|
|
|
auto realEuCount = threadsPerEu * maxEuPerSubslice * maxSubslices * maxSlices;
|
|
|
|
|
|
|
|
auto dataSize = static_cast<size_t>(std::ceil(realEuCount / 8.0)) + maxSlices * static_cast<uint16_t>(std::ceil(maxSubslices / 8.0)) +
|
|
|
|
static_cast<uint16_t>(std::ceil(maxSlices / 8.0));
|
|
|
|
|
|
|
|
if (queryItem->length == 0) {
|
2022-05-19 22:06:33 +08:00
|
|
|
queryItem->length = static_cast<int32_t>(sizeof(QueryTopologyInfo) + dataSize);
|
2022-01-29 05:00:05 +08:00
|
|
|
break;
|
|
|
|
} else {
|
2022-05-19 22:06:33 +08:00
|
|
|
auto topologyArg = reinterpret_cast<QueryTopologyInfo *>(queryItem->dataPtr);
|
2022-02-03 19:13:44 +08:00
|
|
|
if (failRetTopology) {
|
2022-01-29 05:00:05 +08:00
|
|
|
return false;
|
|
|
|
}
|
2022-05-19 22:06:33 +08:00
|
|
|
topologyArg->maxSlices = maxSlices;
|
|
|
|
topologyArg->maxSubslices = maxSubslices;
|
|
|
|
topologyArg->maxEusPerSubslice = maxEuPerSubslice;
|
2022-01-29 05:00:05 +08:00
|
|
|
|
2022-05-19 22:06:33 +08:00
|
|
|
topologyArg->subsliceStride = static_cast<uint16_t>(std::ceil(maxSubslices / 8.0));
|
|
|
|
topologyArg->euStride = static_cast<uint16_t>(std::ceil(maxEuPerSubslice / 8.0));
|
|
|
|
topologyArg->subsliceOffset = static_cast<uint16_t>(std::ceil(maxSlices / 8.0));
|
|
|
|
topologyArg->euOffset = static_cast<uint16_t>(std::ceil(maxSubslices / 8.0)) * maxSlices;
|
2022-01-29 05:00:05 +08:00
|
|
|
|
|
|
|
int threadData = (threadsPerEu == 8) ? 0xff : 0x7f;
|
|
|
|
|
|
|
|
uint8_t *data = topologyArg->data;
|
|
|
|
for (uint32_t sliceId = 0; sliceId < maxSlices; sliceId++) {
|
|
|
|
data[0] |= 1 << (sliceId % 8);
|
|
|
|
if (sliceId == 7 || sliceId == maxSlices - 1) {
|
|
|
|
data++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-19 22:06:33 +08:00
|
|
|
DEBUG_BREAK_IF(ptrDiff(data, topologyArg->data) != topologyArg->subsliceOffset);
|
2022-01-29 05:00:05 +08:00
|
|
|
|
2022-05-19 22:06:33 +08:00
|
|
|
data = ptrOffset(topologyArg->data, topologyArg->subsliceOffset);
|
2022-01-29 05:00:05 +08:00
|
|
|
for (uint32_t sliceId = 0; sliceId < maxSlices; sliceId++) {
|
|
|
|
for (uint32_t i = 0; i < maxSubslices; i++) {
|
|
|
|
data[0] |= 1 << (i % 8);
|
|
|
|
|
|
|
|
if (i == 7 || i == maxSubslices - 1) {
|
|
|
|
data++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-19 22:06:33 +08:00
|
|
|
DEBUG_BREAK_IF(ptrDiff(data, topologyArg->data) != topologyArg->euOffset);
|
|
|
|
auto size = dataSize - topologyArg->euOffset;
|
|
|
|
memset(ptrOffset(topologyArg->data, topologyArg->euOffset), threadData, size);
|
2022-01-29 05:00:05 +08:00
|
|
|
}
|
|
|
|
} break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
queryItem->length = -EINVAL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2022-02-03 19:13:44 +08:00
|
|
|
|
2022-03-16 18:44:54 +08:00
|
|
|
void DrmMockPrelimContext::storeVmBindExtensions(uint64_t ptr, bool bind) {
|
2022-03-05 01:37:36 +08:00
|
|
|
if (ptr == 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t uuidIndex{0};
|
2022-05-23 23:05:47 +08:00
|
|
|
auto baseExt = reinterpret_cast<DrmUserExtension *>(ptr);
|
2022-03-05 01:37:36 +08:00
|
|
|
while (baseExt) {
|
2022-03-30 01:48:12 +08:00
|
|
|
if (baseExt->name == PRELIM_I915_VM_BIND_EXT_USER_FENCE) {
|
|
|
|
const auto *ext = reinterpret_cast<prelim_drm_i915_vm_bind_ext_user_fence *>(baseExt);
|
|
|
|
receivedVmBindUserFence = {ext->addr, ext->val};
|
2022-03-05 01:37:36 +08:00
|
|
|
} else if (baseExt->name == PRELIM_I915_VM_BIND_EXT_UUID) {
|
|
|
|
const auto *ext = reinterpret_cast<prelim_drm_i915_vm_bind_ext_uuid *>(baseExt);
|
|
|
|
receivedVmBindUuidExt[uuidIndex++] = UuidVmBindExt{ext->uuid_handle, ext->base.next_extension};
|
2022-03-16 18:44:54 +08:00
|
|
|
} else if (baseExt->name == PRELIM_I915_VM_BIND_EXT_SET_PAT) {
|
|
|
|
const auto *ext = reinterpret_cast<prelim_drm_i915_vm_bind_ext_set_pat *>(baseExt);
|
|
|
|
if (bind) {
|
|
|
|
receivedVmBindPatIndex = ext->pat_index;
|
|
|
|
} else {
|
|
|
|
receivedVmUnbindPatIndex = ext->pat_index;
|
|
|
|
}
|
2022-03-05 01:37:36 +08:00
|
|
|
}
|
|
|
|
|
2022-05-23 23:05:47 +08:00
|
|
|
baseExt = reinterpret_cast<DrmUserExtension *>(baseExt->nextExtension);
|
2022-03-05 01:37:36 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-15 20:56:31 +08:00
|
|
|
uint32_t DrmPrelimHelper::getQueryComputeSlicesIoctl() {
|
2022-10-31 21:51:26 +08:00
|
|
|
return PRELIM_DRM_I915_QUERY_COMPUTE_SUBSLICES;
|
2022-02-03 19:13:44 +08:00
|
|
|
}
|
2022-02-15 20:56:31 +08:00
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getDistanceInfoQueryId() {
|
|
|
|
return PRELIM_DRM_I915_QUERY_DISTANCE_INFO;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getComputeEngineClass() {
|
2022-07-18 20:53:55 +08:00
|
|
|
return prelim_drm_i915_gem_engine_class::PRELIM_I915_ENGINE_CLASS_COMPUTE;
|
2022-02-15 20:56:31 +08:00
|
|
|
}
|
2022-02-28 21:56:41 +08:00
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getStringUuidClass() {
|
|
|
|
return PRELIM_I915_UUID_CLASS_STRING;
|
|
|
|
}
|
2022-03-03 00:21:57 +08:00
|
|
|
|
2022-03-30 01:48:12 +08:00
|
|
|
uint32_t DrmPrelimHelper::getLongRunningContextCreateFlag() {
|
|
|
|
return PRELIM_I915_CONTEXT_CREATE_FLAGS_LONG_RUNNING;
|
2022-03-03 00:21:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getRunAloneContextParam() {
|
|
|
|
return PRELIM_I915_CONTEXT_PARAM_RUNALONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getAccContextParam() {
|
|
|
|
return PRELIM_I915_CONTEXT_PARAM_ACC;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getAccContextParamSize() {
|
|
|
|
return sizeof(prelim_drm_i915_gem_context_param_acc);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::array<uint32_t, 4> DrmPrelimHelper::getContextAcgValues() {
|
|
|
|
return {PRELIM_I915_CONTEXT_ACG_128K, PRELIM_I915_CONTEXT_ACG_2M, PRELIM_I915_CONTEXT_ACG_16M, PRELIM_I915_CONTEXT_ACG_64M};
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getEnablePageFaultVmCreateFlag() {
|
|
|
|
return PRELIM_I915_VM_CREATE_FLAGS_ENABLE_PAGE_FAULT;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getDisableScratchVmCreateFlag() {
|
|
|
|
return PRELIM_I915_VM_CREATE_FLAGS_DISABLE_SCRATCH;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t DrmPrelimHelper::getU8WaitUserFenceFlag() {
|
|
|
|
return PRELIM_I915_UFENCE_WAIT_U8;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t DrmPrelimHelper::getU16WaitUserFenceFlag() {
|
|
|
|
return PRELIM_I915_UFENCE_WAIT_U16;
|
|
|
|
}
|
|
|
|
|
2022-04-04 23:39:57 +08:00
|
|
|
uint64_t DrmPrelimHelper::getU32WaitUserFenceFlag() {
|
|
|
|
return PRELIM_I915_UFENCE_WAIT_U32;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t DrmPrelimHelper::getU64WaitUserFenceFlag() {
|
|
|
|
return PRELIM_I915_UFENCE_WAIT_U64;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t DrmPrelimHelper::getGTEWaitUserFenceFlag() {
|
|
|
|
return PRELIM_I915_UFENCE_WAIT_GTE;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t DrmPrelimHelper::getSoftWaitUserFenceFlag() {
|
|
|
|
return PRELIM_I915_UFENCE_WAIT_SOFT;
|
|
|
|
}
|
|
|
|
|
2022-03-03 00:21:57 +08:00
|
|
|
uint64_t DrmPrelimHelper::getCaptureVmBindFlag() {
|
|
|
|
return PRELIM_I915_GEM_VM_BIND_CAPTURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t DrmPrelimHelper::getImmediateVmBindFlag() {
|
|
|
|
return PRELIM_I915_GEM_VM_BIND_IMMEDIATE;
|
|
|
|
}
|
2022-03-05 01:37:36 +08:00
|
|
|
|
|
|
|
uint64_t DrmPrelimHelper::getMakeResidentVmBindFlag() {
|
|
|
|
return PRELIM_I915_GEM_VM_BIND_MAKE_RESIDENT;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t DrmPrelimHelper::getSIPContextParamDebugFlag() {
|
|
|
|
return PRELIM_I915_CONTEXT_PARAM_DEBUG_FLAG_SIP;
|
|
|
|
}
|
2022-03-26 01:52:33 +08:00
|
|
|
|
|
|
|
uint64_t DrmPrelimHelper::getMemoryRegionsParamFlag() {
|
|
|
|
return PRELIM_I915_OBJECT_PARAM | PRELIM_I915_PARAM_MEMORY_REGIONS;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getVmAdviseNoneFlag() {
|
|
|
|
return PRELIM_I915_VM_ADVISE_ATOMIC_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getVmAdviseDeviceFlag() {
|
|
|
|
return PRELIM_I915_VM_ADVISE_ATOMIC_DEVICE;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getVmAdviseSystemFlag() {
|
|
|
|
return PRELIM_I915_VM_ADVISE_ATOMIC_SYSTEM;
|
|
|
|
}
|
2023-03-27 07:22:14 +08:00
|
|
|
|
|
|
|
uint32_t DrmPrelimHelper::getPreferredLocationAdvise() {
|
|
|
|
return PRELIM_I915_VM_ADVISE_PREFERRED_LOCATION;
|
|
|
|
}
|