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 : }
|