1 // SPDX-License-Identifier: GPL-2.0+
3 #include "lan966x_main.h"
5 int lan966x_cbs_add(struct lan966x_port *port,
6 struct tc_cbs_qopt_offload *qopt)
8 struct lan966x *lan966x = port->lan966x;
12 /* Check for invalid values */
13 if (qopt->idleslope <= 0 ||
14 qopt->sendslope >= 0 ||
15 qopt->locredit >= qopt->hicredit)
18 se_idx = SE_IDX_QUEUE + port->chip_port * NUM_PRIO_QUEUES + qopt->queue;
19 cir = qopt->idleslope;
20 cbs = (qopt->idleslope - qopt->sendslope) *
21 (qopt->hicredit - qopt->locredit) /
24 /* Rate unit is 100 kbps */
25 cir = DIV_ROUND_UP(cir, 100);
26 /* Avoid using zero rate */
28 /* Burst unit is 4kB */
29 cbs = DIV_ROUND_UP(cbs, 4096);
30 /* Avoid using zero burst */
33 /* Check that actually the result can be written */
34 if (cir > GENMASK(15, 0) ||
38 lan_rmw(QSYS_SE_CFG_SE_AVB_ENA_SET(1) |
39 QSYS_SE_CFG_SE_FRM_MODE_SET(1),
40 QSYS_SE_CFG_SE_AVB_ENA |
41 QSYS_SE_CFG_SE_FRM_MODE,
42 lan966x, QSYS_SE_CFG(se_idx));
44 lan_wr(QSYS_CIR_CFG_CIR_RATE_SET(cir) |
45 QSYS_CIR_CFG_CIR_BURST_SET(cbs),
46 lan966x, QSYS_CIR_CFG(se_idx));
51 int lan966x_cbs_del(struct lan966x_port *port,
52 struct tc_cbs_qopt_offload *qopt)
54 struct lan966x *lan966x = port->lan966x;
57 se_idx = SE_IDX_QUEUE + port->chip_port * NUM_PRIO_QUEUES + qopt->queue;
59 lan_rmw(QSYS_SE_CFG_SE_AVB_ENA_SET(1) |
60 QSYS_SE_CFG_SE_FRM_MODE_SET(0),
61 QSYS_SE_CFG_SE_AVB_ENA |
62 QSYS_SE_CFG_SE_FRM_MODE,
63 lan966x, QSYS_SE_CFG(se_idx));
65 lan_wr(QSYS_CIR_CFG_CIR_RATE_SET(0) |
66 QSYS_CIR_CFG_CIR_BURST_SET(0),
67 lan966x, QSYS_CIR_CFG(se_idx));