aboutsummaryrefslogtreecommitdiffstats
path: root/host/include
diff options
context:
space:
mode:
authorCiro Nishiguchi <ciro.nishiguchi@ni.com>2018-09-28 13:06:20 -0500
committerMartin Braun <martin.braun@ettus.com>2018-10-11 13:16:22 -0700
commit64bbe1e39ca71499074b7af16a8df389b84203fd (patch)
tree9680c58553925cc3730b2cf316d924556eb70828 /host/include
parent71300593e5c0c6af4116d8706c9762f808dbf441 (diff)
downloaduhd-64bbe1e39ca71499074b7af16a8df389b84203fd.tar.gz
uhd-64bbe1e39ca71499074b7af16a8df389b84203fd.tar.bz2
uhd-64bbe1e39ca71499074b7af16a8df389b84203fd.zip
uhd: Add traffic counter to null source sink
Diffstat (limited to 'host/include')
-rw-r--r--host/include/uhd/rfnoc/traffic_counter.hpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/host/include/uhd/rfnoc/traffic_counter.hpp b/host/include/uhd/rfnoc/traffic_counter.hpp
new file mode 100644
index 000000000..4077596cd
--- /dev/null
+++ b/host/include/uhd/rfnoc/traffic_counter.hpp
@@ -0,0 +1,81 @@
+//
+// Copyright 2018 Ettus Research, a National Instruments Company
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+
+#ifndef INCLUDED_LIBUHD_TRAFFIC_COUNTER_HPP
+#define INCLUDED_LIBUHD_TRAFFIC_COUNTER_HPP
+
+#include <uhd/property_tree.hpp>
+#include <stdint.h>
+#include <memory>
+#include <functional>
+#include <type_traits>
+
+namespace uhd {
+ namespace rfnoc {
+
+class traffic_counter
+{
+public:
+ typedef std::shared_ptr<traffic_counter> sptr;
+ typedef std::function<void(const uint32_t addr, const uint32_t data)> write_reg_fn_t ;
+ typedef std::function<uint64_t(const uint32_t addr)> read_reg_fn_t ;
+
+ traffic_counter(
+ uhd::property_tree::sptr tree,
+ uhd::fs_path root_path,
+ write_reg_fn_t write_reg_fn,
+ read_reg_fn_t read_reg_fn
+ ) :
+ _write_reg_fn(write_reg_fn),
+ _read_reg_fn(read_reg_fn)
+ {
+ const uint32_t id_reg_offset = 0;
+ const uint32_t first_counter_offset = 1;
+ const uint64_t traffic_counter_id = 0x712AFF1C00000000ULL;
+
+ // Check traffic counter id to determine if it's present
+ const uint64_t id = _read_reg_fn(id_reg_offset);
+
+ // If present, add properties
+ if (id == traffic_counter_id)
+ {
+ tree->create<bool>(root_path/"traffic_counter/enable")
+ .add_coerced_subscriber([this](const bool enable) {
+ uint32_t val = enable? 1 : 0;
+ return _write_reg_fn(0, val);
+ }).set(false);
+
+ const char* counters[] = {
+ "bus_clock_ticks",
+ "xbar_to_shell_last",
+ "xbar_to_shell_valid",
+ "xbar_to_shell_ready",
+ "shell_to_xbar_last",
+ "shell_to_xbar_valid",
+ "shell_to_xbar_ready",
+ "shell_to_ce_last",
+ "shell_to_ce_valid",
+ "shell_to_ce_ready",
+ "ce_to_shell_last",
+ "ce_to_shell_valid",
+ "ce_to_shell_ready"};
+
+ for (size_t i = 0; i < std::extent<decltype(counters)>::value; i++) {
+ tree->create<uint64_t>(root_path/"traffic_counter"/counters[i])
+ .set_publisher([this, i, first_counter_offset]() {
+ return _read_reg_fn(i+first_counter_offset);
+ });
+ }
+ }
+ }
+private:
+ write_reg_fn_t _write_reg_fn;
+ read_reg_fn_t _read_reg_fn;
+};
+
+}} /* namespace uhd::rfnoc */
+
+#endif /* INCLUDED_LIBUHD_TRAFFIC_COUNTER_HPP */