13998e2a0SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
23998e2a0SBruce Richardson * Copyright(c) 2010-2014 Intel Corporation
3de3cfa2cSIntel */
4de3cfa2cSIntel
5de3cfa2cSIntel #include <stdio.h>
6de3cfa2cSIntel #include <stdlib.h>
7de3cfa2cSIntel #include <string.h>
8de3cfa2cSIntel #include <ctype.h>
9de3cfa2cSIntel #include <rte_string_fns.h>
10de3cfa2cSIntel #include <rte_sched.h>
11de3cfa2cSIntel
12de3cfa2cSIntel #include "cfg_file.h"
13de3cfa2cSIntel #include "main.h"
14de3cfa2cSIntel
15de3cfa2cSIntel
16de3cfa2cSIntel /** when we resize a file structure, how many extra entries
17de3cfa2cSIntel * for new sections do we add in */
18de3cfa2cSIntel #define CFG_ALLOC_SECTION_BATCH 8
19de3cfa2cSIntel /** when we resize a section structure, how many extra entries
20de3cfa2cSIntel * for new entries do we add in */
21de3cfa2cSIntel #define CFG_ALLOC_ENTRY_BATCH 16
22de3cfa2cSIntel
23345187bdSTimothy Redaelli uint32_t active_queues[RTE_SCHED_QUEUES_PER_PIPE];
24345187bdSTimothy Redaelli uint32_t n_active_queues;
25345187bdSTimothy Redaelli
26a61b3196SMarcin Danilewicz struct rte_sched_cman_params cman_params;
27a61b3196SMarcin Danilewicz
parse_u64(const char * entry,uint64_t * val)28*92e9fe0dSMegha Ajmera int parse_u64(const char *entry, uint64_t *val)
29*92e9fe0dSMegha Ajmera {
30*92e9fe0dSMegha Ajmera char *endptr;
31*92e9fe0dSMegha Ajmera if (!entry || !val)
32*92e9fe0dSMegha Ajmera return -EINVAL;
33*92e9fe0dSMegha Ajmera
34*92e9fe0dSMegha Ajmera errno = 0;
35*92e9fe0dSMegha Ajmera
36*92e9fe0dSMegha Ajmera *val = strtoull(entry, &endptr, 0);
37*92e9fe0dSMegha Ajmera if (errno == EINVAL || errno == ERANGE || *endptr != '\0')
38*92e9fe0dSMegha Ajmera return -EINVAL;
39*92e9fe0dSMegha Ajmera
40*92e9fe0dSMegha Ajmera return 0;
41*92e9fe0dSMegha Ajmera }
42*92e9fe0dSMegha Ajmera
43de3cfa2cSIntel int
cfg_load_port(struct rte_cfgfile * cfg,struct rte_sched_port_params * port_params)44db935d01SMichal Jastrzebski cfg_load_port(struct rte_cfgfile *cfg, struct rte_sched_port_params *port_params)
45de3cfa2cSIntel {
46de3cfa2cSIntel const char *entry;
47de3cfa2cSIntel
48de3cfa2cSIntel if (!cfg || !port_params)
49de3cfa2cSIntel return -1;
50de3cfa2cSIntel
51db935d01SMichal Jastrzebski entry = rte_cfgfile_get_entry(cfg, "port", "frame overhead");
52de3cfa2cSIntel if (entry)
53de3cfa2cSIntel port_params->frame_overhead = (uint32_t)atoi(entry);
54de3cfa2cSIntel
55db935d01SMichal Jastrzebski entry = rte_cfgfile_get_entry(cfg, "port", "number of subports per port");
56de3cfa2cSIntel if (entry)
57de3cfa2cSIntel port_params->n_subports_per_port = (uint32_t)atoi(entry);
58de3cfa2cSIntel
59de3cfa2cSIntel return 0;
60de3cfa2cSIntel }
61de3cfa2cSIntel
62de3cfa2cSIntel int
cfg_load_pipe(struct rte_cfgfile * cfg,struct rte_sched_pipe_params * pipe_params)63db935d01SMichal Jastrzebski cfg_load_pipe(struct rte_cfgfile *cfg, struct rte_sched_pipe_params *pipe_params)
64de3cfa2cSIntel {
65*92e9fe0dSMegha Ajmera int i, j, ret = 0;
66de3cfa2cSIntel char *next;
67de3cfa2cSIntel const char *entry;
68de3cfa2cSIntel int profiles;
69de3cfa2cSIntel
70de3cfa2cSIntel if (!cfg || !pipe_params)
71de3cfa2cSIntel return -1;
72de3cfa2cSIntel
73db935d01SMichal Jastrzebski profiles = rte_cfgfile_num_sections(cfg, "pipe profile", sizeof("pipe profile") - 1);
74b0c1628bSJasvinder Singh subport_params[0].n_pipe_profiles = profiles;
75de3cfa2cSIntel
76de3cfa2cSIntel for (j = 0; j < profiles; j++) {
77de3cfa2cSIntel char pipe_name[32];
786f41fe75SStephen Hemminger snprintf(pipe_name, sizeof(pipe_name), "pipe profile %d", j);
79de3cfa2cSIntel
80db935d01SMichal Jastrzebski entry = rte_cfgfile_get_entry(cfg, pipe_name, "tb rate");
81*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tb_rate);
82*92e9fe0dSMegha Ajmera if (ret)
83*92e9fe0dSMegha Ajmera return ret;
84de3cfa2cSIntel
85db935d01SMichal Jastrzebski entry = rte_cfgfile_get_entry(cfg, pipe_name, "tb size");
86*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tb_size);
87*92e9fe0dSMegha Ajmera if (ret)
88*92e9fe0dSMegha Ajmera return ret;
89de3cfa2cSIntel
90db935d01SMichal Jastrzebski entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc period");
91*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_period);
92*92e9fe0dSMegha Ajmera if (ret)
93*92e9fe0dSMegha Ajmera return ret;
94de3cfa2cSIntel
95db935d01SMichal Jastrzebski entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 0 rate");
96*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[0]);
97*92e9fe0dSMegha Ajmera if (ret)
98*92e9fe0dSMegha Ajmera return ret;
99de3cfa2cSIntel
100db935d01SMichal Jastrzebski entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 1 rate");
101*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[1]);
102*92e9fe0dSMegha Ajmera if (ret)
103*92e9fe0dSMegha Ajmera return ret;
104de3cfa2cSIntel
105db935d01SMichal Jastrzebski entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 2 rate");
106*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[2]);
107*92e9fe0dSMegha Ajmera if (ret)
108*92e9fe0dSMegha Ajmera return ret;
109de3cfa2cSIntel
110db935d01SMichal Jastrzebski entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 3 rate");
111*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[3]);
112*92e9fe0dSMegha Ajmera if (ret)
113*92e9fe0dSMegha Ajmera return ret;
114de3cfa2cSIntel
115be1e5332SJasvinder Singh entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 4 rate");
116*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[4]);
117*92e9fe0dSMegha Ajmera if (ret)
118*92e9fe0dSMegha Ajmera return ret;
119be1e5332SJasvinder Singh
120be1e5332SJasvinder Singh entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 5 rate");
121*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[5]);
122*92e9fe0dSMegha Ajmera if (ret)
123*92e9fe0dSMegha Ajmera return ret;
124be1e5332SJasvinder Singh
125be1e5332SJasvinder Singh entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 6 rate");
126*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[6]);
127*92e9fe0dSMegha Ajmera if (ret)
128*92e9fe0dSMegha Ajmera return ret;
129be1e5332SJasvinder Singh
130be1e5332SJasvinder Singh entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 7 rate");
131*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[7]);
132*92e9fe0dSMegha Ajmera if (ret)
133*92e9fe0dSMegha Ajmera return ret;
134be1e5332SJasvinder Singh
135be1e5332SJasvinder Singh entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 8 rate");
136*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[8]);
137*92e9fe0dSMegha Ajmera if (ret)
138*92e9fe0dSMegha Ajmera return ret;
139be1e5332SJasvinder Singh
140be1e5332SJasvinder Singh entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 9 rate");
141*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[9]);
142*92e9fe0dSMegha Ajmera if (ret)
143*92e9fe0dSMegha Ajmera return ret;
144be1e5332SJasvinder Singh
145be1e5332SJasvinder Singh entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 10 rate");
146*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[10]);
147*92e9fe0dSMegha Ajmera if (ret)
148*92e9fe0dSMegha Ajmera return ret;
149be1e5332SJasvinder Singh
150be1e5332SJasvinder Singh entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 11 rate");
151*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[11]);
152*92e9fe0dSMegha Ajmera if (ret)
153*92e9fe0dSMegha Ajmera return ret;
154be1e5332SJasvinder Singh
155be1e5332SJasvinder Singh entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 12 rate");
156*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &pipe_params[j].tc_rate[12]);
157*92e9fe0dSMegha Ajmera if (ret)
158*92e9fe0dSMegha Ajmera return ret;
159be1e5332SJasvinder Singh
160be1e5332SJasvinder Singh entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 12 oversubscription weight");
161de3cfa2cSIntel if (entry)
162835c5409SIntel pipe_params[j].tc_ov_weight = (uint8_t)atoi(entry);
163de3cfa2cSIntel
164be1e5332SJasvinder Singh entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 12 wrr weights");
165de3cfa2cSIntel if (entry) {
166be1e5332SJasvinder Singh for (i = 0; i < RTE_SCHED_BE_QUEUES_PER_PIPE; i++) {
167be1e5332SJasvinder Singh pipe_params[j].wrr_weights[i] =
168de3cfa2cSIntel (uint8_t)strtol(entry, &next, 10);
169de3cfa2cSIntel if (next == NULL)
170de3cfa2cSIntel break;
171de3cfa2cSIntel entry = next;
172de3cfa2cSIntel }
173de3cfa2cSIntel }
174de3cfa2cSIntel }
175de3cfa2cSIntel return 0;
176de3cfa2cSIntel }
177de3cfa2cSIntel
178de3cfa2cSIntel int
cfg_load_subport_profile(struct rte_cfgfile * cfg,struct rte_sched_subport_profile_params * subport_profile)179802d214dSSavinay Dharmappa cfg_load_subport_profile(struct rte_cfgfile *cfg,
180802d214dSSavinay Dharmappa struct rte_sched_subport_profile_params *subport_profile)
181802d214dSSavinay Dharmappa {
182*92e9fe0dSMegha Ajmera int i, ret = 0;
183802d214dSSavinay Dharmappa const char *entry;
184802d214dSSavinay Dharmappa int profiles;
185802d214dSSavinay Dharmappa
186802d214dSSavinay Dharmappa if (!cfg || !subport_profile)
187802d214dSSavinay Dharmappa return -1;
188802d214dSSavinay Dharmappa
189802d214dSSavinay Dharmappa profiles = rte_cfgfile_num_sections(cfg, "subport profile",
190802d214dSSavinay Dharmappa sizeof("subport profile") - 1);
19185ea681cSMegha Ajmera port_params.n_subport_profiles = profiles;
192802d214dSSavinay Dharmappa
193802d214dSSavinay Dharmappa for (i = 0; i < profiles; i++) {
194802d214dSSavinay Dharmappa char sec_name[32];
195802d214dSSavinay Dharmappa snprintf(sec_name, sizeof(sec_name), "subport profile %d", i);
196802d214dSSavinay Dharmappa
197802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tb rate");
198*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tb_rate);
199*92e9fe0dSMegha Ajmera if (ret)
200*92e9fe0dSMegha Ajmera return ret;
201802d214dSSavinay Dharmappa
202802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tb size");
203*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tb_size);
204*92e9fe0dSMegha Ajmera if (ret)
205*92e9fe0dSMegha Ajmera return ret;
206802d214dSSavinay Dharmappa
207802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc period");
208*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_period);
209*92e9fe0dSMegha Ajmera if (ret)
210*92e9fe0dSMegha Ajmera return ret;
211802d214dSSavinay Dharmappa
212802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 0 rate");
213*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[0]);
214*92e9fe0dSMegha Ajmera if (ret)
215*92e9fe0dSMegha Ajmera return ret;
216802d214dSSavinay Dharmappa
217802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 1 rate");
218*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[1]);
219*92e9fe0dSMegha Ajmera if (ret)
220*92e9fe0dSMegha Ajmera return ret;
221802d214dSSavinay Dharmappa
222802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 2 rate");
223*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[2]);
224*92e9fe0dSMegha Ajmera if (ret)
225*92e9fe0dSMegha Ajmera return ret;
226802d214dSSavinay Dharmappa
227802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 3 rate");
228*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[3]);
229*92e9fe0dSMegha Ajmera if (ret)
230*92e9fe0dSMegha Ajmera return ret;
231802d214dSSavinay Dharmappa
232802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 4 rate");
233*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[4]);
234*92e9fe0dSMegha Ajmera if (ret)
235*92e9fe0dSMegha Ajmera return ret;
236802d214dSSavinay Dharmappa
237802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 5 rate");
238*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[5]);
239*92e9fe0dSMegha Ajmera if (ret)
240*92e9fe0dSMegha Ajmera return ret;
241802d214dSSavinay Dharmappa
242802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 6 rate");
243*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[6]);
244*92e9fe0dSMegha Ajmera if (ret)
245*92e9fe0dSMegha Ajmera return ret;
246802d214dSSavinay Dharmappa
247802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 7 rate");
248*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[7]);
249*92e9fe0dSMegha Ajmera if (ret)
250*92e9fe0dSMegha Ajmera return ret;
251802d214dSSavinay Dharmappa
252802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 8 rate");
253*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[8]);
254*92e9fe0dSMegha Ajmera if (ret)
255*92e9fe0dSMegha Ajmera return ret;
256802d214dSSavinay Dharmappa
257802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 9 rate");
258*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[9]);
259*92e9fe0dSMegha Ajmera if (ret)
260*92e9fe0dSMegha Ajmera return ret;
261802d214dSSavinay Dharmappa
262802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 10 rate");
263*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[10]);
264*92e9fe0dSMegha Ajmera if (ret)
265*92e9fe0dSMegha Ajmera return ret;
266802d214dSSavinay Dharmappa
267802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 11 rate");
268*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[11]);
269*92e9fe0dSMegha Ajmera if (ret)
270*92e9fe0dSMegha Ajmera return ret;
271802d214dSSavinay Dharmappa
272802d214dSSavinay Dharmappa entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 12 rate");
273*92e9fe0dSMegha Ajmera ret = parse_u64(entry, &subport_profile[i].tc_rate[12]);
274*92e9fe0dSMegha Ajmera if (ret)
275*92e9fe0dSMegha Ajmera return ret;
276802d214dSSavinay Dharmappa }
277802d214dSSavinay Dharmappa
278802d214dSSavinay Dharmappa return 0;
279802d214dSSavinay Dharmappa }
280802d214dSSavinay Dharmappa
281802d214dSSavinay Dharmappa int
cfg_load_subport(struct rte_cfgfile * cfg,struct rte_sched_subport_params * subport_params)282db935d01SMichal Jastrzebski cfg_load_subport(struct rte_cfgfile *cfg, struct rte_sched_subport_params *subport_params)
283de3cfa2cSIntel {
284a61b3196SMarcin Danilewicz bool cman_enabled = false;
285de3cfa2cSIntel const char *entry;
286de3cfa2cSIntel int i, j, k;
287de3cfa2cSIntel
288de3cfa2cSIntel if (!cfg || !subport_params)
289de3cfa2cSIntel return -1;
290de3cfa2cSIntel
291de3cfa2cSIntel memset(app_pipe_to_profile, -1, sizeof(app_pipe_to_profile));
292b0c1628bSJasvinder Singh memset(active_queues, 0, sizeof(active_queues));
293b0c1628bSJasvinder Singh n_active_queues = 0;
294b0c1628bSJasvinder Singh
29506135957SWojciech Liguzinski if (rte_cfgfile_has_section(cfg, "red")) {
29606135957SWojciech Liguzinski cman_params.cman_mode = RTE_SCHED_CMAN_RED;
297a61b3196SMarcin Danilewicz cman_enabled = true;
298b0c1628bSJasvinder Singh
299b0c1628bSJasvinder Singh for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {
300b0c1628bSJasvinder Singh char str[32];
301b0c1628bSJasvinder Singh
30206135957SWojciech Liguzinski /* Parse RED min thresholds */
30306135957SWojciech Liguzinski snprintf(str, sizeof(str), "tc %d red min", i);
30406135957SWojciech Liguzinski entry = rte_cfgfile_get_entry(cfg, "red", str);
305b0c1628bSJasvinder Singh if (entry) {
306b0c1628bSJasvinder Singh char *next;
307b0c1628bSJasvinder Singh /* for each packet colour (green, yellow, red) */
308b0c1628bSJasvinder Singh for (j = 0; j < RTE_COLORS; j++) {
30906135957SWojciech Liguzinski cman_params.red_params[i][j].min_th
310b0c1628bSJasvinder Singh = (uint16_t)strtol(entry, &next, 10);
311b0c1628bSJasvinder Singh if (next == NULL)
312b0c1628bSJasvinder Singh break;
313b0c1628bSJasvinder Singh entry = next;
314b0c1628bSJasvinder Singh }
315b0c1628bSJasvinder Singh }
316b0c1628bSJasvinder Singh
31706135957SWojciech Liguzinski /* Parse RED max thresholds */
31806135957SWojciech Liguzinski snprintf(str, sizeof(str), "tc %d red max", i);
319b0c1628bSJasvinder Singh entry = rte_cfgfile_get_entry(cfg, "red", str);
320b0c1628bSJasvinder Singh if (entry) {
321b0c1628bSJasvinder Singh char *next;
322b0c1628bSJasvinder Singh /* for each packet colour (green, yellow, red) */
323b0c1628bSJasvinder Singh for (j = 0; j < RTE_COLORS; j++) {
32406135957SWojciech Liguzinski cman_params.red_params[i][j].max_th
325b0c1628bSJasvinder Singh = (uint16_t)strtol(entry, &next, 10);
326b0c1628bSJasvinder Singh if (next == NULL)
327b0c1628bSJasvinder Singh break;
328b0c1628bSJasvinder Singh entry = next;
329b0c1628bSJasvinder Singh }
330b0c1628bSJasvinder Singh }
331b0c1628bSJasvinder Singh
33206135957SWojciech Liguzinski /* Parse RED inverse mark probabilities */
33306135957SWojciech Liguzinski snprintf(str, sizeof(str), "tc %d red inv prob", i);
334b0c1628bSJasvinder Singh entry = rte_cfgfile_get_entry(cfg, "red", str);
335b0c1628bSJasvinder Singh if (entry) {
336b0c1628bSJasvinder Singh char *next;
337b0c1628bSJasvinder Singh /* for each packet colour (green, yellow, red) */
338b0c1628bSJasvinder Singh for (j = 0; j < RTE_COLORS; j++) {
33906135957SWojciech Liguzinski cman_params.red_params[i][j].maxp_inv
340b0c1628bSJasvinder Singh = (uint8_t)strtol(entry, &next, 10);
341b0c1628bSJasvinder Singh
342b0c1628bSJasvinder Singh if (next == NULL)
343b0c1628bSJasvinder Singh break;
344b0c1628bSJasvinder Singh entry = next;
345b0c1628bSJasvinder Singh }
346b0c1628bSJasvinder Singh }
347b0c1628bSJasvinder Singh
34806135957SWojciech Liguzinski /* Parse RED EWMA filter weights */
34906135957SWojciech Liguzinski snprintf(str, sizeof(str), "tc %d red weight", i);
350b0c1628bSJasvinder Singh entry = rte_cfgfile_get_entry(cfg, "red", str);
351b0c1628bSJasvinder Singh if (entry) {
352b0c1628bSJasvinder Singh char *next;
353b0c1628bSJasvinder Singh /* for each packet colour (green, yellow, red) */
354b0c1628bSJasvinder Singh for (j = 0; j < RTE_COLORS; j++) {
35506135957SWojciech Liguzinski cman_params.red_params[i][j].wq_log2
356b0c1628bSJasvinder Singh = (uint8_t)strtol(entry, &next, 10);
357b0c1628bSJasvinder Singh if (next == NULL)
358b0c1628bSJasvinder Singh break;
359b0c1628bSJasvinder Singh entry = next;
360b0c1628bSJasvinder Singh }
361b0c1628bSJasvinder Singh }
362b0c1628bSJasvinder Singh }
363b0c1628bSJasvinder Singh }
36406135957SWojciech Liguzinski
36506135957SWojciech Liguzinski if (rte_cfgfile_has_section(cfg, "pie")) {
36606135957SWojciech Liguzinski cman_params.cman_mode = RTE_SCHED_CMAN_PIE;
367a61b3196SMarcin Danilewicz cman_enabled = true;
36806135957SWojciech Liguzinski
36906135957SWojciech Liguzinski for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {
37006135957SWojciech Liguzinski char str[32];
37106135957SWojciech Liguzinski
37206135957SWojciech Liguzinski /* Parse Queue Delay Ref value */
37306135957SWojciech Liguzinski snprintf(str, sizeof(str), "tc %d qdelay ref", i);
37406135957SWojciech Liguzinski entry = rte_cfgfile_get_entry(cfg, "pie", str);
37506135957SWojciech Liguzinski if (entry)
37606135957SWojciech Liguzinski cman_params.pie_params[i].qdelay_ref =
37706135957SWojciech Liguzinski (uint16_t) atoi(entry);
37806135957SWojciech Liguzinski
37906135957SWojciech Liguzinski /* Parse Max Burst value */
38006135957SWojciech Liguzinski snprintf(str, sizeof(str), "tc %d max burst", i);
38106135957SWojciech Liguzinski entry = rte_cfgfile_get_entry(cfg, "pie", str);
38206135957SWojciech Liguzinski if (entry)
38306135957SWojciech Liguzinski cman_params.pie_params[i].max_burst =
38406135957SWojciech Liguzinski (uint16_t) atoi(entry);
38506135957SWojciech Liguzinski
38606135957SWojciech Liguzinski /* Parse Update Interval Value */
38706135957SWojciech Liguzinski snprintf(str, sizeof(str), "tc %d update interval", i);
38806135957SWojciech Liguzinski entry = rte_cfgfile_get_entry(cfg, "pie", str);
38906135957SWojciech Liguzinski if (entry)
39006135957SWojciech Liguzinski cman_params.pie_params[i].dp_update_interval =
39106135957SWojciech Liguzinski (uint16_t) atoi(entry);
39206135957SWojciech Liguzinski
39306135957SWojciech Liguzinski /* Parse Tailq Threshold Value */
39406135957SWojciech Liguzinski snprintf(str, sizeof(str), "tc %d tailq th", i);
39506135957SWojciech Liguzinski entry = rte_cfgfile_get_entry(cfg, "pie", str);
39606135957SWojciech Liguzinski if (entry)
39706135957SWojciech Liguzinski cman_params.pie_params[i].tailq_th =
39806135957SWojciech Liguzinski (uint16_t) atoi(entry);
39906135957SWojciech Liguzinski
40006135957SWojciech Liguzinski }
40106135957SWojciech Liguzinski }
402de3cfa2cSIntel
403de3cfa2cSIntel for (i = 0; i < MAX_SCHED_SUBPORTS; i++) {
404de3cfa2cSIntel char sec_name[CFG_NAME_LEN];
4056f41fe75SStephen Hemminger snprintf(sec_name, sizeof(sec_name), "subport %d", i);
406de3cfa2cSIntel
407db935d01SMichal Jastrzebski if (rte_cfgfile_has_section(cfg, sec_name)) {
408b0c1628bSJasvinder Singh entry = rte_cfgfile_get_entry(cfg, sec_name,
409b0c1628bSJasvinder Singh "number of pipes per subport");
410b0c1628bSJasvinder Singh if (entry)
411b0c1628bSJasvinder Singh subport_params[i].n_pipes_per_subport_enabled =
412b0c1628bSJasvinder Singh (uint32_t)atoi(entry);
413b0c1628bSJasvinder Singh
414b0c1628bSJasvinder Singh entry = rte_cfgfile_get_entry(cfg, sec_name, "queue sizes");
415b0c1628bSJasvinder Singh if (entry) {
416b0c1628bSJasvinder Singh char *next;
417b0c1628bSJasvinder Singh
418b0c1628bSJasvinder Singh for (j = 0; j < RTE_SCHED_TRAFFIC_CLASS_BE; j++) {
419b0c1628bSJasvinder Singh subport_params[i].qsize[j] =
420b0c1628bSJasvinder Singh (uint16_t)strtol(entry, &next, 10);
421b0c1628bSJasvinder Singh if (subport_params[i].qsize[j] != 0) {
422b0c1628bSJasvinder Singh active_queues[n_active_queues] = j;
423b0c1628bSJasvinder Singh n_active_queues++;
424b0c1628bSJasvinder Singh }
425b0c1628bSJasvinder Singh if (next == NULL)
426b0c1628bSJasvinder Singh break;
427b0c1628bSJasvinder Singh entry = next;
428b0c1628bSJasvinder Singh }
429b0c1628bSJasvinder Singh
430b0c1628bSJasvinder Singh subport_params[i].qsize[RTE_SCHED_TRAFFIC_CLASS_BE] =
431b0c1628bSJasvinder Singh (uint16_t)strtol(entry, &next, 10);
432b0c1628bSJasvinder Singh
433b0c1628bSJasvinder Singh for (j = 0; j < RTE_SCHED_BE_QUEUES_PER_PIPE; j++) {
434b0c1628bSJasvinder Singh active_queues[n_active_queues] =
435b0c1628bSJasvinder Singh RTE_SCHED_TRAFFIC_CLASS_BE + j;
436b0c1628bSJasvinder Singh n_active_queues++;
437b0c1628bSJasvinder Singh }
438b0c1628bSJasvinder Singh }
439b0c1628bSJasvinder Singh
440db935d01SMichal Jastrzebski int n_entries = rte_cfgfile_section_num_entries(cfg, sec_name);
441db935d01SMichal Jastrzebski struct rte_cfgfile_entry entries[n_entries];
442de3cfa2cSIntel
443db935d01SMichal Jastrzebski rte_cfgfile_section_entries(cfg, sec_name, entries, n_entries);
444de3cfa2cSIntel
445de3cfa2cSIntel for (j = 0; j < n_entries; j++) {
446de3cfa2cSIntel if (strncmp("pipe", entries[j].name, sizeof("pipe") - 1) == 0) {
447de3cfa2cSIntel int profile;
448de3cfa2cSIntel char *tokens[2] = {NULL, NULL};
449de3cfa2cSIntel int n_tokens;
450de3cfa2cSIntel int begin, end;
451de3cfa2cSIntel
452de3cfa2cSIntel profile = atoi(entries[j].value);
453de3cfa2cSIntel n_tokens = rte_strsplit(&entries[j].name[sizeof("pipe")],
454de3cfa2cSIntel strnlen(entries[j].name, CFG_NAME_LEN), tokens, 2, '-');
455de3cfa2cSIntel
456de3cfa2cSIntel begin = atoi(tokens[0]);
457de3cfa2cSIntel if (n_tokens == 2)
458de3cfa2cSIntel end = atoi(tokens[1]);
459de3cfa2cSIntel else
460de3cfa2cSIntel end = begin;
461de3cfa2cSIntel
462de3cfa2cSIntel if (end >= MAX_SCHED_PIPES || begin > end)
463de3cfa2cSIntel return -1;
464de3cfa2cSIntel
465de3cfa2cSIntel for (k = begin; k <= end; k++) {
466de3cfa2cSIntel char profile_name[CFG_NAME_LEN];
467de3cfa2cSIntel
4686f41fe75SStephen Hemminger snprintf(profile_name, sizeof(profile_name),
469de3cfa2cSIntel "pipe profile %d", profile);
470db935d01SMichal Jastrzebski if (rte_cfgfile_has_section(cfg, profile_name))
471de3cfa2cSIntel app_pipe_to_profile[i][k] = profile;
472de3cfa2cSIntel else
473de3cfa2cSIntel rte_exit(EXIT_FAILURE, "Wrong pipe profile %s\n",
474de3cfa2cSIntel entries[j].value);
475de3cfa2cSIntel
476de3cfa2cSIntel }
477de3cfa2cSIntel }
478de3cfa2cSIntel }
479a61b3196SMarcin Danilewicz if (cman_enabled)
480a61b3196SMarcin Danilewicz subport_params[i].cman_params = &cman_params;
481de3cfa2cSIntel }
482de3cfa2cSIntel }
483de3cfa2cSIntel
484de3cfa2cSIntel return 0;
485de3cfa2cSIntel }
486