From 2bd49e6720dac5fac43e1aefb8ee22a8184d7f75 Mon Sep 17 00:00:00 2001 From: jsteube Date: Sat, 18 Jun 2016 18:21:40 +0200 Subject: [PATCH] Added --gpu-temp-retain support for windows through nvapi --- docs/changes.txt | 4 ++-- include/ext_nvapi.h | 22 +++++++++++++++++++ include/shared.h | 1 + src/ext_nvapi.c | 19 +++++++++++++++++ src/hashcat.c | 20 +++++++++++++---- src/shared.c | 52 ++++++++++++++++++++++++++++++++------------- 6 files changed, 97 insertions(+), 21 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index a842ae111..4fc3dbfb2 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -24,7 +24,7 @@ It combines all features of all hashcat projects in one project. - Added makefile install and uninstall targets - Added autotuning engine and user-configurable tuning database - Added current engine clock, current memory clock and pci-e lanes to the status display -- Added support for --gpu-temp-retain for nvidia devices on windows +- Added support for --gpu-temp-retain for NVidia GPU, both Linux and Windows - Added execution timer of the running kernel to the status display - Added command prompt to quit at next restore checkpoint - Added human-readable error message for the OpenCL error codes @@ -137,4 +137,4 @@ It combines all features of all hashcat projects in one project. - Disabled retain support by default, you can reactive it using --gpu-temp-retain - Completely get rid of HAVE_ADL, HAVE_NVML and HAVE_NVAPI in sources - Replaced NVAPI with NVML on windows -- Added support for XNVCTRL on Linux to add support for --gpu-temp-retain for NVidia GPU + diff --git a/include/ext_nvapi.h b/include/ext_nvapi.h index ccf7dad45..1b6b6a851 100644 --- a/include/ext_nvapi.h +++ b/include/ext_nvapi.h @@ -19,6 +19,7 @@ #define NVAPI_INTERFACE extern NvAPI_Status typedef unsigned long NvU32; +typedef signed long NvS32; #define NV_DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name @@ -35,6 +36,9 @@ typedef char NvAPI_ShortString[NVAPI_SHORT_STRING_MAX]; #define MAKE_NVAPI_VERSION(typeName,ver) (NvU32)(sizeof(typeName) | ((ver)<<16)) #define NVAPI_MAX_PHYSICAL_GPUS 64 +#define NVAPI_MAX_COOLER_PER_GPU 20 + +#define GPU_COOLER_LEVELS_VER 0x10000 typedef enum _NvAPI_Status { @@ -187,6 +191,20 @@ typedef struct } NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1; +typedef struct +{ + NvS32 Level; + NvS32 Policy; + +} NvLevel; + +typedef struct +{ + NvU32 Version; + NvLevel Levels[NVAPI_MAX_COOLER_PER_GPU]; + +} NV_GPU_COOLER_LEVELS; + NVAPI_INTERFACE NvAPI_QueryInterface (uint offset); NVAPI_INTERFACE NvAPI_Initialize (); NVAPI_INTERFACE NvAPI_Unload (); @@ -194,6 +212,7 @@ NVAPI_INTERFACE NvAPI_GetErrorMessage (NvAPI_Status nr,NvAPI_ShortString szDesc) NVAPI_INTERFACE NvAPI_EnumPhysicalGPUs (NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount); NVAPI_INTERFACE NvAPI_GPU_GetPerfPoliciesInfo (NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_PERF_POLICIES_INFO_PARAMS_V1 *perfPolicies_info); NVAPI_INTERFACE NvAPI_GPU_GetPerfPoliciesStatus (NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1 *perfPolicies_status); +NVAPI_INTERFACE NvAPI_GPU_SetCoolerLevels (NvPhysicalGpuHandle hPhysicalGpu, NvU32 coolerIndex, NV_GPU_COOLER_LEVELS *pCoolerLevels); /* * End of declarations from nvapi.h and subheaders @@ -216,6 +235,7 @@ typedef int (*NVAPI_API_CALL NVAPI_GETERRORMESSAGE) (NvAPI_Status, NvAPI_ShortSt typedef int (*NVAPI_API_CALL NVAPI_ENUMPHYSICALGPUS) (NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *); typedef int (*NVAPI_API_CALL NVAPI_GPU_GETPERFPOLICIESINFO) (NvPhysicalGpuHandle, NV_GPU_PERF_POLICIES_INFO_PARAMS_V1 *); typedef int (*NVAPI_API_CALL NVAPI_GPU_GETPERFPOLICIESSTATUS) (NvPhysicalGpuHandle, NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1 *); +typedef int (*NVAPI_API_CALL NVAPI_GPU_SETCOOLERLEVELS) (NvPhysicalGpuHandle, NvU32, NV_GPU_COOLER_LEVELS *); typedef struct { @@ -228,6 +248,7 @@ typedef struct NVAPI_ENUMPHYSICALGPUS NvAPI_EnumPhysicalGPUs; NVAPI_GPU_GETPERFPOLICIESINFO NvAPI_GPU_GetPerfPoliciesInfo; NVAPI_GPU_GETPERFPOLICIESSTATUS NvAPI_GPU_GetPerfPoliciesStatus; + NVAPI_GPU_SETCOOLERLEVELS NvAPI_GPU_SetCoolerLevels; } hm_nvapi_lib_t; @@ -243,6 +264,7 @@ int hm_NvAPI_GetErrorMessage (NVAPI_PTR *nvapi, NvAPI_Status nr, NvAPI_ShortStri int hm_NvAPI_EnumPhysicalGPUs (NVAPI_PTR *nvapi, NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount); int hm_NvAPI_GPU_GetPerfPoliciesInfo (NVAPI_PTR *nvapi, NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_PERF_POLICIES_INFO_PARAMS_V1 *perfPolicies_info); int hm_NvAPI_GPU_GetPerfPoliciesStatus (NVAPI_PTR *nvapi, NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_PERF_POLICIES_STATUS_PARAMS_V1 *perfPolicies_status); +int hm_NvAPI_GPU_SetCoolerLevels (NVAPI_PTR *nvapi, NvPhysicalGpuHandle hPhysicalGpu, NvU32 coolerIndex, NV_GPU_COOLER_LEVELS *pCoolerLevels); #endif // HAVE_HWMON diff --git a/include/shared.h b/include/shared.h index 34824d366..7af0aa303 100644 --- a/include/shared.h +++ b/include/shared.h @@ -1465,6 +1465,7 @@ int hm_get_memoryspeed_with_device_id (const uint device_id); int hm_get_corespeed_with_device_id (const uint device_id); int hm_get_throttle_with_device_id (const uint device_id); int hm_set_fanspeed_with_device_id_adl (const uint device_id, const int fanspeed, const int fanpolicy); +int hm_set_fanspeed_with_device_id_nvapi (const uint device_id, const int fanspeed, const int fanpolicy); int hm_set_fanspeed_with_device_id_xnvctrl (const uint device_id, const int fanspeed); void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value); diff --git a/src/ext_nvapi.c b/src/ext_nvapi.c index 38326380d..671cb5527 100644 --- a/src/ext_nvapi.c +++ b/src/ext_nvapi.c @@ -38,6 +38,7 @@ int nvapi_init (NVAPI_PTR *nvapi) HC_LOAD_ADDR(nvapi, NvAPI_EnumPhysicalGPUs, NVAPI_ENUMPHYSICALGPUS, nvapi_QueryInterface, 0xE5AC921F, NVAPI, 0) HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetPerfPoliciesInfo, NVAPI_GPU_GETPERFPOLICIESINFO, nvapi_QueryInterface, 0x409D9841, NVAPI, 0) HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetPerfPoliciesStatus, NVAPI_GPU_GETPERFPOLICIESSTATUS, nvapi_QueryInterface, 0x3D358A0C, NVAPI, 0) + HC_LOAD_ADDR(nvapi, NvAPI_GPU_SetCoolerLevels, NVAPI_GPU_SETCOOLERLEVELS, nvapi_QueryInterface, 0x891FA0AE, NVAPI, 0) return 0; } @@ -152,6 +153,24 @@ int hm_NvAPI_GPU_GetPerfPoliciesStatus (NVAPI_PTR *nvapi, NvPhysicalGpuHandle hP return NvAPI_rc; } +int hm_NvAPI_GPU_SetCoolerLevels (NVAPI_PTR *nvapi, NvPhysicalGpuHandle hPhysicalGpu, NvU32 coolerIndex, NV_GPU_COOLER_LEVELS *pCoolerLevels) +{ + if (!nvapi) return (-1); + + NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_SetCoolerLevels (hPhysicalGpu, coolerIndex, pCoolerLevels); + + if (NvAPI_rc != NVAPI_OK) + { + NvAPI_ShortString string = { 0 }; + + hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string); + + log_info ("WARN: %s %d %s\n", "NvAPI_GPU_SetCoolerLevels()", NvAPI_rc, string); + } + + return NvAPI_rc; +} + #ifdef __MINGW64__ void __security_check_cookie (uintptr_t _StackCookie) diff --git a/src/hashcat.c b/src/hashcat.c index 0cf7d2d25..4425b8331 100644 --- a/src/hashcat.c +++ b/src/hashcat.c @@ -4235,7 +4235,11 @@ static void *thread_monitor (void *p) } else if (device_param->device_vendor_id == VENDOR_ID_NV) { - #ifdef _POSIX + #ifdef _WIN + hm_set_fanspeed_with_device_id_nvapi (device_id, fan_speed_new, 1); + #endif + + #ifdef _LINUX hm_set_fanspeed_with_device_id_xnvctrl (device_id, fan_speed_new); #endif } @@ -14066,7 +14070,7 @@ int main (int argc, char **argv) { need_nvml = 1; - #ifdef _POSIX + #ifdef _LINUX need_xnvctrl = 1; #endif @@ -16180,7 +16184,11 @@ int main (int argc, char **argv) } else if (device_param->device_vendor_id == VENDOR_ID_NV) { - #ifdef _POSIX + #ifdef _WIN + rc = hm_set_fanspeed_with_device_id_nvapi (device_id, fanspeed, 1); + #endif + + #ifdef _LINUX rc = set_fan_control (data.hm_xnvctrl, data.hm_device[device_id].xnvctrl, NV_CTRL_GPU_COOLER_MANUAL_CONTROL_TRUE); #endif } @@ -18382,7 +18390,11 @@ int main (int argc, char **argv) } else if (device_param->device_vendor_id == VENDOR_ID_NV) { - #ifdef _POSIX + #ifdef _WIN + rc = hm_set_fanspeed_with_device_id_nvapi (device_id, fanspeed, fanpolicy); + #endif + + #ifdef _LINUX rc = set_fan_control (data.hm_xnvctrl, data.hm_device[device_id].xnvctrl, NV_CTRL_GPU_COOLER_MANUAL_CONTROL_FALSE); #endif } diff --git a/src/shared.c b/src/shared.c index 6b5051cea..5f7f5fbdb 100644 --- a/src/shared.c +++ b/src/shared.c @@ -3398,21 +3398,6 @@ int hm_get_throttle_with_device_id (const uint device_id) return -1; } -int hm_set_fanspeed_with_device_id_xnvctrl (const uint device_id, const int fanspeed) -{ - if (data.hm_device[device_id].fan_set_supported == 1) - { - if (data.hm_xnvctrl) - { - if (set_fan_speed_target (data.hm_xnvctrl, data.hm_device[device_id].xnvctrl, fanspeed) != 0) return -1; - - return 0; - } - } - - return -1; -} - int hm_set_fanspeed_with_device_id_adl (const uint device_id, const int fanspeed, const int fanpolicy) { if (data.hm_device[device_id].fan_set_supported == 1) @@ -3453,6 +3438,43 @@ int hm_set_fanspeed_with_device_id_adl (const uint device_id, const int fanspeed return -1; } +int hm_set_fanspeed_with_device_id_nvapi (const uint device_id, const int fanspeed, const int fanpolicy) +{ + if (data.hm_device[device_id].fan_set_supported == 1) + { + if (data.hm_nvapi) + { + NV_GPU_COOLER_LEVELS CoolerLevels = { 0 }; + + CoolerLevels.Version = GPU_COOLER_LEVELS_VER | sizeof (NV_GPU_COOLER_LEVELS); + + CoolerLevels.Levels[0].Level = fanspeed; + CoolerLevels.Levels[0].Policy = fanpolicy; + + if (hm_NvAPI_GPU_SetCoolerLevels (data.hm_nvapi, data.hm_device[device_id].nvapi, 0, &CoolerLevels) != NVAPI_OK) return -1; + + return 0; + } + } + + return -1; +} + +int hm_set_fanspeed_with_device_id_xnvctrl (const uint device_id, const int fanspeed) +{ + if (data.hm_device[device_id].fan_set_supported == 1) + { + if (data.hm_xnvctrl) + { + if (set_fan_speed_target (data.hm_xnvctrl, data.hm_device[device_id].xnvctrl, fanspeed) != 0) return -1; + + return 0; + } + } + + return -1; +} + #endif // HAVE_HWMON /**