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