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