Browse Source

fpgautils: Abstract open_xilinx_bitstream out from modminer and x6500 drivers

Luke Dashjr 13 years ago
parent
commit
b1c23f6476
4 changed files with 96 additions and 83 deletions
  1. 4 42
      driver-modminer.c
  2. 5 41
      driver-x6500.c
  3. 85 0
      fpgautils.c
  4. 2 0
      fpgautils.h

+ 4 - 42
driver-modminer.c

@@ -189,53 +189,15 @@ static bool
 modminer_fpga_upload_bitstream(struct cgpu_info*modminer)
 modminer_fpga_upload_bitstream(struct cgpu_info*modminer)
 {
 {
 	struct modminer_fpga_state *state = modminer->thr[0]->cgpu_data;
 	struct modminer_fpga_state *state = modminer->thr[0]->cgpu_data;
-fd_set fds;
 	char buf[0x100];
 	char buf[0x100];
-	unsigned char *ubuf = (unsigned char*)buf;
 	unsigned long len, flen;
 	unsigned long len, flen;
-	char *p;
-	const char *fwfile = BITSTREAM_FILENAME;
 	char fpgaid = 4;  // "all FPGAs"
 	char fpgaid = 4;  // "all FPGAs"
-
-	FILE *f = open_bitstream("modminer", fwfile);
+fd_set fds;
+	FILE *f = open_xilinx_bitstream(modminer, BITSTREAM_FILENAME, &len);
 	if (!f)
 	if (!f)
-		bailout(LOG_ERR, "Error opening ModMiner firmware file %s", fwfile);
-	if (1 != fread(buf, 2, 1, f))
-		bailout(LOG_ERR, "Error reading ModMiner firmware (magic)");
-	if (buf[0] || buf[1] != 9)
-		bailout(LOG_ERR, "ModMiner firmware has wrong magic (9)");
-	if (-1 == fseek(f, 11, SEEK_CUR))
-		bailout(LOG_ERR, "ModMiner firmware seek failed");
-	check_magic('a');
-	read_str("design name");
-	applog(LOG_DEBUG, "ModMiner firmware file %s info:", fwfile);
-	applog(LOG_DEBUG, "  Design name: %s", buf);
-	p = strrchr(buf, ';') ?: buf;
-	p = strrchr(buf, '=') ?: p;
-	if (p[0] == '=')
-		++p;
-	unsigned long fwusercode = (unsigned long)strtoll(p, &p, 16);
-	if (p[0] != '\0')
-		bailout(LOG_ERR, "Bad usercode in ModMiner firmware file");
-	if (fwusercode == 0xffffffff)
-		bailout(LOG_ERR, "ModMiner firmware doesn't support user code");
-	applog(LOG_DEBUG, "  Version: %u, build %u", (fwusercode >> 8) & 0xff, fwusercode & 0xff);
-	check_magic('b');
-	read_str("part number");
-	applog(LOG_DEBUG, "  Part number: %s", buf);
-	check_magic('c');
-	read_str("build date");
-	applog(LOG_DEBUG, "  Build date: %s", buf);
-	check_magic('d');
-	read_str("build time");
-	applog(LOG_DEBUG, "  Build time: %s", buf);
-	check_magic('e');
-	if (1 != fread(buf, 4, 1, f))
-		bailout(LOG_ERR, "Error reading ModMiner firmware (data len)");
-	len = ((unsigned long)ubuf[0] << 24) | ((unsigned long)ubuf[1] << 16) | (ubuf[2] << 8) | ubuf[3];
-	flen = len;
-	applog(LOG_DEBUG, "  Bitstream size: %lu", len);
+		return false;
 
 
+	flen = len;
 	int fd = modminer->device_fd;
 	int fd = modminer->device_fd;
 
 
 	applog(LOG_WARNING, "%s %u: Programming %s... DO NOT EXIT UNTIL COMPLETE", modminer->api->name, modminer->device_id, modminer->device_path);
 	applog(LOG_WARNING, "%s %u: Programming %s... DO NOT EXIT UNTIL COMPLETE", modminer->api->name, modminer->device_id, modminer->device_path);

+ 5 - 41
driver-x6500.c

@@ -103,54 +103,18 @@ struct x6500_fpga_data {
 static bool
 static bool
 x6500_fpga_upload_bitstream(struct cgpu_info *x6500, struct ft232r_device_handle *ftdi)
 x6500_fpga_upload_bitstream(struct cgpu_info *x6500, struct ft232r_device_handle *ftdi)
 {
 {
-	struct x6500_fpga_data *state = x6500->thr[0]->cgpu_data;
 	char buf[0x100];
 	char buf[0x100];
-	unsigned char *ubuf = (unsigned char*)buf;
 	unsigned long len, flen;
 	unsigned long len, flen;
-	char *p;
-	const char *fwfile = X6500_BITSTREAM_FILENAME;
 	char *pdone = (char*)&x6500->cgpu_data;
 	char *pdone = (char*)&x6500->cgpu_data;
 
 
-	FILE *f = open_bitstream("x6500", fwfile);
+	FILE *f = open_xilinx_bitstream(x6500, X6500_BITSTREAM_FILENAME, &len);
 	if (!f)
 	if (!f)
-		bailout(LOG_ERR, "Error opening X6500 firmware file %s", fwfile);
-	if (1 != fread(buf, 2, 1, f))
-		bailout(LOG_ERR, "Error reading X6500 firmware (magic)");
-	if (buf[0] || buf[1] != 9)
-		bailout(LOG_ERR, "X6500 firmware has wrong magic (9)");
-	if (-1 == fseek(f, 11, SEEK_CUR))
-		bailout(LOG_ERR, "X6500 firmware seek failed");
-	check_magic('a');
-	read_str("design name");
-	applog(LOG_DEBUG, "X6500 firmware file %s info:", fwfile);
-	applog(LOG_DEBUG, "  Design name: %s", buf);
-	p = strrchr(buf, ';') ?: buf;
-	p = strrchr(buf, '=') ?: p;
-	if (p[0] == '=')
-		++p;
-	unsigned long fwusercode = (unsigned long)strtoll(p, &p, 16);
-	if (p[0] != '\0')
-		bailout(LOG_ERR, "Bad usercode in X6500 firmware file");
-	if (fwusercode == 0xffffffff)
-		bailout(LOG_ERR, "X6500 firmware doesn't support user code");
-	applog(LOG_DEBUG, "  Version: %u, build %u", (fwusercode >> 8) & 0xff, fwusercode & 0xff);
-	check_magic('b');
-	read_str("part number");
-	applog(LOG_DEBUG, "  Part number: %s", buf);
-	check_magic('c');
-	read_str("build date");
-	applog(LOG_DEBUG, "  Build date: %s", buf);
-	check_magic('d');
-	read_str("build time");
-	applog(LOG_DEBUG, "  Build time: %s", buf);
-	check_magic('e');
-	if (1 != fread(buf, 4, 1, f))
-		bailout(LOG_ERR, "Error reading X6500 firmware (data len)");
-	len = ((unsigned long)ubuf[0] << 24) | ((unsigned long)ubuf[1] << 16) | (ubuf[2] << 8) | ubuf[3];
+		return false;
+
 	flen = len;
 	flen = len;
-	applog(LOG_DEBUG, "  Bitstream size: %lu", len);
 
 
-	applog(LOG_WARNING, "%s %u: Programming %s... DO NOT EXIT UNTIL COMPLETE", x6500->api->name, x6500->device_id, x6500->device_path);
+	applog(LOG_WARNING, "%s %u: Programming %s...",
+	       x6500->api->name, x6500->device_id, x6500->device_path);
 	
 	
 	uint8_t dummyx;
 	uint8_t dummyx;
 	struct jtag_port jpt = {
 	struct jtag_port jpt = {

+ 85 - 0
fpgautils.c

@@ -648,3 +648,88 @@ FILE *open_bitstream(const char *dname, const char *filename)
 
 
 	return NULL;
 	return NULL;
 }
 }
+
+#define bailout(...)  do {  \
+	applog(__VA_ARGS__);  \
+	return NULL;  \
+} while(0)
+
+#define check_magic(L)  do {  \
+	if (1 != fread(buf, 1, 1, f))  \
+		bailout(LOG_ERR, "%s %u: Error reading firmware ('%c')",  \
+		        cgpu->api->name, cgpu->device_id, L);  \
+	if (buf[0] != L)  \
+		bailout(LOG_ERR, "%s %u: Firmware has wrong magic ('%c')",  \
+		        cgpu->api->name, cgpu->device_id, L);  \
+} while(0)
+
+#define read_str(eng)  do {  \
+	if (1 != fread(buf, 2, 1, f))  \
+		bailout(LOG_ERR, "%s %u: Error reading firmware (" eng " len)",  \
+		        cgpu->api->name, cgpu->device_id);  \
+	len = (ubuf[0] << 8) | ubuf[1];  \
+	if (len >= sizeof(buf))  \
+		bailout(LOG_ERR, "%s %u: Firmware " eng " too long",  \
+		        cgpu->api->name, cgpu->device_id);  \
+	if (1 != fread(buf, len, 1, f))  \
+		bailout(LOG_ERR, "%s %u: Error reading firmware (" eng ")",  \
+		        cgpu->api->name, cgpu->device_id);  \
+	buf[len] = '\0';  \
+} while(0)
+
+FILE *open_xilinx_bitstream(struct cgpu_info *cgpu, const char *fwfile, unsigned long *out_len)
+{
+	char buf[0x100];
+	unsigned char *ubuf = (unsigned char*)buf;
+	unsigned long len;
+	char *p;
+
+	FILE *f = open_bitstream(cgpu->api->dname, fwfile);
+	if (!f)
+		bailout(LOG_ERR, "%s %u: Error opening firmware file %s",
+		        cgpu->api->name, cgpu->device_id, fwfile);
+	if (1 != fread(buf, 2, 1, f))
+		bailout(LOG_ERR, "%s %u: Error reading firmware (magic)",
+		        cgpu->api->name, cgpu->device_id);
+	if (buf[0] || buf[1] != 9)
+		bailout(LOG_ERR, "%s %u: Firmware has wrong magic (9)",
+		        cgpu->api->name, cgpu->device_id);
+	if (-1 == fseek(f, 11, SEEK_CUR))
+		bailout(LOG_ERR, "%s %u: Firmware seek failed",
+		        cgpu->api->name, cgpu->device_id);
+	check_magic('a');
+	read_str("design name");
+	applog(LOG_DEBUG, "%s %u: Firmware file %s info:",
+	       cgpu->api->name, cgpu->device_id, fwfile);
+	applog(LOG_DEBUG, "  Design name: %s", buf);
+	p = strrchr(buf, ';') ?: buf;
+	p = strrchr(buf, '=') ?: p;
+	if (p[0] == '=')
+		++p;
+	unsigned long fwusercode = (unsigned long)strtoll(p, &p, 16);
+	if (p[0] != '\0')
+		bailout(LOG_ERR, "%s %u: Bad usercode in firmware file",
+		        cgpu->api->name, cgpu->device_id);
+	if (fwusercode == 0xffffffff)
+		bailout(LOG_ERR, "%s %u: Firmware doesn't support user code",
+		        cgpu->api->name, cgpu->device_id);
+	applog(LOG_DEBUG, "  Version: %u, build %u", (fwusercode >> 8) & 0xff, fwusercode & 0xff);
+	check_magic('b');
+	read_str("part number");
+	applog(LOG_DEBUG, "  Part number: %s", buf);
+	check_magic('c');
+	read_str("build date");
+	applog(LOG_DEBUG, "  Build date: %s", buf);
+	check_magic('d');
+	read_str("build time");
+	applog(LOG_DEBUG, "  Build time: %s", buf);
+	check_magic('e');
+	if (1 != fread(buf, 4, 1, f))
+		bailout(LOG_ERR, "%s %u: Error reading firmware (data len)",
+		        cgpu->api->name, cgpu->device_id);
+	len = ((unsigned long)ubuf[0] << 24) | ((unsigned long)ubuf[1] << 16) | (ubuf[2] << 8) | ubuf[3];
+	applog(LOG_DEBUG, "  Bitstream size: %lu", len);
+
+	*out_len = len;
+	return f;
+}

+ 2 - 0
fpgautils.h

@@ -16,6 +16,7 @@
 #include <unistd.h>
 #include <unistd.h>
 
 
 struct device_api;
 struct device_api;
+struct cgpu_info;
 
 
 typedef bool(*detectone_func_t)(const char*);
 typedef bool(*detectone_func_t)(const char*);
 typedef int(*autoscan_func_t)();
 typedef int(*autoscan_func_t)();
@@ -46,5 +47,6 @@ extern ssize_t _serial_read(int fd, char *buf, size_t buflen, char *eol);
 #define serial_close(fd)  close(fd)
 #define serial_close(fd)  close(fd)
 
 
 extern FILE *open_bitstream(const char *dname, const char *filename);
 extern FILE *open_bitstream(const char *dname, const char *filename);
+extern FILE *open_xilinx_bitstream(struct cgpu_info *cgpu, const char *fwfile, unsigned long *out_len);
 
 
 #endif
 #endif