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