162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright(c) 1999 - 2018 Intel Corporation. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef __IXGBE_VF_H__
562306a36Sopenharmony_ci#define __IXGBE_VF_H__
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/pci.h>
862306a36Sopenharmony_ci#include <linux/delay.h>
962306a36Sopenharmony_ci#include <linux/interrupt.h>
1062306a36Sopenharmony_ci#include <linux/if_ether.h>
1162306a36Sopenharmony_ci#include <linux/netdevice.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include "defines.h"
1462306a36Sopenharmony_ci#include "regs.h"
1562306a36Sopenharmony_ci#include "mbx.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistruct ixgbe_hw;
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistruct ixgbe_mac_operations {
2062306a36Sopenharmony_ci	s32 (*init_hw)(struct ixgbe_hw *);
2162306a36Sopenharmony_ci	s32 (*reset_hw)(struct ixgbe_hw *);
2262306a36Sopenharmony_ci	s32 (*start_hw)(struct ixgbe_hw *);
2362306a36Sopenharmony_ci	s32 (*clear_hw_cntrs)(struct ixgbe_hw *);
2462306a36Sopenharmony_ci	enum ixgbe_media_type (*get_media_type)(struct ixgbe_hw *);
2562306a36Sopenharmony_ci	s32 (*get_mac_addr)(struct ixgbe_hw *, u8 *);
2662306a36Sopenharmony_ci	s32 (*stop_adapter)(struct ixgbe_hw *);
2762306a36Sopenharmony_ci	s32 (*get_bus_info)(struct ixgbe_hw *);
2862306a36Sopenharmony_ci	s32 (*negotiate_api_version)(struct ixgbe_hw *hw, int api);
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	/* Link */
3162306a36Sopenharmony_ci	s32 (*setup_link)(struct ixgbe_hw *, ixgbe_link_speed, bool, bool);
3262306a36Sopenharmony_ci	s32 (*check_link)(struct ixgbe_hw *, ixgbe_link_speed *, bool *, bool);
3362306a36Sopenharmony_ci	s32 (*get_link_capabilities)(struct ixgbe_hw *, ixgbe_link_speed *,
3462306a36Sopenharmony_ci				     bool *);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	/* RAR, Multicast, VLAN */
3762306a36Sopenharmony_ci	s32 (*set_rar)(struct ixgbe_hw *, u32, u8 *, u32);
3862306a36Sopenharmony_ci	s32 (*set_uc_addr)(struct ixgbe_hw *, u32, u8 *);
3962306a36Sopenharmony_ci	s32 (*init_rx_addrs)(struct ixgbe_hw *);
4062306a36Sopenharmony_ci	s32 (*update_mc_addr_list)(struct ixgbe_hw *, struct net_device *);
4162306a36Sopenharmony_ci	s32 (*update_xcast_mode)(struct ixgbe_hw *, int);
4262306a36Sopenharmony_ci	s32 (*get_link_state)(struct ixgbe_hw *hw, bool *link_state);
4362306a36Sopenharmony_ci	s32 (*enable_mc)(struct ixgbe_hw *);
4462306a36Sopenharmony_ci	s32 (*disable_mc)(struct ixgbe_hw *);
4562306a36Sopenharmony_ci	s32 (*clear_vfta)(struct ixgbe_hw *);
4662306a36Sopenharmony_ci	s32 (*set_vfta)(struct ixgbe_hw *, u32, u32, bool);
4762306a36Sopenharmony_ci	s32 (*set_rlpml)(struct ixgbe_hw *, u16);
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cienum ixgbe_mac_type {
5162306a36Sopenharmony_ci	ixgbe_mac_unknown = 0,
5262306a36Sopenharmony_ci	ixgbe_mac_82599_vf,
5362306a36Sopenharmony_ci	ixgbe_mac_X540_vf,
5462306a36Sopenharmony_ci	ixgbe_mac_X550_vf,
5562306a36Sopenharmony_ci	ixgbe_mac_X550EM_x_vf,
5662306a36Sopenharmony_ci	ixgbe_mac_x550em_a_vf,
5762306a36Sopenharmony_ci	ixgbe_num_macs
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistruct ixgbe_mac_info {
6162306a36Sopenharmony_ci	struct ixgbe_mac_operations ops;
6262306a36Sopenharmony_ci	u8 addr[6];
6362306a36Sopenharmony_ci	u8 perm_addr[6];
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	enum ixgbe_mac_type type;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	s32  mc_filter_type;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	bool get_link_status;
7062306a36Sopenharmony_ci	u32  max_tx_queues;
7162306a36Sopenharmony_ci	u32  max_rx_queues;
7262306a36Sopenharmony_ci	u32  max_msix_vectors;
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistruct ixgbe_mbx_operations {
7662306a36Sopenharmony_ci	s32 (*init_params)(struct ixgbe_hw *hw);
7762306a36Sopenharmony_ci	void (*release)(struct ixgbe_hw *hw);
7862306a36Sopenharmony_ci	s32 (*read)(struct ixgbe_hw *, u32 *, u16);
7962306a36Sopenharmony_ci	s32 (*write)(struct ixgbe_hw *, u32 *, u16);
8062306a36Sopenharmony_ci	s32 (*check_for_msg)(struct ixgbe_hw *);
8162306a36Sopenharmony_ci	s32 (*check_for_ack)(struct ixgbe_hw *);
8262306a36Sopenharmony_ci	s32 (*check_for_rst)(struct ixgbe_hw *);
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistruct ixgbe_mbx_stats {
8662306a36Sopenharmony_ci	u32 msgs_tx;
8762306a36Sopenharmony_ci	u32 msgs_rx;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	u32 acks;
9062306a36Sopenharmony_ci	u32 reqs;
9162306a36Sopenharmony_ci	u32 rsts;
9262306a36Sopenharmony_ci};
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistruct ixgbe_mbx_info {
9562306a36Sopenharmony_ci	struct ixgbe_mbx_operations ops;
9662306a36Sopenharmony_ci	struct ixgbe_mbx_stats stats;
9762306a36Sopenharmony_ci	u32 timeout;
9862306a36Sopenharmony_ci	u32 udelay;
9962306a36Sopenharmony_ci	u32 vf_mailbox;
10062306a36Sopenharmony_ci	u16 size;
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_cistruct ixgbe_hw {
10462306a36Sopenharmony_ci	void *back;
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	u8 __iomem *hw_addr;
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	struct ixgbe_mac_info mac;
10962306a36Sopenharmony_ci	struct ixgbe_mbx_info mbx;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	u16 device_id;
11262306a36Sopenharmony_ci	u16 subsystem_vendor_id;
11362306a36Sopenharmony_ci	u16 subsystem_device_id;
11462306a36Sopenharmony_ci	u16 vendor_id;
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	u8  revision_id;
11762306a36Sopenharmony_ci	bool adapter_stopped;
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	int api_version;
12062306a36Sopenharmony_ci};
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cistruct ixgbevf_hw_stats {
12362306a36Sopenharmony_ci	u64 base_vfgprc;
12462306a36Sopenharmony_ci	u64 base_vfgptc;
12562306a36Sopenharmony_ci	u64 base_vfgorc;
12662306a36Sopenharmony_ci	u64 base_vfgotc;
12762306a36Sopenharmony_ci	u64 base_vfmprc;
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	u64 last_vfgprc;
13062306a36Sopenharmony_ci	u64 last_vfgptc;
13162306a36Sopenharmony_ci	u64 last_vfgorc;
13262306a36Sopenharmony_ci	u64 last_vfgotc;
13362306a36Sopenharmony_ci	u64 last_vfmprc;
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	u64 vfgprc;
13662306a36Sopenharmony_ci	u64 vfgptc;
13762306a36Sopenharmony_ci	u64 vfgorc;
13862306a36Sopenharmony_ci	u64 vfgotc;
13962306a36Sopenharmony_ci	u64 vfmprc;
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	u64 saved_reset_vfgprc;
14262306a36Sopenharmony_ci	u64 saved_reset_vfgptc;
14362306a36Sopenharmony_ci	u64 saved_reset_vfgorc;
14462306a36Sopenharmony_ci	u64 saved_reset_vfgotc;
14562306a36Sopenharmony_ci	u64 saved_reset_vfmprc;
14662306a36Sopenharmony_ci};
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_cistruct ixgbevf_info {
14962306a36Sopenharmony_ci	enum ixgbe_mac_type mac;
15062306a36Sopenharmony_ci	const struct ixgbe_mac_operations *mac_ops;
15162306a36Sopenharmony_ci};
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci#define IXGBE_FAILED_READ_REG 0xffffffffU
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci#define IXGBE_REMOVED(a) unlikely(!(a))
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_cistatic inline void ixgbe_write_reg(struct ixgbe_hw *hw, u32 reg, u32 value)
15862306a36Sopenharmony_ci{
15962306a36Sopenharmony_ci	u8 __iomem *reg_addr = READ_ONCE(hw->hw_addr);
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	if (IXGBE_REMOVED(reg_addr))
16262306a36Sopenharmony_ci		return;
16362306a36Sopenharmony_ci	writel(value, reg_addr + reg);
16462306a36Sopenharmony_ci}
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci#define IXGBE_WRITE_REG(h, r, v) ixgbe_write_reg(h, r, v)
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ciu32 ixgbevf_read_reg(struct ixgbe_hw *hw, u32 reg);
16962306a36Sopenharmony_ci#define IXGBE_READ_REG(h, r) ixgbevf_read_reg(h, r)
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_cistatic inline void ixgbe_write_reg_array(struct ixgbe_hw *hw, u32 reg,
17262306a36Sopenharmony_ci					 u32 offset, u32 value)
17362306a36Sopenharmony_ci{
17462306a36Sopenharmony_ci	ixgbe_write_reg(hw, reg + (offset << 2), value);
17562306a36Sopenharmony_ci}
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci#define IXGBE_WRITE_REG_ARRAY(h, r, o, v) ixgbe_write_reg_array(h, r, o, v)
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_cistatic inline u32 ixgbe_read_reg_array(struct ixgbe_hw *hw, u32 reg,
18062306a36Sopenharmony_ci				       u32 offset)
18162306a36Sopenharmony_ci{
18262306a36Sopenharmony_ci	return ixgbevf_read_reg(hw, reg + (offset << 2));
18362306a36Sopenharmony_ci}
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci#define IXGBE_READ_REG_ARRAY(h, r, o) ixgbe_read_reg_array(h, r, o)
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ciint ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs,
18862306a36Sopenharmony_ci		       unsigned int *default_tc);
18962306a36Sopenharmony_ciint ixgbevf_get_reta_locked(struct ixgbe_hw *hw, u32 *reta, int num_rx_queues);
19062306a36Sopenharmony_ciint ixgbevf_get_rss_key_locked(struct ixgbe_hw *hw, u8 *rss_key);
19162306a36Sopenharmony_ci#endif /* __IXGBE_VF_H__ */
192