From ae99714241d3c1345fcb641ae0c281b2b1d9e547 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Sun, 26 Feb 2012 14:46:51 -0500 Subject: [PATCH] Use libudev to autodetect BitFORCE GPUs, if available --- Makefile.am | 1 + bitforce.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++--- configure.ac | 27 ++++++++++++++++++++++- 3 files changed, 85 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index 5262d523..d319329c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -22,6 +22,7 @@ bin_SCRIPTS = *.cl cgminer_LDFLAGS = $(PTHREAD_FLAGS) cgminer_LDADD = $(DLOPEN_FLAGS) @LIBCURL_LIBS@ @JANSSON_LIBS@ @PTHREAD_LIBS@ \ @OPENCL_LIBS@ @NCURSES_LIBS@ @PDCURSES_LIBS@ @WS2_LIBS@ \ + @UDEV_LIBS@ \ @MATH_LIBS@ lib/libgnu.a ccan/libccan.a cgminer_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib @OPENCL_FLAGS@ diff --git a/bitforce.c b/bitforce.c index 8dc5b021..96e5bf72 100644 --- a/bitforce.c +++ b/bitforce.c @@ -28,6 +28,12 @@ #endif #include +#include "config.h" + +#ifdef HAVE_LIBUDEV +#include +#endif + #include "elist.h" #include "miner.h" @@ -121,7 +127,43 @@ static bool bitforce_detect_one(const char *devpath) return true; } -static void bitforce_detect_auto() +static bool bitforce_detect_auto_udev() +{ +#ifdef HAVE_LIBUDEV + struct udev *udev = udev_new(); + struct udev_enumerate *enumerate = udev_enumerate_new(udev); + struct udev_list_entry *list_entry; + bool foundany = false; + + udev_enumerate_add_match_subsystem(enumerate, "tty"); + udev_enumerate_add_match_property(enumerate, "ID_MODEL", "BitFORCE*SHA256"); + udev_enumerate_scan_devices(enumerate); + udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(enumerate)) { + struct udev_device *device = udev_device_new_from_syspath( + udev_enumerate_get_udev(enumerate), + udev_list_entry_get_name(list_entry) + ); + if (!device) + continue; + + const char *devpath = udev_device_get_devnode(device); + if (devpath) { + foundany = true; + bitforce_detect_one(devpath); + } + + udev_device_unref(device); + } + udev_enumerate_unref(enumerate); + udev_unref(udev); + + return foundany; +#else + return false; +#endif +} + +static bool bitforce_detect_auto_devserial() { #ifndef WIN32 DIR *D; @@ -129,22 +171,35 @@ static void bitforce_detect_auto() const char udevdir[] = "/dev/serial/by-id"; char devpath[sizeof(udevdir) + 1 + NAME_MAX]; char *devfile = devpath + sizeof(udevdir); - + bool foundany = false; + D = opendir(udevdir); if (!D) - return; + return false; memcpy(devpath, udevdir, sizeof(udevdir) - 1); devpath[sizeof(udevdir) - 1] = '/'; while ( (de = readdir(D)) ) { if (!strstr(de->d_name, "BitFORCE_SHA256")) continue; + foundany = true; strcpy(devfile, de->d_name); bitforce_detect_one(devpath); } closedir(D); + + return foundany; +#else + return false; #endif } +static void bitforce_detect_auto() +{ + bitforce_detect_auto_udev() ?: + bitforce_detect_auto_devserial() ?: + 0; +} + static void bitforce_detect() { struct string_elist *iter, *tmp; diff --git a/configure.ac b/configure.ac index 67847c7c..f505383a 100644 --- a/configure.ac +++ b/configure.ac @@ -260,6 +260,26 @@ fi AM_CONDITIONAL([HAS_YASM], [test x$has_yasm = xtrue]) +if test "x$bitforce" != xno; then + AC_ARG_WITH([libudev], [AC_HELP_STRING([--with-libudev], [Autodetect FPGAs using libudev])], + [libudev=$enableval], + [libudev=auto] + ) + if test "x$libudev" != "xno"; then + AC_CHECK_LIB([udev], [udev_device_get_devnode], [ + libudev=yes + UDEV_LIBS=-ludev + AC_DEFINE([HAVE_LIBUDEV], [1], [Defined to 1 if libudev is wanted]) + ], [ + if test "x$libudev" = "xyes"; then + AC_MSG_ERROR([libudev not found]) + fi + libudev=no + ]) + fi +fi +AM_CONDITIONAL([HAVE_LIBUDEV], [test x$libudev != xno]) + PKG_PROG_PKG_CONFIG() PKG_CHECK_MODULES([LIBCURL], [libcurl >= 7.15.6], [AC_DEFINE([CURL_HAS_SOCKOPT], [1], [Defined if version of curl supports sockopts.])], @@ -320,6 +340,7 @@ AC_SUBST(NCURSES_LIBS) AC_SUBST(PDCURSES_LIBS) AC_SUBST(WS2_LIBS) AC_SUBST(MATH_LIBS) +AC_SUBST(UDEV_LIBS) AC_CONFIG_FILES([ Makefile @@ -383,6 +404,10 @@ else echo " Icarus.FPGAs.........: Disabled" fi +if test "x$bitforce" != xno; then + echo " libudev.detection....: $libudev" +fi + echo if test "x$cpumining" = xyes; then echo " CPU Mining...........: Enabled" @@ -396,7 +421,7 @@ echo "Compilation............: make (or gmake)" echo " CPPFLAGS.............: $CPPFLAGS" echo " CFLAGS...............: $CFLAGS" echo " LDFLAGS..............: $LDFLAGS $PTHREAD_FLAGS" -echo " LDADD................: $DLOPEN_FLAGS $LIBCURL_LIBS $JANSSON_LIBS $PTHREAD_LIBS $OPENCL_LIBS $NCURSES_LIBS $PDCURSES_LIBS $WS2_LIBS $MATH_LIBS" +echo " LDADD................: $DLOPEN_FLAGS $LIBCURL_LIBS $JANSSON_LIBS $PTHREAD_LIBS $OPENCL_LIBS $NCURSES_LIBS $PDCURSES_LIBS $WS2_LIBS $MATH_LIBS $UDEV_LIBS" echo echo "Installation...........: make install (as root if needed, with 'su' or 'sudo')" echo " prefix...............: $prefix"