Browse Source

titan: Poll all enabled ASICs amd dies, not only one

Vitalii Demianets 11 years ago
parent
commit
013c0dcd8f
1 changed files with 47 additions and 38 deletions
  1. 47 38
      driver-titan.c

+ 47 - 38
driver-titan.c

@@ -393,8 +393,8 @@ static void knc_titan_poll(struct thr_info * const thr)
 	unsigned long delay_usecs = KNC_POLL_INTERVAL_US;
 	struct knc_report report;
 	struct knc_die_info die_info;
-	int asic = 0; /* TODO: the asic number must iterate from 0 to 5 */
-	int die = 0; /* TODO: the die number must iterate from 0 to 3 */
+	int asic;
+	int die;
 	int i, tmp_int;
 
 	knc_titan_prune_local_queue(thr);
@@ -404,9 +404,18 @@ static void knc_titan_poll(struct thr_info * const thr)
 
 	knccore = cgpu->thr[0]->cgpu_data;
 	DL_FOREACH_SAFE(knc->workqueue, work, tmp) {
-		bool work_accepted;
-		if (!knc_titan_set_work(cgpu->dev_repr, knc->ctx, asic, die, 0xFFFF, knccore->next_slot, work, knc->need_flush, &work_accepted, &report))
-			work_accepted = false;
+		bool work_accepted = false;
+		for (asic = 0; asic < KNC_TITAN_MAX_ASICS; ++asic) {
+			for (die = 0; die < KNC_TITAN_DIES_PER_ASIC; ++die) {
+				if (0 >= knc->dies[asic][die].cores)
+					continue;
+				bool die_work_accepted = false;
+				if (!knc_titan_set_work(knc->dies[asic][die].first_proc->dev_repr, knc->ctx, asic, die, 0xFFFF, knccore->next_slot, work, knc->need_flush, &die_work_accepted, &report))
+					die_work_accepted = false;
+				if (die_work_accepted)
+					work_accepted = true;
+			}
+		}
 		if (!work_accepted)
 			break;
 		if (knc->need_flush) {
@@ -430,45 +439,45 @@ static void knc_titan_poll(struct thr_info * const thr)
 
 	applog(LOG_DEBUG, "%s: %d jobs accepted to queue (max=%d)", knc_titan_drv.dname, workaccept, knc->workqueue_max);
 
-	while (true) {
-		if (0 >= knc->dies[asic][die].cores)
-			break;
-		die_info.cores = knc->dies[asic][die].cores; /* core hint */
-		die_info.version = KNC_VERSION_TITAN;
-		if (!knc_titan_get_info(cgpu->dev_repr, knc->ctx, asic, die, &die_info))
-			break;
-		for (proc = knc->dies[asic][die].first_proc; proc; proc = proc->next_proc) {
-			mythr = proc->thr[0];
-			knccore = mythr->cgpu_data;
-			if ((knccore->dieno != die) || (knccore->asicno != asic))
-				break;
-			if (!die_info.has_report[knccore->coreno])
+	for (asic = 0; asic < KNC_TITAN_MAX_ASICS; ++asic) {
+		for (die = 0; die < KNC_TITAN_DIES_PER_ASIC; ++die) {
+			if (0 >= knc->dies[asic][die].cores)
 				continue;
-			if (!knc_titan_get_report(proc->proc_repr, knc->ctx, asic, die, knccore->coreno, &report))
+			die_info.cores = knc->dies[asic][die].cores; /* core hint */
+			die_info.version = KNC_VERSION_TITAN;
+			if (!knc_titan_get_info(cgpu->dev_repr, knc->ctx, asic, die, &die_info))
 				continue;
-			/* if last_nonce.slot == 0, then there was a flush and all reports are stale */
-			if (0 != knccore->last_nonce.slot) {
-				for (i = 0; i < KNC_TITAN_NONCES_PER_REPORT; ++i) {
-					if ((report.nonce[i].slot == knccore->last_nonce.slot) &&
-					    (report.nonce[i].nonce == knccore->last_nonce.nonce))
-						break;
-					tmp_int = report.nonce[i].slot;
-					HASH_FIND_INT(knc->devicework, &tmp_int, work);
-					if (!work) {
-						applog(LOG_WARNING, "%"PRIpreprv": Got nonce for unknown work in slot %u", proc->proc_repr, tmp_int);
-						continue;
-					}
-					if (submit_nonce(mythr, work, report.nonce[i].nonce)) {
-						hashes_done2(mythr, DEFAULT_DIFF_HASHES_PER_NONCE, NULL);
-						knccore->hwerr_in_row = 0;
+			for (proc = knc->dies[asic][die].first_proc; proc; proc = proc->next_proc) {
+				mythr = proc->thr[0];
+				knccore = mythr->cgpu_data;
+				if ((knccore->dieno != die) || (knccore->asicno != asic))
+					break;
+				if (!die_info.has_report[knccore->coreno])
+					continue;
+				if (!knc_titan_get_report(proc->proc_repr, knc->ctx, asic, die, knccore->coreno, &report))
+					continue;
+				/* if last_nonce.slot == 0, then there was a flush and all reports are stale */
+				if (0 != knccore->last_nonce.slot) {
+					for (i = 0; i < KNC_TITAN_NONCES_PER_REPORT; ++i) {
+						if ((report.nonce[i].slot == knccore->last_nonce.slot) &&
+						    (report.nonce[i].nonce == knccore->last_nonce.nonce))
+							break;
+						tmp_int = report.nonce[i].slot;
+						HASH_FIND_INT(knc->devicework, &tmp_int, work);
+						if (!work) {
+							applog(LOG_WARNING, "%"PRIpreprv": Got nonce for unknown work in slot %u", proc->proc_repr, tmp_int);
+							continue;
+						}
+						if (submit_nonce(mythr, work, report.nonce[i].nonce)) {
+							hashes_done2(mythr, DEFAULT_DIFF_HASHES_PER_NONCE, NULL);
+							knccore->hwerr_in_row = 0;
+						}
 					}
 				}
+				knccore->last_nonce.slot = report.nonce[0].slot;
+				knccore->last_nonce.nonce = report.nonce[0].nonce;
 			}
-			knccore->last_nonce.slot = report.nonce[0].slot;
-			knccore->last_nonce.nonce = report.nonce[0].nonce;
 		}
-		/* TODO: switch to next asic/die */
-		break;
 	}
 
 	if (workaccept) {