16f2a064bSShagun Agrawal /* SPDX-License-Identifier: BSD-3-Clause
26f2a064bSShagun Agrawal * Copyright(c) 2018 Chelsio Communications.
36f2a064bSShagun Agrawal * All rights reserved.
46f2a064bSShagun Agrawal */
56f2a064bSShagun Agrawal
66f2a064bSShagun Agrawal #ifndef _CXGBE_OFLD_H_
76f2a064bSShagun Agrawal #define _CXGBE_OFLD_H_
86f2a064bSShagun Agrawal
96f2a064bSShagun Agrawal #include <rte_bitmap.h>
106f2a064bSShagun Agrawal
116f2a064bSShagun Agrawal #include "cxgbe_filter.h"
126f2a064bSShagun Agrawal
13af44a577SShagun Agrawal #define INIT_TP_WR(w, tid) do { \
14af44a577SShagun Agrawal (w)->wr.wr_hi = cpu_to_be32(V_FW_WR_OP(FW_TP_WR) | \
15af44a577SShagun Agrawal V_FW_WR_IMMDLEN(sizeof(*w) - sizeof(w->wr))); \
16af44a577SShagun Agrawal (w)->wr.wr_mid = cpu_to_be32( \
17af44a577SShagun Agrawal V_FW_WR_LEN16(DIV_ROUND_UP(sizeof(*w), 16)) | \
18af44a577SShagun Agrawal V_FW_WR_FLOWID(tid)); \
19af44a577SShagun Agrawal (w)->wr.wr_lo = cpu_to_be64(0); \
20af44a577SShagun Agrawal } while (0)
21af44a577SShagun Agrawal
2241dc98b0SShagun Agrawal #define INIT_TP_WR_MIT_CPL(w, cpl, tid) do { \
2341dc98b0SShagun Agrawal INIT_TP_WR(w, tid); \
2441dc98b0SShagun Agrawal OPCODE_TID(w) = cpu_to_be32(MK_OPCODE_TID(cpl, tid)); \
2541dc98b0SShagun Agrawal } while (0)
2641dc98b0SShagun Agrawal
2741dc98b0SShagun Agrawal #define INIT_ULPTX_WR(w, wrlen, atomic, tid) do { \
2841dc98b0SShagun Agrawal (w)->wr.wr_hi = cpu_to_be32(V_FW_WR_OP(FW_ULPTX_WR) | \
2941dc98b0SShagun Agrawal V_FW_WR_ATOMIC(atomic)); \
3041dc98b0SShagun Agrawal (w)->wr.wr_mid = cpu_to_be32(V_FW_WR_LEN16(DIV_ROUND_UP(wrlen, 16)) | \
3141dc98b0SShagun Agrawal V_FW_WR_FLOWID(tid)); \
3241dc98b0SShagun Agrawal (w)->wr.wr_lo = cpu_to_be64(0); \
3341dc98b0SShagun Agrawal } while (0)
3441dc98b0SShagun Agrawal
356f2a064bSShagun Agrawal /*
363a381a41SShagun Agrawal * Max # of ATIDs. The absolute HW max is 16K but we keep it lower.
373a381a41SShagun Agrawal */
383a381a41SShagun Agrawal #define MAX_ATIDS 8192U
393a381a41SShagun Agrawal
403a381a41SShagun Agrawal union aopen_entry {
413a381a41SShagun Agrawal void *data;
423a381a41SShagun Agrawal union aopen_entry *next;
433a381a41SShagun Agrawal };
443a381a41SShagun Agrawal
453a381a41SShagun Agrawal /*
466f2a064bSShagun Agrawal * Holds the size, base address, free list start, etc of filter TID.
476f2a064bSShagun Agrawal * The tables themselves are allocated dynamically.
486f2a064bSShagun Agrawal */
496f2a064bSShagun Agrawal struct tid_info {
506f2a064bSShagun Agrawal void **tid_tab;
516f2a064bSShagun Agrawal unsigned int ntids;
526f2a064bSShagun Agrawal struct filter_entry *ftid_tab; /* Normal filters */
533a381a41SShagun Agrawal union aopen_entry *atid_tab;
546f2a064bSShagun Agrawal struct rte_bitmap *ftid_bmap;
556f2a064bSShagun Agrawal uint8_t *ftid_bmap_array;
563a381a41SShagun Agrawal unsigned int nftids, natids;
573a381a41SShagun Agrawal unsigned int ftid_base, hash_base;
583a381a41SShagun Agrawal
593a381a41SShagun Agrawal union aopen_entry *afree;
603a381a41SShagun Agrawal unsigned int atids_in_use;
613a381a41SShagun Agrawal
623a381a41SShagun Agrawal /* TIDs in the TCAM */
63*e12a0166STyler Retzlaff RTE_ATOMIC(u32) tids_in_use;
643a381a41SShagun Agrawal /* TIDs in the HASH */
65*e12a0166STyler Retzlaff RTE_ATOMIC(u32) hash_tids_in_use;
66*e12a0166STyler Retzlaff RTE_ATOMIC(u32) conns_in_use;
673a381a41SShagun Agrawal
6827595cd8STyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) rte_spinlock_t atid_lock;
696f2a064bSShagun Agrawal rte_spinlock_t ftid_lock;
706f2a064bSShagun Agrawal };
71af44a577SShagun Agrawal
lookup_tid(const struct tid_info * t,unsigned int tid)72af44a577SShagun Agrawal static inline void *lookup_tid(const struct tid_info *t, unsigned int tid)
73af44a577SShagun Agrawal {
74af44a577SShagun Agrawal return tid < t->ntids ? t->tid_tab[tid] : NULL;
75af44a577SShagun Agrawal }
76af44a577SShagun Agrawal
lookup_atid(const struct tid_info * t,unsigned int atid)77af44a577SShagun Agrawal static inline void *lookup_atid(const struct tid_info *t, unsigned int atid)
78af44a577SShagun Agrawal {
79af44a577SShagun Agrawal return atid < t->natids ? t->atid_tab[atid].data : NULL;
80af44a577SShagun Agrawal }
81af44a577SShagun Agrawal
82af44a577SShagun Agrawal int cxgbe_alloc_atid(struct tid_info *t, void *data);
83af44a577SShagun Agrawal void cxgbe_free_atid(struct tid_info *t, unsigned int atid);
8441dc98b0SShagun Agrawal void cxgbe_remove_tid(struct tid_info *t, unsigned int qid, unsigned int tid,
8541dc98b0SShagun Agrawal unsigned short family);
86af44a577SShagun Agrawal void cxgbe_insert_tid(struct tid_info *t, void *data, unsigned int tid,
87af44a577SShagun Agrawal unsigned short family);
88af44a577SShagun Agrawal
896f2a064bSShagun Agrawal #endif /* _CXGBE_OFLD_H_ */
90