Skip to content

Commit 0364733

Browse files
committed
nvapi: fan level, for future use... maybe
1 parent 24436fe commit 0364733

File tree

3 files changed

+214
-31
lines changed

3 files changed

+214
-31
lines changed

compat/nvapi/nvapi_ccminer.h

+92-21
Original file line numberDiff line numberDiff line change
@@ -220,41 +220,89 @@ typedef struct {
220220
NvU64 val2; // seen 7 and 3
221221
NvU64 values[3]; // increment with time
222222
NvU32 pad[326]; // empty
223-
}
224-
NVAPI_GPU_PERF_STATUS; // 1360 bytes (1-0550)
223+
} NVAPI_GPU_PERF_STATUS; // 1360 bytes (1-0550)
225224
#define NVAPI_GPU_PERF_STATUS_VER MAKE_NVAPI_VERSION(NVAPI_GPU_PERF_STATUS, 1)
226225

226+
typedef struct {
227+
NvU32 version;
228+
NvU32 val1; // 4
229+
NvU32 val2; // 2 or 0
230+
NvU32 val3; // 2
231+
NvU32 val4; // 3
232+
NV_GPU_PERF_PSTATE_ID pStateId;
233+
NvU32 val6; // 0 or 2
234+
NvU32 val7; // 4
235+
NvU32 val8; // 0
236+
NvU32 memFreq1; // 405000.
237+
NvU32 memFreq2; // 405000.
238+
NvU32 memFreqMin;// 101250.
239+
NvU32 memFreqMax;// 486000.
240+
NvU32 zeros[3];
241+
NvU32 gpuFreq1; // 696000. Unsure about those
242+
NvU32 gpuFreq2; // 696000.
243+
NvU32 gpuFreqMin;// 174000.
244+
NvU32 gpuFreqMax;// 658000.
245+
NvU32 pad[2697];
246+
} NVAPI_GPU_PERF_CLOCKS; // 10868 bytes (2-2a74)
247+
#define NVAPI_GPU_PERF_CLOCKS_VER MAKE_NVAPI_VERSION(NVAPI_GPU_PERF_CLOCKS, 2)
248+
249+
typedef struct {
250+
NvU32 version;
251+
NvU32 level;
252+
NvU32 count;
253+
NvU32 pad[339]; // (4-0558)
254+
} NVAPI_COOLER_SETTINGS;
255+
#define NVAPI_COOLER_SETTINGS_VER MAKE_NVAPI_VERSION(NVAPI_COOLER_SETTINGS, 4)
256+
257+
typedef struct {
258+
NvU32 version;
259+
NvU32 level; // 0 = auto ?
260+
NvU32 count; // 1
261+
NvU32 pad[38]; // (1-00a4)
262+
} NVAPI_COOLER_LEVEL;
263+
#define NVAPI_COOLER_LEVEL_VER MAKE_NVAPI_VERSION(NVAPI_COOLER_LEVEL, 1)
264+
227265
NvAPI_Status NvAPI_DLL_GetInterfaceVersionString(NvAPI_ShortString string);
228266

229267
NvAPI_Status NvAPI_DLL_PerfPoliciesGetInfo(NvPhysicalGpuHandle, NVAPI_GPU_PERF_INFO*); // 409D9841 1-004c
230268
NvAPI_Status NvAPI_DLL_PerfPoliciesGetStatus(NvPhysicalGpuHandle, NVAPI_GPU_PERF_STATUS*); // 3D358A0C 1-0550
231269

232-
NvAPI_Status NvAPI_DLL_ClientPowerPoliciesGetInfo(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_GPU_POWER_INFO*);
233-
NvAPI_Status NvAPI_DLL_ClientPowerPoliciesGetStatus(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_GPU_POWER_STATUS*);
234-
NvAPI_Status NvAPI_DLL_ClientPowerPoliciesSetStatus(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_GPU_POWER_STATUS*);
235-
NvAPI_Status NvAPI_DLL_ClientPowerTopologyGetStatus(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_GPU_POWER_TOPO*); // EDCF624E 1-0048
270+
NvAPI_Status NvAPI_DLL_ClientPowerPoliciesGetInfo(NvPhysicalGpuHandle, NVAPI_GPU_POWER_INFO*);
271+
NvAPI_Status NvAPI_DLL_ClientPowerPoliciesGetStatus(NvPhysicalGpuHandle, NVAPI_GPU_POWER_STATUS*);
272+
NvAPI_Status NvAPI_DLL_ClientPowerPoliciesSetStatus(NvPhysicalGpuHandle, NVAPI_GPU_POWER_STATUS*);
273+
NvAPI_Status NvAPI_DLL_ClientPowerTopologyGetStatus(NvPhysicalGpuHandle, NVAPI_GPU_POWER_TOPO*); // EDCF624E 1-0048
236274

237-
NvAPI_Status NvAPI_DLL_ClientThermalPoliciesGetInfo(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_GPU_THERMAL_INFO*);
238-
NvAPI_Status NvAPI_DLL_ClientThermalPoliciesGetLimit(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_GPU_THERMAL_LIMIT*);
239-
NvAPI_Status NvAPI_DLL_ClientThermalPoliciesSetLimit(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_GPU_THERMAL_LIMIT*);
275+
NvAPI_Status NvAPI_DLL_ClientThermalPoliciesGetInfo(NvPhysicalGpuHandle, NVAPI_GPU_THERMAL_INFO*);
276+
NvAPI_Status NvAPI_DLL_ClientThermalPoliciesGetLimit(NvPhysicalGpuHandle, NVAPI_GPU_THERMAL_LIMIT*);
277+
NvAPI_Status NvAPI_DLL_ClientThermalPoliciesSetLimit(NvPhysicalGpuHandle, NVAPI_GPU_THERMAL_LIMIT*);
240278

241279
// Pascal GTX only
242-
NvAPI_Status NvAPI_DLL_GetClockBoostRanges(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_CLOCKS_RANGE*);
243-
NvAPI_Status NvAPI_DLL_GetClockBoostMask(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_CLOCK_MASKS*); // 0x507B4B59
244-
NvAPI_Status NvAPI_DLL_GetClockBoostTable(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_CLOCK_TABLE*); // 0x23F1B133
245-
NvAPI_Status NvAPI_DLL_SetClockBoostTable(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_CLOCK_TABLE*); // 0x0733E009
246-
NvAPI_Status NvAPI_DLL_GetVFPCurve(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_VFP_CURVE*); // 0x21537AD4
247-
NvAPI_Status NvAPI_DLL_GetCurrentVoltage(NvPhysicalGpuHandle handle, NVAPI_VOLTAGE_STATUS* status); // 0x465F9BCF 1-004c
248-
NvAPI_Status NvAPI_DLL_GetCoreVoltageBoostPercent(NvPhysicalGpuHandle handle, NVAPI_VOLTBOOST_PERCENT*);
249-
NvAPI_Status NvAPI_DLL_SetCoreVoltageBoostPercent(NvPhysicalGpuHandle handle, NVAPI_VOLTBOOST_PERCENT*);
280+
NvAPI_Status NvAPI_DLL_GetClockBoostRanges(NvPhysicalGpuHandle, NVAPI_CLOCKS_RANGE*);
281+
NvAPI_Status NvAPI_DLL_GetClockBoostMask(NvPhysicalGpuHandle, NVAPI_CLOCK_MASKS*); // 0x507B4B59
282+
NvAPI_Status NvAPI_DLL_GetClockBoostTable(NvPhysicalGpuHandle, NVAPI_CLOCK_TABLE*); // 0x23F1B133
283+
NvAPI_Status NvAPI_DLL_SetClockBoostTable(NvPhysicalGpuHandle, NVAPI_CLOCK_TABLE*); // 0x0733E009
284+
NvAPI_Status NvAPI_DLL_GetVFPCurve(NvPhysicalGpuHandle, NVAPI_VFP_CURVE*); // 0x21537AD4
285+
NvAPI_Status NvAPI_DLL_GetCurrentVoltage(NvPhysicalGpuHandle, NVAPI_VOLTAGE_STATUS*); // 0x465F9BCF 1-004c
286+
NvAPI_Status NvAPI_DLL_GetCoreVoltageBoostPercent(NvPhysicalGpuHandle, NVAPI_VOLTBOOST_PERCENT*);
287+
NvAPI_Status NvAPI_DLL_SetCoreVoltageBoostPercent(NvPhysicalGpuHandle, NVAPI_VOLTBOOST_PERCENT*);
250288

251289
// Maxwell only
252-
NvAPI_Status NvAPI_DLL_GetVoltageDomainsStatus(NvPhysicalGpuHandle hPhysicalGpu, NVAPI_VOLT_STATUS*); // 0xC16C7E2C
253-
NvAPI_Status NvAPI_DLL_GetVoltages(NvPhysicalGpuHandle handle, NVAPI_VOLTAGES_TABLE*); // 7D656244 1-40CC
290+
NvAPI_Status NvAPI_DLL_GetVoltageDomainsStatus(NvPhysicalGpuHandle, NVAPI_VOLT_STATUS*); // 0xC16C7E2C
291+
NvAPI_Status NvAPI_DLL_GetVoltages(NvPhysicalGpuHandle, NVAPI_VOLTAGES_TABLE*); // 0x7D656244 1-40CC
292+
NvAPI_Status NvAPI_DLL_GetVoltageStep(NvPhysicalGpuHandle, NVAPI_VOLT_STATUS*); // 0x28766157 1-008C unsure of the name
293+
294+
NvAPI_Status NvAPI_DLL_GetCoolerSettings(NvPhysicalGpuHandle, uint32_t, NVAPI_COOLER_SETTINGS*); // 0xDA141340 4-0558
295+
NvAPI_Status NvAPI_DLL_SetCoolerLevels(NvPhysicalGpuHandle, uint32_t, NVAPI_COOLER_LEVEL*); // 0x891FA0AE 1-00A4
296+
NvAPI_Status NvAPI_DLL_RestoreCoolerSettings(NvPhysicalGpuHandle, NVAPI_COOLER_SETTINGS*, uint32_t);
297+
298+
NvAPI_Status NvAPI_DLL_GetSerialNumber(NvPhysicalGpuHandle, NvAPI_ShortString serial);
254299

255-
NvAPI_Status NvAPI_DLL_GetPerfClocks(NvPhysicalGpuHandle hPhysicalGpu, void* pFreqs);
300+
NvAPI_Status NvAPI_DLL_GetPerfClocks(NvPhysicalGpuHandle, uint32_t num, NVAPI_GPU_PERF_CLOCKS* pClocks); // 2-2A74
301+
//NvAPI_Status NvAPI_DLL_SetPerfClocks(NvPhysicalGpuHandle, uint32_t num, NVAPI_GPU_PERF_CLOCKS* pClocks); // error
256302

257-
NvAPI_Status NvAPI_DLL_GetSerialNumber(NvPhysicalGpuHandle handle, NvAPI_ShortString serial);
303+
//invalid..
304+
//NvAPI_Status NvAPI_DLL_GetPstateClientLimits(NvPhysicalGpuHandle, NV_GPU_PERF_PSTATE_ID, uint32_t* pLimits);
305+
//NvAPI_Status NvAPI_DLL_SetPstateClientLimits(NvPhysicalGpuHandle, NV_GPU_PERF_PSTATE_ID, uint32_t* pLimits);
258306

259307
NvAPI_Status NvAPI_DLL_SetPstates20v1(NvPhysicalGpuHandle handle, NV_GPU_PERF_PSTATES20_INFO_V1 *pSet);
260308
NvAPI_Status NvAPI_DLL_SetPstates20v2(NvPhysicalGpuHandle handle, NV_GPU_PERF_PSTATES20_INFO_V2 *pSet);
@@ -294,6 +342,29 @@ typedef struct
294342

295343
} NV_I2C_INFO_EX;
296344
#define NV_I2C_INFO_EX_VER MAKE_NVAPI_VERSION(NV_I2C_INFO_EX,3)
345+
/*
346+
sample evga x64 call (struct of 0x40 bytes)
347+
ReadEx
348+
$ ==> 40 00 03 00 00 00 00 00 00 40 00 00 00 00 00 00
349+
$+10 58 F9 2B 00 00 00 00 00 01 00 00 00 00 00 00 00
350+
$+20 C0 F9 2B 00 00 00 00 00 02 00 00 00 FF FF 00 00
351+
$+30 00 00 00 00 02 00 00 00 01 00 00 00 00 00 00 00
352+
353+
$ ==> 40 00 03 00 00 00 00 00 00 10 00 00 00 00 00 00
354+
$+10 68 F9 2B 00 00 00 00 00 01 00 00 00 00 00 00 00
355+
$+20 C0 F9 2B 00 00 00 00 00 01 00 00 00 FF FF 00 00
356+
$+30 00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00
357+
00000000002BF968 > 75 83 CF 3F 01 00 00 00
358+
00000000002BF9C0 > 0
359+
360+
WriteEx
361+
$ ==> 40 00 03 00 00 00 00 00 00 8C 00 00 00 00 00 00
362+
$+10 30 F9 2B 00 00 00 00 00 01 00 00 00 00 00 00 00
363+
$+20 38 F9 2B 00 00 00 00 00 02 00 00 00 FF FF 00 00
364+
$+30 00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00
365+
00000000002BF930 > D1 00 00 00 00 00 00 00
366+
00000000002BF938 > 38 00 00 00 00 00 00 00
367+
*/
297368

298369
NvAPI_Status NvAPI_DLL_I2CReadEx(NvPhysicalGpuHandle, NV_I2C_INFO_EX*, NvU32*);
299370
NvAPI_Status NvAPI_DLL_I2CWriteEx(NvPhysicalGpuHandle, NV_I2C_INFO_EX*, NvU32*);

nvapi.cpp

+83-6
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,9 @@ NvAPI_Status NvAPI_DLL_GetCurrentVoltage(NvPhysicalGpuHandle handle, NVAPI_VOLTA
211211
return (*pointer)(handle, status);
212212
}
213213

214-
#define NVAPI_ID_VOLT_STATUS_GET 0xC16C7E2C
214+
#define NVAPI_ID_VOLT_STATUS_GET 0xC16C7E2C // Maxwell
215215
NvAPI_Status NvAPI_DLL_GetVoltageDomainsStatus(NvPhysicalGpuHandle handle, NVAPI_VOLT_STATUS* data) {
216-
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, NVAPI_VOLT_STATUS*) = NULL;
216+
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, NVAPI_VOLT_STATUS*) = NULL;
217217
if(!nvapi_dll_loaded) return NVAPI_API_NOT_INITIALIZED;
218218
if(!pointer) {
219219
pointer = (NvAPI_Status (*)(NvPhysicalGpuHandle, NVAPI_VOLT_STATUS*))nvidia_handle->query(NVAPI_ID_VOLT_STATUS_GET);
@@ -222,6 +222,17 @@ NvAPI_Status NvAPI_DLL_GetVoltageDomainsStatus(NvPhysicalGpuHandle handle, NVAPI
222222
return (*pointer)(handle, data);
223223
}
224224

225+
#define NVAPI_ID_VOLTAGE 0x28766157 // Maxwell 1-008c Real func name is unknown
226+
NvAPI_Status NvAPI_DLL_GetVoltageStep(NvPhysicalGpuHandle handle, NVAPI_VOLT_STATUS* data) {
227+
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, NVAPI_VOLT_STATUS*) = NULL;
228+
if(!nvapi_dll_loaded) return NVAPI_API_NOT_INITIALIZED;
229+
if(!pointer) {
230+
pointer = (NvAPI_Status (*)(NvPhysicalGpuHandle, NVAPI_VOLT_STATUS*))nvidia_handle->query(NVAPI_ID_VOLTAGE);
231+
}
232+
if(!pointer) return NVAPI_NO_IMPLEMENTATION;
233+
return (*pointer)(handle, data);
234+
}
235+
225236
#define NVAPI_ID_CLK_RANGE_GET 0x64B43A6A // Pascal
226237
NvAPI_Status NvAPI_DLL_GetClockBoostRanges(NvPhysicalGpuHandle handle, NVAPI_CLOCKS_RANGE* range) {
227238
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, NVAPI_CLOCKS_RANGE*) = NULL;
@@ -302,14 +313,47 @@ NvAPI_Status NvAPI_DLL_SetCoreVoltageBoostPercent(NvPhysicalGpuHandle handle, NV
302313
}
303314

304315
#define NVAPI_ID_PERFCLOCKS_GET 0x1EA54A3B
305-
NvAPI_Status NvAPI_DLL_GetPerfClocks(NvPhysicalGpuHandle handle, void* pFreqs){
306-
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, void*) = NULL;
316+
NvAPI_Status NvAPI_DLL_GetPerfClocks(NvPhysicalGpuHandle handle, uint32_t num, NVAPI_GPU_PERF_CLOCKS* pClocks) {
317+
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, uint32_t, NVAPI_GPU_PERF_CLOCKS*) = NULL;
318+
if(!nvapi_dll_loaded) return NVAPI_API_NOT_INITIALIZED;
319+
if(!pointer) {
320+
pointer = (NvAPI_Status (*)(NvPhysicalGpuHandle, uint32_t, NVAPI_GPU_PERF_CLOCKS*))nvidia_handle->query(NVAPI_ID_PERFCLOCKS_GET);
321+
}
322+
if(!pointer) return NVAPI_NO_IMPLEMENTATION;
323+
return (*pointer)(handle, num, pClocks);
324+
}
325+
326+
#define NVAPI_ID_PERFCLOCKS_SET 0x07BCF4AC // error
327+
NvAPI_Status NvAPI_DLL_SetPerfClocks(NvPhysicalGpuHandle handle, uint32_t num, NVAPI_GPU_PERF_CLOCKS* pClocks) {
328+
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, uint32_t, NVAPI_GPU_PERF_CLOCKS*) = NULL;
307329
if(!nvapi_dll_loaded) return NVAPI_API_NOT_INITIALIZED;
308330
if(!pointer) {
309-
pointer = (NvAPI_Status (*)(NvPhysicalGpuHandle, void*))nvidia_handle->query(NVAPI_ID_PERFCLOCKS_GET);
331+
pointer = (NvAPI_Status (*)(NvPhysicalGpuHandle, uint32_t, NVAPI_GPU_PERF_CLOCKS*))nvidia_handle->query(NVAPI_ID_PERFCLOCKS_SET);
310332
}
311333
if(!pointer) return NVAPI_NO_IMPLEMENTATION;
312-
return (*pointer)(handle, pFreqs);
334+
return (*pointer)(handle, num, pClocks);
335+
}
336+
337+
#define NVAPI_ID_PSTATELIMITS_GET 0x88C82104 // wrong prototype or missing struct data ?
338+
NvAPI_Status NvAPI_DLL_GetPstateClientLimits(NvPhysicalGpuHandle handle, NV_GPU_PERF_PSTATE_ID pst, uint32_t* pLimits) {
339+
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, NV_GPU_PERF_PSTATE_ID, uint32_t*) = NULL;
340+
if(!nvapi_dll_loaded) return NVAPI_API_NOT_INITIALIZED;
341+
if(!pointer) {
342+
pointer = (NvAPI_Status (*)(NvPhysicalGpuHandle, NV_GPU_PERF_PSTATE_ID, uint32_t*))nvidia_handle->query(NVAPI_ID_PSTATELIMITS_GET);
343+
}
344+
if(!pointer) return NVAPI_NO_IMPLEMENTATION;
345+
return (*pointer)(handle, pst, pLimits);
346+
}
347+
348+
#define NVAPI_ID_PSTATELIMITS_SET 0xFDFC7D49 // wrong prototype or missing struct data ?
349+
NvAPI_Status NvAPI_DLL_SetPstateClientLimits(NvPhysicalGpuHandle handle, NV_GPU_PERF_PSTATE_ID pst, uint32_t* pLimits) {
350+
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, NV_GPU_PERF_PSTATE_ID, uint32_t*) = NULL;
351+
if(!nvapi_dll_loaded) return NVAPI_API_NOT_INITIALIZED;
352+
if(!pointer) {
353+
pointer = (NvAPI_Status (*)(NvPhysicalGpuHandle, NV_GPU_PERF_PSTATE_ID, uint32_t*))nvidia_handle->query(NVAPI_ID_PSTATELIMITS_SET);
354+
}
355+
if(!pointer) return NVAPI_NO_IMPLEMENTATION;
356+
return (*pointer)(handle, pst, pLimits);
313357
}
314358

315359
#define NVAPI_ID_PSTATE20_SET 0x0F4DAE6B
@@ -347,6 +391,39 @@ NvAPI_Status NvAPI_DLL_GetVoltages(NvPhysicalGpuHandle handle, NVAPI_VOLTAGES_TA
347391
return (*pointer)(handle, pInfo);
348392
}
349393

394+
#define NVAPI_ID_COOLERSETTINGS 0xDA141340 // 4-0558
395+
NvAPI_Status NvAPI_DLL_GetCoolerSettings(NvPhysicalGpuHandle handle, uint32_t id, NVAPI_COOLER_SETTINGS* pSettings) {
396+
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, uint32_t, NVAPI_COOLER_SETTINGS*) = NULL;
397+
if(!nvapi_dll_loaded) return NVAPI_API_NOT_INITIALIZED;
398+
if(!pointer) {
399+
pointer = (NvAPI_Status (*)(NvPhysicalGpuHandle, uint32_t, NVAPI_COOLER_SETTINGS*))nvidia_handle->query(NVAPI_ID_COOLERSETTINGS);
400+
}
401+
if(!pointer) return NVAPI_NO_IMPLEMENTATION;
402+
return (*pointer)(handle, id, pSettings);
403+
}
404+
405+
#define NVAPI_ID_COOLER_SETLEVELS 0x891FA0AE // 1-00A4
406+
NvAPI_Status NvAPI_DLL_SetCoolerLevels(NvPhysicalGpuHandle handle, uint32_t id, NVAPI_COOLER_LEVEL* pLevel) {
407+
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, uint32_t, NVAPI_COOLER_LEVEL*) = NULL;
408+
if(!nvapi_dll_loaded) return NVAPI_API_NOT_INITIALIZED;
409+
if(!pointer) {
410+
pointer = (NvAPI_Status (*)(NvPhysicalGpuHandle, uint32_t, NVAPI_COOLER_LEVEL*))nvidia_handle->query(NVAPI_ID_COOLER_SETLEVELS);
411+
}
412+
if(!pointer) return NVAPI_NO_IMPLEMENTATION;
413+
return (*pointer)(handle, id, pLevel);
414+
}
415+
416+
#define NVAPI_ID_COOLER_RESTORE 0x8F6ED0FB
417+
NvAPI_Status NvAPI_DLL_RestoreCoolerSettings(NvPhysicalGpuHandle handle, NVAPI_COOLER_SETTINGS* pSettings, uint32_t id) {
418+
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, NVAPI_COOLER_SETTINGS*, uint32_t) = NULL;
419+
if(!nvapi_dll_loaded) return NVAPI_API_NOT_INITIALIZED;
420+
if(!pointer) {
421+
pointer = (NvAPI_Status (*)(NvPhysicalGpuHandle, NVAPI_COOLER_SETTINGS*, uint32_t))nvidia_handle->query(NVAPI_ID_COOLER_RESTORE);
422+
}
423+
if(!pointer) return NVAPI_NO_IMPLEMENTATION;
424+
return (*pointer)(handle, pSettings, id);
425+
}
426+
350427
#define NVAPI_ID_I2CREADEX 0x4D7B0709 // 3-002c
351428
NvAPI_Status NvAPI_DLL_I2CReadEx(NvPhysicalGpuHandle handle, NV_I2C_INFO_EX *i2c, NvU32 *exData) {
352429
static NvAPI_Status (*pointer)(NvPhysicalGpuHandle, NV_I2C_INFO_EX*, NvU32*) = NULL;

nvml.cpp

+39-4
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,9 @@ int nvapi_pstateinfo(unsigned int devNum)
10311031
uint32_t* buf = (uint32_t*) calloc(1, 0x8000);
10321032
for (int i=8; i < 0x8000 && buf; i+=4) {
10331033
buf[0] = 0x10000 + i;
1034-
if ((ret = NvAPI_DLL_GetXXX(phys[devNum], buf)) != NVAPI_INCOMPATIBLE_STRUCT_VERSION) {
1034+
NV_GPU_PERF_PSTATE_ID pst = NVAPI_GPU_PERF_PSTATE_P0;
1035+
ret = NvAPI_DLL_GetPstateClientLimits(phys[devNum], pst, buf);
1036+
if (ret != NVAPI_INCOMPATIBLE_STRUCT_VERSION) {
10351037
NvAPI_ShortString string;
10361038
NvAPI_GetErrorMessage(ret, string);
10371039
applog(LOG_BLUE, "struct size is %06x : %s", buf[0], string);
@@ -1111,6 +1113,19 @@ int nvapi_pstateinfo(unsigned int devNum)
11111113
(double) freqs->domain[NVAPI_GPU_PUBLIC_CLOCK_MEMORY].frequency / 1000,
11121114
(double) freqs->domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].frequency / 1000);
11131115

1116+
// Other clock values ??
1117+
NVAPI_GPU_PERF_CLOCKS *pcl;
1118+
NV_INIT_STRUCT_ALLOC(NVAPI_GPU_PERF_CLOCKS, pcl);
1119+
int numClock=0; ret = NVAPI_OK;
1120+
while (ret == NVAPI_OK) {
1121+
if ((ret = NvAPI_DLL_GetPerfClocks(phys[devNum], numClock, pcl)) == NVAPI_OK) {
1122+
applog(LOG_RAW, " C%d: MEM %4.0f MHz GPU %6.1f MHz [%5.1f/%6.1f]", numClock,
1123+
(double) pcl->memFreq1/1000, (double) pcl->gpuFreq1/1000, (double) pcl->gpuFreqMin/1000, (double) pcl->gpuFreqMax/1000);
1124+
// ret = NvAPI_DLL_SetPerfClocks(phys[devNum], numClock, pcl); // error
1125+
}
1126+
numClock++;
1127+
}
1128+
11141129
// Pascal only
11151130
NVAPI_VOLTBOOST_PERCENT *pvb;
11161131
NV_INIT_STRUCT_ON(NVAPI_VOLTBOOST_PERCENT, pvb, mem);
@@ -1125,18 +1140,38 @@ int nvapi_pstateinfo(unsigned int devNum)
11251140
free(pvdom);
11261141
} else {
11271142
// Maxwell 9xx
1128-
NVAPI_VOLT_STATUS *mvdom;
1143+
NVAPI_VOLT_STATUS *mvdom, *mvstep;
11291144
NV_INIT_STRUCT_ALLOC(NVAPI_VOLT_STATUS, mvdom);
11301145
if (mvdom && (ret = NvAPI_DLL_GetVoltageDomainsStatus(phys[devNum], mvdom)) == NVAPI_OK) {
1131-
if (mvdom->value_uV)
1132-
applog(LOG_RAW, " GPU Voltage is %u mV", mvdom->value_uV/1000);
1146+
NV_INIT_STRUCT_ALLOC(NVAPI_VOLT_STATUS, mvstep);
1147+
NvAPI_DLL_GetVoltageStep(phys[devNum], mvstep);
1148+
if (mvdom->value_uV) applog(LOG_RAW, " GPU Voltage is %.1f mV with %.3f mV resolution",
1149+
(double) mvdom->value_uV/1000, (double) mvstep->value_uV/1000);
1150+
free(mvstep);
11331151
}
11341152
free(mvdom);
11351153
}
11361154

11371155
uint32_t plim = nvapi_get_plimit(devNum);
11381156
applog(LOG_RAW, " Power limit is set to %u%%", plim);
11391157

1158+
NVAPI_COOLER_SETTINGS *cooler;
1159+
NV_INIT_STRUCT_ON(NVAPI_COOLER_SETTINGS, cooler, mem);
1160+
ret = NvAPI_DLL_GetCoolerSettings(phys[devNum], 7, cooler);
1161+
if (ret == NVAPI_OK) {
1162+
applog(LOG_RAW, " Fan level is set to %u%%", cooler->level);
1163+
#if 0
1164+
NVAPI_COOLER_LEVEL *fan;
1165+
NV_INIT_STRUCT_ALLOC(NVAPI_COOLER_LEVEL, fan);
1166+
fan->level = 100;
1167+
fan->count = 1;
1168+
ret = NvAPI_DLL_SetCoolerLevels(phys[devNum], 7, fan);
1169+
free(fan);
1170+
sleep(10);
1171+
ret = NvAPI_DLL_RestoreCoolerSettings(phys[devNum], cooler, 7);
1172+
#endif
1173+
}
1174+
11401175
NV_GPU_THERMAL_SETTINGS *tset;
11411176
NV_INIT_STRUCT_ON(NV_GPU_THERMAL_SETTINGS, tset, mem);
11421177

0 commit comments

Comments
 (0)