26#include "flxcard/flx_common.h"
27#include "regmap/regmap.h"
28#include "flxcard/LinkConfig.h"
31#define NUM_INTERRUPTS 8
32#define FLX_GBT_FILE_NOT_FOUND -1
33#define FLX_GBT_VERSION_NOT_FOUND -2
34#define FLX_GBT_TMODE_FEC 0
35#define FLX_GBT_ALIGNMENT_CONTINUOUS 0
36#define FLX_DMA_WRAPAROUND 1
37#define FLX_GBT_ALIGNMENT_ONE 1
38#define FLX_GBT_CHANNEL_AUTO 1
39#define FLX_GBT_TMODE_WideBus 1
48#define FIRMW_FELIG_GBT 6
53#define FIRMW_INTERLAKEN 10
54#define FIRMW_FELIG_LPGBT 11
55#define FIRMW_HGTD_LUMI 12
56#define FIRMW_BCM_PRIME 13
57#define FIRMW_FELIG_PIXEL 14
58#define FIRMW_FELIG_STRIP 15
59#define FIRMW_WUPPER 16
61const std::vector<std::string> FIRMW_STR{
"GBT",
"FULL",
"LTDB",
"FEI4",
"PIXEL",
62 "STRIP",
"FELIG",
"FM-EMU",
"MROD",
"LPGBT",
63 "INTERLAKEN",
"FELIG-LPGBT",
"HGTD-LUMI",
64 "BCM-PRIME",
"FELIG-PIXEL",
"FELIG-STRIP",
68#define ALL_IRQS 0xFFFFFFFF
71#define FPGA_MONITOR 0x001
72#define POD_MONITOR_ALL 0x002
73#define POWER_MONITOR 0x004
74#define FIREFLY_MONITOR 0x008
75#define POD_MONITOR_LOS 0x100
76#define POD_MONITOR_TEMP_VOLT 0x200
77#define POD_MONITOR_POWER 0x400
78#define POD_MONITOR_POWER_RX 0x800
80#define POD_MONITOR POD_MONITOR_ALL
83#define LOCK_NONE 0x0000
84#define LOCK_DMA0 0x0001
85#define LOCK_DMA1 0x0002
86#define LOCK_I2C 0x0004
87#define LOCK_FLASH 0x0008
88#define LOCK_ELINK 0x0010
89#define LOCK_READ_CONFIG 0x0020
90#define LOCK_ALL 0xFFFFFFFF
91#define LOCK_DMA(n) (1<<(16+n))
94#define ALL_BITS 0xFFFFFFFFFFFFFFFF
99 volatile u_long start_address;
100 volatile u_long end_address;
101 volatile u_long tlp :11;
102 volatile u_long fromhost : 1;
103 volatile u_long wrap_around : 1;
104 volatile u_long reserved :51;
105 volatile u_long sw_pointer;
110 volatile u_long fw_pointer;
111 volatile u_long descriptor_done : 1;
112 volatile u_long even_addr_dma : 1;
113 volatile u_long even_addr_pc : 1;
118 volatile u_int control;
120 volatile u_long address;
125 volatile u_long date_time : 40;
126 volatile u_long reserved : 24;
127 volatile u_long revision : 16;
136 volatile u_int BAR0_VALUE;
138 volatile u_int BAR1_VALUE;
140 volatile u_int BAR2_VALUE;
142 volatile u_int DMA_DESC_ENABLE;
144 volatile u_int DMA_RESET;
146 volatile u_int SOFT_RESET;
148 volatile u_int REGISTERS_RESET;
155 volatile u_int INT_TAB_ENABLE;
161 u_int cdmap[MAXCARDS][2];
165typedef struct i2c_device i2c_device_t;
193 int optical_power_uw[12];
199 double vccint_current;
200 double vccint_voltage;
201 double mgtavcc_current;
202 double mgtavcc_voltage;
203 double fpga_internal_diode_temperature;
204 double mgtavtt_current;
205 double mgtavtt_voltage;
206 double mgtavttc_voltage;
207 double mgtvccaux_voltage;
208 double internal_temperature;
215 double pex0p9v_current;
216 double pex0p9v_voltage;
217 double sys18_current;
218 double sys18_voltage;
219 double sys12_voltage;
220 double sys25_current;
221 double sys25_voltage;
222 double pex8732_internal_diode_temperature;
223 double internal_temperature;
232 uint32_t t_remote_hi;
233 uint32_t t_remote_lo;
236 uint32_t manufacturer_id;
243 uint32_t shunt_volt_reg;
244 uint32_t bus_volt_reg;
246 uint32_t current_reg;
248 uint32_t manufacturer_id;
255 uint32_t mfr_special_id;
263 uint32_t temp_ext[2];
270 uint32_t manufacturer_id;
271 uint32_t silicon_rev;
272 uint8_t input_cfg[10][8];
273 uint32_t fault_stat[6];
275 double adc_fullscale[12];
276 std::string adc_name[12];
283 uint32_t ic_device_id;
284 uint64_t ic_device_rev;
286 uint32_t vout_mode[17];
287 uint32_t status_vout[17];
288 std::string vout_name[17];
289 uint32_t vout_uv_warn[17];
290 uint32_t vout_uv_fault[17];
291 uint32_t vout_ov_warn[17];
292 uint32_t vout_ov_fault[17];
303 uint32_t status_summ;
304 uint32_t latched_alarms_tx_los;
305 uint32_t latched_alarms_tx_fault;
306 uint32_t latched_alarms_temp;
307 uint32_t latched_alarms_vcc33;
308 uint32_t latched_alarms_cdr_lol;
311 uint32_t elapsed_optime;
312 uint32_t chan_disable;
313 uint32_t squelch_disable;
314 uint32_t polarity_invert;
315 uint64_t input_equalization;
317 uint32_t mask_tx_los_alarms;
318 uint32_t mask_fault_flags;
319 uint32_t mask_temp_alarms;
320 uint32_t mask_vcc33_alarms;
321 uint32_t mask_cdr_lol_alarms;
322 uint32_t firmware_version;
325 std::string vendor_part;
326 std::string vendor_serial;
337 uint32_t status_summ;
338 uint32_t latched_alarms_rx_los;
339 uint32_t latched_alarms_rx_power;
340 uint32_t latched_alarms_temp;
341 uint32_t latched_alarms_vcc33;
342 uint32_t latched_alarms_cdr_lol;
345 uint32_t elapsed_optime;
346 uint32_t chan_disable;
347 uint32_t output_disable;
348 uint32_t polarity_invert;
349 uint64_t output_swing;
350 uint64_t output_preemphasis;
352 uint32_t firmware_version;
355 std::string vendor_part;
356 std::string vendor_serial;
359 uint32_t optical_power[12];
370 uint32_t latched_alarms_tx_los;
371 uint32_t latched_alarms_tx_fault;
372 uint32_t latched_alarms_cdr_lol;
373 uint32_t latched_alarms_temp;
374 uint32_t latched_alarms_vcc;
375 uint32_t latched_alarms_rx_power;
376 uint32_t elapsed_optime;
380 uint32_t rx_optical_power[4];
381 uint32_t firmware_revision;
382 uint32_t tx_chan_disable;
384 uint32_t cdr_rate_select;
385 uint32_t mask_los_alarms;
386 uint32_t mask_tx_fault_flags;
387 uint32_t mask_cdr_lol_alarms;
388 uint32_t mask_temp_alarms;
389 uint32_t mask_vcc_alarms;
392 std::string vendor_part;
393 std::string vendor_serial;
439 fpga_monitoring_t fpga;
442 ltm_monitoring_t ltm;
450#define TOHEX(n) std::hex << "0x" << (n) << std::dec
512 bool read_config =
false,
513 bool ignore_version =
false );
596 u_int get_lock_mask(
int device_nr ) {
return lock_mask( device_nr ); }
649 void dma_to_host( u_int dma_id, u_long dst,
size_t size, u_int flags );
737 u_long dma_get_read_ptr( u_int dma_id ) {
return dma_get_ptr( dma_id ); }
755 u_long dma_get_current_address( u_int dma_id ) {
return dma_get_fw_ptr( dma_id ); }
798 void i2c_read(
const char *device_str, u_char reg_addr, u_char *value,
int nbytes = 1 );
803 void i2c_write(
const char *device_str, u_char reg_addr, u_char data );
804 void i2c_write(
const char *device_str, u_char reg_addr, u_char *data,
int nbytes );
846 int nbytes, uint8_t *bytes );
847 void i2c_read_bytes ( uint8_t dev_addr, uint8_t reg_addr,
848 int nbytes, uint8_t *bytes );
1135 {
return( m_firmwareType<FIRMW_STR.size() ? FIRMW_STR[m_firmwareType] : std::string(
"????") ); }
1191 int ec_elink_tohost_index();
1192 int ec_elink_fromhost_index();
1198 int ic_elink_tohost_index();
1199 int ic_elink_fromhost_index();
1211 fpga_monitoring_t fpga_monitoring();
1215 ltm_monitoring_t power_monitoring_ltm4700();
1218 FireFlyMonitorData firefly_monitoring(
int *tx_count = 0,
int *rx_count = 0,
int *tr_count = 0 );
1282 std::string &vendor_part,
1283 std::string &vendor_sn );
1301 void configure( std::string filename,
bool do_links =
true,
bool do_registers =
true );
1308 void read_configuration( std::string filename ) {
readConfiguration(filename); }
1342 std::vector<flxcard::elink_descr_t> elinks_fromhost() {
return elinks_toflx(); }
1344 std::vector<flxcard::elink_descr_t> elinks_toflx_broadcast();
1345 std::vector<flxcard::elink_descr_t> elinks_fromhost_broadcast() {
return elinks_toflx_broadcast(); }
1358 void set_hdlc_instant_timeout(
bool b ) { m_hdlcInstantTimeout = b; }
1359 bool hdlc_instant_timeout( ) {
return m_hdlcInstantTimeout; }
1400 uint32_t number_of_epaths_per_egroup(
bool to_flx =
false );
1402 uint32_t number_of_egroups(
bool to_flx =
false );
1404 uint16_t elink_number( uint32_t channel, uint32_t egroup,
1405 uint32_t epath,
bool to_flx =
false );
1407 uint16_t channel_number( uint32_t elinknr );
1408 uint16_t link_number( uint32_t elinknr ) {
return channel_number(elinknr); }
1410 uint16_t egroup_number( uint32_t elinknr,
bool to_flx =
false );
1412 uint16_t epath_number( uint32_t elinknr,
bool to_flx =
false );
1419 static int m_cardsOpen;
1424 u_int m_firmwareType;
1429 bool m_fullmodeType;
1430 bool m_useDmaIndexMask;
1431 bool m_hdlcInstantTimeout;
1432 u_int m_numberOfEndpoints;
1434 u_int m_numberOfChans;
1435 u_int m_numberOfDma;
1436 u_int m_fromHostDataFormat;
1437 std::string m_firmwareString;
1445 flxcard::LinkConfig m_linkConfig[flxcard::FLX_LINKS + 1];
1448 std::vector<flxcard::regsetting_t> m_regSettings;
1458 volatile flxcard_bar2_regs_t *m_bar2;
1461 i2c_device_t
const *m_i2cDevices;
1468 u_long map_memory_bar( u_long pci_addr,
size_t size );
1469 void unmap_memory_bar( u_long vaddr,
size_t size );
1471 void i2c_wait_not_full( );
1472 void i2c_wait_not_empty( );
1473 int i2c_parse_address_string(
const char *str,
1474 u_char *port1, u_char *port2, u_char *port3,
1476 void i2c_set_switches( u_char switch1_val, u_char switch2_val, u_char switch3_val );
1478 void gbt_tx_configuration(
int channel_tx_mode,
int alignment );
1479 int gbt_rx_configuration(
int channel_rx_mode );
1480 int gbt_software_alignment(
int number_channels );
1481 bool gbt_channel_alignment( u_int channel );
1482 void gbt_topbot_oddeven_set( u_int channel, u_int topbot, u_int oddeven );
1483 bool gbt_topbot_alignment( u_int channel, u_int topbot,
1484 u_long *phase_found, u_int *oddeven );
1485 u_long gbt_shift_phase( u_int channel );
1487 int check_digic_value2(
const char *str, u_long *version, u_long *delay );
1489 std::string lockbits2string( u_int locks );
1491 void configureLinks( flxcard::LinkConfig *link_config,
1492 int *dma_index_invalid_count,
1493 int *unsupported_tohost_elinks_count,
1494 int *unsupported_fromhost_elinks_count );
1496 void lockForConfiguration(
FlxCard &flx );
FlxCard()
The constructor of an FlxCard object only initializes a few class variables. It does not interact wit...
bool uses_dma_index_mask()
Definition FlxCard.h:1356
std::vector< flxcard::elink_descr_t > elinks_toflx()
void configure(std::string filename, bool do_links=true, bool do_registers=true)
unsigned int tohost_elink_dmaid(u_int channel, u_int egroup, u_int epath)
bool has_tohost_elink_streams(u_int channel, u_int egroup, u_int epath)
u_int number_of_elinks_toflx()
void readConfiguration(std::string filename)
bool is_elink_enabled(u_int channel, u_int egroup, u_int epath, bool is_to_flx)
u_int number_of_dma_tohost()
Definition FlxCard.h:1350
u_int number_of_elinks_tohost(int dma_index=-1)
uint16_t connector_id(uint16_t channel)
std::vector< flxcard::elink_descr_t > elinks_tohost(int dma_index=-1)
unsigned int tohost_elink_dmaid(uint16_t elinknr)
void dma_advance_ptr(u_int dma_id, u_long dst, size_t size, size_t bytes)
void dma_to_host(u_int dma_id, u_long dst, size_t size, u_int flags)
void dma_stop(u_int dma_id)
bool dma_enabled(u_int dma_id)
u_long dma_get_fw_ptr(u_int dma_id)
int dma_max_tlp_bytes()
Definition FlxCard.h:629
void dma_set_ptr(u_int dma_id, u_long dst)
void dma_wait(u_int dma_id)
u_long dma_get_ptr(u_int dma_id)
void dma_from_host(u_int dma_id, u_long src, size_t size, u_int flags)
bool dma_cmp_even_bits(u_int dma_id)
static device_list_t device_list()
u_long openBackDoor(int bar)
u_long bar1Address()
Definition FlxCard.h:611
static u_int number_of_devices()
u_long bar2Address()
Definition FlxCard.h:615
void card_open(int device_nr, u_int lock_mask, bool read_config=false, bool ignore_version=false)
static u_int number_of_cards()
static int card_to_device_number(int card_number)
u_int lock_mask(int device_nr)
u_long bar0Address()
Definition FlxCard.h:607
long int gbt_version_delay(u_long svn_version, char *filename)
u_long txusrclk_freq(u_int channel)
void gth_rx_reset(int quad=-1)
u_long rxusrclk_freq(u_int channel)
u_int gbt_setup(int alignment, int channel_mode)
bool i2c_flush(u_int *count=0)
void i2c_write(const char *device_str, u_char reg_addr, u_char data)
u_char i2c_read_byte(u_char dev_addr, u_char reg_addr)
void i2c_write_byte(u_char dev_addr, u_char byte)
void i2c_read(const char *device_str, u_char reg_addr, u_char *value, int nbytes=1)
void i2c_write_byte(u_char dev_addr, u_char reg_addr, u_char byte)
void i2c_write_bytes(uint8_t dev_addr, uint8_t reg_addr, int nbytes, uint8_t *bytes)
void irq_enable(u_int interrupt=ALL_IRQS)
void irq_disable(u_int interrupt=ALL_IRQS)
void irq_wait(u_int interrupt)
void irq_cancel(u_int interrupt=ALL_IRQS)
void irq_clear(u_int interrupt=ALL_IRQS)
void irq_reset_counters(u_int interrupt=ALL_IRQS)
double fpga_temperature()
bool firefly_detect(const std::string &device_name, std::string &vendor_part, std::string &vendor_sn)
std::vector< int > minipods_temperature()
std::vector< std::pair< std::string, std::vector< int > > > firefly_optical_power()
std::vector< std::pair< std::string, std::vector< int > > > minipods_optical_power()
monitoring_data_t get_monitoring_data(u_int mon_mask)
static regmap_bitfield_t * cfg_bitfield(const char *name)
void cfg_set_reg(const char *key, u_long value)
u_long cfg_get_option(const char *key, bool show_options=false)
void cfg_set_option(const char *key, u_long value, bool show_options=false)
u_long cfg_get_reg(const char *key)
static regmap_register_t * cfg_register(const char *name)
static std::string cfg_bitfield_options(const char *name, bool include_all_substr=true)