2 * Authors.....: Jens Steube <jens.steube@gmail.com>
6 #include <ext_xnvctrl.h>
8 int xnvctrl_init (XNVCTRL_PTR
*xnvctrl
)
10 if (!xnvctrl
) return (-1);
12 memset (xnvctrl
, 0, sizeof (XNVCTRL_PTR
));
16 // unsupport platform?
21 xnvctrl
->lib_x11
= dlopen ("libX11.so", RTLD_LAZY
);
23 if (xnvctrl
->lib_x11
== NULL
)
25 if (data
.quiet
== 0) log_info ("WARNING: load X11 library failed, proceed without X11 HWMon enabled.");
30 xnvctrl
->lib_xnvctrl
= dlopen ("libXNVCtrl.so", RTLD_LAZY
);
32 if (xnvctrl
->lib_xnvctrl
== NULL
)
34 xnvctrl
->lib_xnvctrl
= dlopen ("libXNVCtrl.so.0", RTLD_LAZY
);
36 if (xnvctrl
->lib_xnvctrl
== NULL
)
38 if (data
.quiet
== 0) log_info ("WARNING: load XNVCTRL library failed, proceed without XNVCTRL HWMon enabled.");
44 xnvctrl
->XOpenDisplay
= dlsym (xnvctrl
->lib_x11
, "XOpenDisplay");
45 xnvctrl
->XCloseDisplay
= dlsym (xnvctrl
->lib_x11
, "XCloseDisplay");
47 xnvctrl
->XNVCTRLQueryTargetAttribute
= dlsym (xnvctrl
->lib_xnvctrl
, "XNVCTRLQueryTargetAttribute");
48 xnvctrl
->XNVCTRLSetTargetAttribute
= dlsym (xnvctrl
->lib_xnvctrl
, "XNVCTRLSetTargetAttribute");
52 // not using HC_LOAD_FUNC() here, because we're using 2 libraries and therefore have 2 different variable names for them
57 void xnvctrl_close (XNVCTRL_PTR
*xnvctrl
)
65 dlclose (xnvctrl
->lib_x11
);
68 if (xnvctrl
->lib_xnvctrl
)
70 dlclose (xnvctrl
->lib_xnvctrl
);
79 int hm_XNVCTRL_XOpenDisplay (XNVCTRL_PTR
*xnvctrl
)
81 void *dpy
= xnvctrl
->XOpenDisplay (NULL
);
95 void hm_XNVCTRL_XCloseDisplay (XNVCTRL_PTR
*xnvctrl
)
97 if (xnvctrl
->dpy
== NULL
) return;
99 xnvctrl
->XCloseDisplay (xnvctrl
->dpy
);
102 int get_fan_control (XNVCTRL_PTR
*xnvctrl
, int gpu
, int *val
)
104 if (xnvctrl
->dpy
== NULL
) return -1;
106 int rc
= xnvctrl
->XNVCTRLQueryTargetAttribute (xnvctrl
->dpy
, NV_CTRL_TARGET_TYPE_GPU
, gpu
, 0, NV_CTRL_GPU_COOLER_MANUAL_CONTROL
, val
);
113 int set_fan_control (XNVCTRL_PTR
*xnvctrl
, int gpu
, int val
)
115 if (xnvctrl
->dpy
== NULL
) return -1;
119 int rc
= get_fan_control (xnvctrl
, gpu
, &cur
);
121 if (rc
== -1) return -1;
123 xnvctrl
->XNVCTRLSetTargetAttribute (xnvctrl
->dpy
, NV_CTRL_TARGET_TYPE_GPU
, gpu
, 0, NV_CTRL_GPU_COOLER_MANUAL_CONTROL
, val
);
125 rc
= get_fan_control (xnvctrl
, gpu
, &cur
);
127 if (rc
== -1) return -1;
129 if (cur
!= val
) return -1;
134 int get_core_threshold (XNVCTRL_PTR
*xnvctrl
, int gpu
, int *val
)
136 if (xnvctrl
->dpy
== NULL
) return -1;
138 int rc
= xnvctrl
->XNVCTRLQueryTargetAttribute (xnvctrl
->dpy
, NV_CTRL_TARGET_TYPE_GPU
, gpu
, 0, NV_CTRL_GPU_CORE_THRESHOLD
, val
);
145 int get_fan_speed_current (XNVCTRL_PTR
*xnvctrl
, int gpu
, int *val
)
147 if (xnvctrl
->dpy
== NULL
) return -1;
149 int rc
= xnvctrl
->XNVCTRLQueryTargetAttribute (xnvctrl
->dpy
, NV_CTRL_TARGET_TYPE_COOLER
, gpu
, 0, NV_CTRL_THERMAL_COOLER_CURRENT_LEVEL
, val
);
156 int get_fan_speed_target (XNVCTRL_PTR
*xnvctrl
, int gpu
, int *val
)
158 if (xnvctrl
->dpy
== NULL
) return -1;
160 int rc
= xnvctrl
->XNVCTRLQueryTargetAttribute (xnvctrl
->dpy
, NV_CTRL_TARGET_TYPE_COOLER
, gpu
, 0, NV_CTRL_THERMAL_COOLER_LEVEL
, val
);
167 int set_fan_speed_target (XNVCTRL_PTR
*xnvctrl
, int gpu
, int val
)
169 if (xnvctrl
->dpy
== NULL
) return -1;
173 int rc
= get_fan_speed_target (xnvctrl
, gpu
, &cur
);
175 if (rc
== -1) return -1;
177 xnvctrl
->XNVCTRLSetTargetAttribute (xnvctrl
->dpy
, NV_CTRL_TARGET_TYPE_COOLER
, gpu
, 0, NV_CTRL_THERMAL_COOLER_LEVEL
, val
);
179 rc
= get_fan_speed_target (xnvctrl
, gpu
, &cur
);
181 if (rc
== -1) return -1;
183 if (cur
!= val
) return -1;