0001
0002
0003
0004 #ifndef __NFP_ABM_H__
0005 #define __NFP_ABM_H__ 1
0006
0007 #include <linux/bits.h>
0008 #include <linux/list.h>
0009 #include <linux/radix-tree.h>
0010 #include <net/devlink.h>
0011 #include <net/pkt_cls.h>
0012 #include <net/pkt_sched.h>
0013
0014
0015
0016
0017 #define NFP_ABM_STATS_REFRESH_IVAL (2500 * 1000)
0018
0019 #define NFP_ABM_LVL_INFINITY S32_MAX
0020
0021 struct nfp_app;
0022 struct nfp_net;
0023
0024 #define NFP_ABM_PORTID_TYPE GENMASK(23, 16)
0025 #define NFP_ABM_PORTID_ID GENMASK(7, 0)
0026
0027
0028 enum nfp_abm_q_action {
0029
0030 NFP_ABM_ACT_MARK_DROP = 0,
0031
0032 NFP_ABM_ACT_MARK_QUEUE = 1,
0033 NFP_ABM_ACT_DROP = 2,
0034 NFP_ABM_ACT_QUEUE = 3,
0035 NFP_ABM_ACT_NOQUEUE = 4,
0036 };
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063 struct nfp_abm {
0064 struct nfp_app *app;
0065 unsigned int pf_id;
0066
0067 unsigned int red_support;
0068 unsigned int num_prios;
0069 unsigned int num_bands;
0070 unsigned int action_mask;
0071
0072 u32 *thresholds;
0073 unsigned long *threshold_undef;
0074 u8 *actions;
0075 size_t num_thresholds;
0076
0077 unsigned int prio_map_len;
0078 u8 dscp_mask;
0079
0080 enum devlink_eswitch_mode eswitch_mode;
0081
0082 const struct nfp_rtsym *q_lvls;
0083 const struct nfp_rtsym *qm_stats;
0084 const struct nfp_rtsym *q_stats;
0085 };
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096 struct nfp_alink_stats {
0097 u64 tx_pkts;
0098 u64 tx_bytes;
0099 u64 backlog_pkts;
0100 u64 backlog_bytes;
0101 u64 overlimits;
0102 u64 drops;
0103 };
0104
0105
0106
0107
0108
0109
0110 struct nfp_alink_xstats {
0111 u64 ecn_marked;
0112 u64 pdrop;
0113 };
0114
0115 enum nfp_qdisc_type {
0116 NFP_QDISC_NONE = 0,
0117 NFP_QDISC_MQ,
0118 NFP_QDISC_RED,
0119 NFP_QDISC_GRED,
0120 };
0121
0122 #define NFP_QDISC_UNTRACKED ((struct nfp_qdisc *)1UL)
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152 struct nfp_qdisc {
0153 struct net_device *netdev;
0154 enum nfp_qdisc_type type;
0155 u32 handle;
0156 u32 parent_handle;
0157 unsigned int use_cnt;
0158 unsigned int num_children;
0159 struct nfp_qdisc **children;
0160
0161 bool params_ok;
0162 bool offload_mark;
0163 bool offloaded;
0164
0165 union {
0166
0167 struct {
0168 struct nfp_alink_stats stats;
0169 struct nfp_alink_stats prev_stats;
0170 } mq;
0171
0172 struct {
0173 unsigned int num_bands;
0174
0175 struct {
0176 bool ecn;
0177 u32 threshold;
0178 struct nfp_alink_stats stats;
0179 struct nfp_alink_stats prev_stats;
0180 struct nfp_alink_xstats xstats;
0181 struct nfp_alink_xstats prev_xstats;
0182 } band[MAX_DPs];
0183 } red;
0184 };
0185 };
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206 struct nfp_abm_link {
0207 struct nfp_abm *abm;
0208 struct nfp_net *vnic;
0209 unsigned int id;
0210 unsigned int queue_base;
0211 unsigned int total_queues;
0212
0213 u64 last_stats_update;
0214
0215 u32 *prio_map;
0216 bool has_prio;
0217
0218 u8 def_band;
0219 struct list_head dscp_map;
0220
0221 struct nfp_qdisc *root_qdisc;
0222 struct radix_tree_root qdiscs;
0223 };
0224
0225 static inline bool nfp_abm_has_prio(struct nfp_abm *abm)
0226 {
0227 return abm->num_bands > 1;
0228 }
0229
0230 static inline bool nfp_abm_has_drop(struct nfp_abm *abm)
0231 {
0232 return abm->action_mask & BIT(NFP_ABM_ACT_DROP);
0233 }
0234
0235 static inline bool nfp_abm_has_mark(struct nfp_abm *abm)
0236 {
0237 return abm->action_mask & BIT(NFP_ABM_ACT_MARK_DROP);
0238 }
0239
0240 void nfp_abm_qdisc_offload_update(struct nfp_abm_link *alink);
0241 int nfp_abm_setup_root(struct net_device *netdev, struct nfp_abm_link *alink,
0242 struct tc_root_qopt_offload *opt);
0243 int nfp_abm_setup_tc_red(struct net_device *netdev, struct nfp_abm_link *alink,
0244 struct tc_red_qopt_offload *opt);
0245 int nfp_abm_setup_tc_mq(struct net_device *netdev, struct nfp_abm_link *alink,
0246 struct tc_mq_qopt_offload *opt);
0247 int nfp_abm_setup_tc_gred(struct net_device *netdev, struct nfp_abm_link *alink,
0248 struct tc_gred_qopt_offload *opt);
0249 int nfp_abm_setup_cls_block(struct net_device *netdev, struct nfp_repr *repr,
0250 struct flow_block_offload *opt);
0251
0252 int nfp_abm_ctrl_read_params(struct nfp_abm_link *alink);
0253 int nfp_abm_ctrl_find_addrs(struct nfp_abm *abm);
0254 int __nfp_abm_ctrl_set_q_lvl(struct nfp_abm *abm, unsigned int id, u32 val);
0255 int nfp_abm_ctrl_set_q_lvl(struct nfp_abm_link *alink, unsigned int band,
0256 unsigned int queue, u32 val);
0257 int __nfp_abm_ctrl_set_q_act(struct nfp_abm *abm, unsigned int id,
0258 enum nfp_abm_q_action act);
0259 int nfp_abm_ctrl_set_q_act(struct nfp_abm_link *alink, unsigned int band,
0260 unsigned int queue, enum nfp_abm_q_action act);
0261 int nfp_abm_ctrl_read_q_stats(struct nfp_abm_link *alink,
0262 unsigned int band, unsigned int queue,
0263 struct nfp_alink_stats *stats);
0264 int nfp_abm_ctrl_read_q_xstats(struct nfp_abm_link *alink,
0265 unsigned int band, unsigned int queue,
0266 struct nfp_alink_xstats *xstats);
0267 u64 nfp_abm_ctrl_stat_non_sto(struct nfp_abm_link *alink, unsigned int i);
0268 u64 nfp_abm_ctrl_stat_sto(struct nfp_abm_link *alink, unsigned int i);
0269 int nfp_abm_ctrl_qm_enable(struct nfp_abm *abm);
0270 int nfp_abm_ctrl_qm_disable(struct nfp_abm *abm);
0271 void nfp_abm_prio_map_update(struct nfp_abm *abm);
0272 int nfp_abm_ctrl_prio_map_update(struct nfp_abm_link *alink, u32 *packed);
0273 #endif