2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
11 #if defined(HAVE_HWMON)
16 * Declarations from nvapi.h and subheaders
20 #define __nvapi_success
21 #define __success(epxr)
24 //#define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
25 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status
28 * Definitions from nvapi_lite_common.h
31 // mac os 32-bit still needs this
32 #if (defined(macintosh) || defined(__APPLE__)) && !defined(__LP64__)
33 typedef signed long NvS32
; /* -2147483648 to 2147483647 */
35 typedef signed int NvS32
; /* -2147483648 to 2147483647 */
38 // mac os 32-bit still needs this
39 #if ( (defined(macintosh) && defined(__LP64__) && (__NVAPI_RESERVED0__)) || \
40 (!defined(macintosh) && defined(__NVAPI_RESERVED0__)) )
41 typedef unsigned int NvU32
; /* 0 to 4294967295 */
43 typedef unsigned long NvU32
; /* 0 to 4294967295 */
46 #define NV_DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
48 NV_DECLARE_HANDLE(NvPhysicalGpuHandle
); // A single physical GPU
50 #define NVAPI_GENERIC_STRING_MAX 4096
51 #define NVAPI_LONG_STRING_MAX 256
52 #define NVAPI_SHORT_STRING_MAX 64
54 typedef char NvAPI_String
[NVAPI_GENERIC_STRING_MAX
];
55 typedef char NvAPI_LongString
[NVAPI_LONG_STRING_MAX
];
56 typedef char NvAPI_ShortString
[NVAPI_SHORT_STRING_MAX
];
58 #define MAKE_NVAPI_VERSION(typeName,ver) (NvU32)(sizeof(typeName) | ((ver)<<16))
59 #define GET_NVAPI_VERSION(ver) (NvU32)((ver)>>16)
60 #define GET_NVAPI_SIZE(ver) (NvU32)((ver) & 0xffff)
62 #define NVAPI_MAX_PHYSICAL_GPUS 64
64 typedef enum _NvAPI_Status
66 NVAPI_OK
= 0, // Success. Request is completed.
67 NVAPI_ERROR
= -1, // Generic error
68 NVAPI_LIBRARY_NOT_FOUND
= -2, // NVAPI support library cannot be loaded.
69 NVAPI_NO_IMPLEMENTATION
= -3, // not implemented in current driver installation
70 NVAPI_API_NOT_INITIALIZED
= -4, // NvAPI_Initialize has not been called (successfully)
71 NVAPI_INVALID_ARGUMENT
= -5, // The argument/parameter value is not valid or NULL.
72 NVAPI_NVIDIA_DEVICE_NOT_FOUND
= -6, // No NVIDIA display driver, or NVIDIA GPU driving a display, was found.
73 NVAPI_END_ENUMERATION
= -7, // No more items to enumerate
74 NVAPI_INVALID_HANDLE
= -8, // Invalid handle
75 NVAPI_INCOMPATIBLE_STRUCT_VERSION
= -9, // An argument's structure version is not supported
76 NVAPI_HANDLE_INVALIDATED
= -10, // The handle is no longer valid (likely due to GPU or display re-configuration)
77 NVAPI_OPENGL_CONTEXT_NOT_CURRENT
= -11, // No NVIDIA OpenGL context is current (but needs to be)
78 NVAPI_INVALID_POINTER
= -14, // An invalid pointer, usually NULL, was passed as a parameter
79 NVAPI_NO_GL_EXPERT
= -12, // OpenGL Expert is not supported by the current drivers
80 NVAPI_INSTRUMENTATION_DISABLED
= -13, // OpenGL Expert is supported, but driver instrumentation is currently disabled
81 NVAPI_NO_GL_NSIGHT
= -15, // OpenGL does not support Nsight
83 NVAPI_EXPECTED_LOGICAL_GPU_HANDLE
= -100, // Expected a logical GPU handle for one or more parameters
84 NVAPI_EXPECTED_PHYSICAL_GPU_HANDLE
= -101, // Expected a physical GPU handle for one or more parameters
85 NVAPI_EXPECTED_DISPLAY_HANDLE
= -102, // Expected an NV display handle for one or more parameters
86 NVAPI_INVALID_COMBINATION
= -103, // The combination of parameters is not valid.
87 NVAPI_NOT_SUPPORTED
= -104, // Requested feature is not supported in the selected GPU
88 NVAPI_PORTID_NOT_FOUND
= -105, // No port ID was found for the I2C transaction
89 NVAPI_EXPECTED_UNATTACHED_DISPLAY_HANDLE
= -106, // Expected an unattached display handle as one of the input parameters.
90 NVAPI_INVALID_PERF_LEVEL
= -107, // Invalid perf level
91 NVAPI_DEVICE_BUSY
= -108, // Device is busy; request not fulfilled
92 NVAPI_NV_PERSIST_FILE_NOT_FOUND
= -109, // NV persist file is not found
93 NVAPI_PERSIST_DATA_NOT_FOUND
= -110, // NV persist data is not found
94 NVAPI_EXPECTED_TV_DISPLAY
= -111, // Expected a TV output display
95 NVAPI_EXPECTED_TV_DISPLAY_ON_DCONNECTOR
= -112, // Expected a TV output on the D Connector - HDTV_EIAJ4120.
96 NVAPI_NO_ACTIVE_SLI_TOPOLOGY
= -113, // SLI is not active on this device.
97 NVAPI_SLI_RENDERING_MODE_NOTALLOWED
= -114, // Setup of SLI rendering mode is not possible right now.
98 NVAPI_EXPECTED_DIGITAL_FLAT_PANEL
= -115, // Expected a digital flat panel.
99 NVAPI_ARGUMENT_EXCEED_MAX_SIZE
= -116, // Argument exceeds the expected size.
100 NVAPI_DEVICE_SWITCHING_NOT_ALLOWED
= -117, // Inhibit is ON due to one of the flags in NV_GPU_DISPLAY_CHANGE_INHIBIT or SLI active.
101 NVAPI_TESTING_CLOCKS_NOT_SUPPORTED
= -118, // Testing of clocks is not supported.
102 NVAPI_UNKNOWN_UNDERSCAN_CONFIG
= -119, // The specified underscan config is from an unknown source (e.g. INF)
103 NVAPI_TIMEOUT_RECONFIGURING_GPU_TOPO
= -120, // Timeout while reconfiguring GPUs
104 NVAPI_DATA_NOT_FOUND
= -121, // Requested data was not found
105 NVAPI_EXPECTED_ANALOG_DISPLAY
= -122, // Expected an analog display
106 NVAPI_NO_VIDLINK
= -123, // No SLI video bridge is present
107 NVAPI_REQUIRES_REBOOT
= -124, // NVAPI requires a reboot for the settings to take effect
108 NVAPI_INVALID_HYBRID_MODE
= -125, // The function is not supported with the current Hybrid mode.
109 NVAPI_MIXED_TARGET_TYPES
= -126, // The target types are not all the same
110 NVAPI_SYSWOW64_NOT_SUPPORTED
= -127, // The function is not supported from 32-bit on a 64-bit system.
111 NVAPI_IMPLICIT_SET_GPU_TOPOLOGY_CHANGE_NOT_ALLOWED
= -128, // There is no implicit GPU topology active. Use NVAPI_SetHybridMode to change topology.
112 NVAPI_REQUEST_USER_TO_CLOSE_NON_MIGRATABLE_APPS
= -129, // Prompt the user to close all non-migratable applications.
113 NVAPI_OUT_OF_MEMORY
= -130, // Could not allocate sufficient memory to complete the call.
114 NVAPI_WAS_STILL_DRAWING
= -131, // The previous operation that is transferring information to or from this surface is incomplete.
115 NVAPI_FILE_NOT_FOUND
= -132, // The file was not found.
116 NVAPI_TOO_MANY_UNIQUE_STATE_OBJECTS
= -133, // There are too many unique instances of a particular type of state object.
117 NVAPI_INVALID_CALL
= -134, // The method call is invalid. For example, a method's parameter may not be a valid pointer.
118 NVAPI_D3D10_1_LIBRARY_NOT_FOUND
= -135, // d3d10_1.dll cannot be loaded.
119 NVAPI_FUNCTION_NOT_FOUND
= -136, // Couldn't find the function in the loaded DLL.
120 NVAPI_INVALID_USER_PRIVILEGE
= -137, // Current User is not Admin.
121 NVAPI_EXPECTED_NON_PRIMARY_DISPLAY_HANDLE
= -138, // The handle corresponds to GDIPrimary.
122 NVAPI_EXPECTED_COMPUTE_GPU_HANDLE
= -139, // Setting Physx GPU requires that the GPU is compute-capable.
123 NVAPI_STEREO_NOT_INITIALIZED
= -140, // The Stereo part of NVAPI failed to initialize completely. Check if the stereo driver is installed.
124 NVAPI_STEREO_REGISTRY_ACCESS_FAILED
= -141, // Access to stereo-related registry keys or values has failed.
125 NVAPI_STEREO_REGISTRY_PROFILE_TYPE_NOT_SUPPORTED
= -142, // The given registry profile type is not supported.
126 NVAPI_STEREO_REGISTRY_VALUE_NOT_SUPPORTED
= -143, // The given registry value is not supported.
127 NVAPI_STEREO_NOT_ENABLED
= -144, // Stereo is not enabled and the function needed it to execute completely.
128 NVAPI_STEREO_NOT_TURNED_ON
= -145, // Stereo is not turned on and the function needed it to execute completely.
129 NVAPI_STEREO_INVALID_DEVICE_INTERFACE
= -146, // Invalid device interface.
130 NVAPI_STEREO_PARAMETER_OUT_OF_RANGE
= -147, // Separation percentage or JPEG image capture quality is out of [0-100] range.
131 NVAPI_STEREO_FRUSTUM_ADJUST_MODE_NOT_SUPPORTED
= -148, // The given frustum adjust mode is not supported.
132 NVAPI_TOPO_NOT_POSSIBLE
= -149, // The mosaic topology is not possible given the current state of the hardware.
133 NVAPI_MODE_CHANGE_FAILED
= -150, // An attempt to do a display resolution mode change has failed.
134 NVAPI_D3D11_LIBRARY_NOT_FOUND
= -151, // d3d11.dll/d3d11_beta.dll cannot be loaded.
135 NVAPI_INVALID_ADDRESS
= -152, // Address is outside of valid range.
136 NVAPI_STRING_TOO_SMALL
= -153, // The pre-allocated string is too small to hold the result.
137 NVAPI_MATCHING_DEVICE_NOT_FOUND
= -154, // The input does not match any of the available devices.
138 NVAPI_DRIVER_RUNNING
= -155, // Driver is running.
139 NVAPI_DRIVER_NOTRUNNING
= -156, // Driver is not running.
140 NVAPI_ERROR_DRIVER_RELOAD_REQUIRED
= -157, // A driver reload is required to apply these settings.
141 NVAPI_SET_NOT_ALLOWED
= -158, // Intended setting is not allowed.
142 NVAPI_ADVANCED_DISPLAY_TOPOLOGY_REQUIRED
= -159, // Information can't be returned due to "advanced display topology".
143 NVAPI_SETTING_NOT_FOUND
= -160, // Setting is not found.
144 NVAPI_SETTING_SIZE_TOO_LARGE
= -161, // Setting size is too large.
145 NVAPI_TOO_MANY_SETTINGS_IN_PROFILE
= -162, // There are too many settings for a profile.
146 NVAPI_PROFILE_NOT_FOUND
= -163, // Profile is not found.
147 NVAPI_PROFILE_NAME_IN_USE
= -164, // Profile name is duplicated.
148 NVAPI_PROFILE_NAME_EMPTY
= -165, // Profile name is empty.
149 NVAPI_EXECUTABLE_NOT_FOUND
= -166, // Application not found in the Profile.
150 NVAPI_EXECUTABLE_ALREADY_IN_USE
= -167, // Application already exists in the other profile.
151 NVAPI_DATATYPE_MISMATCH
= -168, // Data Type mismatch
152 NVAPI_PROFILE_REMOVED
= -169, // The profile passed as parameter has been removed and is no longer valid.
153 NVAPI_UNREGISTERED_RESOURCE
= -170, // An unregistered resource was passed as a parameter.
154 NVAPI_ID_OUT_OF_RANGE
= -171, // The DisplayId corresponds to a display which is not within the normal outputId range.
155 NVAPI_DISPLAYCONFIG_VALIDATION_FAILED
= -172, // Display topology is not valid so the driver cannot do a mode set on this configuration.
156 NVAPI_DPMST_CHANGED
= -173, // Display Port Multi-Stream topology has been changed.
157 NVAPI_INSUFFICIENT_BUFFER
= -174, // Input buffer is insufficient to hold the contents.
158 NVAPI_ACCESS_DENIED
= -175, // No access to the caller.
159 NVAPI_MOSAIC_NOT_ACTIVE
= -176, // The requested action cannot be performed without Mosaic being enabled.
160 NVAPI_SHARE_RESOURCE_RELOCATED
= -177, // The surface is relocated away from video memory.
161 NVAPI_REQUEST_USER_TO_DISABLE_DWM
= -178, // The user should disable DWM before calling NvAPI.
162 NVAPI_D3D_DEVICE_LOST
= -179, // D3D device status is D3DERR_DEVICELOST or D3DERR_DEVICENOTRESET - the user has to reset the device.
163 NVAPI_INVALID_CONFIGURATION
= -180, // The requested action cannot be performed in the current state.
164 NVAPI_STEREO_HANDSHAKE_NOT_DONE
= -181, // Call failed as stereo handshake not completed.
165 NVAPI_EXECUTABLE_PATH_IS_AMBIGUOUS
= -182, // The path provided was too short to determine the correct NVDRS_APPLICATION
166 NVAPI_DEFAULT_STEREO_PROFILE_IS_NOT_DEFINED
= -183, // Default stereo profile is not currently defined
167 NVAPI_DEFAULT_STEREO_PROFILE_DOES_NOT_EXIST
= -184, // Default stereo profile does not exist
168 NVAPI_CLUSTER_ALREADY_EXISTS
= -185, // A cluster is already defined with the given configuration.
169 NVAPI_DPMST_DISPLAY_ID_EXPECTED
= -186, // The input display id is not that of a multi stream enabled connector or a display device in a multi stream topology
170 NVAPI_INVALID_DISPLAY_ID
= -187, // The input display id is not valid or the monitor associated to it does not support the current operation
171 NVAPI_STREAM_IS_OUT_OF_SYNC
= -188, // While playing secure audio stream, stream goes out of sync
172 NVAPI_INCOMPATIBLE_AUDIO_DRIVER
= -189, // Older audio driver version than required
173 NVAPI_VALUE_ALREADY_SET
= -190, // Value already set, setting again not allowed.
174 NVAPI_TIMEOUT
= -191, // Requested operation timed out
175 NVAPI_GPU_WORKSTATION_FEATURE_INCOMPLETE
= -192, // The requested workstation feature set has incomplete driver internal allocation resources
176 NVAPI_STEREO_INIT_ACTIVATION_NOT_DONE
= -193, // Call failed because InitActivation was not called.
177 NVAPI_SYNC_NOT_ACTIVE
= -194, // The requested action cannot be performed without Sync being enabled.
178 NVAPI_SYNC_MASTER_NOT_FOUND
= -195, // The requested action cannot be performed without Sync Master being enabled.
179 NVAPI_INVALID_SYNC_TOPOLOGY
= -196, // Invalid displays passed in the NV_GSYNC_DISPLAY pointer.
180 NVAPI_ECID_SIGN_ALGO_UNSUPPORTED
= -197, // The specified signing algorithm is not supported. Either an incorrect value was entered or the current installed driver/hardware does not support the input value.
181 NVAPI_ECID_KEY_VERIFICATION_FAILED
= -198, // The encrypted public key verification has failed.
182 NVAPI_FIRMWARE_OUT_OF_DATE
= -199, // The device's firmware is out of date.
183 NVAPI_FIRMWARE_REVISION_NOT_SUPPORTED
= -200, // The device's firmware is not supported.
187 //! Used in NvAPI_GPU_GetPerfDecreaseInfo.
188 //! Bit masks for knowing the exact reason for performance decrease
189 typedef enum _NVAPI_GPU_PERF_DECREASE
191 NV_GPU_PERF_DECREASE_NONE
= 0, //!< No Slowdown detected
192 NV_GPU_PERF_DECREASE_REASON_THERMAL_PROTECTION
= 0x00000001, //!< Thermal slowdown/shutdown/POR thermal protection
193 NV_GPU_PERF_DECREASE_REASON_POWER_CONTROL
= 0x00000002, //!< Power capping / pstate cap
194 NV_GPU_PERF_DECREASE_REASON_AC_BATT
= 0x00000004, //!< AC->BATT event
195 NV_GPU_PERF_DECREASE_REASON_API_TRIGGERED
= 0x00000008, //!< API triggered slowdown
196 NV_GPU_PERF_DECREASE_REASON_INSUFFICIENT_POWER
= 0x00000010, //!< Power connector missing
197 NV_GPU_PERF_DECREASE_REASON_UNKNOWN
= 0x80000000, //!< Unknown reason
198 } NVAPI_GPU_PERF_DECREASE
;
201 NVAPI_INTERFACE
NvAPI_QueryInterface(uint offset
);
202 NVAPI_INTERFACE
NvAPI_Initialize();
203 NVAPI_INTERFACE
NvAPI_Unload();
204 NVAPI_INTERFACE
NvAPI_GetErrorMessage(NvAPI_Status nr
,NvAPI_ShortString szDesc
);
205 NVAPI_INTERFACE
NvAPI_EnumPhysicalGPUs(NvPhysicalGpuHandle nvGPUHandle
[NVAPI_MAX_PHYSICAL_GPUS
], NvU32
*pGpuCount
);
207 NVAPI_INTERFACE
NvAPI_GPU_GetPerfDecreaseInfo(NvPhysicalGpuHandle hPhysicalGpu
, NvU32
*pPerfDecrInfo
);
209 #ifdef __nvapi_success
211 #undef __nvapi_success
215 * End of declarations from nvapi.h and subheaders
218 // Just annotations (they do nothing special)
230 #define __in_ecount(x)
233 #define __out_ecount(x)
247 #ifndef __inout_ecount
248 #define __inout_ecount(x)
250 #ifndef __inout_ecount_full
251 #define __inout_ecount_full(x)
253 #ifndef __inout_ecount_part_opt
254 #define __inout_ecount_part_opt(x,y)
256 #ifndef __inout_ecount_full_opt
257 #define __inout_ecount_full_opt(x,y)
259 #ifndef __out_ecount_full_opt
260 #define __out_ecount_full_opt(x)
263 typedef NvPhysicalGpuHandle HM_ADAPTER_NVAPI
;
267 typedef int *(*NVAPI_QUERYINTERFACE
) (uint
);
268 typedef int (*NVAPI_INITIALIZE
) (void);
269 typedef int (*NVAPI_UNLOAD
) (void);
270 typedef int (*NVAPI_GETERRORMESSAGE
) (NvAPI_Status
, NvAPI_ShortString
);
271 typedef int (*NVAPI_ENUMPHYSICALGPUS
) (NvPhysicalGpuHandle nvGPUHandle
[NVAPI_MAX_PHYSICAL_GPUS
], NvU32
*);
273 typedef int (*NVAPI_GPU_GETPERFDECREASEINFO
) (NvPhysicalGpuHandle
, NvU32
*);
279 NVAPI_QUERYINTERFACE nvapi_QueryInterface
;
280 NVAPI_INITIALIZE NvAPI_Initialize
;
281 NVAPI_UNLOAD NvAPI_Unload
;
282 NVAPI_GETERRORMESSAGE NvAPI_GetErrorMessage
;
283 NVAPI_ENUMPHYSICALGPUS NvAPI_EnumPhysicalGPUs
;
285 NVAPI_GPU_GETPERFDECREASEINFO NvAPI_GPU_GetPerfDecreaseInfo
;
289 #define NVAPI_PTR hm_nvapi_lib_t
291 int nvapi_init (NVAPI_PTR
*nvapi
);
292 void nvapi_close (NVAPI_PTR
*nvapi
);
294 int hm_NvAPI_QueryInterface (NVAPI_PTR
*nvapi
, uint offset
);
295 int hm_NvAPI_Initialize (NVAPI_PTR
*nvapi
);
296 int hm_NvAPI_Unload (NVAPI_PTR
*nvapi
);
297 int hm_NvAPI_GetErrorMessage (NVAPI_PTR
*nvapi
, NvAPI_Status nr
, NvAPI_ShortString szDesc
);
298 int hm_NvAPI_EnumPhysicalGPUs (NVAPI_PTR
*nvapi
, NvPhysicalGpuHandle nvGPUHandle
[NVAPI_MAX_PHYSICAL_GPUS
], NvU32
*pGpuCount
);
300 int hm_NvAPI_GPU_GetPerfDecreaseInfo (NVAPI_PTR
*nvapi
, NvPhysicalGpuHandle hPhysicalGpu
, NvU32
*pPerfDecrInfo
);
304 #endif // EXT_NVAPI_H