Query driver for maximal performance mode

This commit is contained in:
Timur Sultanov 2019-06-01 13:42:51 +03:00
parent 51c594227a
commit 20a3534632
2 changed files with 38 additions and 6 deletions

View File

@ -95,6 +95,9 @@ void nvidia::queryGPUFeatures()
Bool ret; Bool ret;
NVCTRLAttributeValidValuesRec values; NVCTRLAttributeValidValuesRec values;
for (int i=0; i<gpuCount; i++) { for (int i=0; i<gpuCount; i++) {
// Query all performance modes
queryGPUMaxPerfMode(i);
// Query if voltage offset is writable/readable // Query if voltage offset is writable/readable
ret = XNVCTRLQueryValidTargetAttributeValues(dpy, ret = XNVCTRLQueryValidTargetAttributeValues(dpy,
NV_CTRL_TARGET_TYPE_GPU, NV_CTRL_TARGET_TYPE_GPU,
@ -120,7 +123,7 @@ void nvidia::queryGPUFeatures()
ret = XNVCTRLQueryValidTargetAttributeValues(dpy, ret = XNVCTRLQueryValidTargetAttributeValues(dpy,
NV_CTRL_TARGET_TYPE_GPU, NV_CTRL_TARGET_TYPE_GPU,
i, i,
3, GPUList[i].maxPerfMode,
NV_CTRL_GPU_NVCLOCK_OFFSET, NV_CTRL_GPU_NVCLOCK_OFFSET,
&values); &values);
if ((values.permissions & ATTRIBUTE_TYPE_WRITE) == ATTRIBUTE_TYPE_WRITE) { if ((values.permissions & ATTRIBUTE_TYPE_WRITE) == ATTRIBUTE_TYPE_WRITE) {
@ -139,7 +142,7 @@ void nvidia::queryGPUFeatures()
ret = XNVCTRLQueryValidTargetAttributeValues(dpy, ret = XNVCTRLQueryValidTargetAttributeValues(dpy,
NV_CTRL_TARGET_TYPE_GPU, NV_CTRL_TARGET_TYPE_GPU,
i, i,
3, GPUList[i].maxPerfMode,
NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET, NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET,
&values); &values);
if ((values.permissions & ATTRIBUTE_TYPE_WRITE) == ATTRIBUTE_TYPE_WRITE) { if ((values.permissions & ATTRIBUTE_TYPE_WRITE) == ATTRIBUTE_TYPE_WRITE) {
@ -189,6 +192,32 @@ void nvidia::queryGPUFeatures()
qDebug() << GPUList[i].totalVRAM << "vram"; qDebug() << GPUList[i].totalVRAM << "vram";
} }
} }
void nvidia::queryGPUMaxPerfMode(int GPUIndex)
{
char* result;
Bool ret = XNVCTRLQueryTargetStringAttribute(dpy,
NV_CTRL_TARGET_TYPE_GPU,
GPUIndex,
0,
NV_CTRL_STRING_PERFORMANCE_MODES,
&result);
if(ret){
QString modes(result);
free(result);
// Each perf mode is separated by a ";" symbol, so for obtaining the number
// of maximal performance mode it should be enough to just count number of
// ";" occurences
int maxPerfMode = modes.count(';');
GPUList[GPUIndex].maxPerfMode = uint(maxPerfMode);
qDebug() << modes;
return;
}
else {
GPUList[GPUIndex].maxPerfMode = 3;
}
}
void nvidia::queryGPUVoltage(int GPUIndex) void nvidia::queryGPUVoltage(int GPUIndex)
{ {
Bool ret; Bool ret;
@ -266,7 +295,7 @@ void nvidia::queryGPUFreqOffset(int GPUIndex)
Bool ret = XNVCTRLQueryTargetAttribute(dpy, Bool ret = XNVCTRLQueryTargetAttribute(dpy,
NV_CTRL_TARGET_TYPE_GPU, NV_CTRL_TARGET_TYPE_GPU,
GPUIndex, GPUIndex,
3, GPUList[GPUIndex].maxPerfMode,
NV_CTRL_GPU_NVCLOCK_OFFSET, NV_CTRL_GPU_NVCLOCK_OFFSET,
&GPUList[GPUIndex].coreClkOffset); &GPUList[GPUIndex].coreClkOffset);
} }
@ -275,7 +304,7 @@ void nvidia::queryGPUMemClkOffset(int GPUIndex)
Bool ret = XNVCTRLQueryTargetAttribute(dpy, Bool ret = XNVCTRLQueryTargetAttribute(dpy,
NV_CTRL_TARGET_TYPE_GPU, NV_CTRL_TARGET_TYPE_GPU,
GPUIndex, GPUIndex,
3, GPUList[GPUIndex].maxPerfMode,
NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET, NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET,
&GPUList[GPUIndex].memClkOffset); &GPUList[GPUIndex].memClkOffset);
} }
@ -316,7 +345,7 @@ bool nvidia::assignGPUFreqOffset(int GPUIndex, int targetValue)
Bool ret = XNVCTRLSetTargetAttributeAndGetStatus(dpy, Bool ret = XNVCTRLSetTargetAttributeAndGetStatus(dpy,
NV_CTRL_TARGET_TYPE_GPU, NV_CTRL_TARGET_TYPE_GPU,
GPUIndex, GPUIndex,
3, // This argument is the performance mode GPUList[GPUIndex].maxPerfMode, // This argument is the performance mode
NV_CTRL_GPU_NVCLOCK_OFFSET, NV_CTRL_GPU_NVCLOCK_OFFSET,
targetValue); targetValue);
qDebug() << ret << "freqassign"; qDebug() << ret << "freqassign";
@ -327,7 +356,7 @@ bool nvidia::assignGPUMemClockOffset(int GPUIndex, int targetValue)
Bool ret = XNVCTRLSetTargetAttributeAndGetStatus(dpy, Bool ret = XNVCTRLSetTargetAttributeAndGetStatus(dpy,
NV_CTRL_TARGET_TYPE_GPU, NV_CTRL_TARGET_TYPE_GPU,
GPUIndex, GPUIndex,
3, GPUList[GPUIndex].maxPerfMode,
NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET, NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET,
targetValue); targetValue);
qDebug() << ret << "memassign"; qDebug() << ret << "memassign";

View File

@ -70,6 +70,8 @@ public:
uint powerLim; uint powerLim;
int totalVRAM; int totalVRAM;
int usedVRAM; int usedVRAM;
uint maxPerfMode;
}; };
QVector <GPU> GPUList; QVector <GPU> GPUList;
@ -94,6 +96,7 @@ public slots:
void queryGPUFreqOffset(int GPUIndex); void queryGPUFreqOffset(int GPUIndex);
void queryGPUMemClkOffset(int GPUIndex); void queryGPUMemClkOffset(int GPUIndex);
void queryGPUVoltageOffset(int GPUIndex); void queryGPUVoltageOffset(int GPUIndex);
void queryGPUMaxPerfMode(int GPUIndex);
void queryGPUUtils(int GPUIndex); void queryGPUUtils(int GPUIndex);
void queryGPUPowerDraw(int GPUIndex); void queryGPUPowerDraw(int GPUIndex);