1414#include " du_low_config_translator.h"
1515#include " srsran/du/du_low/du_low_wrapper_factory.h"
1616#include " srsran/ran/slot_pdu_capacity_constants.h"
17+ #ifdef DPDK_FOUND
18+ #include " srsran/hal/dpdk/bbdev/bbdev_acc.h"
19+ #include " srsran/hal/dpdk/bbdev/bbdev_acc_factory.h"
20+ #include " srsran/hal/phy/upper/channel_processors/hw_accelerator_factories.h"
21+ #include " srsran/hal/phy/upper/channel_processors/pusch/ext_harq_buffer_context_repository_factory.h"
22+ #include " srsran/hal/phy/upper/channel_processors/pusch/hw_accelerator_factories.h"
23+ #endif // DPDK_FOUND
1724
1825using namespace srsran ;
1926
@@ -55,7 +62,6 @@ static void generate_dl_processor_config(downlink_processor_factory_sw_config& o
5562void srsran::make_du_low_wrapper_config_and_dependencies (
5663 srs_du::du_low_wrapper_config& out_cfg,
5764 const du_low_unit_config& du_low_unit_cfg,
58- const hal_upper_phy_config& hal_config,
5965 std::vector<srs_du::cell_prach_ports_entry> prach_ports,
6066 span<const srs_du::du_cell_config> du_cells,
6167 span<const unsigned > max_puschs_per_slot,
@@ -66,8 +72,90 @@ void srsran::make_du_low_wrapper_config_and_dependencies(
6672{
6773 out_cfg.du_low_cfg .logger = &srslog::fetch_basic_logger (" DU" );
6874
69- generate_du_low_wrapper_config (
70- out_cfg, du_low_unit_cfg, hal_config, std::move (prach_ports), du_cells, max_puschs_per_slot, du_id);
75+ // Initialize hardware-accelerator (only if needed).
76+ hal_upper_phy_config hal_config = {};
77+ hal_config.hwacc_pdsch_processor = false ;
78+ hal_config.hwacc_pusch_processor = false ;
79+ #ifdef DPDK_FOUND
80+ if (du_low_unit_cfg.hal_config && du_low_unit_cfg.hal_config ->bbdev_hwacc &&
81+ !du_low_unit_cfg.hal_config ->bbdev_hwacc ->hwacc_type .empty ()) {
82+ const bbdev_appconfig& bbdev_app_cfg = du_low_unit_cfg.hal_config ->bbdev_hwacc .value ();
83+ srslog::basic_logger& hwacc_logger = srslog::fetch_basic_logger (" HWACC" , false );
84+ hwacc_logger.set_level (du_low_unit_cfg.loggers .hal_level );
85+
86+ hal::bbdev_hwacc_pdsch_enc_factory_configuration hwacc_pdsch_enc_cfg = {};
87+ hal::bbdev_hwacc_pusch_dec_factory_configuration hwacc_pusch_dec_cfg = {};
88+ std::shared_ptr<hal::ext_harq_buffer_context_repository> harq_buffer_context = nullptr ;
89+ unsigned nof_hwacc_dus = du_cells.size ();
90+
91+ // Create a bbdev accelerator factory.
92+ std::unique_ptr<dpdk::bbdev_acc_factory> bbdev_acc_factory =
93+ dpdk::create_bbdev_acc_factory (bbdev_app_cfg.bbdev_acc_type );
94+ report_error_if_not (bbdev_acc_factory,
95+ " Unable to create the {} bbdev hardware-accelerator interface factory." ,
96+ bbdev_app_cfg.bbdev_acc_type );
97+
98+ // Intefacing to the bbdev-based hardware-accelerator.
99+ dpdk::bbdev_acc_configuration bbdev_config;
100+ bbdev_config.id = bbdev_app_cfg.id ;
101+ if (bbdev_app_cfg.pdsch_enc && bbdev_app_cfg.pdsch_enc ->nof_hwacc > 0 ) {
102+ bbdev_config.nof_ldpc_enc_lcores = nof_hwacc_dus * bbdev_app_cfg.pdsch_enc ->nof_hwacc ;
103+ }
104+ if (bbdev_app_cfg.pusch_dec && bbdev_app_cfg.pusch_dec ->nof_hwacc > 0 ) {
105+ bbdev_config.nof_ldpc_dec_lcores = nof_hwacc_dus * bbdev_app_cfg.pusch_dec ->nof_hwacc ;
106+ }
107+ // If no msg_mbuf size is defined, a worst-case value will be used.
108+ bbdev_config.msg_mbuf_size = bbdev_app_cfg.msg_mbuf_size .value_or (RTE_BBDEV_LDPC_E_MAX_MBUF);
109+ // If no rm_mbuf size is defined, a worst-case value will be used.
110+ bbdev_config.rm_mbuf_size = bbdev_app_cfg.rm_mbuf_size .value_or (RTE_BBDEV_LDPC_E_MAX_MBUF);
111+ // If no number of mbufs is defined, a worst-case value will be used.
112+ bbdev_config.nof_mbuf = bbdev_app_cfg.nof_mbuf .value_or (static_cast <unsigned >(pow2 (log2_ceil (MAX_NOF_SEGMENTS))));
113+ std::shared_ptr<dpdk::bbdev_acc> bbdev_accelerator = bbdev_acc_factory->create (bbdev_config, hwacc_logger);
114+ report_error_if_not (bbdev_accelerator, " Unable to open the {} hardware-accelerator." , bbdev_app_cfg.hwacc_type );
115+
116+ // Configure the hardware-accelerated PDSCH encoding factory (only if needed).
117+ if (bbdev_app_cfg.pdsch_enc && bbdev_app_cfg.pdsch_enc ->nof_hwacc > 0 ) {
118+ hwacc_pdsch_enc_cfg.acc_type = bbdev_app_cfg.hwacc_type ;
119+ hwacc_pdsch_enc_cfg.bbdev_accelerator = bbdev_accelerator;
120+ hwacc_pdsch_enc_cfg.cb_mode = bbdev_app_cfg.pdsch_enc ->cb_mode ;
121+ // If no maximum buffer size is defined, a worst-case value will be used.
122+ hwacc_pdsch_enc_cfg.max_tb_size = bbdev_app_cfg.pdsch_enc ->max_buffer_size .value_or (RTE_BBDEV_LDPC_E_MAX_MBUF);
123+ hwacc_pdsch_enc_cfg.dedicated_queue = bbdev_app_cfg.pdsch_enc ->dedicated_queue ;
124+ hal_config.hwacc_pdsch_processor = true ;
125+ hal_config.hwacc_pdsch_enc_cfg = hwacc_pdsch_enc_cfg;
126+ }
127+
128+ // Configure the hardware-accelerated PUSCH decoding factory (only if needed).
129+ if (bbdev_app_cfg.pusch_dec && bbdev_app_cfg.pusch_dec ->nof_hwacc > 0 ) {
130+ hwacc_pusch_dec_cfg.acc_type = bbdev_app_cfg.hwacc_type ;
131+ hwacc_pusch_dec_cfg.bbdev_accelerator = bbdev_accelerator;
132+ hwacc_pusch_dec_cfg.ext_softbuffer = bbdev_app_cfg.pusch_dec ->ext_softbuffer ;
133+ if (hwacc_pusch_dec_cfg.ext_softbuffer ) {
134+ // Set up an external HARQ buffer context repository.
135+ unsigned nof_cbs = bbdev_app_cfg.pusch_dec ->harq_context_size .value_or (MAX_NOF_SEGMENTS);
136+ uint64_t ext_harq_buff_size = bbdev_accelerator->get_harq_buff_size_bytes ();
137+ harq_buffer_context = hal::create_ext_harq_buffer_context_repository (nof_cbs, ext_harq_buff_size, false );
138+ report_error_if_not (harq_buffer_context,
139+ " Unable to create the external HARQ buffer context for the {} hardware-accelerator." ,
140+ bbdev_app_cfg.hwacc_type );
141+ hwacc_pusch_dec_cfg.harq_buffer_context = harq_buffer_context;
142+ }
143+ hwacc_pusch_dec_cfg.dedicated_queue = bbdev_app_cfg.pusch_dec ->dedicated_queue ;
144+ hal_config.hwacc_pusch_processor = true ;
145+ hal_config.hwacc_pusch_dec_cfg = hwacc_pusch_dec_cfg;
146+ }
147+ }
148+ #endif // DPDK_FOUND
149+
150+ generate_du_low_wrapper_config (out_cfg, du_low_unit_cfg, du_cells, max_puschs_per_slot, du_id);
151+
152+ // Fill the hal config.
153+ for (auto & cell : out_cfg.du_low_cfg .cells ) {
154+ cell.upper_phy_cfg .hal_config = hal_config;
155+ }
156+
157+ // Fill the PRACH ports.
158+ out_cfg.prach_ports = std::move (prach_ports);
71159
72160 // Fill the workers information.
73161 for (unsigned i = 0 , e = out_cfg.du_low_cfg .cells .size (); i != e; ++i) {
0 commit comments