LCOV - code coverage report
Current view: top level - src - device_file.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 59 106 55.7 %
Date: 2025-09-09 12:09:29 Functions: 6 12 50.0 %

          Line data    Source code
       1             : #include "device.hpp"
       2             : #include "log.hpp"
       3             : 
       4             : 
       5          27 : FileDevice::FileDevice(ConfigFile& cfg, unsigned dev_no)
       6          54 :     : Device(dev_no, cfg.resource.vid, cfg.resource.did, cfg.get_device_cid(dev_no)),
       7          27 :     m_locks(0), m_regmap(cfg.regmap), m_channels(cfg.channels),
       8          27 :     m_block_size(cfg.block_size), m_trailer_size(32), m_wide_mode(0), m_max_tlp_bytes(cfg.max_tlp_bytes),
       9          27 :     m_toflx_dmaid(cfg.toflx_dmaid), m_trickle_dmaid(6), m_status_leds(0), m_busy(0)
      10             : {   
      11          27 :     m_firmware_type         = cfg.firmware;
      12          27 :     m_fromHostDataFormat    = static_cast<flx_fromhost_format>(cfg.fromHostDataFormat);
      13          27 :     m_toHostDataFormat      = static_cast<flx_tohost_format>(cfg.toHostDataFormat);
      14             : 
      15          50 :     for (auto dma_elinks_pair : cfg.elinks) {
      16          23 :         int dmaid = dma_elinks_pair.first;
      17          23 :         uint8_t is_to_flx = (dmaid == m_toflx_dmaid || dmaid == m_trickle_dmaid);
      18          60 :         for (uint16_t elink : dma_elinks_pair.second) {
      19          37 :             bool is_ttc = (elink == TTC2HOST_LINK(m_channels)) ? true : false;
      20          37 :             felix_id_t fid = get_fid_from_ids(m_did, m_cid, elink, 0, m_vid, is_to_flx, is_ttc);
      21          37 :             elink_type_t type = is_ttc ? elink_type_t::TTC : elink_type_t::DAQ;
      22          37 :             encoding_t enc = is_ttc ? encoding_t::ENC_TTC : encoding_t::ENC_8b10b;
      23          37 :             m_enabled_elinks[dmaid].emplace_back(fid, elink, false, type, enc);
      24             :         }      
      25          23 :     }
      26             : 
      27          31 :     for (auto dma_elinks_pair : cfg.elinks_with_streams) {
      28           4 :         int dmaid = dma_elinks_pair.first;
      29           4 :         uint8_t is_to_flx = (dmaid == m_toflx_dmaid || dmaid == m_trickle_dmaid);
      30           8 :         for (uint16_t elink : dma_elinks_pair.second) {
      31           4 :             elink_type_t type = elink_type_t::DAQ;
      32           4 :             encoding_t enc = encoding_t::ENC_8b10b;
      33           4 :             felix_id_t fid = get_fid_from_ids(m_did, m_cid, elink, 0, m_vid, is_to_flx, false);
      34           4 :             m_enabled_elinks[dmaid].emplace_back(fid, elink, true, type, enc);
      35             :         }
      36           4 :     }
      37             : 
      38          27 : }
      39             : 
      40             : 
      41           5 : FileDevice::FileDevice(unsigned dev_no)
      42             :     : Device(dev_no, 0, 0, dev_no),
      43           5 :     m_locks(0), m_regmap(REGMAP_VERSION), m_channels(24),
      44           5 :     m_block_size(1024), m_trailer_size(32), m_wide_mode(0), m_max_tlp_bytes(32),
      45           5 :     m_toflx_dmaid(5), m_trickle_dmaid(6), m_status_leds(0), m_busy(0)
      46             : { 
      47           5 :     m_toHostDataFormat = TOHOST_SUBCHUNK_TRAILER;
      48           5 : }
      49             : 
      50          37 : int FileDevice::open_device(u_int lock_mask)
      51             : {
      52          37 :     if (lock_mask != 0 && lock_mask == m_locks){
      53           0 :         LOG_ERR("Device locked. Current locked mask 0x%x", m_locks);
      54             :     }
      55          37 :     m_locks = lock_mask;
      56             : 
      57          37 :     u_long major = (m_regmap & 0xFF00) >> 8;
      58          37 :     u_long minor = (m_regmap & 0x00FF) >> 0;
      59          37 :     LOG_INFO("  regmap version %lu.%lu", major, minor);
      60          37 :     if ( has_wrong_rm()){
      61           0 :         LOG_ERR("felix-star compiled for register map 0x%x, firmware uses 0x%x\n", REGMAP_VERSION, m_regmap);
      62           0 :         return 1;
      63             :     }
      64             :     
      65             :     // only initialize m_fromHostDataFormat if not already set
      66          37 :     if (m_regmap < 0x500 and m_fromHostDataFormat == UN_INITIALIZED){
      67           0 :         m_fromHostDataFormat = FROMHOST_FORMAT_REGMAP4;
      68           0 :         m_trailer_size = 2;
      69           0 :         m_block_size = 1024;
      70          37 :     } else if (m_fromHostDataFormat == UN_INITIALIZED){
      71           5 :         m_fromHostDataFormat = FROMHOST_FORMAT_HDR32_PACKET32;
      72           5 :         m_trailer_size = 4;
      73             :     }
      74             :     return 0;
      75             : }
      76             : 
      77             : 
      78           1 : void FileDevice::set_register(const char *key, uint64_t value)
      79             : {
      80           1 :     if (!strcmp(key, "STATUS_LEDS")) {
      81           0 :         m_status_leds = value;
      82           1 :     } else if (!strcmp(key, "TTC_DEC_CTRL_MASTER_BUSY")) {
      83           1 :         m_busy = value;
      84             :     }
      85           1 : }
      86             : 
      87             : 
      88           3 : uint64_t FileDevice::get_register(const char *key)
      89             : {
      90           3 :     if (!strcmp(key, "STATUS_LEDS")) {
      91           0 :         return m_status_leds;
      92           3 :     } else if (!strcmp(key, "REG_MAP_VERSION")) {
      93           0 :         return m_regmap;
      94           3 :     } else if (!strcmp(key, "PCIE_ENDPOINT")) {
      95           1 :         return m_device_number;
      96           2 :     } else if (!strcmp(key, "TTC_DEC_CTRL_MASTER_BUSY")) {
      97           2 :         return m_busy;
      98           0 :     } else if (!strcmp(key, "FPGA_DNA")) {
      99             :         return 0x012007c004500580;
     100           0 :     } else if (!strcmp(key, "FPGA_CORE_TEMP")) {
     101             :         return 2688;
     102           0 :     } else if (!strcmp(key, "TACH_CNT")) {
     103             :         return 67285;
     104           0 :     } else if (!strcmp(key, "MMCM_MAIN_MAIN_INPUT")) {
     105             :         return 2;
     106           0 :     } else if (!strcmp(key, "MMCM_MAIN_PLL_LOCK")) {
     107             :         return 1;
     108           0 :     } else if (!strcmp(key, "FIRMWARE_MODE")) {
     109             :         return 0;
     110           0 :     } else if (!strcmp(key, "BOARD_ID_TIMESTAMP")) {
     111             :         return 0x2006112009;
     112           0 :     } else if (!strcmp(key, "GIT_HASH")) {
     113             :         return 0xd20ac176;
     114           0 :     } else if (!strcmp(key, "GBT_ALIGNMENT_DONE")) {
     115             :         return 0x0;
     116           0 :     } else if (!strcmp(key, "GBT_ERROR")) {
     117             :         return 0x0;
     118           0 :     } else if (!strcmp(key, "NUM_OF_CHANNELS")) {
     119           0 :         return 12;
     120             :     }
     121             :     return 0;
     122             : }
     123             : 
     124             : 
     125           0 : void FileDevice::add_enabled_elink(Elink e, int dmaid)
     126             : {
     127           0 :     std::vector<Elink>& elinks_dmaid = m_enabled_elinks[dmaid];
     128           0 :     LOG_INFO("Enabling elink %u on dmaid %d", e.lid, dmaid);
     129           0 :     elinks_dmaid.push_back(e);
     130           0 : }
     131             : 
     132             : 
     133         115 : std::vector<Elink> FileDevice::read_enabled_elinks(int dmaid)
     134             : {
     135         115 :     return m_enabled_elinks.at(dmaid);
     136             : }
     137             : 
     138             : 
     139           0 : bool FileDevice::dma_enabled(int dmaid)
     140             : {
     141           0 :     return true;
     142             : }
     143             : 
     144             : 
     145           0 : void FileDevice::dma_to_host(DmaBuffer* buf, int dmaid)
     146             : {
     147           0 :     buf->pend = buf->paddr + buf->size;
     148           0 :     buf->pc_ptr = buf->paddr;
     149           0 :     buf->emu_fw_ptr = buf->paddr;
     150           0 : }
     151             : 
     152             : 
     153           0 : uint64_t FileDevice::get_broadcast_enable_gen(u_int channel)
     154             : {
     155           0 :     return 0;
     156             : }
     157             : 
     158             : 
     159           0 : bool FileDevice::elink_has_stream_id(u_int channel, u_int egroup, u_int epath)
     160             : {
     161           0 :     return true;
     162             : }
     163             : 
     164             : 
     165           0 : monitoring_data_t FileDevice::hw_get_monitoring_data(unsigned int mon_mask)
     166             : {
     167           0 :     monitoring_data_t mondata;
     168             :     //no need of emulating the readout of all parameters.
     169           0 :     if( mon_mask & FPGA_MONITOR )
     170             :     {
     171           0 :         mondata.fpga.temperature = 70;
     172           0 :         mondata.fpga.vccint = 10;
     173           0 :         mondata.fpga.vccaux = 1;
     174           0 :         mondata.fpga.vccbram = 1;
     175           0 :         mondata.fpga.fanspeed = 8000;
     176           0 :         mondata.fpga.dna = 0x1000000000000;
     177             :     }
     178           0 :     return mondata;
     179             : }

Generated by: LCOV version 1.0