#ifndef __T4_IOCTL_H__
#define __T4_IOCTL_H__
#include <sys/types.h>
#include <net/ethernet.h>
#include <net/bpf.h>
enum {
T4_GETREG = 0x40,
T4_SETREG,
T4_REGDUMP,
T4_GET_FILTER_MODE,
T4_SET_FILTER_MODE,
T4_GET_FILTER,
T4_SET_FILTER,
T4_DEL_FILTER,
T4_GET_SGE_CONTEXT,
T4_LOAD_FW,
T4_GET_MEM,
T4_GET_I2C,
T4_CLEAR_STATS,
T4_SET_OFLD_POLICY,
T4_SET_SCHED_CLASS,
T4_SET_SCHED_QUEUE,
T4_GET_TRACER,
T4_SET_TRACER,
T4_LOAD_CFG,
T4_LOAD_BOOT,
T4_LOAD_BOOTCFG,
T4_CUDBG_DUMP,
T4_SET_FILTER_MASK,
T4_HOLD_CLIP_ADDR,
T4_RELEASE_CLIP_ADDR,
T4_GET_SGE_CTXT,
};
struct t4_reg {
uint32_t addr;
uint32_t size;
uint64_t val;
};
#define T4_REGDUMP_SIZE (160 * 1024)
#define T5_REGDUMP_SIZE (332 * 1024)
struct t4_regdump {
uint32_t version;
uint32_t len;
uint32_t *data;
};
struct t4_data {
uint32_t len;
uint8_t *data;
};
struct t4_bootrom {
uint32_t pf_offset;
uint32_t pfidx_addr;
uint32_t len;
uint8_t *data;
};
struct t4_i2c_data {
uint8_t port_id;
uint8_t dev_addr;
uint8_t offset;
uint8_t len;
uint8_t data[8];
};
#define T4_FILTER_IPv4 0x1
#define T4_FILTER_IPv6 0x2
#define T4_FILTER_IP_SADDR 0x4
#define T4_FILTER_IP_DADDR 0x8
#define T4_FILTER_IP_SPORT 0x10
#define T4_FILTER_IP_DPORT 0x20
#define T4_FILTER_FCoE 0x40
#define T4_FILTER_PORT 0x80
#define T4_FILTER_VNIC 0x100
#define T4_FILTER_VLAN 0x200
#define T4_FILTER_IP_TOS 0x400
#define T4_FILTER_IP_PROTO 0x800
#define T4_FILTER_ETH_TYPE 0x1000
#define T4_FILTER_MAC_IDX 0x2000
#define T4_FILTER_MPS_HIT_TYPE 0x4000
#define T4_FILTER_IP_FRAGMENT 0x8000
#define T4_FILTER_IPSECIDX 0x10000
#define T4_FILTER_ROCE 0x20000
#define T4_FILTER_SYNONLY 0x40000
#define T4_FILTER_TCPFLAGS 0x80000
#define T4_FILTER_IC_OVLAN 0
#define T4_FILTER_IC_VNIC 0x80000000
#define T4_FILTER_IC_ENCAP 0x40000000
enum {
FILTER_PASS = 0,
FILTER_DROP,
FILTER_SWITCH
};
enum {
VLAN_NOCHANGE = 0,
VLAN_REMOVE,
VLAN_INSERT,
VLAN_REWRITE
};
enum {
UCAST_EXACT = 0,
UCAST_HASH = 1,
MCAST_EXACT = 2,
MCAST_HASH = 3,
PROMISC = 4,
HYPPROMISC = 5,
BCAST = 6,
};
enum {
DST_MODE_QUEUE,
DST_MODE_RSS_QUEUE,
DST_MODE_RSS,
DST_MODE_FILT_RSS
};
enum {
NAT_MODE_NONE = 0,
NAT_MODE_DIP,
NAT_MODE_DIP_DP,
NAT_MODE_DIP_DP_SIP,
NAT_MODE_DIP_DP_SP,
NAT_MODE_SIP_SP,
NAT_MODE_DIP_SIP_SP,
NAT_MODE_ALL
};
struct t4_filter_tuple {
uint8_t sip[16];
uint8_t dip[16];
uint16_t sport;
uint16_t dport;
uint16_t vnic;
uint16_t vlan;
uint16_t ethtype;
uint8_t tos;
uint8_t proto;
uint32_t fcoe:1;
uint32_t iport:3;
uint32_t matchtype:3;
uint32_t frag:1;
uint32_t macidx:9;
uint32_t vlan_vld:1;
uint32_t ovlan_vld:1;
uint32_t pfvf_vld:1;
uint32_t roce:1;
uint32_t synonly:1;
uint32_t tcpflags:6;
uint32_t ipsecidx:12;
};
struct t4_filter_specification {
uint32_t hitcnts:1;
uint32_t prio:1;
uint32_t type:1;
uint32_t hash:1;
uint32_t action:2;
uint32_t rpttid:1;
uint32_t dirsteer:1;
uint32_t iq:10;
uint32_t maskhash:1;
uint32_t dirsteerhash:1;
uint32_t eport:2;
uint32_t newdmac:1;
uint32_t newsmac:1;
uint32_t swapmac:1;
uint32_t newvlan:2;
uint32_t nat_mode:3;
uint32_t nat_flag_chk:1;
uint32_t nat_seq_chk;
uint8_t dmac[ETHER_ADDR_LEN];
uint8_t smac[ETHER_ADDR_LEN];
uint16_t vlan;
uint8_t nat_dip[16];
uint8_t nat_sip[16];
uint16_t nat_dport;
uint16_t nat_sport;
struct t4_filter_tuple val;
struct t4_filter_tuple mask;
};
struct t4_filter {
uint32_t idx;
uint16_t l2tidx;
uint16_t smtidx;
uint64_t hits;
struct t4_filter_specification fs;
};
struct t4_sched_class_params {
int8_t level;
int8_t mode;
int8_t rateunit;
int8_t ratemode;
int8_t channel;
int8_t cl;
int32_t minrate;
int32_t maxrate;
int16_t weight;
int16_t pktsize;
};
struct t4_sched_params {
int8_t subcmd;
int8_t type;
union {
struct {
int8_t minmax;
} config;
struct t4_sched_class_params params;
uint8_t reserved[6 + 8 * 8];
} u;
};
enum {
SCHED_CLASS_SUBCMD_CONFIG,
SCHED_CLASS_SUBCMD_PARAMS,
};
enum {
SCHED_CLASS_TYPE_PACKET,
};
enum {
SCHED_CLASS_LEVEL_CL_RL,
SCHED_CLASS_LEVEL_CL_WRR,
SCHED_CLASS_LEVEL_CH_RL,
};
enum {
SCHED_CLASS_MODE_CLASS,
SCHED_CLASS_MODE_FLOW,
};
enum {
SCHED_CLASS_RATEUNIT_BITS,
SCHED_CLASS_RATEUNIT_PKTS,
};
enum {
SCHED_CLASS_RATEMODE_REL,
SCHED_CLASS_RATEMODE_ABS,
};
struct t4_sched_queue {
uint8_t port;
int8_t queue;
int8_t cl;
};
#define T4_SGE_CONTEXT_SIZE 24
#define T7_SGE_CONTEXT_SIZE 28
enum {
SGE_CONTEXT_EGRESS,
SGE_CONTEXT_INGRESS,
SGE_CONTEXT_FLM,
SGE_CONTEXT_CNM
};
struct t4_sge_context {
uint32_t mem_id;
uint32_t cid;
uint32_t data[T4_SGE_CONTEXT_SIZE / 4];
};
struct t4_sge_ctxt {
uint32_t mem_id;
uint32_t cid;
uint32_t data[T7_SGE_CONTEXT_SIZE / 4];
};
struct t4_mem_range {
uint32_t addr;
uint32_t len;
uint32_t *data;
};
#define T4_TRACE_LEN 112
struct t4_trace_params {
uint32_t data[T4_TRACE_LEN / 4];
uint32_t mask[T4_TRACE_LEN / 4];
uint16_t snap_len;
uint16_t min_len;
uint8_t skip_ofst;
uint8_t skip_len;
uint8_t invert;
uint8_t port;
};
struct t4_tracer {
uint8_t idx;
uint8_t enabled;
uint8_t valid;
struct t4_trace_params tp;
};
struct t4_cudbg_dump {
uint8_t wr_flash;
uint8_t bitmap[16];
uint32_t len;
uint8_t *data;
};
enum {
OPEN_TYPE_LISTEN = 'L',
OPEN_TYPE_ACTIVE = 'A',
OPEN_TYPE_PASSIVE = 'P',
OPEN_TYPE_DONTCARE = 'D',
};
enum {
QUEUE_RANDOM = -1,
QUEUE_ROUNDROBIN = -2,
};
struct offload_settings {
int8_t offload;
int8_t rx_coalesce;
int8_t cong_algo;
int8_t sched_class;
int8_t tstamp;
int8_t sack;
int8_t nagle;
int8_t ecn;
int8_t ddp;
int8_t tls;
int16_t txq;
int16_t rxq;
int16_t mss;
};
struct offload_rule {
char open_type;
struct offload_settings settings;
struct bpf_program bpf_prog;
};
struct t4_offload_policy {
uint32_t nrules;
struct offload_rule *rule;
};
struct t4_clip_addr {
uint8_t addr[16];
uint8_t mask[16];
};
#define CHELSIO_T4_GETREG _IOWR('f', T4_GETREG, struct t4_reg)
#define CHELSIO_T4_SETREG _IOW('f', T4_SETREG, struct t4_reg)
#define CHELSIO_T4_REGDUMP _IOWR('f', T4_REGDUMP, struct t4_regdump)
#define CHELSIO_T4_GET_FILTER_MODE _IOWR('f', T4_GET_FILTER_MODE, uint32_t)
#define CHELSIO_T4_SET_FILTER_MODE _IOW('f', T4_SET_FILTER_MODE, uint32_t)
#define CHELSIO_T4_GET_FILTER _IOWR('f', T4_GET_FILTER, struct t4_filter)
#define CHELSIO_T4_SET_FILTER _IOWR('f', T4_SET_FILTER, struct t4_filter)
#define CHELSIO_T4_DEL_FILTER _IOW('f', T4_DEL_FILTER, struct t4_filter)
#define CHELSIO_T4_GET_SGE_CONTEXT _IOWR('f', T4_GET_SGE_CONTEXT, \
struct t4_sge_context)
#define CHELSIO_T4_LOAD_FW _IOW('f', T4_LOAD_FW, struct t4_data)
#define CHELSIO_T4_GET_MEM _IOW('f', T4_GET_MEM, struct t4_mem_range)
#define CHELSIO_T4_GET_I2C _IOWR('f', T4_GET_I2C, struct t4_i2c_data)
#define CHELSIO_T4_CLEAR_STATS _IOW('f', T4_CLEAR_STATS, uint32_t)
#define CHELSIO_T4_SCHED_CLASS _IOW('f', T4_SET_SCHED_CLASS, \
struct t4_sched_params)
#define CHELSIO_T4_SCHED_QUEUE _IOW('f', T4_SET_SCHED_QUEUE, \
struct t4_sched_queue)
#define CHELSIO_T4_GET_TRACER _IOWR('f', T4_GET_TRACER, struct t4_tracer)
#define CHELSIO_T4_SET_TRACER _IOW('f', T4_SET_TRACER, struct t4_tracer)
#define CHELSIO_T4_LOAD_CFG _IOW('f', T4_LOAD_CFG, struct t4_data)
#define CHELSIO_T4_LOAD_BOOT _IOW('f', T4_LOAD_BOOT, struct t4_bootrom)
#define CHELSIO_T4_LOAD_BOOTCFG _IOW('f', T4_LOAD_BOOTCFG, struct t4_data)
#define CHELSIO_T4_CUDBG_DUMP _IOWR('f', T4_CUDBG_DUMP, struct t4_cudbg_dump)
#define CHELSIO_T4_SET_OFLD_POLICY _IOW('f', T4_SET_OFLD_POLICY, struct t4_offload_policy)
#define CHELSIO_T4_SET_FILTER_MASK _IOW('f', T4_SET_FILTER_MASK, uint32_t)
#define CHELSIO_T4_HOLD_CLIP_ADDR _IOW('f', T4_HOLD_CLIP_ADDR, struct t4_clip_addr)
#define CHELSIO_T4_RELEASE_CLIP_ADDR _IOW('f', T4_RELEASE_CLIP_ADDR, struct t4_clip_addr)
#define CHELSIO_T4_GET_SGE_CTXT _IOWR('f', T4_GET_SGE_CTXT, struct t4_sge_ctxt)
#endif