Browse Source

Titan: bugfix: dies are not configured if die#0 is OFF

Vitalii Demianets 11 years ago
parent
commit
c03fa3f7a0
1 changed files with 19 additions and 5 deletions
  1. 19 5
      driver-titan.c

+ 19 - 5
driver-titan.c

@@ -206,7 +206,7 @@ static bool knc_titan_detect_one(const char *devpath)
 				.asicno = asic,
 				.dieno = die,
 				.cores = die_info.cores,
-				.proc = cgpu,
+				.proc = NULL, /* Will be assigned at init stage */
 				.first_core = NULL,
 				.freq = KNC_TITAN_DEFAULT_FREQUENCY,
 			};
@@ -367,7 +367,7 @@ static bool knc_titan_init(struct thr_info * const thr)
 	struct knc_titan_core *knccore;
 	struct knc_titan_die *kncdie;
 	struct knc_titan_info *knc;
-	int i, asic, die;
+	int i, asic, logical_dieno, ena_die, die;
 	int total_cores = 0;
 	int asic_cores[KNC_TITAN_MAX_ASICS] = {0};
 
@@ -378,12 +378,26 @@ static bool knc_titan_init(struct thr_info * const thr)
 		proc->min_nonce_diff = DEFAULT_DIFF_FILTERING_FLOAT;
 		if (proc->device == proc) {
 			asic = atoi(proc->device_path);
-			die = 0;
+			logical_dieno = 0;
 			knc->asic_served_by_fpga[asic] = true;
 		} else {
-			die++;
+			++logical_dieno;
 		}
-		kncdie = ((struct thr_info *)proc->thr[0])->cgpu_data = &knc->dies[asic][die];
+		kncdie = NULL;
+		for (die = 0, ena_die = 0; die < KNC_TITAN_DIES_PER_ASIC; ++die) {
+			if (knc->dies[asic][die].cores <= 0)
+				continue;
+			if (ena_die++ == logical_dieno) {
+				kncdie = &knc->dies[asic][die];
+				break;
+			}
+		}
+		if (NULL == kncdie) {
+			applog(LOG_ERR, "Can not find logical dieno %d", logical_dieno);
+			continue;
+		}
+		kncdie->proc = proc;
+		((struct thr_info *)proc->thr[0])->cgpu_data = kncdie;
 		for (i = 0 ; i < KNC_TITAN_CORES_PER_DIE ; i++) {
 			if (i == 0) {
 				kncdie->first_core = malloc(sizeof(*knccore));