Lines Matching full:group

22 static u32 sparx5_lg_get_leak_time(struct sparx5 *sparx5, u32 layer, u32 group)  in sparx5_lg_get_leak_time()  argument
26 value = spx5_rd(sparx5, HSCH_HSCH_TIMER_CFG(layer, group)); in sparx5_lg_get_leak_time()
30 static void sparx5_lg_set_leak_time(struct sparx5 *sparx5, u32 layer, u32 group, in sparx5_lg_set_leak_time() argument
34 HSCH_HSCH_TIMER_CFG(layer, group)); in sparx5_lg_set_leak_time()
37 static u32 sparx5_lg_get_first(struct sparx5 *sparx5, u32 layer, u32 group) in sparx5_lg_get_first() argument
41 value = spx5_rd(sparx5, HSCH_HSCH_LEAK_CFG(layer, group)); in sparx5_lg_get_first()
45 static u32 sparx5_lg_get_next(struct sparx5 *sparx5, u32 layer, u32 group, in sparx5_lg_get_next() argument
55 static u32 sparx5_lg_get_last(struct sparx5 *sparx5, u32 layer, u32 group) in sparx5_lg_get_last() argument
59 itr = sparx5_lg_get_first(sparx5, layer, group); in sparx5_lg_get_last()
62 next = sparx5_lg_get_next(sparx5, layer, group, itr); in sparx5_lg_get_last()
70 static bool sparx5_lg_is_last(struct sparx5 *sparx5, u32 layer, u32 group, in sparx5_lg_is_last() argument
73 return idx == sparx5_lg_get_next(sparx5, layer, group, idx); in sparx5_lg_is_last()
76 static bool sparx5_lg_is_first(struct sparx5 *sparx5, u32 layer, u32 group, in sparx5_lg_is_first() argument
79 return idx == sparx5_lg_get_first(sparx5, layer, group); in sparx5_lg_is_first()
82 static bool sparx5_lg_is_empty(struct sparx5 *sparx5, u32 layer, u32 group) in sparx5_lg_is_empty() argument
84 return sparx5_lg_get_leak_time(sparx5, layer, group) == 0; in sparx5_lg_is_empty()
87 static bool sparx5_lg_is_singular(struct sparx5 *sparx5, u32 layer, u32 group) in sparx5_lg_is_singular() argument
89 if (sparx5_lg_is_empty(sparx5, layer, group)) in sparx5_lg_is_singular()
92 return sparx5_lg_get_first(sparx5, layer, group) == in sparx5_lg_is_singular()
93 sparx5_lg_get_last(sparx5, layer, group); in sparx5_lg_is_singular()
96 static void sparx5_lg_enable(struct sparx5 *sparx5, u32 layer, u32 group, in sparx5_lg_enable() argument
99 sparx5_lg_set_leak_time(sparx5, layer, group, leak_time); in sparx5_lg_enable()
102 static void sparx5_lg_disable(struct sparx5 *sparx5, u32 layer, u32 group) in sparx5_lg_disable() argument
104 sparx5_lg_set_leak_time(sparx5, layer, group, 0); in sparx5_lg_disable()
108 u32 idx, u32 *group) in sparx5_lg_get_group_by_index() argument
123 *group = i; in sparx5_lg_get_group_by_index()
136 static int sparx5_lg_get_group_by_rate(u32 layer, u32 rate, u32 *group) in sparx5_lg_get_group_by_rate() argument
145 *group = i; in sparx5_lg_get_group_by_rate()
153 static int sparx5_lg_get_adjacent(struct sparx5 *sparx5, u32 layer, u32 group, in sparx5_lg_get_adjacent() argument
158 *first = sparx5_lg_get_first(sparx5, layer, group); in sparx5_lg_get_adjacent()
164 *next = sparx5_lg_get_next(sparx5, layer, group, itr); in sparx5_lg_get_adjacent()
179 static int sparx5_lg_conf_set(struct sparx5 *sparx5, u32 layer, u32 group, in sparx5_lg_conf_set() argument
182 u32 leak_time = layers[layer].leak_groups[group].leak_time; in sparx5_lg_conf_set()
185 sparx5_lg_disable(sparx5, layer, group); in sparx5_lg_conf_set()
201 HSCH_HSCH_LEAK_CFG(layer, group)); in sparx5_lg_conf_set()
204 sparx5_lg_enable(sparx5, layer, group, leak_time); in sparx5_lg_conf_set()
209 static int sparx5_lg_del(struct sparx5 *sparx5, u32 layer, u32 group, u32 idx) in sparx5_lg_del() argument
214 /* idx *must* be present in the leak group */ in sparx5_lg_del()
215 WARN_ON(sparx5_lg_get_adjacent(sparx5, layer, group, idx, &prev, &next, in sparx5_lg_del()
218 if (sparx5_lg_is_singular(sparx5, layer, group)) { in sparx5_lg_del()
220 } else if (sparx5_lg_is_last(sparx5, layer, group, idx)) { in sparx5_lg_del()
224 } else if (sparx5_lg_is_first(sparx5, layer, group, idx)) { in sparx5_lg_del()
233 return sparx5_lg_conf_set(sparx5, layer, group, first, idx, next, in sparx5_lg_del()
248 /* Delete from old group */ in sparx5_lg_add()
270 u32 idx, u32 group) in sparx5_shaper_conf_set() argument
294 sparx5_lg_action(sparx5, layer, group, idx); in sparx5_shaper_conf_set()
346 * rate of 'max_rate' for this group in sparx5_leak_groups_init()
357 * this leak group in sparx5_leak_groups_init()
364 * 100 mbps can be served by leak group zero. in sparx5_leak_groups_init()
375 * leak group in sparx5_leak_groups_init()
436 u32 group; in sparx5_tc_tbf_add() local
438 /* Find suitable group for this se */ in sparx5_tc_tbf_add()
439 if (sparx5_lg_get_group_by_rate(layer, sh.rate, &group) < 0) { in sparx5_tc_tbf_add()
440 pr_debug("Could not find leak group for se with rate: %d", in sparx5_tc_tbf_add()
445 lg = &layers[layer].leak_groups[group]; in sparx5_tc_tbf_add()
447 pr_debug("Found matching group (speed: %d)\n", lg->max_rate); in sparx5_tc_tbf_add()
459 return sparx5_shaper_conf_set(port, &sh, layer, idx, group); in sparx5_tc_tbf_add()
465 u32 group; in sparx5_tc_tbf_del() local
467 sparx5_lg_get_group_by_index(port->sparx5, layer, idx, &group); in sparx5_tc_tbf_del()
469 return sparx5_shaper_conf_set(port, &sh, layer, idx, group); in sparx5_tc_tbf_del()