aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/include/uhdlib/rfnoc/epid_allocator.hpp
diff options
context:
space:
mode:
authorAlex Williams <alex.williams@ni.com>2019-08-06 18:32:29 -0700
committerMartin Braun <martin.braun@ettus.com>2019-11-26 11:49:36 -0800
commit91e01c484475600fcd659bb433ab86efa5146426 (patch)
treeb551507190e7b230c9c81c4145283966b9a99a9a /host/lib/include/uhdlib/rfnoc/epid_allocator.hpp
parent0fc57b99b9163d919cc4a470b3065ab4cf1c947d (diff)
downloaduhd-91e01c484475600fcd659bb433ab86efa5146426.tar.gz
uhd-91e01c484475600fcd659bb433ab86efa5146426.tar.bz2
uhd-91e01c484475600fcd659bb433ab86efa5146426.zip
rfnoc: Centralize initialization state of SEPs to epid_allocator
Because the initialization state of SEPs is a graph-wide property, link_stream_managers and mgmt_portals cannot rely on their private members to determine if they can reset an SEP. Move the call to init SEPs into the epid_allocator, and have it call into a mgmt_portal to gain access to the SEP. Thus, link_stream_managers only request that an epid_allocator ensure an SEP is numbered and initialized, and they provide a path to communicate with the SEP. The epid_allocator will ensure init only happens once, so a stream currently running on another link_stream_manager does not get interrupted. This could happen, for example, if the OSTRM went to one device, and the ISTRM came from another. In general, EPIDs should only be assigned once.
Diffstat (limited to 'host/lib/include/uhdlib/rfnoc/epid_allocator.hpp')
-rw-r--r--host/lib/include/uhdlib/rfnoc/epid_allocator.hpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/host/lib/include/uhdlib/rfnoc/epid_allocator.hpp b/host/lib/include/uhdlib/rfnoc/epid_allocator.hpp
index ec23dcb50..8306b98a4 100644
--- a/host/lib/include/uhdlib/rfnoc/epid_allocator.hpp
+++ b/host/lib/include/uhdlib/rfnoc/epid_allocator.hpp
@@ -7,6 +7,7 @@
#ifndef INCLUDED_LIBUHD_EPID_ALLOCATOR_HPP
#define INCLUDED_LIBUHD_EPID_ALLOCATOR_HPP
+#include <uhdlib/rfnoc/mgmt_portal.hpp>
#include <uhdlib/rfnoc/rfnoc_common.hpp>
#include <map>
#include <memory>
@@ -27,12 +28,24 @@ public:
epid_allocator(epid_allocator&& rhs) = delete;
/*! \brief Allocate an EPID for the specified endpoint.
+ * Does not initialize the specified endpoint (ideal for SW endpoints).
*
* \param addr The physical address (device, instance) of the stream endpoint
* \return The allocated EPID
*/
sep_id_t allocate_epid(const sep_addr_t& addr);
+ /*! \brief Allocate an EPID for the specified endpoint.
+ * Also initialize the specified endpoint.
+ *
+ * \param addr The physical address (device, instance) of the stream endpoint
+ * \param mgmt_portal The management portal to use for initializing the SEP/EPID
+ * \param chdr_ctrl_xport The ctrl xport to use for initializing the SEP/EPID
+ * \return The allocated EPID
+ */
+ sep_id_t allocate_epid(const sep_addr_t& addr, mgmt::mgmt_portal& mgmt_portal,
+ chdr_ctrl_xport& xport);
+
/*! \brief Get a pre-allocated EPID. Throws an exception is not allocated
*
* \param addr The physical address (device, instance) of the stream endpoint