compute-runtime/shared/source/os_interface/linux/drm_wrappers.h

352 lines
6.3 KiB
C++

/*
* Copyright (C) 2022-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include <cstddef>
#include <cstdint>
#include <string>
namespace NEO {
class IoctlHelper;
struct RegisterRead {
uint64_t offset;
uint64_t value;
};
struct ExecObject {
uint8_t data[56];
};
struct ExecBuffer {
uint8_t data[64];
};
struct GemCreate {
uint64_t size;
uint32_t handle;
};
struct GemUserPtr {
uint64_t userPtr;
uint64_t userSize;
uint32_t flags;
uint32_t handle;
};
struct GemSetTiling {
uint32_t handle;
uint32_t tilingMode;
uint32_t stride;
uint32_t swizzleMode;
};
struct GemGetTiling {
uint32_t handle;
uint32_t tilingMode;
uint32_t swizzleMode;
uint32_t physSwizzleMode;
};
struct QueryItem {
uint64_t queryId;
int32_t length;
uint32_t flags;
uint64_t dataPtr;
};
struct EngineClassInstance {
uint16_t engineClass;
uint16_t engineInstance;
};
struct GemContextParamSseu {
EngineClassInstance engine;
uint32_t flags;
uint64_t sliceMask;
uint64_t subsliceMask;
uint16_t minEusPerSubslice;
uint16_t maxEusPerSubslice;
};
struct QueryTopologyInfo {
uint16_t flags;
uint16_t maxSlices;
uint16_t maxSubslices;
uint16_t maxEusPerSubslice;
uint16_t subsliceOffset;
uint16_t subsliceStride;
uint16_t euOffset;
uint16_t euStride;
uint8_t data[];
};
struct DrmQueryTopologyData {
int sliceCount = 0;
int subSliceCount = 0;
int euCount = 0;
int numL3Banks = 0;
int maxSlices = 0;
int maxSubSlicesPerSlice = 0;
int maxEusPerSubSlice = 0;
};
struct MemoryClassInstance {
uint16_t memoryClass;
uint16_t memoryInstance;
};
struct GemMmapOffset {
uint32_t handle;
uint32_t pad;
uint64_t offset;
uint64_t flags;
uint64_t extensions;
};
struct GemSetDomain {
uint32_t handle;
uint32_t readDomains;
uint32_t writeDomain;
};
struct GemContextParam {
uint32_t contextId;
uint32_t size;
uint64_t param;
uint64_t value;
};
struct DrmUserExtension {
uint64_t nextExtension;
uint32_t name;
uint32_t flags;
uint32_t reserved[4];
};
struct GemContextCreateExtSetParam {
DrmUserExtension base;
GemContextParam param;
};
struct GemContextCreateExt {
uint32_t contextId;
uint32_t flags;
uint64_t extensions;
};
struct GemContextDestroy {
uint32_t contextId;
uint32_t reserved;
};
struct GemVmControl {
uint64_t extensions;
uint32_t flags;
uint32_t vmId;
};
struct GemWait {
uint32_t boHandle;
uint32_t flags;
int64_t timeoutNs;
};
struct ResetStats {
uint32_t contextId;
uint32_t flags;
uint32_t resetCount;
uint32_t batchActive;
uint32_t batchPending;
uint32_t reserved;
};
struct GetParam {
int32_t param;
int *value;
};
struct Query {
uint32_t numItems;
uint32_t flags;
uint64_t itemsPtr;
};
struct GemClose {
uint32_t handle;
uint32_t reserved;
uint64_t userptr;
};
struct GemVmBind {
uint32_t vmId;
union {
uint32_t handle; /* For unbind, it is reserved and must be 0 */
int32_t fd;
};
uint64_t start;
uint64_t offset;
uint64_t length;
uint64_t flags;
uint64_t extensions;
};
struct PrimeHandle {
uint32_t handle;
uint32_t flags;
int32_t fileDescriptor;
};
struct PrimaryContextHandle {
uint32_t handle;
uint32_t pad;
int32_t fd;
uint32_t pad2;
uint64_t reserved[2];
};
#pragma pack(1)
template <uint32_t numEngines = 10> // 1 + max engines
struct ContextParamEngines {
uint64_t extensions;
uint64_t enginesData[numEngines];
uint32_t numEnginesInContext;
};
template <uint32_t numEngines>
struct ContextEnginesLoadBalance {
DrmUserExtension base;
uint16_t engineIndex;
uint16_t numSiblings;
uint32_t flags;
uint64_t reserved;
EngineClassInstance engines[numEngines];
};
#pragma pack()
struct DrmVersion {
int versionMajor;
int versionMinor;
int versionPatch;
size_t nameLen;
char *name;
size_t dateLen;
char *date;
size_t descLen;
char *desc;
};
struct DrmDebuggerOpen {
uint64_t pid;
uint32_t flags;
uint32_t version;
uint64_t events;
uint64_t extensions;
};
enum class DrmIoctl {
allocateInterrupt,
gemExecbuffer2,
gemWait,
gemUserptr,
getparam,
gemCreate,
gemSetDomain,
gemSetTiling,
gemGetTiling,
gemContextCreateExt,
gemContextDestroy,
regRead,
getResetStats,
getResetStatsPrelim,
gemContextGetparam,
gemContextSetparam,
query,
gemMmapOffset,
gemVmCreate,
gemVmDestroy,
gemClose,
primeFdToHandle,
primeHandleToFd,
gemVmBind,
gemVmUnbind,
gemWaitUserFence,
dg1GemCreateExt,
gemCreateExt,
gemVmAdvise,
gemVmPrefetch,
uuidRegister,
uuidUnregister,
debuggerOpen,
gemClosReserve,
gemClosFree,
gemCacheReserve,
version,
vmExport,
metadataCreate,
metadataDestroy,
perfOpen,
perfEnable,
perfDisable,
perfQuery,
primaryContextExport,
primaryContextImport
};
enum class DrmParam {
atomicClassUndefined,
atomicClassDevice,
atomicClassGlobal,
atomicClassSystem,
contextCreateExtSetparam,
contextCreateFlagsUseExtensions,
contextEnginesExtLoadBalance,
contextParamEngines,
contextParamGttSize,
contextParamPersistence,
contextParamPriority,
contextParamRecoverable,
contextParamSseu,
contextParamVm,
engineClassRender,
engineClassCompute,
engineClassCopy,
engineClassVideo,
engineClassVideoEnhance,
engineClassInvalid,
engineClassInvalidNone,
execBlt,
execDefault,
execNoReloc,
execRender,
memoryClassDevice,
memoryClassSystem,
mmapOffsetWb,
mmapOffsetWc,
paramHasPooledEu,
paramEuTotal,
paramSubsliceTotal,
paramMinEuInPool,
paramCsTimestampFrequency,
paramOATimestampFrequency,
paramHasVmBind,
paramHasPageFault,
queryEngineInfo,
queryHwconfigTable,
queryComputeSlices,
queryMemoryRegions,
queryTopologyInfo,
tilingNone,
tilingY,
};
unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest, IoctlHelper *ioctlHelper);
bool checkIfIoctlReinvokeRequired(int error, DrmIoctl ioctlRequest, IoctlHelper *ioctlHelper);
} // namespace NEO