Skip to content

Commit

Permalink
Use macro expansion to iterate over all device drivers without needin…
Browse files Browse the repository at this point in the history
…g to explicitly code in support in all places. Pass a hotplug bool to the detect() function to prevent opencl trying to hogplug GPUs.
  • Loading branch information
ckolivas committed Sep 28, 2013
1 parent 741b743 commit 6d74712
Show file tree
Hide file tree
Showing 10 changed files with 35 additions and 82 deletions.
94 changes: 22 additions & 72 deletions cgminer.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -7883,48 +7861,20 @@ int main(int argc, char *argv[])
}
#endif

#ifdef HAVE_OPENCL
if (!opt_nogpu)
opencl_drv.drv_detect();
gpu_threads = 0;
#endif
/* 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

#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_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;

if (opt_display_devs) {
applog(LOG_ERR, "Devices detected:");
Expand Down
2 changes: 1 addition & 1 deletion driver-avalon.c
Original file line number Diff line number Diff line change
Expand Up @@ -799,7 +799,7 @@ static bool avalon_detect_one(libusb_device *dev, struct usb_find_devices *found
return false;
}

static void avalon_detect(void)
static void avalon_detect(bool __maybe_unused hotplug)
{
usb_detect(&avalon_drv, avalon_detect_one);
}
Expand Down
2 changes: 1 addition & 1 deletion driver-bflsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -893,7 +893,7 @@ static bool bflsc_detect_one(struct libusb_device *dev, struct usb_find_devices
return false;
}

static void bflsc_detect(void)
static void bflsc_detect(bool __maybe_unused hotplug)
{
usb_detect(&bflsc_drv, bflsc_detect_one);
}
Expand Down
2 changes: 1 addition & 1 deletion driver-bitforce.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ static bool bitforce_detect_one(struct libusb_device *dev, struct usb_find_devic
return false;
}

static void bitforce_detect(void)
static void bitforce_detect(bool __maybe_unused hotplug)
{
usb_detect(&bitforce_drv, bitforce_detect_one);
}
Expand Down
2 changes: 1 addition & 1 deletion driver-bitfury.c
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ static bool bitfury_detect_one(struct libusb_device *dev, struct usb_find_device
return false;
}

static void bitfury_detect(void)
static void bitfury_detect(bool __maybe_unused hotplug)
{
usb_detect(&bitfury_drv, bitfury_detect_one);
}
Expand Down
2 changes: 1 addition & 1 deletion driver-icarus.c
Original file line number Diff line number Diff line change
Expand Up @@ -926,7 +926,7 @@ static bool icarus_detect_one(struct libusb_device *dev, struct usb_find_devices
return false;
}

static void icarus_detect()
static void icarus_detect(bool __maybe_unused hotplug)
{
usb_detect(&icarus_drv, icarus_detect_one);
}
Expand Down
2 changes: 1 addition & 1 deletion driver-modminer.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ static bool modminer_detect_one(struct libusb_device *dev, struct usb_find_devic
return false;
}

static void modminer_detect()
static void modminer_detect(bool __maybe_unused hotplug)
{
usb_detect(&modminer_drv, modminer_detect_one);
}
Expand Down
6 changes: 4 additions & 2 deletions driver-opencl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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");
Expand Down
2 changes: 1 addition & 1 deletion driver-ztex.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion miner.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 6d74712

Please sign in to comment.