162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * This file is part of the Chelsio T4 PCI-E SR-IOV Virtual Function Ethernet
362306a36Sopenharmony_ci * driver for Linux.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2009-2010 Chelsio Communications, Inc. All rights reserved.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * This software is available to you under a choice of one of two
862306a36Sopenharmony_ci * licenses.  You may choose to be licensed under the terms of the GNU
962306a36Sopenharmony_ci * General Public License (GPL) Version 2, available from the file
1062306a36Sopenharmony_ci * COPYING in the main directory of this source tree, or the
1162306a36Sopenharmony_ci * OpenIB.org BSD license below:
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci *     Redistribution and use in source and binary forms, with or
1462306a36Sopenharmony_ci *     without modification, are permitted provided that the following
1562306a36Sopenharmony_ci *     conditions are met:
1662306a36Sopenharmony_ci *
1762306a36Sopenharmony_ci *      - Redistributions of source code must retain the above
1862306a36Sopenharmony_ci *        copyright notice, this list of conditions and the following
1962306a36Sopenharmony_ci *        disclaimer.
2062306a36Sopenharmony_ci *
2162306a36Sopenharmony_ci *      - Redistributions in binary form must reproduce the above
2262306a36Sopenharmony_ci *        copyright notice, this list of conditions and the following
2362306a36Sopenharmony_ci *        disclaimer in the documentation and/or other materials
2462306a36Sopenharmony_ci *        provided with the distribution.
2562306a36Sopenharmony_ci *
2662306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
2762306a36Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2862306a36Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
2962306a36Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
3062306a36Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
3162306a36Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
3262306a36Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3362306a36Sopenharmony_ci * SOFTWARE.
3462306a36Sopenharmony_ci */
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#ifndef __T4VF_COMMON_H__
3762306a36Sopenharmony_ci#define __T4VF_COMMON_H__
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#include "../cxgb4/t4_hw.h"
4062306a36Sopenharmony_ci#include "../cxgb4/t4fw_api.h"
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define CHELSIO_CHIP_CODE(version, revision) (((version) << 4) | (revision))
4362306a36Sopenharmony_ci#define CHELSIO_CHIP_VERSION(code) (((code) >> 4) & 0xf)
4462306a36Sopenharmony_ci#define CHELSIO_CHIP_RELEASE(code) ((code) & 0xf)
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* All T4 and later chips have their PCI-E Device IDs encoded as 0xVFPP where:
4762306a36Sopenharmony_ci *
4862306a36Sopenharmony_ci *   V  = "4" for T4; "5" for T5, etc. or
4962306a36Sopenharmony_ci *      = "a" for T4 FPGA; "b" for T4 FPGA, etc.
5062306a36Sopenharmony_ci *   F  = "0" for PF 0..3; "4".."7" for PF4..7; and "8" for VFs
5162306a36Sopenharmony_ci *   PP = adapter product designation
5262306a36Sopenharmony_ci */
5362306a36Sopenharmony_ci#define CHELSIO_T4		0x4
5462306a36Sopenharmony_ci#define CHELSIO_T5		0x5
5562306a36Sopenharmony_ci#define CHELSIO_T6		0x6
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cienum chip_type {
5862306a36Sopenharmony_ci	T4_A1 = CHELSIO_CHIP_CODE(CHELSIO_T4, 1),
5962306a36Sopenharmony_ci	T4_A2 = CHELSIO_CHIP_CODE(CHELSIO_T4, 2),
6062306a36Sopenharmony_ci	T4_FIRST_REV	= T4_A1,
6162306a36Sopenharmony_ci	T4_LAST_REV	= T4_A2,
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	T5_A0 = CHELSIO_CHIP_CODE(CHELSIO_T5, 0),
6462306a36Sopenharmony_ci	T5_A1 = CHELSIO_CHIP_CODE(CHELSIO_T5, 1),
6562306a36Sopenharmony_ci	T5_FIRST_REV	= T5_A0,
6662306a36Sopenharmony_ci	T5_LAST_REV	= T5_A1,
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/*
7062306a36Sopenharmony_ci * The "len16" field of a Firmware Command Structure ...
7162306a36Sopenharmony_ci */
7262306a36Sopenharmony_ci#define FW_LEN16(fw_struct) FW_CMD_LEN16_V(sizeof(fw_struct) / 16)
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci/*
7562306a36Sopenharmony_ci * Per-VF statistics.
7662306a36Sopenharmony_ci */
7762306a36Sopenharmony_cistruct t4vf_port_stats {
7862306a36Sopenharmony_ci	/*
7962306a36Sopenharmony_ci	 * TX statistics.
8062306a36Sopenharmony_ci	 */
8162306a36Sopenharmony_ci	u64 tx_bcast_bytes;		/* broadcast */
8262306a36Sopenharmony_ci	u64 tx_bcast_frames;
8362306a36Sopenharmony_ci	u64 tx_mcast_bytes;		/* multicast */
8462306a36Sopenharmony_ci	u64 tx_mcast_frames;
8562306a36Sopenharmony_ci	u64 tx_ucast_bytes;		/* unicast */
8662306a36Sopenharmony_ci	u64 tx_ucast_frames;
8762306a36Sopenharmony_ci	u64 tx_drop_frames;		/* TX dropped frames */
8862306a36Sopenharmony_ci	u64 tx_offload_bytes;		/* offload */
8962306a36Sopenharmony_ci	u64 tx_offload_frames;
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	/*
9262306a36Sopenharmony_ci	 * RX statistics.
9362306a36Sopenharmony_ci	 */
9462306a36Sopenharmony_ci	u64 rx_bcast_bytes;		/* broadcast */
9562306a36Sopenharmony_ci	u64 rx_bcast_frames;
9662306a36Sopenharmony_ci	u64 rx_mcast_bytes;		/* multicast */
9762306a36Sopenharmony_ci	u64 rx_mcast_frames;
9862306a36Sopenharmony_ci	u64 rx_ucast_bytes;
9962306a36Sopenharmony_ci	u64 rx_ucast_frames;		/* unicast */
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	u64 rx_err_frames;		/* RX error frames */
10262306a36Sopenharmony_ci};
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/*
10562306a36Sopenharmony_ci * Per-"port" (Virtual Interface) link configuration ...
10662306a36Sopenharmony_ci */
10762306a36Sopenharmony_citypedef u16 fw_port_cap16_t;    /* 16-bit Port Capabilities integral value */
10862306a36Sopenharmony_citypedef u32 fw_port_cap32_t;    /* 32-bit Port Capabilities integral value */
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cienum fw_caps {
11162306a36Sopenharmony_ci	FW_CAPS_UNKNOWN	= 0,	/* 0'ed out initial state */
11262306a36Sopenharmony_ci	FW_CAPS16	= 1,	/* old Firmware: 16-bit Port Capabilities */
11362306a36Sopenharmony_ci	FW_CAPS32	= 2,	/* new Firmware: 32-bit Port Capabilities */
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cienum cc_pause {
11762306a36Sopenharmony_ci	PAUSE_RX	= 1 << 0,
11862306a36Sopenharmony_ci	PAUSE_TX	= 1 << 1,
11962306a36Sopenharmony_ci	PAUSE_AUTONEG	= 1 << 2
12062306a36Sopenharmony_ci};
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cienum cc_fec {
12362306a36Sopenharmony_ci	FEC_AUTO	= 1 << 0,	/* IEEE 802.3 "automatic" */
12462306a36Sopenharmony_ci	FEC_RS		= 1 << 1,	/* Reed-Solomon */
12562306a36Sopenharmony_ci	FEC_BASER_RS	= 1 << 2,	/* BaseR/Reed-Solomon */
12662306a36Sopenharmony_ci};
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_cistruct link_config {
12962306a36Sopenharmony_ci	fw_port_cap32_t pcaps;		/* link capabilities */
13062306a36Sopenharmony_ci	fw_port_cap32_t	acaps;		/* advertised capabilities */
13162306a36Sopenharmony_ci	fw_port_cap32_t	lpacaps;	/* peer advertised capabilities */
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	fw_port_cap32_t	speed_caps;	/* speed(s) user has requested */
13462306a36Sopenharmony_ci	u32		speed;		/* actual link speed */
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci	enum cc_pause	requested_fc;	/* flow control user has requested */
13762306a36Sopenharmony_ci	enum cc_pause	fc;		/* actual link flow control */
13862306a36Sopenharmony_ci	enum cc_pause   advertised_fc;  /* actual advertised flow control */
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	enum cc_fec	auto_fec;	/* Forward Error Correction: */
14162306a36Sopenharmony_ci	enum cc_fec	requested_fec;	/*   "automatic" (IEEE 802.3), */
14262306a36Sopenharmony_ci	enum cc_fec	fec;		/*   requested, and actual in use */
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci	unsigned char	autoneg;	/* autonegotiating? */
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci	unsigned char	link_ok;	/* link up? */
14762306a36Sopenharmony_ci	unsigned char	link_down_rc;	/* link down reason */
14862306a36Sopenharmony_ci};
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci/* Return true if the Link Configuration supports "High Speeds" (those greater
15162306a36Sopenharmony_ci * than 1Gb/s).
15262306a36Sopenharmony_ci */
15362306a36Sopenharmony_cistatic inline bool is_x_10g_port(const struct link_config *lc)
15462306a36Sopenharmony_ci{
15562306a36Sopenharmony_ci	fw_port_cap32_t speeds, high_speeds;
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	speeds = FW_PORT_CAP32_SPEED_V(FW_PORT_CAP32_SPEED_G(lc->pcaps));
15862306a36Sopenharmony_ci	high_speeds =
15962306a36Sopenharmony_ci		speeds & ~(FW_PORT_CAP32_SPEED_100M | FW_PORT_CAP32_SPEED_1G);
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	return high_speeds != 0;
16262306a36Sopenharmony_ci}
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci/*
16562306a36Sopenharmony_ci * General device parameters ...
16662306a36Sopenharmony_ci */
16762306a36Sopenharmony_cistruct dev_params {
16862306a36Sopenharmony_ci	u32 fwrev;			/* firmware version */
16962306a36Sopenharmony_ci	u32 tprev;			/* TP Microcode Version */
17062306a36Sopenharmony_ci};
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci/*
17362306a36Sopenharmony_ci * Scatter Gather Engine parameters.  These are almost all determined by the
17462306a36Sopenharmony_ci * Physical Function Driver.  We just need to grab them to see within which
17562306a36Sopenharmony_ci * environment we're playing ...
17662306a36Sopenharmony_ci */
17762306a36Sopenharmony_cistruct sge_params {
17862306a36Sopenharmony_ci	u32 sge_control;		/* padding, boundaries, lengths, etc. */
17962306a36Sopenharmony_ci	u32 sge_control2;		/* T5: more of the same */
18062306a36Sopenharmony_ci	u32 sge_host_page_size;		/* PF0-7 page sizes */
18162306a36Sopenharmony_ci	u32 sge_egress_queues_per_page;	/* PF0-7 egress queues/page */
18262306a36Sopenharmony_ci	u32 sge_ingress_queues_per_page;/* PF0-7 ingress queues/page */
18362306a36Sopenharmony_ci	u32 sge_vf_hps;                 /* host page size for our vf */
18462306a36Sopenharmony_ci	u32 sge_vf_eq_qpp;		/* egress queues/page for our VF */
18562306a36Sopenharmony_ci	u32 sge_vf_iq_qpp;		/* ingress queues/page for our VF */
18662306a36Sopenharmony_ci	u32 sge_fl_buffer_size[16];	/* free list buffer sizes */
18762306a36Sopenharmony_ci	u32 sge_ingress_rx_threshold;	/* RX counter interrupt threshold[4] */
18862306a36Sopenharmony_ci	u32 sge_congestion_control;     /* congestion thresholds, etc. */
18962306a36Sopenharmony_ci	u32 sge_timer_value_0_and_1;	/* interrupt coalescing timer values */
19062306a36Sopenharmony_ci	u32 sge_timer_value_2_and_3;
19162306a36Sopenharmony_ci	u32 sge_timer_value_4_and_5;
19262306a36Sopenharmony_ci};
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci/*
19562306a36Sopenharmony_ci * Vital Product Data parameters.
19662306a36Sopenharmony_ci */
19762306a36Sopenharmony_cistruct vpd_params {
19862306a36Sopenharmony_ci	u32 cclk;			/* Core Clock (KHz) */
19962306a36Sopenharmony_ci};
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci/* Stores chip specific parameters */
20262306a36Sopenharmony_cistruct arch_specific_params {
20362306a36Sopenharmony_ci	u32 sge_fl_db;
20462306a36Sopenharmony_ci	u16 mps_tcam_size;
20562306a36Sopenharmony_ci};
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci/*
20862306a36Sopenharmony_ci * Global Receive Side Scaling (RSS) parameters in host-native format.
20962306a36Sopenharmony_ci */
21062306a36Sopenharmony_cistruct rss_params {
21162306a36Sopenharmony_ci	unsigned int mode;		/* RSS mode */
21262306a36Sopenharmony_ci	union {
21362306a36Sopenharmony_ci	    struct {
21462306a36Sopenharmony_ci		unsigned int synmapen:1;	/* SYN Map Enable */
21562306a36Sopenharmony_ci		unsigned int syn4tupenipv6:1;	/* enable hashing 4-tuple IPv6 SYNs */
21662306a36Sopenharmony_ci		unsigned int syn2tupenipv6:1;	/* enable hashing 2-tuple IPv6 SYNs */
21762306a36Sopenharmony_ci		unsigned int syn4tupenipv4:1;	/* enable hashing 4-tuple IPv4 SYNs */
21862306a36Sopenharmony_ci		unsigned int syn2tupenipv4:1;	/* enable hashing 2-tuple IPv4 SYNs */
21962306a36Sopenharmony_ci		unsigned int ofdmapen:1;	/* Offload Map Enable */
22062306a36Sopenharmony_ci		unsigned int tnlmapen:1;	/* Tunnel Map Enable */
22162306a36Sopenharmony_ci		unsigned int tnlalllookup:1;	/* Tunnel All Lookup */
22262306a36Sopenharmony_ci		unsigned int hashtoeplitz:1;	/* use Toeplitz hash */
22362306a36Sopenharmony_ci	    } basicvirtual;
22462306a36Sopenharmony_ci	} u;
22562306a36Sopenharmony_ci};
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci/*
22862306a36Sopenharmony_ci * Virtual Interface RSS Configuration in host-native format.
22962306a36Sopenharmony_ci */
23062306a36Sopenharmony_ciunion rss_vi_config {
23162306a36Sopenharmony_ci    struct {
23262306a36Sopenharmony_ci	u16 defaultq;			/* Ingress Queue ID for !tnlalllookup */
23362306a36Sopenharmony_ci	unsigned int ip6fourtupen:1;	/* hash 4-tuple IPv6 ingress packets */
23462306a36Sopenharmony_ci	unsigned int ip6twotupen:1;	/* hash 2-tuple IPv6 ingress packets */
23562306a36Sopenharmony_ci	unsigned int ip4fourtupen:1;	/* hash 4-tuple IPv4 ingress packets */
23662306a36Sopenharmony_ci	unsigned int ip4twotupen:1;	/* hash 2-tuple IPv4 ingress packets */
23762306a36Sopenharmony_ci	int udpen;			/* hash 4-tuple UDP ingress packets */
23862306a36Sopenharmony_ci    } basicvirtual;
23962306a36Sopenharmony_ci};
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci/*
24262306a36Sopenharmony_ci * Maximum resources provisioned for a PCI VF.
24362306a36Sopenharmony_ci */
24462306a36Sopenharmony_cistruct vf_resources {
24562306a36Sopenharmony_ci	unsigned int nvi;		/* N virtual interfaces */
24662306a36Sopenharmony_ci	unsigned int neq;		/* N egress Qs */
24762306a36Sopenharmony_ci	unsigned int nethctrl;		/* N egress ETH or CTRL Qs */
24862306a36Sopenharmony_ci	unsigned int niqflint;		/* N ingress Qs/w free list(s) & intr */
24962306a36Sopenharmony_ci	unsigned int niq;		/* N ingress Qs */
25062306a36Sopenharmony_ci	unsigned int tc;		/* PCI-E traffic class */
25162306a36Sopenharmony_ci	unsigned int pmask;		/* port access rights mask */
25262306a36Sopenharmony_ci	unsigned int nexactf;		/* N exact MPS filters */
25362306a36Sopenharmony_ci	unsigned int r_caps;		/* read capabilities */
25462306a36Sopenharmony_ci	unsigned int wx_caps;		/* write/execute capabilities */
25562306a36Sopenharmony_ci};
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci/*
25862306a36Sopenharmony_ci * Per-"adapter" (Virtual Function) parameters.
25962306a36Sopenharmony_ci */
26062306a36Sopenharmony_cistruct adapter_params {
26162306a36Sopenharmony_ci	struct dev_params dev;		/* general device parameters */
26262306a36Sopenharmony_ci	struct sge_params sge;		/* Scatter Gather Engine */
26362306a36Sopenharmony_ci	struct vpd_params vpd;		/* Vital Product Data */
26462306a36Sopenharmony_ci	struct rss_params rss;		/* Receive Side Scaling */
26562306a36Sopenharmony_ci	struct vf_resources vfres;	/* Virtual Function Resource limits */
26662306a36Sopenharmony_ci	struct arch_specific_params arch; /* chip specific params */
26762306a36Sopenharmony_ci	enum chip_type chip;		/* chip code */
26862306a36Sopenharmony_ci	u8 nports;			/* # of Ethernet "ports" */
26962306a36Sopenharmony_ci	u8 fw_caps_support;		/* 32-bit Port Capabilities */
27062306a36Sopenharmony_ci};
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci/* Firmware Mailbox Command/Reply log.  All values are in Host-Endian format.
27362306a36Sopenharmony_ci * The access and execute times are signed in order to accommodate negative
27462306a36Sopenharmony_ci * error returns.
27562306a36Sopenharmony_ci */
27662306a36Sopenharmony_cistruct mbox_cmd {
27762306a36Sopenharmony_ci	u64 cmd[MBOX_LEN / 8];		/* a Firmware Mailbox Command/Reply */
27862306a36Sopenharmony_ci	u64 timestamp;			/* OS-dependent timestamp */
27962306a36Sopenharmony_ci	u32 seqno;			/* sequence number */
28062306a36Sopenharmony_ci	s16 access;			/* time (ms) to access mailbox */
28162306a36Sopenharmony_ci	s16 execute;			/* time (ms) to execute */
28262306a36Sopenharmony_ci};
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_cistruct mbox_cmd_log {
28562306a36Sopenharmony_ci	unsigned int size;		/* number of entries in the log */
28662306a36Sopenharmony_ci	unsigned int cursor;		/* next position in the log to write */
28762306a36Sopenharmony_ci	u32 seqno;			/* next sequence number */
28862306a36Sopenharmony_ci	/* variable length mailbox command log starts here */
28962306a36Sopenharmony_ci};
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci/* Given a pointer to a Firmware Mailbox Command Log and a log entry index,
29262306a36Sopenharmony_ci * return a pointer to the specified entry.
29362306a36Sopenharmony_ci */
29462306a36Sopenharmony_cistatic inline struct mbox_cmd *mbox_cmd_log_entry(struct mbox_cmd_log *log,
29562306a36Sopenharmony_ci						  unsigned int entry_idx)
29662306a36Sopenharmony_ci{
29762306a36Sopenharmony_ci	return &((struct mbox_cmd *)&(log)[1])[entry_idx];
29862306a36Sopenharmony_ci}
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci#include "adapter.h"
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci#ifndef PCI_VENDOR_ID_CHELSIO
30362306a36Sopenharmony_ci# define PCI_VENDOR_ID_CHELSIO 0x1425
30462306a36Sopenharmony_ci#endif
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci#define for_each_port(adapter, iter) \
30762306a36Sopenharmony_ci	for (iter = 0; iter < (adapter)->params.nports; iter++)
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_cistatic inline unsigned int core_ticks_per_usec(const struct adapter *adapter)
31062306a36Sopenharmony_ci{
31162306a36Sopenharmony_ci	return adapter->params.vpd.cclk / 1000;
31262306a36Sopenharmony_ci}
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_cistatic inline unsigned int us_to_core_ticks(const struct adapter *adapter,
31562306a36Sopenharmony_ci					    unsigned int us)
31662306a36Sopenharmony_ci{
31762306a36Sopenharmony_ci	return (us * adapter->params.vpd.cclk) / 1000;
31862306a36Sopenharmony_ci}
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_cistatic inline unsigned int core_ticks_to_us(const struct adapter *adapter,
32162306a36Sopenharmony_ci					    unsigned int ticks)
32262306a36Sopenharmony_ci{
32362306a36Sopenharmony_ci	return (ticks * 1000) / adapter->params.vpd.cclk;
32462306a36Sopenharmony_ci}
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ciint t4vf_wr_mbox_core(struct adapter *, const void *, int, void *, bool);
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_cistatic inline int t4vf_wr_mbox(struct adapter *adapter, const void *cmd,
32962306a36Sopenharmony_ci			       int size, void *rpl)
33062306a36Sopenharmony_ci{
33162306a36Sopenharmony_ci	return t4vf_wr_mbox_core(adapter, cmd, size, rpl, true);
33262306a36Sopenharmony_ci}
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_cistatic inline int t4vf_wr_mbox_ns(struct adapter *adapter, const void *cmd,
33562306a36Sopenharmony_ci				  int size, void *rpl)
33662306a36Sopenharmony_ci{
33762306a36Sopenharmony_ci	return t4vf_wr_mbox_core(adapter, cmd, size, rpl, false);
33862306a36Sopenharmony_ci}
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci#define CHELSIO_PCI_ID_VER(dev_id)  ((dev_id) >> 12)
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_cistatic inline int is_t4(enum chip_type chip)
34362306a36Sopenharmony_ci{
34462306a36Sopenharmony_ci	return CHELSIO_CHIP_VERSION(chip) == CHELSIO_T4;
34562306a36Sopenharmony_ci}
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci/**
34862306a36Sopenharmony_ci *	hash_mac_addr - return the hash value of a MAC address
34962306a36Sopenharmony_ci *	@addr: the 48-bit Ethernet MAC address
35062306a36Sopenharmony_ci *
35162306a36Sopenharmony_ci *	Hashes a MAC address according to the hash function used by hardware
35262306a36Sopenharmony_ci *	inexact (hash) address matching.
35362306a36Sopenharmony_ci */
35462306a36Sopenharmony_cistatic inline int hash_mac_addr(const u8 *addr)
35562306a36Sopenharmony_ci{
35662306a36Sopenharmony_ci	u32 a = ((u32)addr[0] << 16) | ((u32)addr[1] << 8) | addr[2];
35762306a36Sopenharmony_ci	u32 b = ((u32)addr[3] << 16) | ((u32)addr[4] << 8) | addr[5];
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci	a ^= b;
36062306a36Sopenharmony_ci	a ^= (a >> 12);
36162306a36Sopenharmony_ci	a ^= (a >> 6);
36262306a36Sopenharmony_ci	return a & 0x3f;
36362306a36Sopenharmony_ci}
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ciint t4vf_wait_dev_ready(struct adapter *);
36662306a36Sopenharmony_ciint t4vf_port_init(struct adapter *, int);
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ciint t4vf_fw_reset(struct adapter *);
36962306a36Sopenharmony_ciint t4vf_set_params(struct adapter *, unsigned int, const u32 *, const u32 *);
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ciint t4vf_fl_pkt_align(struct adapter *adapter);
37262306a36Sopenharmony_cienum t4_bar2_qtype { T4_BAR2_QTYPE_EGRESS, T4_BAR2_QTYPE_INGRESS };
37362306a36Sopenharmony_ciint t4vf_bar2_sge_qregs(struct adapter *adapter,
37462306a36Sopenharmony_ci			unsigned int qid,
37562306a36Sopenharmony_ci			enum t4_bar2_qtype qtype,
37662306a36Sopenharmony_ci			u64 *pbar2_qoffset,
37762306a36Sopenharmony_ci			unsigned int *pbar2_qid);
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ciunsigned int t4vf_get_pf_from_vf(struct adapter *);
38062306a36Sopenharmony_ciint t4vf_get_sge_params(struct adapter *);
38162306a36Sopenharmony_ciint t4vf_get_vpd_params(struct adapter *);
38262306a36Sopenharmony_ciint t4vf_get_dev_params(struct adapter *);
38362306a36Sopenharmony_ciint t4vf_get_rss_glb_config(struct adapter *);
38462306a36Sopenharmony_ciint t4vf_get_vfres(struct adapter *);
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ciint t4vf_read_rss_vi_config(struct adapter *, unsigned int,
38762306a36Sopenharmony_ci			    union rss_vi_config *);
38862306a36Sopenharmony_ciint t4vf_write_rss_vi_config(struct adapter *, unsigned int,
38962306a36Sopenharmony_ci			     union rss_vi_config *);
39062306a36Sopenharmony_ciint t4vf_config_rss_range(struct adapter *, unsigned int, int, int,
39162306a36Sopenharmony_ci			  const u16 *, int);
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ciint t4vf_alloc_vi(struct adapter *, int);
39462306a36Sopenharmony_ciint t4vf_free_vi(struct adapter *, int);
39562306a36Sopenharmony_ciint t4vf_enable_vi(struct adapter *adapter, unsigned int viid, bool rx_en,
39662306a36Sopenharmony_ci		   bool tx_en);
39762306a36Sopenharmony_ciint t4vf_enable_pi(struct adapter *adapter, struct port_info *pi, bool rx_en,
39862306a36Sopenharmony_ci		   bool tx_en);
39962306a36Sopenharmony_ciint t4vf_identify_port(struct adapter *, unsigned int, unsigned int);
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_ciint t4vf_set_rxmode(struct adapter *, unsigned int, int, int, int, int, int,
40262306a36Sopenharmony_ci		    bool);
40362306a36Sopenharmony_ciint t4vf_alloc_mac_filt(struct adapter *, unsigned int, bool, unsigned int,
40462306a36Sopenharmony_ci			const u8 **, u16 *, u64 *, bool);
40562306a36Sopenharmony_ciint t4vf_free_mac_filt(struct adapter *, unsigned int, unsigned int naddr,
40662306a36Sopenharmony_ci		       const u8 **, bool);
40762306a36Sopenharmony_ciint t4vf_change_mac(struct adapter *, unsigned int, int, const u8 *, bool);
40862306a36Sopenharmony_ciint t4vf_set_addr_hash(struct adapter *, unsigned int, bool, u64, bool);
40962306a36Sopenharmony_ciint t4vf_get_port_stats(struct adapter *, int, struct t4vf_port_stats *);
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_ciint t4vf_iq_free(struct adapter *, unsigned int, unsigned int, unsigned int,
41262306a36Sopenharmony_ci		 unsigned int);
41362306a36Sopenharmony_ciint t4vf_eth_eq_free(struct adapter *, unsigned int);
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ciint t4vf_update_port_info(struct port_info *pi);
41662306a36Sopenharmony_ciint t4vf_handle_fw_rpl(struct adapter *, const __be64 *);
41762306a36Sopenharmony_ciint t4vf_prep_adapter(struct adapter *);
41862306a36Sopenharmony_ciint t4vf_get_vf_mac_acl(struct adapter *adapter, unsigned int port,
41962306a36Sopenharmony_ci			unsigned int *naddr, u8 *addr);
42062306a36Sopenharmony_ciint t4vf_get_vf_vlan_acl(struct adapter *adapter);
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_ci#endif /* __T4VF_COMMON_H__ */
423