/ driver-avalon7.h
driver-avalon7.h
  1  /*
  2   * Copyright 2016 Mikeqin <Fengling.Qin@gmail.com>
  3   * Copyright 2016 Con Kolivas <kernel@kolivas.org>
  4   *
  5   * This program is free software; you can redistribute it and/or modify it
  6   * under the terms of the GNU General Public License as published by the Free
  7   * Software Foundation; either version 3 of the License, or (at your option)
  8   * any later version.  See COPYING for more details.
  9   */
 10  
 11  #ifndef _AVALON7_H_
 12  #define _AVALON7_H_
 13  
 14  #include "util.h"
 15  #include "i2c-context.h"
 16  
 17  #ifdef USE_AVALON7
 18  
 19  #define AVA7_FREQUENCY_MAX	1404
 20  
 21  #define AVA7_DEFAULT_FAN_MIN		5 /* % */
 22  #define AVA7_DEFAULT_FAN_MAX		100
 23  #define AVA7_DEFAULT_FAN_INTERVAL	15 /* Seconds */
 24  
 25  #define AVA7_DEFAULT_TEMP_TARGET	90
 26  #define AVA7_DEFAULT_TEMP_OVERHEAT	105
 27  #define AVA7_DEFAULT_TEMP_HYSTERESIS	5
 28  
 29  #define AVA7_DEFAULT_VOLTAGE_MIN	3889
 30  #define AVA7_DEFAULT_VOLTAGE_MAX	5059
 31  #define AVA7_INVALID_VOLTAGE	0
 32  #define AVA7_DEFAULT_VOLTAGE_STEP	78
 33  
 34  #define AVA7_DEFAULT_VOLTAGE_LEVEL_MIN	0
 35  #define AVA7_DEFAULT_VOLTAGE_LEVEL_MAX	15
 36  
 37  #define AVA7_DEFAULT_VOLTAGE_OFFSET_MIN	-2
 38  #define AVA7_DEFAULT_VOLTAGE_OFFSET	0
 39  #define AVA7_DEFAULT_VOLTAGE_OFFSET_MAX	1
 40  
 41  #define AVA7_DEFAULT_FACTORY_INFO_0_MIN	-15
 42  #define AVA7_DEFAULT_FACTORY_INFO_0	0
 43  #define AVA7_DEFAULT_FACTORY_INFO_0_MAX	15
 44  
 45  #define AVA7_DEFAULT_FREQUENCY_MIN	24 /* NOTE: It cann't support 0 */
 46  #define AVA7_DEFAULT_FREQUENCY_0	600
 47  #define AVA7_DEFAULT_FREQUENCY_1	636
 48  #define AVA7_DEFAULT_FREQUENCY_2	672
 49  #define AVA7_DEFAULT_FREQUENCY_3	708
 50  #define AVA7_DEFAULT_FREQUENCY_4	744
 51  #define AVA7_DEFAULT_FREQUENCY_5	780
 52  #define AVA7_DEFAULT_FREQUENCY_MAX	1404
 53  #define AVA7_DEFAULT_FREQUENCY_SEL	0
 54  
 55  #define AVA7_DEFAULT_MODULARS	7	/* Only support 6 modules maximum with one AUC */
 56  #define AVA7_DEFAULT_MINER_CNT	4
 57  #define AVA7_DEFAULT_ASIC_MAX	26
 58  #define AVA7_DEFAULT_PLL_CNT	6
 59  #define AVA7_DEFAULT_PMU_CNT	2
 60  
 61  #define AVA7_DEFAULT_POLLING_DELAY	20 /* ms */
 62  
 63  #define AVA7_DEFAULT_SMARTSPEED_OFF 0
 64  #define AVA7_DEFAULT_SMARTSPEED_MODE1 1
 65  #define AVA7_DEFAULT_SMART_SPEED	(AVA7_DEFAULT_SMARTSPEED_MODE1)
 66  
 67  #define AVA7_DEFAULT_TH_PASS	(162)
 68  #define AVA7_DEFAULT_TH_FAIL	(10921)
 69  #define AVA7_DEFAULT_TH_INIT	(0xffff / 2)
 70  #define AVA7_DEFAULT_TH_MS	1
 71  #define AVA7_DEFAULT_TH_TIMEOUT	0
 72  #define AVA7_DEFAULT_NONCE_MASK 29
 73  
 74  #define AVA7_DEFAULT_IIC_DETECT	false
 75  
 76  #define AVA7_PWM_MAX	0x3FF
 77  #define AVA7_DRV_DIFFMAX	500
 78  #define AVA7_ASIC_TIMEOUT_CONST	0x2000000 /* 2 ^ 32 / 128 */
 79  
 80  #define AVA7_MODULE_DETECT_INTERVAL	30 /* 30 s */
 81  
 82  #define AVA7_AUC_VER_LEN	12	/* Version length: 12 (AUC-YYYYMMDD) */
 83  #define AVA7_AUC_SPEED		400000
 84  #define AVA7_AUC_XDELAY  	19200	/* 4800 = 1ms in AUC (11U14)  */
 85  #define AVA7_AUC_P_SIZE		64
 86  
 87  #define AVA7_CONNECTER_AUC	1
 88  #define AVA7_CONNECTER_IIC	2
 89  
 90  /* avalon7 protocol package type from MM protocol.h
 91   * https://github.com/Canaan-Creative/MM/blob/avalon7/firmware/protocol.h */
 92  #define AVA7_MM_VER_LEN	15
 93  #define AVA7_MM_DNA_LEN	8
 94  #define AVA7_H1	'C'
 95  #define AVA7_H2	'N'
 96  
 97  #define AVA7_P_COINBASE_SIZE	(6 * 1024 + 64)
 98  #define AVA7_P_MERKLES_COUNT	30
 99  
100  #define AVA7_P_COUNT	40
101  #define AVA7_P_DATA_LEN 32
102  
103  /* Broadcase with block iic_write*/
104  #define AVA7_P_DETECT	0x10
105  
106  /* Broadcase With non-block iic_write*/
107  #define AVA7_P_STATIC	0x11
108  #define AVA7_P_JOB_ID	0x12
109  #define AVA7_P_COINBASE	0x13
110  #define AVA7_P_MERKLES	0x14
111  #define AVA7_P_HEADER	0x15
112  #define AVA7_P_TARGET	0x16
113  #define AVA7_P_JOB_FIN	0x17
114  
115  /* ss package */
116  #define AVA7_P_MID	0xa7
117  
118  /* Broadcase or with I2C address */
119  #define AVA7_P_SET	0x20
120  #define AVA7_P_SET_FIN	0x21
121  #define AVA7_P_SET_VOLT	0x22
122  #define AVA7_P_SET_PMU	0x24
123  #define AVA7_P_SET_PLL	0x25
124  #define AVA7_P_SET_SS	0x26
125  #define AVA7_P_SET_FAC	0x28
126  
127  /* Have to send with I2C address */
128  #define AVA7_P_POLLING	0x30
129  #define AVA7_P_SYNC	0x31
130  #define AVA7_P_TEST	0x32
131  #define AVA7_P_RSTMMTX	0x33
132  #define AVA7_P_GET_VOLT	0x34
133  
134  /* Back to host */
135  #define AVA7_P_ACKDETECT	0x40
136  #define AVA7_P_STATUS		0x41
137  #define AVA7_P_NONCE		0x42
138  #define AVA7_P_TEST_RET		0x43
139  #define AVA7_P_STATUS_VOLT	0x46
140  #define AVA7_P_STATUS_PMU	0x48
141  #define AVA7_P_STATUS_PLL	0x49
142  #define AVA7_P_STATUS_LOG	0x4a
143  #define AVA7_P_STATUS_ASIC	0x4b
144  #define AVA7_P_STATUS_PVT	0x4c
145  #define AVA7_P_STATUS_FAC	0x4d
146  
147  #define AVA7_MODULE_BROADCAST	0
148  /* End of avalon7 protocol package type */
149  
150  #define AVA7_IIC_RESET		0xa0
151  #define AVA7_IIC_INIT		0xa1
152  #define AVA7_IIC_DEINIT		0xa2
153  #define AVA7_IIC_XFER		0xa5
154  #define AVA7_IIC_INFO		0xa6
155  
156  #define AVA7_FREQ_INIT_MODE	0x0
157  #define AVA7_FREQ_PLLADJ_MODE	0x1
158  
159  #define AVA7_DEFAULT_FAVG_TIME	(15 * 60.0)
160  #define AVA7_DEFAULT_FREQADJ_TIME	60
161  
162  #define AVA7_DEFAULT_DELTA_T	0
163  #define AVA7_DEFAULT_DELTA_FREQ	100
164  
165  #define AVA7_DEFAULT_FACTORY_INFO_CNT	1
166  
167  #define AVA7_MM711_VIN_ADC_RATIO	(3.3 / 1024.0 * 27.15 / 7.15 * 1000.0 * 100.0)
168  #define AVA7_MM721_VIN_ADC_RATIO	(3.3 / 1024.0 * 27.15 / 7.15 * 1000.0 * 100.0)
169  #define AVA7_MM741_VIN_ADC_RATIO	(3.3 / 1024.0 * 27.15 / 7.15 * 1000.0 * 100.0)
170  #define AVA7_MM761_VIN_ADC_RATIO	(3.3 / 1024.0 * 26.0 / 6.0 * 1000.0 * 100.0)
171  
172  #define AVA7_MM711_VOUT_ADC_RATIO	(3.3 / 1024.0 * 125.0 / 43.0 * 10000.0 * 100.0)
173  #define AVA7_MM721_VOUT_ADC_RATIO	(3.3 / 1024.0 * 125.0 / 43.0 * 10000.0 * 100.0)
174  #define AVA7_MM741_VOUT_ADC_RATIO	(3.3 / 1024.0 * 63.0 / 20.0 * 10000.0 * 100.0)
175  #define AVA7_MM761_VOUT_ADC_RATIO	(3.3 / 1024.0 * 26.0 / 6.0 * 10000.0 * 100.0)
176  
177  struct avalon7_pkg {
178  	uint8_t head[2];
179  	uint8_t type;
180  	uint8_t opt;
181  	uint8_t idx;
182  	uint8_t cnt;
183  	uint8_t data[32];
184  	uint8_t crc[2];
185  };
186  #define avalon7_ret avalon7_pkg
187  
188  struct avalon7_info {
189  	/* Public data */
190  	int64_t last_diff1;
191  	int64_t pending_diff1;
192  	double last_rej;
193  
194  	int mm_count;
195  	int xfer_err_cnt;
196  	int pool_no;
197  
198  	struct timeval firsthash;
199  	struct timeval last_fan_adj;
200  	struct timeval last_stratum;
201  	struct timeval last_detect;
202  
203  	cglock_t update_lock;
204  
205  	struct pool pool0;
206  	struct pool pool1;
207  	struct pool pool2;
208  
209  	bool work_restart;
210  
211  	uint32_t last_jobid;
212  
213  	/* For connecter */
214  	char auc_version[AVA7_AUC_VER_LEN + 1];
215  
216  	int auc_speed;
217  	int auc_xdelay;
218  	int auc_sensor;
219  
220  	struct i2c_ctx *i2c_slaves[AVA7_DEFAULT_MODULARS];
221  
222  	uint8_t connecter; /* AUC or IIC */
223  
224  	/* For modulars */
225  	bool enable[AVA7_DEFAULT_MODULARS];
226  	bool reboot[AVA7_DEFAULT_MODULARS];
227  
228  	struct timeval elapsed[AVA7_DEFAULT_MODULARS];
229  
230  	uint8_t mm_dna[AVA7_DEFAULT_MODULARS][AVA7_MM_DNA_LEN];
231  	char mm_version[AVA7_DEFAULT_MODULARS][AVA7_MM_VER_LEN + 1]; /* It's a string */
232  	uint32_t total_asics[AVA7_DEFAULT_MODULARS];
233  	uint32_t max_ntime; /* Maximum: 7200 */
234  
235  	int mod_type[AVA7_DEFAULT_MODULARS];
236  	uint8_t miner_count[AVA7_DEFAULT_MODULARS];
237  	uint8_t asic_count[AVA7_DEFAULT_MODULARS];
238  
239  	uint32_t freq_mode[AVA7_DEFAULT_MODULARS];
240  	int led_indicator[AVA7_DEFAULT_MODULARS];
241  	int fan_pct[AVA7_DEFAULT_MODULARS];
242  	int fan_cpm[AVA7_DEFAULT_MODULARS];
243  
244  	int temp[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT][5];
245  	int temp_mm[AVA7_DEFAULT_MODULARS];
246  
247  	uint8_t cutoff[AVA7_DEFAULT_MODULARS];
248  	int temp_target[AVA7_DEFAULT_MODULARS];
249  	int temp_last_max[AVA7_DEFAULT_MODULARS];
250  	int temp_overheat[AVA7_DEFAULT_MODULARS];
251  	time_t last_temp_time[AVA7_DEFAULT_MODULARS];
252  
253  	uint32_t set_voltage[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT];
254  	uint32_t set_frequency[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT][AVA7_DEFAULT_PLL_CNT];
255  
256  	uint16_t get_vin[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT];
257  	uint32_t get_voltage[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT];
258  	uint32_t get_pll[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT][AVA7_DEFAULT_PLL_CNT];
259  	/* spd_pass(4B), spd_fail(4B), sum_failed(4B), sum_num(4B), sum_xor(4B), PLL(6 * 4B) */
260  	uint32_t get_asic[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT][AVA7_DEFAULT_ASIC_MAX][11];
261  
262  	int8_t factory_info[AVA7_DEFAULT_FACTORY_INFO_CNT];
263  
264  	uint64_t local_works[AVA7_DEFAULT_MODULARS];
265  	uint64_t local_works_i[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT];
266  	uint64_t hw_works[AVA7_DEFAULT_MODULARS];
267  	uint64_t hw_works_i[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT];
268  	uint64_t chip_matching_work[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT][AVA7_DEFAULT_ASIC_MAX];
269  
270  	uint32_t error_code[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT + 1];
271  	uint32_t error_crc[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_MINER_CNT];
272  	uint8_t error_polling_cnt[AVA7_DEFAULT_MODULARS];
273  
274  	uint8_t power_good[AVA7_DEFAULT_MODULARS];
275  	char pmu_version[AVA7_DEFAULT_MODULARS][AVA7_DEFAULT_PMU_CNT][5];
276  	uint64_t diff1[AVA7_DEFAULT_MODULARS];
277  
278  	uint16_t vin_adc_ratio[AVA7_DEFAULT_MODULARS];
279  	uint16_t vout_adc_ratio[AVA7_DEFAULT_MODULARS];
280  
281  	bool conn_overloaded;
282  };
283  
284  struct avalon7_iic_info {
285  	uint8_t iic_op;
286  	union {
287  		uint32_t aucParam[2];
288  		uint8_t slave_addr;
289  	} iic_param;
290  };
291  
292  struct avalon7_dev_description {
293  	uint8_t dev_id_str[8];
294  	int mod_type;
295  	uint8_t miner_count; /* it should not greater than AVA7_DEFAULT_MINER_CNT */
296  	uint8_t asic_count; /* asic count each miner, it should not great than AVA7_DEFAULT_ASIC_MAX */
297  	uint16_t vin_adc_ratio;
298  	uint16_t vout_adc_ratio;
299  	uint32_t set_voltage;
300  };
301  
302  #define AVA7_WRITE_SIZE (sizeof(struct avalon7_pkg))
303  #define AVA7_READ_SIZE AVA7_WRITE_SIZE
304  
305  #define AVA7_SEND_OK 0
306  #define AVA7_SEND_ERROR -1
307  
308  extern char *set_avalon7_fan(char *arg);
309  extern char *set_avalon7_freq(char *arg);
310  extern char *set_avalon7_voltage(char *arg);
311  extern char *set_avalon7_voltage_level(char *arg);
312  extern char *set_avalon7_voltage_offset(char *arg);
313  extern int opt_avalon7_temp_target;
314  extern int opt_avalon7_polling_delay;
315  extern int opt_avalon7_aucspeed;
316  extern int opt_avalon7_aucxdelay;
317  extern int opt_avalon7_smart_speed;
318  extern bool opt_avalon7_iic_detect;
319  extern int opt_avalon7_freq_sel;
320  extern uint32_t opt_avalon7_th_pass;
321  extern uint32_t opt_avalon7_th_fail;
322  extern uint32_t opt_avalon7_th_init;
323  extern uint32_t opt_avalon7_th_ms;
324  extern uint32_t opt_avalon7_th_timeout;
325  extern uint32_t opt_avalon7_nonce_mask;
326  extern bool opt_avalon7_asic_debug;
327  #endif /* USE_AVALON7 */
328  #endif	/* _AVALON7_H_ */