- Return 0 if no AMD/Ati gpus or cannot get information.
-*/
-static int init()
-{
- LPAdapterInfo lpadapterinfo = NULL;
- int i, inumberadapters, inumberadaptersactive = 0;
- int lpstatus, iadapterindex;
-
- hdll = NULL;
- adl_main_control_done = 0;
- active_amd_adapters = NULL;
- hdll = dlopen("libatiadlxx.so", RTLD_LAZY|RTLD_GLOBAL);
-
-
- if (!hdll) {
- fprintf(stderr,
- _("ERROR: ADL library not found!\n"));
- return 0;
- }
-
- adl_main_control_create = (ADL_MAIN_CONTROL_CREATE)
- getprocaddress(hdll, "ADL_Main_Control_Create");
- adl_main_control_destroy = (ADL_MAIN_CONTROL_DESTROY)
- getprocaddress(hdll, "ADL_Main_Control_Destroy");
- adl_adapter_numberofadapters_get = (ADL_ADAPTER_NUMBEROFADAPTERS_GET)
- getprocaddress(hdll, "ADL_Adapter_NumberOfAdapters_Get");
- adl_adapter_adapterinfo_get = (ADL_ADAPTER_ADAPTERINFO_GET)
- getprocaddress(hdll, "ADL_Adapter_AdapterInfo_Get");
- adl_adapter_active_get = (ADL_ADAPTER_ACTIVE_GET)
- getprocaddress(hdll, "ADL_Adapter_Active_Get");
- adl_overdrive5_temperature_get = (ADL_OVERDRIVE5_TEMPERATURE_GET)
- getprocaddress(hdll, "ADL_Overdrive5_Temperature_Get");
- adl_overdrive5_fanspeed_get = (ADL_OVERDRIVE5_FANSPEED_GET)
- getprocaddress(hdll, "ADL_Overdrive5_FanSpeed_Get");
- if (!adl_main_control_create ||
- !adl_main_control_destroy ||
- !adl_adapter_numberofadapters_get ||
- !adl_adapter_adapterinfo_get ||
- !adl_overdrive5_temperature_get ||
- !adl_overdrive5_fanspeed_get) {
- fprintf(stderr,
- _("ERROR: ADL's API is missing!\n"));
- return 0;
- }
-
- /* Initialize ADL. The second parameter is 1, which means:
- retrieve adapter information only for adapters that
- are physically present and enabled in the system */
- if (ADL_OK != adl_main_control_create(adl_main_memory_alloc, 1)) {
- fprintf(stderr,
- _("ERROR: ADL Initialization Error!\n"));
- return 0;
- }
- adl_main_control_done = 1;
-
- /* Obtain the number of adapters for the system */
- if (ADL_OK != adl_adapter_numberofadapters_get(&inumberadapters)) {
- fprintf(stderr,
- _("ERROR: Cannot get the number of adapters!\n"));
- return 0;
- }
-
- if (!inumberadapters)
- return 0;
-
- lpadapterinfo = malloc(sizeof(AdapterInfo) * inumberadapters);
- memset(lpadapterinfo, '\0', sizeof(AdapterInfo) * inumberadapters);
-
- /* Get the AdapterInfo structure for all adapters in the system */
- adl_adapter_adapterinfo_get(lpadapterinfo,
- sizeof(AdapterInfo) * inumberadapters);
-
- /* Repeat for all available adapters in the system */
- for (i = 0; i < inumberadapters; i++) {
- iadapterindex = lpadapterinfo[i].iAdapterIndex;
- if (ADL_OK != adl_adapter_active_get(iadapterindex, &lpstatus))
- continue;
- if (lpstatus != ADL_TRUE)
- /* count only if the adapter is active */
- continue;
-
- if (!active_amd_adapters) {
- active_amd_adapters = (int *) malloc(sizeof(int));
- inumberadaptersactive = 1;
- } else {
- ++inumberadaptersactive;
- active_amd_adapters =
- (int *) realloc(active_amd_adapters,
- sizeof(int)*inumberadaptersactive);
- }
- active_amd_adapters[inumberadaptersactive-1] = iadapterindex;
- }
-
- adl_main_memory_free((void **) &lpadapterinfo);