mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-09 22:43:00 +08:00
fix: unblock xekmd recoverable pagefaults vmbind
Related-To: HSD-13011898606 Signed-off-by: Naklicki, Mateusz <mateusz.naklicki@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
020cbf6116
commit
8f4472a26c
@@ -11,7 +11,7 @@ set(NEO_CORE_OS_INTERFACE_LINUX_XE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_query_hw_ip_version.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_vm_bind_flags.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_query_features.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_perf.cpp
|
||||
)
|
||||
|
||||
|
||||
@@ -654,6 +654,7 @@ void IoctlHelperXe::setupXeWaitUserFenceStruct(void *arg, uint32_t ctxId, uint16
|
||||
}
|
||||
|
||||
int IoctlHelperXe::xeWaitUserFence(uint32_t ctxId, uint16_t op, uint64_t addr, uint64_t value, int64_t timeout, bool userInterrupt, uint32_t externalInterruptId, GraphicsAllocation *allocForInterruptWait) {
|
||||
UNRECOVERABLE_IF(addr == 0x0)
|
||||
drm_xe_wait_user_fence waitUserFence = {};
|
||||
|
||||
setupXeWaitUserFenceStruct(&waitUserFence, ctxId, op, addr, value, timeout);
|
||||
@@ -696,11 +697,14 @@ std::optional<MemoryClassInstance> IoctlHelperXe::getPreferredLocationRegion(Pre
|
||||
|
||||
bool IoctlHelperXe::setVmBoAdvise(int32_t handle, uint32_t attribute, void *region) {
|
||||
xeLog(" -> IoctlHelperXe::%s\n", __FUNCTION__);
|
||||
return false;
|
||||
// There is no vmAdvise attribute in Xe, so return success
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IoctlHelperXe::setVmBoAdviseForChunking(int32_t handle, uint64_t start, uint64_t length, uint32_t attribute, void *region) {
|
||||
return false;
|
||||
xeLog(" -> IoctlHelperXe::%s\n", __FUNCTION__);
|
||||
// There is no vmAdvise attribute in Xe, so return success
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IoctlHelperXe::setVmPrefetch(uint64_t start, uint64_t length, uint32_t region, uint32_t vmId) {
|
||||
@@ -808,9 +812,10 @@ int IoctlHelperXe::queryDistances(std::vector<QueryItem> &queryItems, std::vecto
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::optional<DrmParam> IoctlHelperXe::getHasPageFaultParamId() {
|
||||
xeLog(" -> IoctlHelperXe::%s\n", __FUNCTION__);
|
||||
return {};
|
||||
bool IoctlHelperXe::isPageFaultSupported() {
|
||||
xeLog(" -> IoctlHelperXe::%s %d\n", __FUNCTION__, supportedFeatures.flags.pageFault == true);
|
||||
|
||||
return supportedFeatures.flags.pageFault;
|
||||
};
|
||||
|
||||
uint32_t IoctlHelperXe::getEuStallFdParameter() {
|
||||
@@ -861,9 +866,10 @@ void IoctlHelperXe::setVmBindUserFence(VmBindParams &vmBind, VmBindExtUserFenceT
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t IoctlHelperXe::getVmAdviseAtomicAttribute() {
|
||||
std::optional<uint32_t> IoctlHelperXe::getVmAdviseAtomicAttribute() {
|
||||
xeLog(" -> IoctlHelperXe::%s\n", __FUNCTION__);
|
||||
return 0;
|
||||
// There is no vmAdvise attribute in Xe
|
||||
return {};
|
||||
}
|
||||
|
||||
int IoctlHelperXe::vmBind(const VmBindParams &vmBindParams) {
|
||||
@@ -1222,21 +1228,11 @@ int IoctlHelperXe::xeVmBind(const VmBindParams &vmBindParams, bool isBind) {
|
||||
}
|
||||
|
||||
if (index != invalidIndex) {
|
||||
|
||||
drm_xe_sync sync[1] = {};
|
||||
sync[0].type = DRM_XE_SYNC_TYPE_USER_FENCE;
|
||||
sync[0].flags = DRM_XE_SYNC_FLAG_SIGNAL;
|
||||
auto xeBindExtUserFence = reinterpret_cast<UserFenceExtension *>(vmBindParams.userFence);
|
||||
UNRECOVERABLE_IF(!xeBindExtUserFence);
|
||||
UNRECOVERABLE_IF(xeBindExtUserFence->tag != UserFenceExtension::tagValue);
|
||||
sync[0].addr = xeBindExtUserFence->addr;
|
||||
sync[0].timeline_value = xeBindExtUserFence->value;
|
||||
|
||||
drm_xe_vm_bind bind = {};
|
||||
bind.vm_id = vmBindParams.vmId;
|
||||
bind.num_binds = 1;
|
||||
bind.num_syncs = 1;
|
||||
bind.syncs = reinterpret_cast<uintptr_t>(&sync);
|
||||
bind.num_binds = 1;
|
||||
|
||||
bind.bind.range = vmBindParams.length;
|
||||
bind.bind.addr = gmmHelper->decanonize(vmBindParams.start);
|
||||
bind.bind.obj_offset = vmBindParams.offset;
|
||||
@@ -1244,6 +1240,18 @@ int IoctlHelperXe::xeVmBind(const VmBindParams &vmBindParams, bool isBind) {
|
||||
bind.bind.extensions = vmBindParams.extensions;
|
||||
bind.bind.flags = static_cast<uint32_t>(vmBindParams.flags);
|
||||
|
||||
UNRECOVERABLE_IF(vmBindParams.userFence == 0x0);
|
||||
drm_xe_sync sync[1] = {};
|
||||
|
||||
auto xeBindExtUserFence = reinterpret_cast<UserFenceExtension *>(vmBindParams.userFence);
|
||||
UNRECOVERABLE_IF(xeBindExtUserFence->tag != UserFenceExtension::tagValue);
|
||||
|
||||
sync[0].type = DRM_XE_SYNC_TYPE_USER_FENCE;
|
||||
sync[0].flags = DRM_XE_SYNC_FLAG_SIGNAL;
|
||||
sync[0].addr = xeBindExtUserFence->addr;
|
||||
sync[0].timeline_value = xeBindExtUserFence->value;
|
||||
bind.syncs = reinterpret_cast<uintptr_t>(&sync);
|
||||
|
||||
if (isBind) {
|
||||
bind.bind.op = DRM_XE_VM_BIND_OP_MAP;
|
||||
bind.bind.obj = vmBindParams.handle;
|
||||
|
||||
@@ -66,7 +66,7 @@ class IoctlHelperXe : public IoctlHelper {
|
||||
uint16_t getWaitUserFenceSoftFlag() override;
|
||||
int execBuffer(ExecBuffer *execBuffer, uint64_t completionGpuAddress, TaskCountType counterValue) override;
|
||||
bool completionFenceExtensionSupported(const bool isVmBindAvailable) override;
|
||||
std::optional<DrmParam> getHasPageFaultParamId() override;
|
||||
bool isPageFaultSupported() override;
|
||||
std::unique_ptr<uint8_t[]> createVmControlExtRegion(const std::optional<MemoryClassInstance> ®ionInstanceClass) override;
|
||||
uint32_t getFlagsForVmCreate(bool disableScratch, bool enablePageFault, bool useVmBind) override;
|
||||
uint32_t createContextWithAccessCounters(GemContextCreateExt &gcc) override;
|
||||
@@ -74,7 +74,7 @@ class IoctlHelperXe : public IoctlHelper {
|
||||
void fillVmBindExtSetPat(VmBindExtSetPatT &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) override;
|
||||
void fillVmBindExtUserFence(VmBindExtUserFenceT &vmBindExtUserFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) override;
|
||||
void setVmBindUserFence(VmBindParams &vmBind, VmBindExtUserFenceT vmBindUserFence) override;
|
||||
uint32_t getVmAdviseAtomicAttribute() override;
|
||||
std::optional<uint32_t> getVmAdviseAtomicAttribute() override;
|
||||
int vmBind(const VmBindParams &vmBindParams) override;
|
||||
int vmUnbind(const VmBindParams &vmBindParams) override;
|
||||
int getResetStats(ResetStats &resetStats, uint32_t *status, ResetStatsFault *resetStatsFault) override;
|
||||
@@ -211,7 +211,8 @@ class IoctlHelperXe : public IoctlHelper {
|
||||
struct {
|
||||
uint32_t vmBindReadOnly : 1;
|
||||
uint32_t vmBindImmediate : 1;
|
||||
uint32_t reserved : 30;
|
||||
uint32_t pageFault : 1;
|
||||
uint32_t reserved : 29;
|
||||
} flags;
|
||||
uint32_t allFlags = 0;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user