|
|
@@ -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) {
|