xref: /f-stack/dpdk/examples/ip_pipeline/tmgr.c (revision d30ea906)
1*d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*d30ea906Sjfb8856606  * Copyright(c) 2010-2018 Intel Corporation
3*d30ea906Sjfb8856606  */
4*d30ea906Sjfb8856606 
5*d30ea906Sjfb8856606 #include <stdlib.h>
6*d30ea906Sjfb8856606 
7*d30ea906Sjfb8856606 #include <rte_string_fns.h>
8*d30ea906Sjfb8856606 
9*d30ea906Sjfb8856606 #include "tmgr.h"
10*d30ea906Sjfb8856606 
11*d30ea906Sjfb8856606 static struct rte_sched_subport_params
12*d30ea906Sjfb8856606 	subport_profile[TMGR_SUBPORT_PROFILE_MAX];
13*d30ea906Sjfb8856606 
14*d30ea906Sjfb8856606 static uint32_t n_subport_profiles;
15*d30ea906Sjfb8856606 
16*d30ea906Sjfb8856606 static struct rte_sched_pipe_params
17*d30ea906Sjfb8856606 	pipe_profile[TMGR_PIPE_PROFILE_MAX];
18*d30ea906Sjfb8856606 
19*d30ea906Sjfb8856606 static uint32_t n_pipe_profiles;
20*d30ea906Sjfb8856606 
21*d30ea906Sjfb8856606 static struct tmgr_port_list tmgr_port_list;
22*d30ea906Sjfb8856606 
23*d30ea906Sjfb8856606 int
24*d30ea906Sjfb8856606 tmgr_init(void)
25*d30ea906Sjfb8856606 {
26*d30ea906Sjfb8856606 	TAILQ_INIT(&tmgr_port_list);
27*d30ea906Sjfb8856606 
28*d30ea906Sjfb8856606 	return 0;
29*d30ea906Sjfb8856606 }
30*d30ea906Sjfb8856606 
31*d30ea906Sjfb8856606 struct tmgr_port *
32*d30ea906Sjfb8856606 tmgr_port_find(const char *name)
33*d30ea906Sjfb8856606 {
34*d30ea906Sjfb8856606 	struct tmgr_port *tmgr_port;
35*d30ea906Sjfb8856606 
36*d30ea906Sjfb8856606 	if (name == NULL)
37*d30ea906Sjfb8856606 		return NULL;
38*d30ea906Sjfb8856606 
39*d30ea906Sjfb8856606 	TAILQ_FOREACH(tmgr_port, &tmgr_port_list, node)
40*d30ea906Sjfb8856606 		if (strcmp(tmgr_port->name, name) == 0)
41*d30ea906Sjfb8856606 			return tmgr_port;
42*d30ea906Sjfb8856606 
43*d30ea906Sjfb8856606 	return NULL;
44*d30ea906Sjfb8856606 }
45*d30ea906Sjfb8856606 
46*d30ea906Sjfb8856606 int
47*d30ea906Sjfb8856606 tmgr_subport_profile_add(struct rte_sched_subport_params *p)
48*d30ea906Sjfb8856606 {
49*d30ea906Sjfb8856606 	/* Check input params */
50*d30ea906Sjfb8856606 	if (p == NULL)
51*d30ea906Sjfb8856606 		return -1;
52*d30ea906Sjfb8856606 
53*d30ea906Sjfb8856606 	/* Save profile */
54*d30ea906Sjfb8856606 	memcpy(&subport_profile[n_subport_profiles],
55*d30ea906Sjfb8856606 		p,
56*d30ea906Sjfb8856606 		sizeof(*p));
57*d30ea906Sjfb8856606 
58*d30ea906Sjfb8856606 	n_subport_profiles++;
59*d30ea906Sjfb8856606 
60*d30ea906Sjfb8856606 	return 0;
61*d30ea906Sjfb8856606 }
62*d30ea906Sjfb8856606 
63*d30ea906Sjfb8856606 int
64*d30ea906Sjfb8856606 tmgr_pipe_profile_add(struct rte_sched_pipe_params *p)
65*d30ea906Sjfb8856606 {
66*d30ea906Sjfb8856606 	/* Check input params */
67*d30ea906Sjfb8856606 	if (p == NULL)
68*d30ea906Sjfb8856606 		return -1;
69*d30ea906Sjfb8856606 
70*d30ea906Sjfb8856606 	/* Save profile */
71*d30ea906Sjfb8856606 	memcpy(&pipe_profile[n_pipe_profiles],
72*d30ea906Sjfb8856606 		p,
73*d30ea906Sjfb8856606 		sizeof(*p));
74*d30ea906Sjfb8856606 
75*d30ea906Sjfb8856606 	n_pipe_profiles++;
76*d30ea906Sjfb8856606 
77*d30ea906Sjfb8856606 	return 0;
78*d30ea906Sjfb8856606 }
79*d30ea906Sjfb8856606 
80*d30ea906Sjfb8856606 struct tmgr_port *
81*d30ea906Sjfb8856606 tmgr_port_create(const char *name, struct tmgr_port_params *params)
82*d30ea906Sjfb8856606 {
83*d30ea906Sjfb8856606 	struct rte_sched_port_params p;
84*d30ea906Sjfb8856606 	struct tmgr_port *tmgr_port;
85*d30ea906Sjfb8856606 	struct rte_sched_port *s;
86*d30ea906Sjfb8856606 	uint32_t i, j;
87*d30ea906Sjfb8856606 
88*d30ea906Sjfb8856606 	/* Check input params */
89*d30ea906Sjfb8856606 	if ((name == NULL) ||
90*d30ea906Sjfb8856606 		tmgr_port_find(name) ||
91*d30ea906Sjfb8856606 		(params == NULL) ||
92*d30ea906Sjfb8856606 		(params->n_subports_per_port == 0) ||
93*d30ea906Sjfb8856606 		(params->n_pipes_per_subport == 0) ||
94*d30ea906Sjfb8856606 		(params->cpu_id >= RTE_MAX_NUMA_NODES) ||
95*d30ea906Sjfb8856606 		(n_subport_profiles == 0) ||
96*d30ea906Sjfb8856606 		(n_pipe_profiles == 0))
97*d30ea906Sjfb8856606 		return NULL;
98*d30ea906Sjfb8856606 
99*d30ea906Sjfb8856606 	/* Resource create */
100*d30ea906Sjfb8856606 	p.name = name;
101*d30ea906Sjfb8856606 	p.socket = (int) params->cpu_id;
102*d30ea906Sjfb8856606 	p.rate = params->rate;
103*d30ea906Sjfb8856606 	p.mtu = params->mtu;
104*d30ea906Sjfb8856606 	p.frame_overhead = params->frame_overhead;
105*d30ea906Sjfb8856606 	p.n_subports_per_port = params->n_subports_per_port;
106*d30ea906Sjfb8856606 	p.n_pipes_per_subport = params->n_pipes_per_subport;
107*d30ea906Sjfb8856606 
108*d30ea906Sjfb8856606 	for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
109*d30ea906Sjfb8856606 		p.qsize[i] = params->qsize[i];
110*d30ea906Sjfb8856606 
111*d30ea906Sjfb8856606 	p.pipe_profiles = pipe_profile;
112*d30ea906Sjfb8856606 	p.n_pipe_profiles = n_pipe_profiles;
113*d30ea906Sjfb8856606 
114*d30ea906Sjfb8856606 	s = rte_sched_port_config(&p);
115*d30ea906Sjfb8856606 	if (s == NULL)
116*d30ea906Sjfb8856606 		return NULL;
117*d30ea906Sjfb8856606 
118*d30ea906Sjfb8856606 	for (i = 0; i < params->n_subports_per_port; i++) {
119*d30ea906Sjfb8856606 		int status;
120*d30ea906Sjfb8856606 
121*d30ea906Sjfb8856606 		status = rte_sched_subport_config(
122*d30ea906Sjfb8856606 			s,
123*d30ea906Sjfb8856606 			i,
124*d30ea906Sjfb8856606 			&subport_profile[0]);
125*d30ea906Sjfb8856606 
126*d30ea906Sjfb8856606 		if (status) {
127*d30ea906Sjfb8856606 			rte_sched_port_free(s);
128*d30ea906Sjfb8856606 			return NULL;
129*d30ea906Sjfb8856606 		}
130*d30ea906Sjfb8856606 
131*d30ea906Sjfb8856606 		for (j = 0; j < params->n_pipes_per_subport; j++) {
132*d30ea906Sjfb8856606 			status = rte_sched_pipe_config(
133*d30ea906Sjfb8856606 				s,
134*d30ea906Sjfb8856606 				i,
135*d30ea906Sjfb8856606 				j,
136*d30ea906Sjfb8856606 				0);
137*d30ea906Sjfb8856606 
138*d30ea906Sjfb8856606 			if (status) {
139*d30ea906Sjfb8856606 				rte_sched_port_free(s);
140*d30ea906Sjfb8856606 				return NULL;
141*d30ea906Sjfb8856606 			}
142*d30ea906Sjfb8856606 		}
143*d30ea906Sjfb8856606 	}
144*d30ea906Sjfb8856606 
145*d30ea906Sjfb8856606 	/* Node allocation */
146*d30ea906Sjfb8856606 	tmgr_port = calloc(1, sizeof(struct tmgr_port));
147*d30ea906Sjfb8856606 	if (tmgr_port == NULL) {
148*d30ea906Sjfb8856606 		rte_sched_port_free(s);
149*d30ea906Sjfb8856606 		return NULL;
150*d30ea906Sjfb8856606 	}
151*d30ea906Sjfb8856606 
152*d30ea906Sjfb8856606 	/* Node fill in */
153*d30ea906Sjfb8856606 	strlcpy(tmgr_port->name, name, sizeof(tmgr_port->name));
154*d30ea906Sjfb8856606 	tmgr_port->s = s;
155*d30ea906Sjfb8856606 	tmgr_port->n_subports_per_port = params->n_subports_per_port;
156*d30ea906Sjfb8856606 	tmgr_port->n_pipes_per_subport = params->n_pipes_per_subport;
157*d30ea906Sjfb8856606 
158*d30ea906Sjfb8856606 	/* Node add to list */
159*d30ea906Sjfb8856606 	TAILQ_INSERT_TAIL(&tmgr_port_list, tmgr_port, node);
160*d30ea906Sjfb8856606 
161*d30ea906Sjfb8856606 	return tmgr_port;
162*d30ea906Sjfb8856606 }
163*d30ea906Sjfb8856606 
164*d30ea906Sjfb8856606 int
165*d30ea906Sjfb8856606 tmgr_subport_config(const char *port_name,
166*d30ea906Sjfb8856606 	uint32_t subport_id,
167*d30ea906Sjfb8856606 	uint32_t subport_profile_id)
168*d30ea906Sjfb8856606 {
169*d30ea906Sjfb8856606 	struct tmgr_port *port;
170*d30ea906Sjfb8856606 	int status;
171*d30ea906Sjfb8856606 
172*d30ea906Sjfb8856606 	/* Check input params */
173*d30ea906Sjfb8856606 	if (port_name == NULL)
174*d30ea906Sjfb8856606 		return -1;
175*d30ea906Sjfb8856606 
176*d30ea906Sjfb8856606 	port = tmgr_port_find(port_name);
177*d30ea906Sjfb8856606 	if ((port == NULL) ||
178*d30ea906Sjfb8856606 		(subport_id >= port->n_subports_per_port) ||
179*d30ea906Sjfb8856606 		(subport_profile_id >= n_subport_profiles))
180*d30ea906Sjfb8856606 		return -1;
181*d30ea906Sjfb8856606 
182*d30ea906Sjfb8856606 	/* Resource config */
183*d30ea906Sjfb8856606 	status = rte_sched_subport_config(
184*d30ea906Sjfb8856606 		port->s,
185*d30ea906Sjfb8856606 		subport_id,
186*d30ea906Sjfb8856606 		&subport_profile[subport_profile_id]);
187*d30ea906Sjfb8856606 
188*d30ea906Sjfb8856606 	return status;
189*d30ea906Sjfb8856606 }
190*d30ea906Sjfb8856606 
191*d30ea906Sjfb8856606 int
192*d30ea906Sjfb8856606 tmgr_pipe_config(const char *port_name,
193*d30ea906Sjfb8856606 	uint32_t subport_id,
194*d30ea906Sjfb8856606 	uint32_t pipe_id_first,
195*d30ea906Sjfb8856606 	uint32_t pipe_id_last,
196*d30ea906Sjfb8856606 	uint32_t pipe_profile_id)
197*d30ea906Sjfb8856606 {
198*d30ea906Sjfb8856606 	struct tmgr_port *port;
199*d30ea906Sjfb8856606 	uint32_t i;
200*d30ea906Sjfb8856606 
201*d30ea906Sjfb8856606 	/* Check input params */
202*d30ea906Sjfb8856606 	if (port_name == NULL)
203*d30ea906Sjfb8856606 		return -1;
204*d30ea906Sjfb8856606 
205*d30ea906Sjfb8856606 	port = tmgr_port_find(port_name);
206*d30ea906Sjfb8856606 	if ((port == NULL) ||
207*d30ea906Sjfb8856606 		(subport_id >= port->n_subports_per_port) ||
208*d30ea906Sjfb8856606 		(pipe_id_first >= port->n_pipes_per_subport) ||
209*d30ea906Sjfb8856606 		(pipe_id_last >= port->n_pipes_per_subport) ||
210*d30ea906Sjfb8856606 		(pipe_id_first > pipe_id_last) ||
211*d30ea906Sjfb8856606 		(pipe_profile_id >= n_pipe_profiles))
212*d30ea906Sjfb8856606 		return -1;
213*d30ea906Sjfb8856606 
214*d30ea906Sjfb8856606 	/* Resource config */
215*d30ea906Sjfb8856606 	for (i = pipe_id_first; i <= pipe_id_last; i++) {
216*d30ea906Sjfb8856606 		int status;
217*d30ea906Sjfb8856606 
218*d30ea906Sjfb8856606 		status = rte_sched_pipe_config(
219*d30ea906Sjfb8856606 			port->s,
220*d30ea906Sjfb8856606 			subport_id,
221*d30ea906Sjfb8856606 			i,
222*d30ea906Sjfb8856606 			(int) pipe_profile_id);
223*d30ea906Sjfb8856606 
224*d30ea906Sjfb8856606 		if (status)
225*d30ea906Sjfb8856606 			return status;
226*d30ea906Sjfb8856606 	}
227*d30ea906Sjfb8856606 
228*d30ea906Sjfb8856606 	return 0;
229*d30ea906Sjfb8856606 }
230