Browse Source

titan: Use setup_core from knc-asic library

Vitalii Demianets 11 years ago
parent
commit
b6ccd84a64
3 changed files with 7 additions and 240 deletions
  1. 1 1
      driver-titan.c
  2. 5 225
      titan-asic.c
  3. 1 14
      titan-asic.h

+ 1 - 1
driver-titan.c

@@ -276,7 +276,7 @@ static bool knc_titan_init(struct thr_info * const thr)
 		mythr = proc->thr[0];
 		mythr = proc->thr[0];
 		knccore = mythr->cgpu_data;
 		knccore = mythr->cgpu_data;
 		applog(LOG_DEBUG, "%s Setup core %d:%d:%d, nonces 0x%08X - 0x%08X", proc->device->dev_repr, knccore->asicno, knccore->dieno, knccore->coreno, setup_params.nonce_bottom, setup_params.nonce_top);
 		applog(LOG_DEBUG, "%s Setup core %d:%d:%d, nonces 0x%08X - 0x%08X", proc->device->dev_repr, knccore->asicno, knccore->dieno, knccore->coreno, setup_params.nonce_bottom, setup_params.nonce_top);
-		knc_titan_setup_core(proc->device->dev_repr, knc->ctx, knccore->asicno, knccore->dieno, knccore->coreno, &setup_params);
+		knc_titan_setup_core_local(proc->device->dev_repr, knc->ctx, knccore->asicno, knccore->dieno, knccore->coreno, &setup_params);
 	}
 	}
 
 
 	timer_set_now(&thr->tv_poll);
 	timer_set_now(&thr->tv_poll);

+ 5 - 225
titan-asic.c

@@ -71,230 +71,10 @@ bool knc_titan_get_report(const char *repr, void * const ctx, int channel, int d
 	return true;
 	return true;
 }
 }
 
 
-bool knc_titan_setup_core(const char *repr, void * const ctx, int channel, int die, int core, struct titan_setup_core_params *params)
+/* This fails if core is hashing!
+ * Stop it before setting up.
+ */
+bool knc_titan_setup_core_local(const char *repr, void * const ctx, int channel, int die, int core, struct titan_setup_core_params *params)
 {
 {
-#define	SETWORK_CMD_SIZE	(5 + BLOCK_HEADER_BYTES_WITHOUT_NONCE)
-	/* The size of command is the same as for set_work */
-	uint8_t setup_core_cmd[SETWORK_CMD_SIZE] = {
-		KNC_ASIC_CMD_SETUP_CORE,
-		die,
-		(core >> 8) & 0xFF,
-		core & 0xFF,
-		/* next follows padding and data */
-	};
-	const int send_size = sizeof(setup_core_cmd);
-	int response_length = send_size - 4;
-	uint8_t response[response_length];
-	int status;
-	uint32_t *src, *dst;
-	int i;
-	struct titan_packed_core_params {
-		/* WORD [0] */
-#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-		uint32_t padding			:26;
-		uint32_t bad_address_mask_0_6msb	:6;
-#else
-		uint32_t bad_address_mask_0_6msb	:6;
-		uint32_t padding			:26;
-#endif
-		/* WORD [1] */
-#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-		uint32_t bad_address_mask_0_4lsb	:4;
-		uint32_t bad_address_mask_1		:10;
-		uint32_t bad_address_match_0		:10;
-		uint32_t bad_address_match_1_8msb	:8;
-#else
-		uint32_t bad_address_match_1_8msb	:8;
-		uint32_t bad_address_match_0		:10;
-		uint32_t bad_address_mask_1		:10;
-		uint32_t bad_address_mask_0_4lsb	:4;
-#endif
-		/* WORD [2] */
-#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-		uint32_t bad_address_match_1_2lsb	:2;
-		uint32_t difficulty			:6;
-		uint32_t thread_enable			:8;
-		uint32_t thread_base_address_0		:10;
-		uint32_t thread_base_address_1_6msb	:6;
-#else
-		uint32_t thread_base_address_1_6msb	:6;
-		uint32_t thread_base_address_0		:10;
-		uint32_t thread_enable			:8;
-		uint32_t difficulty			:6;
-		uint32_t bad_address_match_1_2lsb	:2;
-#endif
-		/* WORD [3] */
-#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-		uint32_t thread_base_address_1_4lsb	:4;
-		uint32_t thread_base_address_2		:10;
-		uint32_t thread_base_address_3		:10;
-		uint32_t thread_base_address_4_8msb	:8;
-#else
-		uint32_t thread_base_address_4_8msb	:8;
-		uint32_t thread_base_address_3		:10;
-		uint32_t thread_base_address_2		:10;
-		uint32_t thread_base_address_1_4lsb	:4;
-#endif
-		/* WORD [4] */
-#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-		uint32_t thread_base_address_4_2lsb	:2;
-		uint32_t thread_base_address_5		:10;
-		uint32_t thread_base_address_6		:10;
-		uint32_t thread_base_address_7		:10;
-#else
-		uint32_t thread_base_address_7		:10;
-		uint32_t thread_base_address_6		:10;
-		uint32_t thread_base_address_5		:10;
-		uint32_t thread_base_address_4_2lsb	:2;
-#endif
-		/* WORD [5] */
-#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-		uint32_t lookup_gap_mask_0		:10;
-		uint32_t lookup_gap_mask_1		:10;
-		uint32_t lookup_gap_mask_2		:10;
-		uint32_t lookup_gap_mask_3_2msb		:2;
-#else
-		uint32_t lookup_gap_mask_3_2msb		:2;
-		uint32_t lookup_gap_mask_2		:10;
-		uint32_t lookup_gap_mask_1		:10;
-		uint32_t lookup_gap_mask_0		:10;
-#endif
-		/* WORD [6] */
-#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-		uint32_t lookup_gap_mask_3_8lsb		:8;
-		uint32_t lookup_gap_mask_4		:10;
-		uint32_t lookup_gap_mask_5		:10;
-		uint32_t lookup_gap_mask_6_4msb		:4;
-#else
-		uint32_t lookup_gap_mask_6_4msb		:4;
-		uint32_t lookup_gap_mask_5		:10;
-		uint32_t lookup_gap_mask_4		:10;
-		uint32_t lookup_gap_mask_3_8lsb		:8;
-#endif
-		/* WORD [7] */
-#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-		uint32_t lookup_gap_mask_6_6lsb		:6;
-		uint32_t lookup_gap_mask_7		:10;
-		uint32_t N_mask_0			:10;
-		uint32_t N_mask_1_6msb			:6;
-#else
-		uint32_t N_mask_1_6msb			:6;
-		uint32_t N_mask_0			:10;
-		uint32_t lookup_gap_mask_7		:10;
-		uint32_t lookup_gap_mask_6_6lsb		:6;
-#endif
-		/* WORD [8] */
-#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-		uint32_t N_mask_1_4lsb			:4;
-		uint32_t N_mask_2			:10;
-		uint32_t N_mask_3			:10;
-		uint32_t N_mask_4_8msb			:8;
-#else
-		uint32_t N_mask_4_8msb			:8;
-		uint32_t N_mask_3			:10;
-		uint32_t N_mask_2			:10;
-		uint32_t N_mask_1_4lsb			:4;
-#endif
-		/* WORD [9] */
-#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-		uint32_t N_mask_4_2lsb			:2;
-		uint32_t N_mask_5			:10;
-		uint32_t N_mask_6			:10;
-		uint32_t N_mask_7			:10;
-#else
-		uint32_t N_mask_7			:10;
-		uint32_t N_mask_6			:10;
-		uint32_t N_mask_5			:10;
-		uint32_t N_mask_4_2lsb			:2;
-#endif
-		/* WORD [10] */
-#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-		uint32_t N_shift_0			:4;
-		uint32_t N_shift_1			:4;
-		uint32_t N_shift_2			:4;
-		uint32_t N_shift_3			:4;
-		uint32_t N_shift_4			:4;
-		uint32_t N_shift_5			:4;
-		uint32_t N_shift_6			:4;
-		uint32_t N_shift_7			:4;
-#else
-		uint32_t N_shift_7			:4;
-		uint32_t N_shift_6			:4;
-		uint32_t N_shift_5			:4;
-		uint32_t N_shift_4			:4;
-		uint32_t N_shift_3			:4;
-		uint32_t N_shift_2			:4;
-		uint32_t N_shift_1			:4;
-		uint32_t N_shift_0			:4;
-#endif
-		/* WORD [11] */
-		uint32_t nonce_top;
-		/* WORD [12] */
-		uint32_t nonce_bottom;
-	} __attribute__((packed)) packed_params;
-
-	packed_params.padding = 0;
-	packed_params.bad_address_mask_0_6msb = (params->bad_address_mask[0] >> 4) & 0x03F;
-	packed_params.bad_address_mask_0_4lsb = params->bad_address_mask[0] & 0x00F;
-	packed_params.bad_address_mask_1 = params->bad_address_mask[1];
-	packed_params.bad_address_match_0 = params->bad_address_match[0];
-	packed_params.bad_address_match_1_8msb = (params->bad_address_match[1] >> 2) & 0x0FF;
-	packed_params.bad_address_match_1_2lsb = params->bad_address_match[1] & 0x003;
-	packed_params.difficulty = params->difficulty;
-	packed_params.thread_enable = params->thread_enable;
-	packed_params.thread_base_address_0 = params->thread_base_address[0];
-	packed_params.thread_base_address_1_6msb = (params->thread_base_address[1] >> 4) & 0x03F;
-	packed_params.thread_base_address_1_4lsb = params->thread_base_address[1] & 0x00F;
-	packed_params.thread_base_address_2 = params->thread_base_address[2];
-	packed_params.thread_base_address_3 = params->thread_base_address[3];
-	packed_params.thread_base_address_4_8msb = (params->thread_base_address[4] >> 2) & 0x0FF;
-	packed_params.thread_base_address_4_2lsb = params->thread_base_address[4] & 0x003;
-	packed_params.thread_base_address_5 = params->thread_base_address[5];
-	packed_params.thread_base_address_6 = params->thread_base_address[6];
-	packed_params.thread_base_address_7 = params->thread_base_address[7];
-	packed_params.lookup_gap_mask_0 = params->lookup_gap_mask[0];
-	packed_params.lookup_gap_mask_1 = params->lookup_gap_mask[1];
-	packed_params.lookup_gap_mask_2 = params->lookup_gap_mask[2];
-	packed_params.lookup_gap_mask_3_2msb = (params->lookup_gap_mask[3] >> 8) & 0x003;
-	packed_params.lookup_gap_mask_3_8lsb = params->lookup_gap_mask[3] & 0x0FF;
-	packed_params.lookup_gap_mask_4 = params->lookup_gap_mask[4];
-	packed_params.lookup_gap_mask_5 = params->lookup_gap_mask[5];
-	packed_params.lookup_gap_mask_6_4msb = (params->lookup_gap_mask[6] >> 6) & 0x00F;
-	packed_params.lookup_gap_mask_6_6lsb = params->lookup_gap_mask[6] & 0x03F;
-	packed_params.lookup_gap_mask_7 = params->lookup_gap_mask[7];
-	packed_params.N_mask_0 = params->N_mask[0];
-	packed_params.N_mask_1_6msb = (params->N_mask[1] >> 4) & 0x03F;
-	packed_params.N_mask_1_4lsb = params->N_mask[1] & 0x00F;
-	packed_params.N_mask_2 = params->N_mask[2];
-	packed_params.N_mask_3 = params->N_mask[3];
-	packed_params.N_mask_4_8msb = (params->N_mask[4] >> 2) & 0x0FF;
-	packed_params.N_mask_4_2lsb = params->N_mask[4] & 0x003;
-	packed_params.N_mask_5 = params->N_mask[5];
-	packed_params.N_mask_6 = params->N_mask[6];
-	packed_params.N_mask_7 = params->N_mask[7];
-	packed_params.N_shift_0 = params->N_shift[0];
-	packed_params.N_shift_1 = params->N_shift[1];
-	packed_params.N_shift_2 = params->N_shift[2];
-	packed_params.N_shift_3 = params->N_shift[3];
-	packed_params.N_shift_4 = params->N_shift[4];
-	packed_params.N_shift_5 = params->N_shift[5];
-	packed_params.N_shift_6 = params->N_shift[6];
-	packed_params.N_shift_7 = params->N_shift[7];
-	packed_params.nonce_top = params->nonce_top;
-	packed_params.nonce_bottom = params->nonce_bottom;
-
-	src = (uint32_t *)&packed_params;
-	dst = (uint32_t *)(&setup_core_cmd[send_size - sizeof(packed_params)]);
-	for (i = 0; i < (sizeof(packed_params) / 4); ++i)
-		dst[i] = htobe32(src[i]);
-
-	status = knc_syncronous_transfer(ctx, channel, send_size, setup_core_cmd, response_length, response);
-	/* For this command ASIC does not send CRC in response, so ignore it */
-	status &= ~(KNC_ERR_CRC);
-	if (status != KNC_ACCEPTED) {
-		applog(LOG_ERR, "%s[%d:%d]: setup_core failed (%x)", repr, channel, die, status);
-		return false;
-	}
-
-	return true;
+	return knc_titan_setup_core(ctx, channel, die, core, params);
 }
 }

+ 1 - 14
titan-asic.h

@@ -17,22 +17,9 @@ struct nonce_report {
 	uint8_t slot;
 	uint8_t slot;
 };
 };
 
 
-struct titan_setup_core_params {
-	uint16_t bad_address_mask[2];
-	uint16_t bad_address_match[2];
-	uint8_t difficulty;
-	uint8_t thread_enable;
-	uint16_t thread_base_address[KNC_TITAN_THREADS_PER_CORE];
-	uint16_t lookup_gap_mask[KNC_TITAN_THREADS_PER_CORE];
-	uint16_t N_mask[KNC_TITAN_THREADS_PER_CORE];
-	uint8_t N_shift[KNC_TITAN_THREADS_PER_CORE];
-	uint32_t nonce_top;
-	uint32_t nonce_bottom;
-};
-
 bool knc_titan_get_info(const char *repr, void * const ctx, int channel, int die, struct knc_die_info *die_info);
 bool knc_titan_get_info(const char *repr, void * const ctx, int channel, int die, struct knc_die_info *die_info);
 bool knc_titan_set_work(const char *repr, void * const ctx, int channel, int die, int core, int slot, struct work *work, bool urgent, bool *work_accepted, struct knc_report *report);
 bool knc_titan_set_work(const char *repr, void * const ctx, int channel, int die, int core, int slot, struct work *work, bool urgent, bool *work_accepted, struct knc_report *report);
 bool knc_titan_get_report(const char *repr, void * const ctx, int channel, int die, int core, struct knc_report *report);
 bool knc_titan_get_report(const char *repr, void * const ctx, int channel, int die, int core, struct knc_report *report);
-bool knc_titan_setup_core(const char *repr, void * const ctx, int channel, int die, int core, struct titan_setup_core_params *params);
+bool knc_titan_setup_core_local(const char *repr, void * const ctx, int channel, int die, int core, struct titan_setup_core_params *params);
 
 
 #endif /* __TITAN_ASIC_H */
 #endif /* __TITAN_ASIC_H */