|
|
|
/*
|
|
|
|
* Copyright 2013 Con Kolivas <kernel@kolivas.org>
|
|
|
|
* Copyright 2013 Andrew Smith
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
|
|
* Software Foundation; either version 3 of the License, or (at your option)
|
|
|
|
* any later version. See COPYING for more details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef BFLSC_H
|
|
|
|
#define BFLSC_H
|
|
|
|
#define BLANK ""
|
|
|
|
#define LFSTR "<LF>"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Firmware
|
|
|
|
* DRV_V2 expects (beyond V1) the GetInfo to return the chip count
|
|
|
|
* The queues are 40 instead of 20 and are *usually* consumed and filled
|
|
|
|
* in bursts due to e.g. a 16 chip device doing 16 items at a time and
|
|
|
|
* returning 16 results at a time
|
|
|
|
* If the device has varying chip speeds, it will gradually break up the
|
|
|
|
* burst of results as we progress
|
|
|
|
*/
|
|
|
|
enum driver_version {
|
|
|
|
BFLSC_DRVUNDEF = 0,
|
|
|
|
BFLSC_DRV1,
|
|
|
|
BFLSC_DRV2
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* With Firmware 1.0.0 and a result queue of 20 the Max is:
|
|
|
|
* inprocess = 12
|
|
|
|
* max count = 9
|
|
|
|
* 64+1+24+1+1+(1+8)*8+1 per line = 164 * 20
|
|
|
|
* OK = 3
|
|
|
|
* Total: 3304
|
|
|
|
*
|
|
|
|
* With Firmware 1.2.* and a result queue of 40 but a limit of 15 replies:
|
|
|
|
* inprocess = 12
|
|
|
|
* max count = 9
|
|
|
|
* 64+1+24+1+1+1+1+(1+8)*8+1 per line = 166 * 15
|
|
|
|
* OK = 3
|
|
|
|
* Total: 2514
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
#define BFLSC_BUFSIZ (0x1000)
|
|
|
|
|
|
|
|
#define BFLSC_INFO_TIMEOUT 999
|
|
|
|
|
|
|
|
#define BFLSC_DI_FIRMWARE "FIRMWARE"
|
|
|
|
#define BFLSC_DI_ENGINES "ENGINES"
|
|
|
|
#define BFLSC_DI_JOBSINQUE "JOBS IN QUEUE"
|
|
|
|
#define BFLSC_DI_XLINKMODE "XLINK MODE"
|
|
|
|
#define BFLSC_DI_XLINKPRESENT "XLINK PRESENT"
|
|
|
|
#define BFLSC_DI_DEVICESINCHAIN "DEVICES IN CHAIN"
|
|
|
|
#define BFLSC_DI_CHAINPRESENCE "CHAIN PRESENCE MASK"
|
|
|
|
#define BFLSC_DI_CHIPS "CHIP PARALLELIZATION"
|
|
|
|
|
|
|
|
#define FULLNONCE 0x100000000ULL
|
|
|
|
|
|
|
|
struct bflsc_dev {
|
|
|
|
// Work
|
|
|
|
unsigned int ms_work;
|
|
|
|
int work_queued;
|
|
|
|
int work_complete;
|
|
|
|
int nonces_hw; // TODO: this - need to add a paramter to submit_nonce()
|
|
|
|
// so can pass 'dev' to hw_error
|
|
|
|
uint64_t hashes_unsent;
|
|
|
|
uint64_t hashes_sent;
|
|
|
|
uint64_t nonces_found;
|
|
|
|
|
|
|
|
struct timeval last_check_result;
|
|
|
|
struct timeval last_dev_result; // array > 0
|
|
|
|
struct timeval last_nonce_result; // > 0 nonce
|
|
|
|
|
|
|
|
// Info
|
|
|
|
char getinfo[(BFLSC_BUFSIZ+4)*4];
|
|
|
|
char *firmware;
|
|
|
|
int engines; // each engine represents a 'thread' in a chip
|
|
|
|
char *xlink_mode;
|
|
|
|
char *xlink_present;
|
|
|
|
char *chips;
|
|
|
|
|
|
|
|
// Status
|
|
|
|
bool dead; // TODO: handle seperate x-link devices failing?
|
|
|
|
bool overheat;
|
|
|
|
|
|
|
|
// Stats
|
|
|
|
float temp1;
|
|
|
|
float temp2;
|
|
|
|
float vcc1;
|
|
|
|
float vcc2;
|
|
|
|
float vmain;
|
|
|
|
float temp1_max;
|
|
|
|
float temp2_max;
|
|
|
|
time_t temp1_max_time;
|
|
|
|
time_t temp2_max_time;
|
|
|
|
float temp1_5min_av; // TODO:
|
|
|
|
float temp2_5min_av; // TODO:
|
|
|
|
|
|
|
|
// To handle the fact that flushing the queue may not remove all work
|
|
|
|
// (normally one item is still being processed)
|
|
|
|
// and also that once the queue is flushed, results may still be in
|
|
|
|
// the output queue - but we don't want to process them at the time of doing an LP
|
|
|
|
// when result_id > flush_id+1, flushed work can be discarded since it
|
|
|
|
// is no longer in the device
|
|
|
|
uint64_t flush_id; // counter when results were last flushed
|
|
|
|
uint64_t result_id; // counter when results were last checked
|
|
|
|
bool flushed; // are any flushed?
|
|
|
|
};
|
|
|
|
|
|
|
|
#define QUE_MAX_RESULTS 8
|
|
|
|
|
|
|
|
struct bflsc_info {
|
|
|
|
enum driver_version driver_version;
|
|
|
|
pthread_rwlock_t stat_lock;
|
|
|
|
struct thr_info results_thr;
|
|
|
|
uint64_t hashes_sent;
|
|
|
|
uint32_t update_count;
|
|
|
|
struct timeval last_update;
|
|
|
|
int sc_count;
|
|
|
|
struct bflsc_dev *sc_devs;
|
|
|
|
unsigned int scan_sleep_time;
|
|
|
|
unsigned int results_sleep_time;
|
|
|
|
unsigned int default_ms_work;
|
|
|
|
bool shutdown;
|
|
|
|
bool flash_led;
|
|
|
|
bool not_first_work; // allow ignoring the first nonce error
|
|
|
|
bool fanauto;
|
|
|
|
int que_size;
|
|
|
|
int que_full_enough;
|
|
|
|
int que_watermark;
|
|
|
|
int que_low;
|
|
|
|
int que_noncecount;
|
|
|
|
int que_fld_min;
|
|
|
|
int que_fld_max;
|
|
|
|
int flush_size;
|
|
|
|
// count of given size, [+2] is for any > QUE_MAX_RESULTS
|
|
|
|
uint64_t result_size[QUE_MAX_RESULTS+2];
|
|
|
|
};
|
|
|
|
|
|
|
|
#define BFLSC_XLINKHDR '@'
|
|
|
|
#define BFLSC_MAXPAYLOAD 255
|
|
|
|
|
|
|
|
struct DataForwardToChain {
|
|
|
|
uint8_t header;
|
|
|
|
uint8_t payloadSize;
|
|
|
|
uint8_t deviceAddress;
|
|
|
|
uint8_t payloadData[BFLSC_MAXPAYLOAD];
|
|
|
|
};
|
|
|
|
|
|
|
|
#define DATAFORWARDSIZE(data) (1 + 1 + 1 + data.payloadSize)
|
|
|
|
|
|
|
|
#define MIDSTATE_BYTES 32
|
|
|
|
#define MERKLE_OFFSET 64
|
|
|
|
#define MERKLE_BYTES 12
|
|
|
|
#define BFLSC_QJOBSIZ (MIDSTATE_BYTES+MERKLE_BYTES+1)
|
|
|
|
#define BFLSC_EOB 0xaa
|
|
|
|
|
|
|
|
struct QueueJobStructure {
|
|
|
|
uint8_t payloadSize;
|
|
|
|
uint8_t midState[MIDSTATE_BYTES];
|
|
|
|
uint8_t blockData[MERKLE_BYTES];
|
|
|
|
uint8_t endOfBlock;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define QUE_RES_LINES_MIN 3
|
|
|
|
#define QUE_MIDSTATE 0
|
|
|
|
#define QUE_BLOCKDATA 1
|
|
|
|
|
|
|
|
#define QUE_NONCECOUNT_V1 2
|
|
|
|
#define QUE_FLD_MIN_V1 3
|
|
|
|
#define QUE_FLD_MAX_V1 (QUE_MAX_RESULTS+QUE_FLD_MIN_V1)
|
|
|
|
|
|
|
|
#define QUE_CHIP_V2 2
|
|
|
|
#define QUE_NONCECOUNT_V2 3
|
|
|
|
#define QUE_FLD_MIN_V2 4
|
|
|
|
#define QUE_FLD_MAX_V2 (QUE_MAX_RESULTS+QUE_FLD_MIN_V2)
|
|
|
|
|
|
|
|
#define BFLSC_SIGNATURE 0xc1
|
|
|
|
#define BFLSC_EOW 0xfe
|
|
|
|
|
|
|
|
// N.B. this will only work with 5 jobs
|
|
|
|
// requires a different jobs[N] for each job count
|
|
|
|
// but really only need to handle 5 anyway
|
|
|
|
struct QueueJobPackStructure {
|
|
|
|
uint8_t payloadSize;
|
|
|
|
uint8_t signature;
|
|
|
|
uint8_t jobsInArray;
|
|
|
|
struct QueueJobStructure jobs[5];
|
|
|
|
uint8_t endOfWrapper;
|
|
|
|
};
|
|
|
|
|
|
|
|
// TODO: Implement in API and also in usb device selection
|
|
|
|
struct SaveString {
|
|
|
|
uint8_t payloadSize;
|
|
|
|
uint8_t payloadData[BFLSC_MAXPAYLOAD];
|
|
|
|
};
|
|
|
|
|
|
|
|
// Commands (Single Stage)
|
|
|
|
#define BFLSC_IDENTIFY "ZGX"
|
|
|
|
#define BFLSC_IDENTIFY_LEN (sizeof(BFLSC_IDENTIFY)-1)
|
|
|
|
#define BFLSC_DETAILS "ZCX"
|
|
|
|
#define BFLSC_DETAILS_LEN (sizeof(BFLSC_DETAILS)-1)
|
|
|
|
#define BFLSC_FIRMWARE "ZJX"
|
|
|
|
#define BFLSC_FIRMWARE_LEN (sizeof(BFLSC_FIRMWARE)-1)
|
|
|
|
#define BFLSC_FLASH "ZMX"
|
|
|
|
#define BFLSC_FLASH_LEN (sizeof(BFLSC_FLASH)-1)
|
|
|
|
#define BFLSC_VOLTAGE "ZTX"
|
|
|
|
#define BFLSC_VOLTAGE_LEN (sizeof(BFLSC_VOLTAGE)-1)
|
|
|
|
#define BFLSC_TEMPERATURE "ZLX"
|
|
|
|
#define BFLSC_TEMPERATURE_LEN (sizeof(BFLSC_TEMPERATURE)-1)
|
|
|
|
#define BFLSC_QRES "ZOX"
|
|
|
|
#define BFLSC_QRES_LEN (sizeof(BFLSC_QRES)-1)
|
|
|
|
#define BFLSC_QFLUSH "ZQX"
|
|
|
|
#define BFLSC_QFLUSH_LEN (sizeof(BFLSC_QFLUSH)-1)
|
|
|
|
#define BFLSC_FANAUTO "Z9X"
|
|
|
|
#define BFLSC_FANOUT_LEN (sizeof(BFLSC_FANAUTO)-1)
|
|
|
|
#define BFLSC_FAN0 "Z0X"
|
|
|
|
#define BFLSC_FAN0_LEN (sizeof(BFLSC_FAN0)-1)
|
|
|
|
#define BFLSC_FAN1 "Z1X"
|
|
|
|
#define BFLSC_FAN1_LEN (sizeof(BFLSC_FAN1)-1)
|
|
|
|
#define BFLSC_FAN2 "Z2X"
|
|
|
|
#define BFLSC_FAN2_LEN (sizeof(BFLSC_FAN2)-1)
|
|
|
|
#define BFLSC_FAN3 "Z3X"
|
|
|
|
#define BFLSC_FAN3_LEN (sizeof(BFLSC_FAN3)-1)
|
|
|
|
#define BFLSC_FAN4 "Z4X"
|
|
|
|
#define BFLSC_FAN4_LEN (sizeof(BFLSC_FAN4)-1)
|
|
|
|
#define BFLSC_LOADSTR "ZUX"
|
|
|
|
#define BFLSC_LOADSTR_LEN (sizeof(BFLSC_LOADSTR)-1)
|
|
|
|
|
|
|
|
// Commands (Dual Stage)
|
|
|
|
#define BFLSC_QJOB "ZNX"
|
|
|
|
#define BFLSC_QJOB_LEN (sizeof(BFLSC_QJOB)-1)
|
|
|
|
#define BFLSC_QJOBS "ZWX"
|
|
|
|
#define BFLSC_QJOBS_LEN (sizeof(BFLSC_QJOBS)-1)
|
|
|
|
#define BFLSC_SAVESTR "ZSX"
|
|
|
|
#define BFLSC_SAVESTR_LEN (sizeof(BFLSC_SAVESTR)-1)
|
|
|
|
|
|
|
|
// Replies
|
|
|
|
#define BFLSC_IDENTITY "BitFORCE SC"
|
|
|
|
#define BFLSC_BFLSC "SHA256 SC"
|
|
|
|
|
|
|
|
#define BFLSC_OK "OK\n"
|
|
|
|
#define BFLSC_OK_LEN (sizeof(BFLSC_OK)-1)
|
|
|
|
#define BFLSC_SUCCESS "SUCCESS\n"
|
|
|
|
#define BFLSC_SUCCESS_LEN (sizeof(BFLSC_SUCCESS)-1)
|
|
|
|
|
|
|
|
#define BFLSC_RESULT "COUNT:"
|
|
|
|
#define BFLSC_RESULT_LEN (sizeof(BFLSC_RESULT)-1)
|
|
|
|
|
|
|
|
#define BFLSC_ANERR "ERR:"
|
|
|
|
#define BFLSC_ANERR_LEN (sizeof(BFLSC_ANERR)-1)
|
|
|
|
#define BFLSC_TIMEOUT BFLSC_ANERR "TIMEOUT"
|
|
|
|
#define BFLSC_TIMEOUT_LEN (sizeof(BFLSC_TIMEOUT)-1)
|
|
|
|
// x-link timeout has a space (a number follows)
|
|
|
|
#define BFLSC_XTIMEOUT BFLSC_ANERR "TIMEOUT "
|
|
|
|
#define BFLSC_XTIMEOUT_LEN (sizeof(BFLSC_XTIMEOUT)-1)
|
|
|
|
#define BFLSC_INVALID BFLSC_ANERR "INVALID DATA"
|
|
|
|
#define BFLSC_INVALID_LEN (sizeof(BFLSC_INVALID)-1)
|
|
|
|
#define BFLSC_ERRSIG BFLSC_ANERR "SIGNATURE"
|
|
|
|
#define BFLSC_ERRSIG_LEN (sizeof(BFLSC_ERRSIG)-1)
|
|
|
|
#define BFLSC_OKQ "OK:QUEUED"
|
|
|
|
#define BFLSC_OKQ_LEN (sizeof(BFLSC_OKQ)-1)
|
|
|
|
// Followed by N=1..5
|
|
|
|
#define BFLSC_OKQN "OK:QUEUED "
|
|
|
|
#define BFLSC_OKQN_LEN (sizeof(BFLSC_OKQN)-1)
|
|
|
|
#define BFLSC_QFULL "QUEUE FULL"
|
|
|
|
#define BFLSC_QFULL_LEN (sizeof(BFLSC_QFULL)-1)
|
|
|
|
#define BFLSC_HITEMP "HIGH TEMPERATURE RECOVERY"
|
|
|
|
#define BFLSC_HITEMP_LEN (sizeof(BFLSC_HITEMP)-1)
|
|
|
|
#define BFLSC_EMPTYSTR "MEMORY EMPTY"
|
|
|
|
#define BFLSC_EMPTYSTR_LEN (sizeof(BFLSC_EMPTYSTR)-1)
|
|
|
|
|
|
|
|
// Queued and non-queued are the same
|
|
|
|
#define FullNonceRangeJob QueueJobStructure
|
|
|
|
#define BFLSC_JOBSIZ BFLSC_QJOBSIZ
|
|
|
|
|
|
|
|
// Non queued commands (not used)
|
|
|
|
#define BFLSC_SENDWORK "ZDX"
|
|
|
|
#define BFLSC_SENDWORK_LEN (sizeof(BFLSC_SENDWORK)-1)
|
|
|
|
#define BFLSC_WORKSTATUS "ZFX"
|
|
|
|
#define BFLSC_WORKSTATUS_LEN (sizeof(BFLSC_WORKSTATUS)-1)
|
|
|
|
#define BFLSC_SENDRANGE "ZPX"
|
|
|
|
#define BFLSC_SENDRANGE_LEN (sizeof(BFLSC_SENDRANGE)-1)
|
|
|
|
|
|
|
|
// Non queued work replies (not used)
|
|
|
|
#define BFLSC_NONCE "NONCE-FOUND:"
|
|
|
|
#define BFLSC_NONCE_LEN (sizeof(BFLSC_NONCE)-1)
|
|
|
|
#define BFLSC_NO_NONCE "NO-NONCE"
|
|
|
|
#define BFLSC_NO_NONCE_LEN (sizeof(BFLSC_NO_NONCE)-1)
|
|
|
|
#define BFLSC_IDLE "IDLE"
|
|
|
|
#define BFLSC_IDLE_LEN (sizeof(BFLSC_IDLE)-1)
|
|
|
|
#define BFLSC_BUSY "BUSY"
|
|
|
|
#define BFLSC_BUSY_LEN (sizeof(BFLSC_BUSY)-1)
|
|
|
|
|
|
|
|
#define BFLSC_MINIRIG "BAM"
|
|
|
|
#define BFLSC_SINGLE "BAS"
|
|
|
|
#define BFLSC_LITTLESINGLE "BAL"
|
|
|
|
#define BFLSC_JALAPENO "BAJ"
|
|
|
|
|
|
|
|
// Default expected time for a nonce range
|
|
|
|
// - thus no need to check until this + last time work was found
|
|
|
|
// 60GH/s MiniRig (1 board) or Single
|
|
|
|
#define BAM_WORK_TIME 71.58
|
|
|
|
#define BAS_WORK_TIME 71.58
|
|
|
|
// 30GH/s Little Single
|
|
|
|
#define BAL_WORK_TIME 143.17
|
|
|
|
// 4.5GH/s Jalapeno
|
|
|
|
#define BAJ_WORK_TIME 954.44
|
|
|
|
|
|
|
|
// Defaults (slightly over half the work time) but ensure none are above 100
|
|
|
|
// SCAN_TIME - delay after sending work
|
|
|
|
// RES_TIME - delay between checking for results
|
|
|
|
#define BAM_SCAN_TIME 20
|
|
|
|
#define BAM_RES_TIME 2
|
|
|
|
#define BAS_SCAN_TIME 360
|
|
|
|
#define BAS_RES_TIME 36
|
|
|
|
#define BAL_SCAN_TIME 720
|
|
|
|
#define BAL_RES_TIME 72
|
|
|
|
#define BAJ_SCAN_TIME 1000
|
|
|
|
#define BAJ_RES_TIME 100
|
|
|
|
#define BFLSC_MAX_SLEEP 2000
|
|
|
|
|
|
|
|
#define BAJ_LATENCY LATENCY_STD
|
|
|
|
#define BAL_LATENCY 12
|
|
|
|
#define BAS_LATENCY 12
|
|
|
|
// For now a BAM doesn't really exist - it's currently 8 independent BASs
|
|
|
|
#define BAM_LATENCY 2
|
|
|
|
|
|
|
|
#define BFLSC_TEMP_SLEEPMS 5
|
|
|
|
|
|
|
|
#define BFLSC_QUE_SIZE_V1 20
|
|
|
|
#define BFLSC_QUE_FULL_ENOUGH_V1 13
|
|
|
|
#define BFLSC_QUE_WATERMARK_V1 6
|
|
|
|
#define BFLSC_QUE_LOW_V1 2
|
|
|
|
|
|
|
|
// TODO: use 5 batch jobs
|
|
|
|
// TODO: base these numbers on the chip count?
|
|
|
|
#define BFLSC_QUE_SIZE_V2 40
|
|
|
|
#define BFLSC_QUE_FULL_ENOUGH_V2 36
|
|
|
|
#define BFLSC_QUE_WATERMARK_V2 32
|
|
|
|
#define BFLSC_QUE_LOW_V2 8
|
|
|
|
|
|
|
|
#define BFLSC_TEMP_OVERHEAT 90
|
|
|
|
// Must drop this far below cutoff before resuming work
|
|
|
|
#define BFLSC_TEMP_RECOVER 5
|
|
|
|
|
|
|
|
// If initialisation fails the first time,
|
|
|
|
// sleep this amount (ms) and try again
|
|
|
|
#define REINIT_TIME_FIRST_MS 100
|
|
|
|
// Max ms per sleep
|
|
|
|
#define REINIT_TIME_MAX_MS 800
|
|
|
|
// Keep trying up to this many us
|
|
|
|
#define REINIT_TIME_MAX 3000000
|
|
|
|
|
|
|
|
int opt_bflsc_overheat;
|
|
|
|
|
|
|
|
#endif /* BFLSC_H */
|