hclgevf_main.h 10.0 KB
Newer Older
1 2 3 4 5 6
/* SPDX-License-Identifier: GPL-2.0+ */
/* Copyright (c) 2016-2017 Hisilicon Limited. */

#ifndef __HCLGEVF_MAIN_H
#define __HCLGEVF_MAIN_H
#include <linux/fs.h>
7
#include <linux/if_vlan.h>
8
#include <linux/types.h>
9
#include <net/devlink.h>
10 11 12 13
#include "hclge_mbx.h"
#include "hclgevf_cmd.h"
#include "hnae3.h"

14
#define HCLGEVF_MOD_VERSION "1.0"
15 16
#define HCLGEVF_DRIVER_NAME "hclgevf"

17
#define HCLGEVF_MAX_VLAN_ID	4095
18 19 20
#define HCLGEVF_MISC_VECTOR_NUM		0

#define HCLGEVF_INVALID_VPORT		0xffff
21 22
#define HCLGEVF_GENERAL_TASK_INTERVAL	  5
#define HCLGEVF_KEEP_ALIVE_TASK_INTERVAL  2
23 24 25 26 27 28 29 30 31 32 33 34

/* This number in actual depends upon the total number of VFs
 * created by physical function. But the maximum number of
 * possible vector-per-VF is {VFn(1-32), VECTn(32 + 1)}.
 */
#define HCLGEVF_MAX_VF_VECTOR_NUM	(32 + 1)

#define HCLGEVF_VECTOR_REG_BASE		0x20000
#define HCLGEVF_MISC_VECTOR_REG_BASE	0x20400
#define HCLGEVF_VECTOR_REG_OFFSET	0x4
#define HCLGEVF_VECTOR_VF_OFFSET		0x100000

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
/* bar registers for cmdq */
#define HCLGEVF_CMDQ_TX_ADDR_L_REG		0x27000
#define HCLGEVF_CMDQ_TX_ADDR_H_REG		0x27004
#define HCLGEVF_CMDQ_TX_DEPTH_REG		0x27008
#define HCLGEVF_CMDQ_TX_TAIL_REG		0x27010
#define HCLGEVF_CMDQ_TX_HEAD_REG		0x27014
#define HCLGEVF_CMDQ_RX_ADDR_L_REG		0x27018
#define HCLGEVF_CMDQ_RX_ADDR_H_REG		0x2701C
#define HCLGEVF_CMDQ_RX_DEPTH_REG		0x27020
#define HCLGEVF_CMDQ_RX_TAIL_REG		0x27024
#define HCLGEVF_CMDQ_RX_HEAD_REG		0x27028
#define HCLGEVF_CMDQ_INTR_EN_REG		0x27108
#define HCLGEVF_CMDQ_INTR_GEN_REG		0x2710C

/* bar registers for common func */
#define HCLGEVF_GRO_EN_REG			0x28000
51
#define HCLGEVF_RXD_ADV_LAYOUT_EN_REG		0x28008
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

/* bar registers for rcb */
#define HCLGEVF_RING_RX_ADDR_L_REG		0x80000
#define HCLGEVF_RING_RX_ADDR_H_REG		0x80004
#define HCLGEVF_RING_RX_BD_NUM_REG		0x80008
#define HCLGEVF_RING_RX_BD_LENGTH_REG		0x8000C
#define HCLGEVF_RING_RX_MERGE_EN_REG		0x80014
#define HCLGEVF_RING_RX_TAIL_REG		0x80018
#define HCLGEVF_RING_RX_HEAD_REG		0x8001C
#define HCLGEVF_RING_RX_FBD_NUM_REG		0x80020
#define HCLGEVF_RING_RX_OFFSET_REG		0x80024
#define HCLGEVF_RING_RX_FBD_OFFSET_REG		0x80028
#define HCLGEVF_RING_RX_STASH_REG		0x80030
#define HCLGEVF_RING_RX_BD_ERR_REG		0x80034
#define HCLGEVF_RING_TX_ADDR_L_REG		0x80040
#define HCLGEVF_RING_TX_ADDR_H_REG		0x80044
#define HCLGEVF_RING_TX_BD_NUM_REG		0x80048
#define HCLGEVF_RING_TX_PRIORITY_REG		0x8004C
#define HCLGEVF_RING_TX_TC_REG			0x80050
#define HCLGEVF_RING_TX_MERGE_EN_REG		0x80054
#define HCLGEVF_RING_TX_TAIL_REG		0x80058
#define HCLGEVF_RING_TX_HEAD_REG		0x8005C
#define HCLGEVF_RING_TX_FBD_NUM_REG		0x80060
#define HCLGEVF_RING_TX_OFFSET_REG		0x80064
#define HCLGEVF_RING_TX_EBD_NUM_REG		0x80068
#define HCLGEVF_RING_TX_EBD_OFFSET_REG		0x80070
#define HCLGEVF_RING_TX_BD_ERR_REG		0x80074
#define HCLGEVF_RING_EN_REG			0x80090

/* bar registers for tqp interrupt */
#define HCLGEVF_TQP_INTR_CTRL_REG		0x20000
#define HCLGEVF_TQP_INTR_GL0_REG		0x20100
#define HCLGEVF_TQP_INTR_GL1_REG		0x20200
#define HCLGEVF_TQP_INTR_GL2_REG		0x20300
#define HCLGEVF_TQP_INTR_RL_REG			0x20900

88 89
/* Vector0 interrupt CMDQ event source register(RW) */
#define HCLGEVF_VECTOR0_CMDQ_SRC_REG	0x27100
90
/* Vector0 interrupt CMDQ event status register(RO) */
91
#define HCLGEVF_VECTOR0_CMDQ_STATE_REG	0x27104
92 93
/* CMDQ register bits for RX event(=MBX event) */
#define HCLGEVF_VECTOR0_RX_CMDQ_INT_B	1
94 95
/* RST register bits for RESET event */
#define HCLGEVF_VECTOR0_RST_INT_B	2
96 97

#define HCLGEVF_TQP_RESET_TRY_TIMES	10
98
/* Reset related Registers */
99 100 101 102 103 104 105 106
#define HCLGEVF_RST_ING			0x20C00
#define HCLGEVF_FUN_RST_ING_BIT		BIT(0)
#define HCLGEVF_GLOBAL_RST_ING_BIT	BIT(5)
#define HCLGEVF_CORE_RST_ING_BIT	BIT(6)
#define HCLGEVF_IMP_RST_ING_BIT		BIT(7)
#define HCLGEVF_RST_ING_BITS \
	(HCLGEVF_FUN_RST_ING_BIT | HCLGEVF_GLOBAL_RST_ING_BIT | \
	 HCLGEVF_CORE_RST_ING_BIT | HCLGEVF_IMP_RST_ING_BIT)
107

108 109 110
#define HCLGEVF_VF_RST_ING		0x07008
#define HCLGEVF_VF_RST_ING_BIT		BIT(16)

111 112 113 114 115 116 117
#define HCLGEVF_RSS_IND_TBL_SIZE		512
#define HCLGEVF_RSS_SET_BITMAP_MSK	0xffff
#define HCLGEVF_RSS_KEY_SIZE		40
#define HCLGEVF_RSS_HASH_ALGO_TOEPLITZ	0
#define HCLGEVF_RSS_HASH_ALGO_SIMPLE	1
#define HCLGEVF_RSS_HASH_ALGO_SYMMETRIC	2
#define HCLGEVF_RSS_HASH_ALGO_MASK	0xf
118

119 120 121 122 123 124 125
#define HCLGEVF_RSS_INPUT_TUPLE_OTHER	GENMASK(3, 0)
#define HCLGEVF_RSS_INPUT_TUPLE_SCTP	GENMASK(4, 0)
#define HCLGEVF_D_PORT_BIT		BIT(0)
#define HCLGEVF_S_PORT_BIT		BIT(1)
#define HCLGEVF_D_IP_BIT		BIT(2)
#define HCLGEVF_S_IP_BIT		BIT(3)
#define HCLGEVF_V_TAG_BIT		BIT(4)
126 127
#define HCLGEVF_RSS_INPUT_TUPLE_SCTP_NO_PORT	\
	(HCLGEVF_D_IP_BIT | HCLGEVF_S_IP_BIT | HCLGEVF_V_TAG_BIT)
128

129 130
#define HCLGEVF_MAC_MAX_FRAME		9728

131
#define HCLGEVF_STATS_TIMER_INTERVAL	36U
132

133 134 135 136 137 138
enum hclgevf_evt_cause {
	HCLGEVF_VECTOR0_EVENT_RST,
	HCLGEVF_VECTOR0_EVENT_MBX,
	HCLGEVF_VECTOR0_EVENT_OTHER,
};

139 140 141 142 143
/* states of hclgevf device & tasks */
enum hclgevf_states {
	/* device states */
	HCLGEVF_STATE_DOWN,
	HCLGEVF_STATE_DISABLED,
144
	HCLGEVF_STATE_IRQ_INITED,
145
	HCLGEVF_STATE_REMOVING,
146
	HCLGEVF_STATE_NIC_REGISTERED,
147
	HCLGEVF_STATE_ROCE_REGISTERED,
148
	/* task states */
149 150
	HCLGEVF_STATE_RST_SERVICE_SCHED,
	HCLGEVF_STATE_RST_HANDLING,
151 152
	HCLGEVF_STATE_MBX_SERVICE_SCHED,
	HCLGEVF_STATE_MBX_HANDLING,
153
	HCLGEVF_STATE_CMD_DISABLE,
154
	HCLGEVF_STATE_LINK_UPDATING,
155
	HCLGEVF_STATE_PROMISC_CHANGED,
156
	HCLGEVF_STATE_RST_FAIL,
157
	HCLGEVF_STATE_PF_PUSH_LINK_STATUS,
158 159 160
};

struct hclgevf_mac {
161
	u8 media_type;
162
	u8 module_type;
163 164
	u8 mac_addr[ETH_ALEN];
	int link;
165 166
	u8 duplex;
	u32 speed;
167 168
	u64 supported;
	u64 advertising;
169 170 171 172
};

struct hclgevf_hw {
	void __iomem *io_base;
173
	void __iomem *mem_base;
174 175 176 177 178 179 180 181
	int num_vec;
	struct hclgevf_cmq cmq;
	struct hclgevf_mac mac;
	void *hdev; /* hchgevf device it is part of */
};

/* TQP stats */
struct hlcgevf_tqp_stats {
182
	/* query_tqp_tx_queue_statistics, opcode id: 0x0B03 */
183
	u64 rcb_tx_ring_pktnum_rcd; /* 32bit */
184
	/* query_tqp_rx_queue_statistics, opcode id: 0x0B13 */
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
	u64 rcb_rx_ring_pktnum_rcd; /* 32bit */
};

struct hclgevf_tqp {
	struct device *dev;	/* device for DMA mapping */
	struct hnae3_queue q;
	struct hlcgevf_tqp_stats tqp_stats;
	u16 index;		/* global index in a NIC controller */

	bool alloced;
};

struct hclgevf_cfg {
	u8 tc_num;
	u16 tqp_desc_num;
	u16 rx_buf_len;
	u8 phy_addr;
	u8 media_type;
	u8 mac_addr[ETH_ALEN];
	u32 numa_node_map;
};

207 208 209 210 211 212 213 214 215 216 217
struct hclgevf_rss_tuple_cfg {
	u8 ipv4_tcp_en;
	u8 ipv4_udp_en;
	u8 ipv4_sctp_en;
	u8 ipv4_fragment_en;
	u8 ipv6_tcp_en;
	u8 ipv6_udp_en;
	u8 ipv6_sctp_en;
	u8 ipv6_fragment_en;
};

218 219 220 221 222
struct hclgevf_rss_cfg {
	u8  rss_hash_key[HCLGEVF_RSS_KEY_SIZE]; /* user configured hash keys */
	u32 hash_algo;
	u32 rss_size;
	u8 hw_tc_map;
223 224
	/* shadow table */
	u8 *rss_indirection_tbl;
225
	struct hclgevf_rss_tuple_cfg rss_tuple_sets;
226 227 228 229 230
};

struct hclgevf_misc_vector {
	u8 __iomem *addr;
	int vector_irq;
231
	char name[HNAE3_INT_NAME_LEN];
232 233
};

234 235 236 237 238 239 240
struct hclgevf_rst_stats {
	u32 rst_cnt;			/* the number of reset */
	u32 vf_func_rst_cnt;		/* the number of VF function reset */
	u32 flr_rst_cnt;		/* the number of FLR */
	u32 vf_rst_cnt;			/* the number of VF reset */
	u32 rst_done_cnt;		/* the number of reset completed */
	u32 hw_rst_done_cnt;		/* the number of HW reset completed */
241
	u32 rst_fail_cnt;		/* the number of VF reset fail */
242 243
};

244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
enum HCLGEVF_MAC_ADDR_TYPE {
	HCLGEVF_MAC_ADDR_UC,
	HCLGEVF_MAC_ADDR_MC
};

enum HCLGEVF_MAC_NODE_STATE {
	HCLGEVF_MAC_TO_ADD,
	HCLGEVF_MAC_TO_DEL,
	HCLGEVF_MAC_ACTIVE
};

struct hclgevf_mac_addr_node {
	struct list_head node;
	enum HCLGEVF_MAC_NODE_STATE state;
	u8 mac_addr[ETH_ALEN];
};

struct hclgevf_mac_table_cfg {
	spinlock_t mac_list_lock; /* protect mac address need to add/detele */
	struct list_head uc_mac_list;
	struct list_head mc_mac_list;
};

267 268 269 270 271 272 273
struct hclgevf_dev {
	struct pci_dev *pdev;
	struct hnae3_ae_dev *ae_dev;
	struct hclgevf_hw hw;
	struct hclgevf_misc_vector misc_vector;
	struct hclgevf_rss_cfg rss_cfg;
	unsigned long state;
274
	unsigned long flr_state;
275
	unsigned long default_reset_request;
276 277
	unsigned long last_reset_time;
	enum hnae3_reset_type reset_level;
278 279
	unsigned long reset_pending;
	enum hnae3_reset_type reset_type;
280

281 282 283
#define HCLGEVF_RESET_REQUESTED		0
#define HCLGEVF_RESET_PENDING		1
	unsigned long reset_state;	/* requested, pending */
284
	struct hclgevf_rst_stats rst_stats;
285
	u32 reset_attempts;
286
	struct semaphore reset_sem;	/* protect reset process */
287

288
	u32 fw_version;
289
	u16 mbx_api_version;
290
	u16 num_tqps;		/* num task queue pairs of this VF */
291 292 293 294 295 296 297

	u16 alloc_rss_size;	/* allocated RSS task queue */
	u16 rss_size_max;	/* HW defined max RSS task queue */

	u16 num_alloc_vport;	/* num vports this driver supports */
	u32 numa_node_mask;
	u16 rx_buf_len;
298 299
	u16 num_tx_desc;	/* desc num of per tx queue */
	u16 num_rx_desc;	/* desc num of per rx queue */
300
	u8 hw_tc_map;
301
	u8 has_pf_mac;
302 303 304 305

	u16 num_msi;
	u16 num_msi_left;
	u16 num_msi_used;
306
	u16 num_nic_msix;	/* Num of nic vectors for this VF */
307 308 309
	u16 num_roce_msix;	/* Num of roce vectors for this VF */
	u16 roce_base_msix_offset;
	int roce_base_vector;
310 311 312 313
	u32 base_msi_vector;
	u16 *vector_status;
	int *vector_irq;

314 315
	bool gro_en;

316 317
	unsigned long vlan_del_fail_bmap[BITS_TO_LONGS(VLAN_N_VID)];

318 319
	struct hclgevf_mac_table_cfg mac_table;

320
	struct hclgevf_mbx_resp_status mbx_resp; /* mailbox response */
321
	struct hclgevf_mbx_arq_ring arq; /* mailbox async rx queue */
322

323
	struct delayed_work service_task;
324 325 326 327 328 329 330 331 332

	struct hclgevf_tqp *htqp;

	struct hnae3_handle nic;
	struct hnae3_handle roce;

	struct hnae3_client *nic_client;
	struct hnae3_client *roce_client;
	u32 flag;
333 334
	unsigned long serv_processed_cnt;
	unsigned long last_serv_processed;
335 336

	struct devlink *devlink;
337 338
};

339 340 341 342 343
static inline bool hclgevf_is_reset_pending(struct hclgevf_dev *hdev)
{
	return !!hdev->reset_pending;
}

344 345
int hclgevf_send_mbx_msg(struct hclgevf_dev *hdev,
			 struct hclge_vf_to_pf_msg *send_msg, bool need_resp,
346 347
			 u8 *resp_data, u16 resp_len);
void hclgevf_mbx_handler(struct hclgevf_dev *hdev);
348 349
void hclgevf_mbx_async_handler(struct hclgevf_dev *hdev);

350
void hclgevf_update_link_status(struct hclgevf_dev *hdev, int link_state);
351 352
void hclgevf_update_speed_duplex(struct hclgevf_dev *hdev, u32 speed,
				 u8 duplex);
353
void hclgevf_reset_task_schedule(struct hclgevf_dev *hdev);
354
void hclgevf_mbx_task_schedule(struct hclgevf_dev *hdev);
355 356
void hclgevf_update_port_base_vlan_info(struct hclgevf_dev *hdev, u16 state,
					u8 *port_base_vlan_info, u8 data_size);
357
#endif