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