/ 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_ */