diff --git a/src/libhsakmt.ver b/src/libhsakmt.ver index 3992e6535a..66ca6ea5b3 100644 --- a/src/libhsakmt.ver +++ b/src/libhsakmt.ver @@ -77,6 +77,8 @@ hsaKmtSPMRelease; hsaKmtSPMSetDestBuffer; hsaKmtSVMSetAttr; hsaKmtSVMGetAttr; +hsaKmtSetXNACKMode; +hsaKmtGetXNACKMode; local: *; }; diff --git a/src/svm.c b/src/svm.c index 8f20fc0378..edb73bbd18 100644 --- a/src/svm.c +++ b/src/svm.c @@ -185,3 +185,43 @@ hsaKmtSVMGetAttr(void *start_addr, HSAuint64 size, unsigned int nattr, return HSAKMT_STATUS_SUCCESS; } + +static HSAKMT_STATUS +hsaKmtSetGetXNACKMode(HSAint32 * enable) +{ + struct kfd_ioctl_set_xnack_mode_args args; + + CHECK_KFD_OPEN(); + CHECK_KFD_MINOR_VERSION(5); + + args.xnack_enabled = *enable; + + if (kmtIoctl(kfd_fd, AMDKFD_IOC_SET_XNACK_MODE, &args)) { + if (errno == EPERM) { + pr_debug("set mode not supported %s\n", + strerror(errno)); + return HSAKMT_STATUS_NOT_SUPPORTED; + } else if (errno == EBUSY) { + pr_debug("kmtIoctl queues not empty %s\n", + strerror(errno)); + } + return HSAKMT_STATUS_ERROR; + } + + *enable = args.xnack_enabled; + + return HSAKMT_STATUS_SUCCESS; +} + +HSAKMT_STATUS HSAKMTAPI +hsaKmtSetXNACKMode(HSAint32 enable) +{ + return hsaKmtSetGetXNACKMode(&enable); +} + +HSAKMT_STATUS HSAKMTAPI +hsaKmtGetXNACKMode(HSAint32 * enable) +{ + *enable = -1; + return hsaKmtSetGetXNACKMode(enable); +}