102 lines
5.2 KiB
C++
102 lines
5.2 KiB
C++
// Copyright (2019-2023) Paul Scherrer Institute
|
|
|
|
#include <iostream>
|
|
#include <bitset>
|
|
|
|
#include "../common/NetworkAddressConvert.h"
|
|
#include "../common/JFJochException.h"
|
|
#include "PCIExpressDevice.h"
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
if (argc != 2) {
|
|
std::cout << "Usage: ./jfjoch_pcie_status <device name>" << std::endl;
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
std::cout << "Device " << argv[1] << std::endl;
|
|
std::cout << std::endl;
|
|
try {
|
|
PCIExpressDevice test(argv[1], 0);
|
|
auto status = test.GetStatus();
|
|
|
|
std::cout << "PCIe/JFJoch card detected " << std::endl;
|
|
std::cout << "Git SHA1 " << std::hex << status.git_sha1() << std::endl;
|
|
std::cout << "Max modules " << std::dec << status.max_modules() << std::endl;
|
|
std::cout << "NUMA node " << test.GetNUMANode() << std::endl;
|
|
std::cout << "Ethernet aligned " << (status.ethernet_rx_aligned() ? "Yes" : "No") << std::endl;
|
|
|
|
std::cout << "FPGA 12V rail current [A] " << status.current_edge_12v_a() << std::endl;
|
|
std::cout << "FPGA 12V rail voltage [V] " << status.voltage_edge_12v_v() << std::endl;
|
|
std::cout << "FPGA 3.3V rail current [A] " << status.current_edge_3p3v_a() << std::endl;
|
|
std::cout << "FPGA 3.3V rail voltage [V] " << status.voltage_edge_3p3v_v() << std::endl;
|
|
std::cout << "FPGA temperature " << status.fpga_temp_degc() << std::endl;
|
|
std::cout << "HBM temperature #0 " << status.hbm_temp_0_degc() << std::endl;
|
|
std::cout << "HBM temperature #1 " << status.hbm_temp_1_degc() << std::endl;
|
|
std::cout << "HBM size (MiB) " << status.hbm_size_bytes() / static_cast<double>(1024 * 1024) << std::endl;
|
|
std::cout << "Data collection idle " << status.fpga_idle() << std::endl;
|
|
std::cout << "Host writer idle " << status.host_writer_idle() << std::endl;
|
|
std::cout << "Data collection cancel " << status.cancel_bit() << std::endl;
|
|
|
|
std::cout << "Full status register " << std::bitset<32>(status.full_status_register()) << std::endl;
|
|
|
|
std::cout << "Stalls HBM " << status.stalls_hbm() << std::endl;
|
|
std::cout << "Stalls host mem " << status.stalls_host() << std::endl;
|
|
|
|
ActionConfig cfg = test.ReadActionRegister();
|
|
std::cout << "MAC address " << test.GetMACAddress() << std::endl;
|
|
std::cout << "IPv4 address " << test.GetIPv4Address() << std::endl;
|
|
std::cout << "Data collection mode (hex) " << std::hex << (cfg.mode & 0xFFFF) << std::dec << std::endl;
|
|
std::cout << "Data collection ID (hex) " << std::hex << ((cfg.mode & 0xFFFF0000) >> 16) << std::dec << std::endl;
|
|
std::cout << "Modules " << std::dec << cfg.nmodules << std::endl;
|
|
std::cout << "Frames int. pkt. gen. " << std::dec << cfg.nframes << std::endl;
|
|
std::cout << std::endl;
|
|
std::cout << "FPGA FIFO status: " << std::endl;
|
|
for (const auto &i: status.fifo_status()) {
|
|
std::string s = i.name();
|
|
s.resize(28, ' ');
|
|
switch (i.value()) {
|
|
case JFJochProtoBuf::FPGAFIFOStatusEnum::EMPTY:
|
|
s += "Empty";
|
|
break;
|
|
case JFJochProtoBuf::FPGAFIFOStatusEnum::FULL:
|
|
s += "Full";
|
|
break;
|
|
case JFJochProtoBuf::FPGAFIFOStatusEnum::PARTIAL:
|
|
s += "Partial";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
std::cout << s << std::endl;
|
|
}
|
|
|
|
if (!status.host_writer_err().empty()) {
|
|
std::cout << "FPGA host writer errors: " << std::endl;
|
|
for (const auto &i: status.host_writer_err())
|
|
std::cout << " " << i << std::endl;
|
|
}
|
|
|
|
std::cout << std::endl;
|
|
std::cout << "Packet counters - ETH " << status.packets_ether() << std::endl;
|
|
std::cout << " - UDP " << status.packets_udp() << std::endl;
|
|
std::cout << " - SLS " << status.packets_sls() << std::endl;
|
|
std::cout << " - ICMP " << status.packets_icmp() << std::endl;
|
|
std::cout << " - JFJoch " << status.packets_jfjoch() << std::endl;
|
|
std::cout << std::endl;
|
|
|
|
std::cout << " - err. ETH " << status.error_eth() << std::endl;
|
|
std::cout << " - err. len. " << status.error_packet_len() << std::endl;
|
|
std::cout << std::endl;
|
|
|
|
std::cout << "H2C descriptors:" << status.pcie_h2c_descriptors() << " beats: " << status.pcie_h2c_beats()
|
|
<< " status:" << status.pcie_h2c_status() << std::endl;
|
|
std::cout << "C2H descriptors:" << status.pcie_c2h_descriptors() << " beats: " << status.pcie_c2h_beats()
|
|
<< " status:" << status.pcie_c2h_status() << std::endl;
|
|
|
|
std::cout << std::endl;
|
|
} catch (const JFJochException &e) {
|
|
std::cout << e.what() << std::endl;
|
|
std::cout << std::endl;
|
|
}
|
|
|
|
} |