Commit 6d7471237dd8bbc2666e9bf3a9dc45e00097ebc9

ckolivas 2013-09-28T15:11:06

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.

diff --git a/cgminer.c b/cgminer.c
index 6fad18e..9f39a7e 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -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();
-	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:");
diff --git a/driver-avalon.c b/driver-avalon.c
index d6cd71d..6abdaeb 100644
--- a/driver-avalon.c
+++ b/driver-avalon.c
@@ -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);
 }
diff --git a/driver-bflsc.c b/driver-bflsc.c
index 5ace03d..bebed38 100644
--- a/driver-bflsc.c
+++ b/driver-bflsc.c
@@ -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);
 }
diff --git a/driver-bitforce.c b/driver-bitforce.c
index f28dc1e..6cd0d52 100644
--- a/driver-bitforce.c
+++ b/driver-bitforce.c
@@ -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);
 }
diff --git a/driver-bitfury.c b/driver-bitfury.c
index 0d72b91..9708fe6 100644
--- a/driver-bitfury.c
+++ b/driver-bitfury.c
@@ -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);
 }
diff --git a/driver-icarus.c b/driver-icarus.c
index 0773ad5..a42988b 100644
--- a/driver-icarus.c
+++ b/driver-icarus.c
@@ -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);
 }
diff --git a/driver-modminer.c b/driver-modminer.c
index 3a80986..0672c99 100644
--- a/driver-modminer.c
+++ b/driver-modminer.c
@@ -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);
 }
diff --git a/driver-opencl.c b/driver-opencl.c
index b6ad37d..d7b663a 100644
--- a/driver-opencl.c
+++ b/driver-opencl.c
@@ -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");
diff --git a/driver-ztex.c b/driver-ztex.c
index f806717..ee0c0a9 100644
--- a/driver-ztex.c
+++ b/driver-ztex.c
@@ -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;
diff --git a/miner.h b/miner.h
index 1dddf3d..be92b83 100644
--- a/miner.h
+++ b/miner.h
@@ -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;