1 /******************************************************************************
3 * Copyright (c) 2019 Intel.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 *******************************************************************************/
18 #include "nr5g_fapi_framework.h"
19 #include "nr5g_fapi_wls.h"
20 #include "nr5g_fapi_fapi2mac_wls.h"
21 #include "nr5g_fapi_fapi2phy_wls.h"
22 #include "nr5g_fapi_fapi2phy_api.h"
23 #include "gnb_l1_l2_api.h"
24 #include "rte_memzone.h"
25 #include "nr5g_fapi_memory.h"
27 static nr5g_fapi_phy_ctx_t nr5g_fapi_phy_ctx;
29 inline p_nr5g_fapi_phy_ctx_t nr5g_fapi_get_nr5g_fapi_phy_ctx(
32 return &nr5g_fapi_phy_ctx;
35 uint8_t nr5g_fapi_dpdk_init(
36 p_nr5g_fapi_cfg_t p_cfg)
38 printf("init dev name: %s\n", p_cfg->wls.device_name);
39 char *const file_prefix = basename(p_cfg->wls.device_name);
40 printf("init basename: %s\n", file_prefix);
44 char *argv[] = { p_cfg->prgname, "--proc-type=secondary",
45 "--file-prefix", file_prefix, whitelist
49 char *argv[] = { p_cfg->prgname, coremask, "--proc-type=secondary",
50 "--file-prefix", file_prefix, whitelist
52 snprintf(coremask, 32, "-l %d,%d", p_cfg->mac2phy_worker.core_id,
53 p_cfg->phy2mac_worker.core_id);
55 int argc = RTE_DIM(argv);
57 /* initialize EAL first */
58 snprintf(whitelist, 32, "-w %s", "0000:00:06.0");
59 printf("Calling rte_eal_init: ");
60 for (i = 0; i < RTE_DIM(argv); i++) {
61 printf("%s ", argv[i]);
65 if (rte_eal_init(argc, argv) < 0)
66 rte_panic("Cannot init EAL\n");
71 uint8_t nr5g_fapi_dpdk_wait(
72 p_nr5g_fapi_cfg_t p_cfg)
77 RTE_LCORE_FOREACH_SLAVE(worker_core) {
78 if (rte_eal_wait_lcore(worker_core) < 0) {
83 pthread_join(p_cfg->mac2phy_thread_info.thread_id, NULL);
84 pthread_join(p_cfg->phy2mac_thread_info.thread_id, NULL);
89 void nr5g_fapi_set_ul_slot_info(
92 nr5g_fapi_ul_slot_info_t * p_ul_slot_info)
94 NR5G_FAPI_MEMSET(p_ul_slot_info, sizeof(nr5g_fapi_ul_slot_info_t), 0,
95 sizeof(nr5g_fapi_ul_slot_info_t));
96 p_ul_slot_info->cookie = frame_no;
97 p_ul_slot_info->slot_no = slot_no;
100 nr5g_fapi_ul_slot_info_t *nr5g_fapi_get_ul_slot_info(
103 p_nr5g_fapi_phy_instance_t p_phy_instance)
106 nr5g_fapi_ul_slot_info_t *p_ul_slot_info;
108 for (i = 0; i < MAX_UL_SLOT_INFO_COUNT; i++) {
109 p_ul_slot_info = &p_phy_instance->ul_slot_info[i];
110 if ((slot_no == p_ul_slot_info->slot_no) &&
111 (frame_no == p_ul_slot_info->cookie)) {
112 return p_ul_slot_info;
118 uint8_t nr5g_fapi_framework_init(
119 p_nr5g_fapi_cfg_t p_cfg)
121 uint8_t retval = FAILURE;
122 p_nr5g_fapi_phy_ctx_t p_phy_ctx = nr5g_fapi_get_nr5g_fapi_phy_ctx();
123 p_nr5g_fapi_wls_context_t pwls;
124 pthread_attr_t *p_mac2phy_attr, *p_phy2mac_attr;
125 struct sched_param param;
127 nr5g_fapi_set_log_level(p_cfg->logger.level);
129 if (FAILURE == nr5g_fapi_wls_init(p_cfg)) {
130 NR5G_FAPI_LOG(ERROR_LOG, ("[FAPI_INT] WLS init Failed"));
133 // First let's wait for the L1 and L2 to be present
135 retval = nr5g_fapi_fapi2phy_wls_ready();
137 // Now the L2 is up so let's make sure that the L1 was started first
140 retval = nr5g_fapi_fapi2mac_wls_ready();
144 // Now that the L2 is up and has completed the Common Memory initialization
145 // the FT needs to initialize the FAPI2PHY buffers
146 pwls = nr5g_fapi_wls_context();
148 if (FAILURE == nr5g_fapi2Phy_wls_init(pwls)) {
155 p_phy_ctx->phy2mac_worker_core_id = p_cfg->phy2mac_worker.core_id;
156 p_phy_ctx->mac2phy_worker_core_id = p_cfg->mac2phy_worker.core_id;
158 p_phy2mac_attr = &p_cfg->phy2mac_thread_info.thread_attr;
159 pthread_attr_init(p_phy2mac_attr);
160 if (!pthread_attr_getschedparam(p_phy2mac_attr, ¶m)) {
161 param.sched_priority = p_cfg->phy2mac_worker.thread_priority;
162 pthread_attr_setschedparam(p_phy2mac_attr, ¶m);
163 pthread_attr_setschedpolicy(p_phy2mac_attr, SCHED_FIFO);
166 if (0 != pthread_create(&p_cfg->phy2mac_thread_info.thread_id,
167 p_phy2mac_attr, nr5g_fapi_phy2mac_thread_func, (void *)
169 printf("Error: Unable to create threads\n");
171 pthread_attr_destroy(p_phy2mac_attr);
174 pthread_setname_np(p_cfg->phy2mac_thread_info.thread_id,
175 "nr5g_fapi_phy2mac_thread");
177 p_mac2phy_attr = &p_cfg->mac2phy_thread_info.thread_attr;
178 pthread_attr_init(p_mac2phy_attr);
179 if (!pthread_attr_getschedparam(p_mac2phy_attr, ¶m)) {
180 param.sched_priority = p_cfg->mac2phy_worker.thread_priority;
181 pthread_attr_setschedparam(p_mac2phy_attr, ¶m);
182 pthread_attr_setschedpolicy(p_mac2phy_attr, SCHED_FIFO);
185 if (0 != pthread_create(&p_cfg->mac2phy_thread_info.thread_id,
186 p_mac2phy_attr, nr5g_fapi_mac2phy_thread_func, (void *)
188 printf("Error: Unable to create threads\n");
190 pthread_attr_destroy(p_mac2phy_attr);
193 pthread_setname_np(p_cfg->mac2phy_thread_info.thread_id,
194 "nr5g_fapi_mac2phy_thread");