Lines Matching +full:only +full:- +full:1 +full:- +full:8 +full:v
1 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
2 /* Copyright 2020-2021 NXP
9 * Resource 1: Frame references tracked per source port
17 #define REF_xxxx_I (1 * OCELOT_RESOURCE_SZ)
33 * ----------------------
44 * V V v v
55 * V V v v
66 * V V v v
77 * V V v v
88 * V V v v
99 * V V v v
110 * V V v v
121 * V V v v
128 * ------------------
138 * V V v v
149 * V V v v
153 (BUF_xxxx_E + xxx_COL_SHR_x + (1 - (dp)))
160 * V V v v
171 * V V v v
175 (BUF_xxxx_I + xxx_COL_SHR_x + (1 - (dp)))
182 * V V v v
193 * V V v v
197 (REF_xxxx_E + xxx_COL_SHR_x + (1 - (dp)))
204 * V V v v
215 * V V v v
219 (REF_xxxx_I + xxx_COL_SHR_x + (1 - (dp)))
225 return ocelot->ops->wm_dec(wm); in ocelot_wm_read()
230 u32 wm = ocelot->ops->wm_enc(val); in ocelot_wm_write()
240 return ocelot->ops->wm_stat(res_stat, inuse, maxuse); in ocelot_wm_status()
248 * reservations and rely only on the sharing watermark for frames with drop
250 * and per port-tc through devlink-sb.
274 * The switch has 10 sharing watermarks per lookup: 8 per traffic class and 2
277 * (1) There's a risk that we overcommit the resources if we configure
278 * (a) all 8 per-TC sharing watermarks to the max
279 * (b) all 2 per-color sharing watermarks to the max
281 * (a) all 8 per-TC sharing watermarks to "max / 8"
282 * (b) all 2 per-color sharing watermarks to "max / 2"
284 * (setting them to 0 will make them always exceeded), and rely only on the
285 * sharing watermark for drop priority 0. So frames with drop priority set to 1
286 * by QoS classification or policing will still be allowed, but only as long as
287 * the port and port-TC reservations are not exceeded.
309 for (port = 0; port <= ocelot->num_phys_ports; port++) { in ocelot_get_buf_rsrv()
333 for (port = 0; port <= ocelot->num_phys_ports; port++) { in ocelot_get_ref_rsrv()
359 buf_shr_i = ocelot->pool_size[OCELOT_SB_BUF][OCELOT_SB_POOL_ING] - in ocelot_setup_sharing_watermarks()
361 buf_shr_e = ocelot->pool_size[OCELOT_SB_BUF][OCELOT_SB_POOL_EGR] - in ocelot_setup_sharing_watermarks()
363 ref_shr_i = ocelot->pool_size[OCELOT_SB_REF][OCELOT_SB_POOL_ING] - in ocelot_setup_sharing_watermarks()
365 ref_shr_e = ocelot->pool_size[OCELOT_SB_REF][OCELOT_SB_POOL_EGR] - in ocelot_setup_sharing_watermarks()
375 ocelot_wm_write(ocelot, BUF_COL_SHR_I(1), 0); in ocelot_setup_sharing_watermarks()
376 ocelot_wm_write(ocelot, BUF_COL_SHR_E(1), 0); in ocelot_setup_sharing_watermarks()
377 ocelot_wm_write(ocelot, REF_COL_SHR_E(1), 0); in ocelot_setup_sharing_watermarks()
378 ocelot_wm_write(ocelot, REF_COL_SHR_I(1), 0); in ocelot_setup_sharing_watermarks()
391 if (buf_rsrv_i > ocelot->pool_size[OCELOT_SB_BUF][OCELOT_SB_POOL_ING]) { in ocelot_watermark_validate()
394 return -ERANGE; in ocelot_watermark_validate()
396 if (buf_rsrv_e > ocelot->pool_size[OCELOT_SB_BUF][OCELOT_SB_POOL_EGR]) { in ocelot_watermark_validate()
399 return -ERANGE; in ocelot_watermark_validate()
401 if (ref_rsrv_i > ocelot->pool_size[OCELOT_SB_REF][OCELOT_SB_POOL_ING]) { in ocelot_watermark_validate()
404 return -ERANGE; in ocelot_watermark_validate()
406 if (ref_rsrv_e > ocelot->pool_size[OCELOT_SB_REF][OCELOT_SB_POOL_EGR]) { in ocelot_watermark_validate()
409 return -ERANGE; in ocelot_watermark_validate()
419 * v
420 * +--------------------+--------------------+--------------------+
422 * v v v v
426 * v v v v
428 *(src port, prio) -+ (dst port, prio) -+ (src port, prio) -+ (dst port, prio) -+
431 * v | v | v | v |
433 * (src port) ----+ (dst port) ----+ (src port) ----+ (dst port) -----+
436 * v | v | v | v |
438 * (prio) ------+ (prio) ------+ (prio) ------+ (prio) -------+
441 * v | v | v | v |
443 * (dp) -------+ (dp) -------+ (dp) -------+ (dp) --------+
446 * v v v v v v v v
449 * v v v v v v v v
450 * +-----+----+ +-----+----+ +-----+----+ +-----+-----+
452 * +-------> OR <-------+ +-------> OR <-------+
454 * v v
455 * +----------------> AND <-----------------+
457 * v
460 * We are modeling each of the 4 parallel lookups as a devlink-sb pool.
464 * The following watermarks are controlled explicitly through devlink-sb:
467 * The following watermarks are controlled implicitly through devlink-sb:
478 int all_tcs = GENMASK(OCELOT_NUM_TC - 1, 0); in ocelot_watermark_init()
483 for (port = 0; port <= ocelot->num_phys_ports; port++) in ocelot_watermark_init()
491 * Bit 8: Unit; 0:1, 1:16
492 * Bit 7-0: Value to be multiplied with unit
496 WARN_ON(value >= 16 * BIT(8)); in ocelot_wm_enc()
498 if (value >= BIT(8)) in ocelot_wm_enc()
499 return BIT(8) | (value / 16); in ocelot_wm_enc()
507 if (wm & BIT(8)) in ocelot_wm_dec()
530 .cell_size = 1,
541 return -ENODEV; in ocelot_sb_pool_get()
543 return -ENODEV; in ocelot_sb_pool_get()
546 pool_info->size = ocelot->pool_size[sb_index][pool_index]; in ocelot_sb_pool_get()
548 pool_info->pool_type = DEVLINK_SB_POOL_TYPE_INGRESS; in ocelot_sb_pool_get()
550 pool_info->pool_type = DEVLINK_SB_POOL_TYPE_EGRESS; in ocelot_sb_pool_get()
558 * the values for the port and port-tc reservations, is written into the
571 "Invalid sb, use 0 for buffers and 1 for frame references"); in ocelot_sb_pool_set()
572 return -ENODEV; in ocelot_sb_pool_set()
576 "Invalid pool, use 0 for ingress and 1 for egress"); in ocelot_sb_pool_set()
577 return -ENODEV; in ocelot_sb_pool_set()
581 "Only static threshold supported"); in ocelot_sb_pool_set()
582 return -EOPNOTSUPP; in ocelot_sb_pool_set()
585 old_pool_size = ocelot->pool_size[sb_index][pool_index]; in ocelot_sb_pool_set()
586 ocelot->pool_size[sb_index][pool_index] = size; in ocelot_sb_pool_set()
590 ocelot->pool_size[sb_index][pool_index] = old_pool_size; in ocelot_sb_pool_set()
621 return -ENODEV; in ocelot_sb_port_pool_get()
631 /* This configures the P_RSRV per-port reserved resource watermark */
654 return -ENODEV; in ocelot_sb_port_pool_set()
696 return -ENODEV; in ocelot_sb_tc_pool_bind_get()
705 *p_pool_index = 1; in ocelot_sb_tc_pool_bind_get()
711 /* This configures the Q_RSRV per-port-tc reserved resource watermark */
724 return -EINVAL; in ocelot_sb_tc_pool_bind_set()
727 return -EINVAL; in ocelot_sb_tc_pool_bind_set()
744 return -ENODEV; in ocelot_sb_tc_pool_bind_set()
782 for (port = 0; port <= ocelot->num_phys_ports; port++) { in ocelot_sb_occ_max_clear()
796 for (port = 0; port <= ocelot->num_phys_ports; port++) { in ocelot_sb_occ_max_clear()
810 return -ENODEV; in ocelot_sb_occ_max_clear()
817 /* This retrieves the watermark occupancy for per-port P_RSRV watermarks */
838 return -ENODEV; in ocelot_sb_occ_port_pool_get()
849 /* This retrieves the watermark occupancy for per-port-tc Q_RSRV watermarks */
871 return -ENODEV; in ocelot_sb_occ_tc_port_bind_get()
886 err = devlink_sb_register(ocelot->devlink, OCELOT_SB_BUF, in ocelot_devlink_sb_register()
887 ocelot->packet_buffer_size, 1, 1, in ocelot_devlink_sb_register()
892 err = devlink_sb_register(ocelot->devlink, OCELOT_SB_REF, in ocelot_devlink_sb_register()
893 ocelot->num_frame_refs, 1, 1, in ocelot_devlink_sb_register()
896 devlink_sb_unregister(ocelot->devlink, OCELOT_SB_BUF); in ocelot_devlink_sb_register()
900 ocelot->pool_size[OCELOT_SB_BUF][OCELOT_SB_POOL_ING] = ocelot->packet_buffer_size; in ocelot_devlink_sb_register()
901 ocelot->pool_size[OCELOT_SB_BUF][OCELOT_SB_POOL_EGR] = ocelot->packet_buffer_size; in ocelot_devlink_sb_register()
902 ocelot->pool_size[OCELOT_SB_REF][OCELOT_SB_POOL_ING] = ocelot->num_frame_refs; in ocelot_devlink_sb_register()
903 ocelot->pool_size[OCELOT_SB_REF][OCELOT_SB_POOL_EGR] = ocelot->num_frame_refs; in ocelot_devlink_sb_register()
913 devlink_sb_unregister(ocelot->devlink, OCELOT_SB_BUF); in ocelot_devlink_sb_unregister()
914 devlink_sb_unregister(ocelot->devlink, OCELOT_SB_REF); in ocelot_devlink_sb_unregister()