1
0
mirror of https://github.com/GOSTSec/sgminer synced 2025-01-14 00:38:02 +00:00

Use macro expansion to iterate over all device drivers without needing to explicitly code in support in all places. Pass a hotplug bool to the detect() function to prevent opencl trying to hogplug GPUs.

This commit is contained in:
ckolivas 2013-09-28 15:11:06 +10:00
parent 741b74309e
commit 6d7471237d
10 changed files with 35 additions and 82 deletions

View File

@ -119,7 +119,7 @@ bool opt_scrypt;
#endif
#endif
bool opt_restart = true;
static bool opt_nogpu;
bool opt_nogpu;
struct list_head scan_devices;
static bool devices_enabled[MAX_DEVICES];
@ -7434,19 +7434,17 @@ static void noop_thread_enable(struct thr_info __maybe_unused *thr)
{
}
static void noop_null(void)
static void noop_detect(bool __maybe_unused hotplug)
{
}
#define noop_flush_work noop_reinit_device
#define noop_queue_full noop_get_stats
/* Fill missing driver drv functions with noops */
void fill_device_drv(struct cgpu_info *cgpu)
void fill_device_drv(struct device_drv *drv)
{
struct device_drv *drv = cgpu->drv;
if (!drv->drv_detect)
drv->drv_detect = &noop_null;
drv->drv_detect = &noop_detect;
if (!drv->reinit_device)
drv->reinit_device = &noop_reinit_device;
if (!drv->get_statline_before)
@ -7544,8 +7542,6 @@ bool add_cgpu(struct cgpu_info *cgpu)
cgpu->last_device_valid_work = time(NULL);
mutex_unlock(&stats_lock);
fill_device_drv(cgpu);
if (hotplug_mode)
devices[total_devices + new_devices++] = cgpu;
else
@ -7655,29 +7651,11 @@ static void *hotplug_thread(void __maybe_unused *userdata)
new_devices = 0;
new_threads = 0;
#ifdef USE_ICARUS
icarus_drv.drv_detect();
#endif
#ifdef USE_BFLSC
bflsc_drv.drv_detect();
#endif
#ifdef USE_BITFORCE
bitforce_drv.drv_detect();
#endif
#ifdef USE_BITFURY
bitfury_drv.drv_detect();
#endif
#ifdef USE_MODMINER
modminer_drv.drv_detect();
#endif
#ifdef USE_AVALON
avalon_drv.drv_detect();
#endif
/* Use the DRIVER_PARSE_COMMANDS macro to detect all
* devices */
#define DRIVER_ADD_COMMAND(X) X##_drv.drv_detect(true);
DRIVER_PARSE_COMMANDS
#undef DRIVER_ADD_COMMAND
if (new_devices)
hotplug_process();
@ -7883,48 +7861,20 @@ int main(int argc, char *argv[])
}
#endif
#ifdef HAVE_OPENCL
if (!opt_nogpu)
opencl_drv.drv_detect();
/* Use the DRIVER_PARSE_COMMANDS macro to fill all the device_drvs */
#define DRIVER_ADD_COMMAND(X) fill_device_drv(&X##_drv);
DRIVER_PARSE_COMMANDS
#undef DRIVER_ADD_COMMAND
if (opt_scrypt)
opencl_drv.drv_detect(false);
else {
/* Use the DRIVER_PARSE_COMMANDS macro to detect all devices */
#define DRIVER_ADD_COMMAND(X) X##_drv.drv_detect(false);
DRIVER_PARSE_COMMANDS
#undef DRIVER_ADD_COMMAND
}
gpu_threads = 0;
#endif
#ifdef USE_ICARUS
if (!opt_scrypt)
icarus_drv.drv_detect();
#endif
#ifdef USE_BFLSC
if (!opt_scrypt)
bflsc_drv.drv_detect();
#endif
#ifdef USE_BITFORCE
if (!opt_scrypt)
bitforce_drv.drv_detect();
#endif
#ifdef USE_BITFURY
if (!opt_scrypt)
bitfury_drv.drv_detect();
#endif
#ifdef USE_MODMINER
if (!opt_scrypt)
modminer_drv.drv_detect();
#endif
#ifdef USE_ZTEX
if (!opt_scrypt)
ztex_drv.drv_detect();
#endif
/* Detect avalon last since it will try to claim the device regardless
* as detection is unreliable. */
#ifdef USE_AVALON
if (!opt_scrypt)
avalon_drv.drv_detect();
#endif
if (opt_display_devs) {
applog(LOG_ERR, "Devices detected:");

View File

@ -799,7 +799,7 @@ shin:
return false;
}
static void avalon_detect(void)
static void avalon_detect(bool __maybe_unused hotplug)
{
usb_detect(&avalon_drv, avalon_detect_one);
}

View File

@ -893,7 +893,7 @@ shin:
return false;
}
static void bflsc_detect(void)
static void bflsc_detect(bool __maybe_unused hotplug)
{
usb_detect(&bflsc_drv, bflsc_detect_one);
}

View File

@ -288,7 +288,7 @@ shin:
return false;
}
static void bitforce_detect(void)
static void bitforce_detect(bool __maybe_unused hotplug)
{
usb_detect(&bitforce_drv, bitforce_detect_one);
}

View File

@ -150,7 +150,7 @@ out:
return false;
}
static void bitfury_detect(void)
static void bitfury_detect(bool __maybe_unused hotplug)
{
usb_detect(&bitfury_drv, bitfury_detect_one);
}

View File

@ -926,7 +926,7 @@ shin:
return false;
}
static void icarus_detect()
static void icarus_detect(bool __maybe_unused hotplug)
{
usb_detect(&icarus_drv, icarus_detect_one);
}

View File

@ -237,7 +237,7 @@ shin:
return false;
}
static void modminer_detect()
static void modminer_detect(bool __maybe_unused hotplug)
{
usb_detect(&modminer_drv, modminer_detect_one);
}

View File

@ -581,7 +581,7 @@ char *set_intensity(char *arg)
void print_ndevs(int *ndevs)
{
opt_log_output = true;
opencl_drv.drv_detect();
opencl_drv.drv_detect(false);
clear_adl(*ndevs);
applog(LOG_INFO, "%i GPU devices max detected", *ndevs);
}
@ -1227,10 +1227,12 @@ void *reinit_gpu(__maybe_unused void *userdata)
#ifdef HAVE_OPENCL
static void opencl_detect()
static void opencl_detect(bool hotplug)
{
int i;
if (opt_nogpu || hotplug)
return;
nDevs = clDevicesNum();
if (nDevs < 0) {
applog(LOG_ERR, "clDevicesNum returned error, no GPUs usable");

View File

@ -52,7 +52,7 @@ static void ztex_releaseFpga(struct libztex_device* ztex)
}
}
static void ztex_detect(void)
static void ztex_detect(bool __maybe_unused hotplug)
{
int cnt;
int i,j;

View File

@ -329,7 +329,7 @@ struct device_drv {
char *name;
// DRV-global functions
void (*drv_detect)();
void (*drv_detect)(bool);
// Device-specific functions
void (*reinit_device)(struct cgpu_info *);
@ -914,6 +914,7 @@ extern bool opt_api_listen;
extern bool opt_api_network;
extern bool opt_delaynet;
extern bool opt_restart;
extern bool opt_nogpu;
extern char *opt_icarus_options;
extern char *opt_icarus_timing;
extern bool opt_worktime;