xref: /illumos-gate/usr/src/uts/common/io/cxgbe/t4nex/offload.h (revision 3dde7c95de085cfe31f989eff6cefb775563eeb8)
156b2bdd1SGireesh Nagabhushana /*
256b2bdd1SGireesh Nagabhushana  * This file and its contents are supplied under the terms of the
356b2bdd1SGireesh Nagabhushana  * Common Development and Distribution License ("CDDL"), version 1.0.
456b2bdd1SGireesh Nagabhushana  * You may only use this file in accordance with the terms of version
556b2bdd1SGireesh Nagabhushana  * 1.0 of the CDDL.
656b2bdd1SGireesh Nagabhushana  *
756b2bdd1SGireesh Nagabhushana  * A full copy of the text of the CDDL should have accompanied this
856b2bdd1SGireesh Nagabhushana  * source. A copy of the CDDL is also available via the Internet at
956b2bdd1SGireesh Nagabhushana  * http://www.illumos.org/license/CDDL.
1056b2bdd1SGireesh Nagabhushana  */
1156b2bdd1SGireesh Nagabhushana 
1256b2bdd1SGireesh Nagabhushana /*
1356b2bdd1SGireesh Nagabhushana  * This file is part of the Chelsio T4 support code.
1456b2bdd1SGireesh Nagabhushana  *
1556b2bdd1SGireesh Nagabhushana  * Copyright (C) 2010-2013 Chelsio Communications.  All rights reserved.
1656b2bdd1SGireesh Nagabhushana  *
1756b2bdd1SGireesh Nagabhushana  * This program is distributed in the hope that it will be useful, but WITHOUT
1856b2bdd1SGireesh Nagabhushana  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1956b2bdd1SGireesh Nagabhushana  * FITNESS FOR A PARTICULAR PURPOSE.  See the LICENSE file included in this
2056b2bdd1SGireesh Nagabhushana  * release for licensing terms and conditions.
2156b2bdd1SGireesh Nagabhushana  */
2256b2bdd1SGireesh Nagabhushana 
2356b2bdd1SGireesh Nagabhushana #ifndef __CXGBE_OFFLOAD_H
2456b2bdd1SGireesh Nagabhushana #define	__CXGBE_OFFLOAD_H
2556b2bdd1SGireesh Nagabhushana 
2656b2bdd1SGireesh Nagabhushana /*
2756b2bdd1SGireesh Nagabhushana  * Max # of ATIDs.  The absolute HW max is 16K but we keep it lower.
2856b2bdd1SGireesh Nagabhushana  */
2956b2bdd1SGireesh Nagabhushana #define	MAX_ATIDS 8192U
3056b2bdd1SGireesh Nagabhushana 
3156b2bdd1SGireesh Nagabhushana #define	INIT_ULPTX_WR(w, wrlen, atomic, tid) do { \
3256b2bdd1SGireesh Nagabhushana 	(w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_ULPTX_WR) | \
3356b2bdd1SGireesh Nagabhushana 		V_FW_WR_ATOMIC(atomic)); \
3456b2bdd1SGireesh Nagabhushana 	(w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(wrlen, 16)) | \
3556b2bdd1SGireesh Nagabhushana 		V_FW_WR_FLOWID(tid)); \
3656b2bdd1SGireesh Nagabhushana 	(w)->wr.wr_lo = cpu_to_be64(0); \
3756b2bdd1SGireesh Nagabhushana } while (0)
3856b2bdd1SGireesh Nagabhushana 
3956b2bdd1SGireesh Nagabhushana #define	INIT_TP_WR(w, tid) do { \
4056b2bdd1SGireesh Nagabhushana 	(w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_TP_WR) | \
4156b2bdd1SGireesh Nagabhushana 		V_FW_WR_IMMDLEN(sizeof (*w) - sizeof (w->wr))); \
4256b2bdd1SGireesh Nagabhushana 	(w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(sizeof (*w), 16)) | \
4356b2bdd1SGireesh Nagabhushana 		V_FW_WR_FLOWID(tid)); \
4456b2bdd1SGireesh Nagabhushana 	(w)->wr.wr_lo = cpu_to_be64(0); \
4556b2bdd1SGireesh Nagabhushana } while (0)
4656b2bdd1SGireesh Nagabhushana 
4756b2bdd1SGireesh Nagabhushana #define	INIT_TP_WR_MIT_CPL(w, cpl, tid) do { \
4856b2bdd1SGireesh Nagabhushana 	INIT_TP_WR(w, tid); \
4956b2bdd1SGireesh Nagabhushana 	OPCODE_TID(w) = htonl(MK_OPCODE_TID(cpl, tid)); \
5056b2bdd1SGireesh Nagabhushana } while (0)
5156b2bdd1SGireesh Nagabhushana 
5256b2bdd1SGireesh Nagabhushana union serv_entry {
5356b2bdd1SGireesh Nagabhushana 	void *data;
5456b2bdd1SGireesh Nagabhushana 	union serv_entry *next;
5556b2bdd1SGireesh Nagabhushana };
5656b2bdd1SGireesh Nagabhushana 
5756b2bdd1SGireesh Nagabhushana union aopen_entry {
5856b2bdd1SGireesh Nagabhushana 	void *data;
5956b2bdd1SGireesh Nagabhushana 	union aopen_entry *next;
6056b2bdd1SGireesh Nagabhushana };
6156b2bdd1SGireesh Nagabhushana 
6256b2bdd1SGireesh Nagabhushana /*
6356b2bdd1SGireesh Nagabhushana  * Holds the size, base address, free list start, etc of the TID, server TID,
6456b2bdd1SGireesh Nagabhushana  * and active-open TID tables.  The tables themselves are allocated dynamically.
6556b2bdd1SGireesh Nagabhushana  */
6656b2bdd1SGireesh Nagabhushana struct tid_info {
6756b2bdd1SGireesh Nagabhushana 	void **tid_tab;
6856b2bdd1SGireesh Nagabhushana 	unsigned int ntids;
6956b2bdd1SGireesh Nagabhushana 
7056b2bdd1SGireesh Nagabhushana 	union serv_entry *stid_tab;
7156b2bdd1SGireesh Nagabhushana 	unsigned int nstids;
7256b2bdd1SGireesh Nagabhushana 	unsigned int stid_base;
7356b2bdd1SGireesh Nagabhushana 
7456b2bdd1SGireesh Nagabhushana 	union aopen_entry *atid_tab;
7556b2bdd1SGireesh Nagabhushana 	unsigned int natids;
7656b2bdd1SGireesh Nagabhushana 
7756b2bdd1SGireesh Nagabhushana 	struct filter_entry *ftid_tab;
7856b2bdd1SGireesh Nagabhushana 	unsigned int nftids;
7956b2bdd1SGireesh Nagabhushana 	unsigned int ftid_base;
8056b2bdd1SGireesh Nagabhushana 	unsigned int ftids_in_use;
8156b2bdd1SGireesh Nagabhushana 
8256b2bdd1SGireesh Nagabhushana 	kmutex_t atid_lock;
8356b2bdd1SGireesh Nagabhushana 	union aopen_entry *afree;
8456b2bdd1SGireesh Nagabhushana 	unsigned int atids_in_use;
8556b2bdd1SGireesh Nagabhushana 
8656b2bdd1SGireesh Nagabhushana 	kmutex_t stid_lock;
8756b2bdd1SGireesh Nagabhushana 	union serv_entry *sfree;
8856b2bdd1SGireesh Nagabhushana 	unsigned int stids_in_use;
8956b2bdd1SGireesh Nagabhushana 
9056b2bdd1SGireesh Nagabhushana 	unsigned int tids_in_use;
9156b2bdd1SGireesh Nagabhushana };
9256b2bdd1SGireesh Nagabhushana 
9356b2bdd1SGireesh Nagabhushana struct t4_range {
94de483253SVishal Kulkarni 	u_int start;
95de483253SVishal Kulkarni 	u_int size;
9656b2bdd1SGireesh Nagabhushana };
9756b2bdd1SGireesh Nagabhushana 
9856b2bdd1SGireesh Nagabhushana struct t4_virt_res {		/* virtualized HW resources */
9956b2bdd1SGireesh Nagabhushana 	struct t4_range ddp;
10056b2bdd1SGireesh Nagabhushana 	struct t4_range iscsi;
10156b2bdd1SGireesh Nagabhushana 	struct t4_range stag;
10256b2bdd1SGireesh Nagabhushana 	struct t4_range rq;
10356b2bdd1SGireesh Nagabhushana 	struct t4_range pbl;
104de483253SVishal Kulkarni 	struct t4_range l2t;
10556b2bdd1SGireesh Nagabhushana };
10656b2bdd1SGireesh Nagabhushana 
10756b2bdd1SGireesh Nagabhushana struct adapter;
10856b2bdd1SGireesh Nagabhushana struct port_info;
10956b2bdd1SGireesh Nagabhushana 
11056b2bdd1SGireesh Nagabhushana enum {
11156b2bdd1SGireesh Nagabhushana 	ULD_TOM = 1,
11256b2bdd1SGireesh Nagabhushana };
11356b2bdd1SGireesh Nagabhushana 
11456b2bdd1SGireesh Nagabhushana enum cxgb4_control {
11556b2bdd1SGireesh Nagabhushana 	CXGB4_CONTROL_SET_OFFLOAD_POLICY,
11656b2bdd1SGireesh Nagabhushana };
11756b2bdd1SGireesh Nagabhushana 
11856b2bdd1SGireesh Nagabhushana struct uld_info {
11956b2bdd1SGireesh Nagabhushana 	SLIST_ENTRY(uld_info) link;
12056b2bdd1SGireesh Nagabhushana 	int refcount;
12156b2bdd1SGireesh Nagabhushana 	int uld_id;
12256b2bdd1SGireesh Nagabhushana 	int (*attach)(struct adapter *, void **);
12356b2bdd1SGireesh Nagabhushana 	int (*detach)(void *);
12456b2bdd1SGireesh Nagabhushana 	int (*rx)(void *, const void *, mblk_t *);
12556b2bdd1SGireesh Nagabhushana 	int (*control)(void *handle, enum cxgb4_control control, ...);
12656b2bdd1SGireesh Nagabhushana };
12756b2bdd1SGireesh Nagabhushana 
12856b2bdd1SGireesh Nagabhushana struct uld_softc {
12956b2bdd1SGireesh Nagabhushana 	struct uld_info *uld;
13056b2bdd1SGireesh Nagabhushana 	void *softc;
13156b2bdd1SGireesh Nagabhushana };
13256b2bdd1SGireesh Nagabhushana 
13356b2bdd1SGireesh Nagabhushana struct tom_tunables {
13456b2bdd1SGireesh Nagabhushana 	int sndbuf;
13556b2bdd1SGireesh Nagabhushana 	int ddp;
13656b2bdd1SGireesh Nagabhushana 	int indsz;
13756b2bdd1SGireesh Nagabhushana 	int ddp_thres;
13856b2bdd1SGireesh Nagabhushana };
13956b2bdd1SGireesh Nagabhushana 
140*3dde7c95SVishal Kulkarni #ifdef TCP_OFFLOAD_ENABLE
14156b2bdd1SGireesh Nagabhushana struct offload_req {
14256b2bdd1SGireesh Nagabhushana 	__be32 sip[4];
14356b2bdd1SGireesh Nagabhushana 	__be32 dip[4];
14456b2bdd1SGireesh Nagabhushana 	__be16 sport;
14556b2bdd1SGireesh Nagabhushana 	__be16 dport;
14656b2bdd1SGireesh Nagabhushana 	__u8   ipvers_opentype;
14756b2bdd1SGireesh Nagabhushana 	__u8   tos;
14856b2bdd1SGireesh Nagabhushana 	__be16 vlan;
14956b2bdd1SGireesh Nagabhushana 	__u32  mark;
15056b2bdd1SGireesh Nagabhushana };
15156b2bdd1SGireesh Nagabhushana 
15256b2bdd1SGireesh Nagabhushana enum { OPEN_TYPE_LISTEN, OPEN_TYPE_ACTIVE, OPEN_TYPE_PASSIVE };
15356b2bdd1SGireesh Nagabhushana 
15456b2bdd1SGireesh Nagabhushana struct offload_settings {
15556b2bdd1SGireesh Nagabhushana 	__u8  offload;
15656b2bdd1SGireesh Nagabhushana 	int8_t  ddp;
15756b2bdd1SGireesh Nagabhushana 	int8_t  rx_coalesce;
15856b2bdd1SGireesh Nagabhushana 	int8_t  cong_algo;
15956b2bdd1SGireesh Nagabhushana 	int32_t	rssq;
16056b2bdd1SGireesh Nagabhushana 	int16_t sched_class;
16156b2bdd1SGireesh Nagabhushana 	int8_t  tstamp;
16256b2bdd1SGireesh Nagabhushana 	int8_t  sack;
16356b2bdd1SGireesh Nagabhushana 
16456b2bdd1SGireesh Nagabhushana };
16556b2bdd1SGireesh Nagabhushana #endif
16656b2bdd1SGireesh Nagabhushana 
16756b2bdd1SGireesh Nagabhushana extern int t4_register_uld(struct uld_info *ui);
16856b2bdd1SGireesh Nagabhushana extern int t4_unregister_uld(struct uld_info *ui);
16956b2bdd1SGireesh Nagabhushana 
17056b2bdd1SGireesh Nagabhushana #endif /* __CXGBE_OFFLOAD_H */
171