mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
110 lines
5.1 KiB
C++
110 lines
5.1 KiB
C++
/*
|
|
* Copyright (C) 2021-2022 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
*/
|
|
|
|
#include "shared/source/os_interface/linux/ioctl_helper.h"
|
|
|
|
#include "shared/source/helpers/ptr_math.h"
|
|
#include "shared/source/os_interface/linux/drm_neo.h"
|
|
|
|
#include "drm/i915_drm.h"
|
|
|
|
namespace NEO {
|
|
|
|
uint32_t IoctlHelper::ioctl(Drm *drm, unsigned long request, void *arg) {
|
|
return drm->ioctl(request, arg);
|
|
}
|
|
|
|
static_assert(sizeof(GemCreate) == sizeof(drm_i915_gem_create));
|
|
static_assert(offsetof(GemCreate, size) == offsetof(drm_i915_gem_create, size));
|
|
static_assert(offsetof(GemCreate, handle) == offsetof(drm_i915_gem_create, handle));
|
|
|
|
static_assert(sizeof(GemUserPtr) == sizeof(drm_i915_gem_userptr));
|
|
static_assert(offsetof(GemUserPtr, userPtr) == offsetof(drm_i915_gem_userptr, user_ptr));
|
|
static_assert(offsetof(GemUserPtr, userSize) == offsetof(drm_i915_gem_userptr, user_size));
|
|
static_assert(offsetof(GemUserPtr, flags) == offsetof(drm_i915_gem_userptr, flags));
|
|
static_assert(offsetof(GemUserPtr, handle) == offsetof(drm_i915_gem_userptr, handle));
|
|
|
|
static_assert(sizeof(RegisterRead) == sizeof(drm_i915_reg_read));
|
|
static_assert(offsetof(RegisterRead, offset) == offsetof(drm_i915_reg_read, offset));
|
|
static_assert(offsetof(RegisterRead, value) == offsetof(drm_i915_reg_read, val));
|
|
|
|
static_assert(sizeof(GemSetTiling) == sizeof(drm_i915_gem_set_tiling));
|
|
static_assert(offsetof(GemSetTiling, handle) == offsetof(drm_i915_gem_set_tiling, handle));
|
|
static_assert(offsetof(GemSetTiling, tilingMode) == offsetof(drm_i915_gem_set_tiling, tiling_mode));
|
|
static_assert(offsetof(GemSetTiling, stride) == offsetof(drm_i915_gem_set_tiling, stride));
|
|
static_assert(offsetof(GemSetTiling, swizzleMode) == offsetof(drm_i915_gem_set_tiling, swizzle_mode));
|
|
|
|
static_assert(sizeof(GemGetTiling) == sizeof(drm_i915_gem_get_tiling));
|
|
static_assert(offsetof(GemGetTiling, handle) == offsetof(drm_i915_gem_get_tiling, handle));
|
|
static_assert(offsetof(GemGetTiling, tilingMode) == offsetof(drm_i915_gem_get_tiling, tiling_mode));
|
|
static_assert(offsetof(GemGetTiling, swizzleMode) == offsetof(drm_i915_gem_get_tiling, swizzle_mode));
|
|
static_assert(offsetof(GemGetTiling, physSwizzleMode) == offsetof(drm_i915_gem_get_tiling, phys_swizzle_mode));
|
|
|
|
bool GemGetTiling::isTilingDisabled() const { return I915_TILING_NONE == tilingMode; }
|
|
|
|
static_assert(sizeof(ExecObject) == sizeof(drm_i915_gem_exec_object2));
|
|
|
|
void IoctlHelper::fillExecObject(ExecObject &execObject, uint32_t handle, uint64_t gpuAddress, uint32_t drmContextId, bool bindInfo, bool isMarkedForCapture) {
|
|
|
|
auto &drmExecObject = *reinterpret_cast<drm_i915_gem_exec_object2 *>(execObject.data);
|
|
drmExecObject.handle = handle;
|
|
drmExecObject.relocation_count = 0; //No relocations, we are SoftPinning
|
|
drmExecObject.relocs_ptr = 0ul;
|
|
drmExecObject.alignment = 0;
|
|
drmExecObject.offset = gpuAddress;
|
|
drmExecObject.flags = EXEC_OBJECT_PINNED | EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
|
|
|
|
if (DebugManager.flags.UseAsyncDrmExec.get() == 1) {
|
|
drmExecObject.flags |= static_cast<decltype(drmExecObject.flags)>(EXEC_OBJECT_ASYNC);
|
|
}
|
|
|
|
if (isMarkedForCapture) {
|
|
drmExecObject.flags |= static_cast<decltype(drmExecObject.flags)>(EXEC_OBJECT_CAPTURE);
|
|
}
|
|
drmExecObject.rsvd1 = drmContextId;
|
|
drmExecObject.rsvd2 = 0;
|
|
|
|
if (bindInfo) {
|
|
drmExecObject.handle = 0u;
|
|
}
|
|
}
|
|
|
|
void IoctlHelper::logExecObject(const ExecObject &execObject, std::stringstream &logger, size_t size) {
|
|
auto &drmExecObject = *reinterpret_cast<const drm_i915_gem_exec_object2 *>(execObject.data);
|
|
logger << "Buffer Object = { handle: BO-" << drmExecObject.handle
|
|
<< ", address range: 0x" << reinterpret_cast<void *>(drmExecObject.offset)
|
|
<< " - 0x" << reinterpret_cast<void *>(ptrOffset(drmExecObject.offset, size))
|
|
<< ", flags: " << std::hex << drmExecObject.flags << std::dec
|
|
<< ", size: " << size << " }\n";
|
|
}
|
|
|
|
static_assert(sizeof(ExecBuffer) == sizeof(drm_i915_gem_execbuffer2));
|
|
|
|
void IoctlHelper::fillExecBuffer(ExecBuffer &execBuffer, uintptr_t buffersPtr, uint32_t bufferCount, uint32_t startOffset, uint32_t size, uint64_t flags, uint32_t drmContextId) {
|
|
auto &drmExecBuffer = *reinterpret_cast<drm_i915_gem_execbuffer2 *>(execBuffer.data);
|
|
drmExecBuffer.buffers_ptr = buffersPtr;
|
|
drmExecBuffer.buffer_count = bufferCount;
|
|
drmExecBuffer.batch_start_offset = startOffset;
|
|
drmExecBuffer.batch_len = size;
|
|
drmExecBuffer.flags = flags;
|
|
drmExecBuffer.rsvd1 = drmContextId;
|
|
}
|
|
|
|
void IoctlHelper::logExecBuffer(const ExecBuffer &execBuffer, std::stringstream &logger) {
|
|
auto &drmExecBuffer = *reinterpret_cast<const drm_i915_gem_execbuffer2 *>(execBuffer.data);
|
|
logger << "drm_i915_gem_execbuffer2 { "
|
|
<< "buffer_ptr: " + std::to_string(drmExecBuffer.buffers_ptr)
|
|
<< ", buffer_count: " + std::to_string(drmExecBuffer.buffer_count)
|
|
<< ", batch_start_offset: " + std::to_string(drmExecBuffer.batch_start_offset)
|
|
<< ", batch_len: " + std::to_string(drmExecBuffer.batch_len)
|
|
<< ", flags: " + std::to_string(drmExecBuffer.flags)
|
|
<< ", rsvd1: " + std::to_string(drmExecBuffer.rsvd1)
|
|
<< " }\n";
|
|
}
|
|
|
|
} // namespace NEO
|