1e126ba97SEli Cohen /*
2302bdf68SSaeed Mahameed * Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved.
3e126ba97SEli Cohen *
4e126ba97SEli Cohen * This software is available to you under a choice of one of two
5e126ba97SEli Cohen * licenses. You may choose to be licensed under the terms of the GNU
6e126ba97SEli Cohen * General Public License (GPL) Version 2, available from the file
7e126ba97SEli Cohen * COPYING in the main directory of this source tree, or the
8e126ba97SEli Cohen * OpenIB.org BSD license below:
9e126ba97SEli Cohen *
10e126ba97SEli Cohen * Redistribution and use in source and binary forms, with or
11e126ba97SEli Cohen * without modification, are permitted provided that the following
12e126ba97SEli Cohen * conditions are met:
13e126ba97SEli Cohen *
14e126ba97SEli Cohen * - Redistributions of source code must retain the above
15e126ba97SEli Cohen * copyright notice, this list of conditions and the following
16e126ba97SEli Cohen * disclaimer.
17e126ba97SEli Cohen *
18e126ba97SEli Cohen * - Redistributions in binary form must reproduce the above
19e126ba97SEli Cohen * copyright notice, this list of conditions and the following
20e126ba97SEli Cohen * disclaimer in the documentation and/or other materials
21e126ba97SEli Cohen * provided with the distribution.
22e126ba97SEli Cohen *
23e126ba97SEli Cohen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24e126ba97SEli Cohen * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25e126ba97SEli Cohen * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26e126ba97SEli Cohen * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27e126ba97SEli Cohen * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28e126ba97SEli Cohen * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29e126ba97SEli Cohen * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30e126ba97SEli Cohen * SOFTWARE.
31e126ba97SEli Cohen */
32e126ba97SEli Cohen
33e126ba97SEli Cohen #ifndef MLX5_DRIVER_H
34e126ba97SEli Cohen #define MLX5_DRIVER_H
35e126ba97SEli Cohen
36e126ba97SEli Cohen #include <linux/kernel.h>
37e126ba97SEli Cohen #include <linux/completion.h>
38e126ba97SEli Cohen #include <linux/pci.h>
3905e0cc84SSaeed Mahameed #include <linux/irq.h>
40e126ba97SEli Cohen #include <linux/spinlock_types.h>
41e126ba97SEli Cohen #include <linux/semaphore.h>
426ecde51dSRoland Dreier #include <linux/slab.h>
43e126ba97SEli Cohen #include <linux/vmalloc.h>
44792c4e9dSMatthew Wilcox #include <linux/xarray.h>
4543a335e0SAmir Vadai #include <linux/workqueue.h>
46d9aaed83SArtemy Kovalyov #include <linux/mempool.h>
4794c6825eSMatan Barak #include <linux/interrupt.h>
4820902be4SSaeed Mahameed #include <linux/notifier.h>
4994f3e14eSChuhong Yuan #include <linux/refcount.h>
50a925b5e3SLeon Romanovsky #include <linux/auxiliary_bus.h>
51c7d4e6abSJiri Pirko #include <linux/mutex.h>
526ecde51dSRoland Dreier
53e126ba97SEli Cohen #include <linux/mlx5/device.h>
54e126ba97SEli Cohen #include <linux/mlx5/doorbell.h>
5541069256SSaeed Mahameed #include <linux/mlx5/eq.h>
567c39afb3SFeras Daoud #include <linux/timecounter.h>
577c39afb3SFeras Daoud #include <net/devlink.h>
581e34f3efSMoshe Shemesh
59e126ba97SEli Cohen #define MLX5_ADEV_NAME "mlx5_core"
6017a7612bSLeon Romanovsky
6117a7612bSLeon Romanovsky #define MLX5_IRQ_EQ_CTRL (U8_MAX)
623663ad34SShay Drory
633663ad34SShay Drory enum {
64e126ba97SEli Cohen MLX5_BOARD_ID_LEN = 64,
65e126ba97SEli Cohen };
66e126ba97SEli Cohen
67e126ba97SEli Cohen enum {
68e126ba97SEli Cohen MLX5_CMD_WQ_MAX_NAME = 32,
69e126ba97SEli Cohen };
70e126ba97SEli Cohen
71e126ba97SEli Cohen enum {
72e126ba97SEli Cohen CMD_OWNER_SW = 0x0,
73e126ba97SEli Cohen CMD_OWNER_HW = 0x1,
74e126ba97SEli Cohen CMD_STATUS_SUCCESS = 0,
75e126ba97SEli Cohen };
76e126ba97SEli Cohen
77e126ba97SEli Cohen enum mlx5_sqp_t {
78e126ba97SEli Cohen MLX5_SQP_SMI = 0,
79e126ba97SEli Cohen MLX5_SQP_GSI = 1,
80e126ba97SEli Cohen MLX5_SQP_IEEE_1588 = 2,
81e126ba97SEli Cohen MLX5_SQP_SNIFFER = 3,
82e126ba97SEli Cohen MLX5_SQP_SYNC_UMR = 4,
83e126ba97SEli Cohen };
84e126ba97SEli Cohen
85e126ba97SEli Cohen enum {
86e126ba97SEli Cohen MLX5_MAX_PORTS = 8,
87e0e6adfeSShay Drory };
88e126ba97SEli Cohen
89e126ba97SEli Cohen enum {
90e126ba97SEli Cohen MLX5_ATOMIC_MODE_OFFSET = 16,
91a60109dcSYonatan Cohen MLX5_ATOMIC_MODE_IB_COMP = 1,
92a60109dcSYonatan Cohen MLX5_ATOMIC_MODE_CX = 2,
93a60109dcSYonatan Cohen MLX5_ATOMIC_MODE_8B = 3,
94a60109dcSYonatan Cohen MLX5_ATOMIC_MODE_16B = 4,
95a60109dcSYonatan Cohen MLX5_ATOMIC_MODE_32B = 5,
96a60109dcSYonatan Cohen MLX5_ATOMIC_MODE_64B = 6,
97a60109dcSYonatan Cohen MLX5_ATOMIC_MODE_128B = 7,
98a60109dcSYonatan Cohen MLX5_ATOMIC_MODE_256B = 8,
99a60109dcSYonatan Cohen };
100e126ba97SEli Cohen
101e126ba97SEli Cohen enum {
102e126ba97SEli Cohen MLX5_REG_SBPR = 0xb001,
1038d231dbcSMaher Sanalla MLX5_REG_SBCM = 0xb002,
1048d231dbcSMaher Sanalla MLX5_REG_QPTS = 0x4002,
105415a64aaSHuy Nguyen MLX5_REG_QETCR = 0x4005,
1064f3961eeSSaeed Mahameed MLX5_REG_QTCT = 0x400a,
1074f3961eeSSaeed Mahameed MLX5_REG_QPDPM = 0x4013,
108415a64aaSHuy Nguyen MLX5_REG_QCAM = 0x4019,
109c02762ebSHuy Nguyen MLX5_REG_DCBX_PARAM = 0x4020,
110341c5ee2SHuy Nguyen MLX5_REG_DCBX_APP = 0x4021,
111341c5ee2SHuy Nguyen MLX5_REG_FPGA_CAP = 0x4022,
112e29341fbSIlan Tayari MLX5_REG_FPGA_CTRL = 0x4023,
113e29341fbSIlan Tayari MLX5_REG_FPGA_ACCESS_REG = 0x4024,
114a9956d35SIlan Tayari MLX5_REG_CORE_DUMP = 0x402e,
1150b9055a1SMoshe Shemesh MLX5_REG_PCAP = 0x5001,
116e126ba97SEli Cohen MLX5_REG_PMTU = 0x5003,
117e126ba97SEli Cohen MLX5_REG_PTYS = 0x5004,
118e126ba97SEli Cohen MLX5_REG_PAOS = 0x5006,
119e126ba97SEli Cohen MLX5_REG_PFCC = 0x5007,
1203c2d18efSAchiad Shochat MLX5_REG_PPCNT = 0x5008,
121efea389dSGal Pressman MLX5_REG_PPTB = 0x500b,
12250b4a3c2SHuy Nguyen MLX5_REG_PBMC = 0x500c,
12350b4a3c2SHuy Nguyen MLX5_REG_PMAOS = 0x5012,
124e126ba97SEli Cohen MLX5_REG_PUDE = 0x5009,
125e126ba97SEli Cohen MLX5_REG_PMPE = 0x5010,
126e126ba97SEli Cohen MLX5_REG_PELC = 0x500e,
127e126ba97SEli Cohen MLX5_REG_PVLC = 0x500f,
128a124d13eSMajd Dibbiny MLX5_REG_PCMR = 0x5041,
12994cb1ebbSEran Ben Elisha MLX5_REG_PDDR = 0x5031,
13036830159SMoshe Tal MLX5_REG_PMLP = 0x5002,
131bb64143eSGal Pressman MLX5_REG_PPLM = 0x5023,
1324b5b9c7dSShay Agroskin MLX5_REG_PCAM = 0x507f,
133cfdcbceaSGal Pressman MLX5_REG_NODE_DESC = 0x6001,
134e126ba97SEli Cohen MLX5_REG_HOST_ENDIANNESS = 0x7004,
135e126ba97SEli Cohen MLX5_REG_MTCAP = 0x9009,
1361f507e80SAdham Faris MLX5_REG_MTMP = 0x900A,
137c1fef618SSandipan Patra MLX5_REG_MCIA = 0x9014,
138bb64143eSGal Pressman MLX5_REG_MFRL = 0x9028,
13906939536SMoshe Shemesh MLX5_REG_MLCR = 0x902b,
140da54d24eSGal Pressman MLX5_REG_MRTC = 0x902d,
1415a1023deSAya Levin MLX5_REG_MTRC_CAP = 0x9040,
142eff8ea8fSFeras Daoud MLX5_REG_MTRC_CONF = 0x9041,
143eff8ea8fSFeras Daoud MLX5_REG_MTRC_STDB = 0x9042,
144eff8ea8fSFeras Daoud MLX5_REG_MTRC_CTRL = 0x9043,
145eff8ea8fSFeras Daoud MLX5_REG_MPEIN = 0x9050,
1464039049bSAya Levin MLX5_REG_MPCNT = 0x9051,
1478ed1a630SGal Pressman MLX5_REG_MTPPS = 0x9053,
148f9a1ef72SEugenia Emantayev MLX5_REG_MTPPSE = 0x9054,
149f9a1ef72SEugenia Emantayev MLX5_REG_MTUTC = 0x9055,
150ae02d415SEran Ben Elisha MLX5_REG_MPEGC = 0x9056,
1515e022dd3SEran Ben Elisha MLX5_REG_MPIR = 0x9059,
152f5e95632STariq Toukan MLX5_REG_MCQS = 0x9060,
153a82e0b5bSShay Agroskin MLX5_REG_MCQI = 0x9061,
15447176289SOr Gerlitz MLX5_REG_MCC = 0x9062,
15547176289SOr Gerlitz MLX5_REG_MCDA = 0x9063,
15647176289SOr Gerlitz MLX5_REG_MCAM = 0x907f,
157cfdcbceaSGal Pressman MLX5_REG_MSECQ = 0x9155,
158496fd0a2SJiri Pirko MLX5_REG_MSEES = 0x9156,
159496fd0a2SJiri Pirko MLX5_REG_MIRC = 0x9162,
160bab58ba1SEran Ben Elisha MLX5_REG_MTPTM = 0x9180,
1617e45c1e9SRahul Rameshbabu MLX5_REG_MTCTR = 0x9181,
1627e45c1e9SRahul Rameshbabu MLX5_REG_MRTCQ = 0x9182,
163e2685ef5SJianbo Liu MLX5_REG_SBCAM = 0xB01F,
16488b3d5c9SEran Ben Elisha MLX5_REG_RESOURCE_DUMP = 0xC000,
165609b8272SAya Levin MLX5_REG_NIC_CAP = 0xC00D,
1666ca00ec4SAkiva Goldberger MLX5_REG_DTOR = 0xC00E,
1674b2c5fa9SAmir Tzin MLX5_REG_VHCA_ICM_CTRL = 0xC010,
1686ca00ec4SAkiva Goldberger };
169e126ba97SEli Cohen
170e126ba97SEli Cohen enum mlx5_qpts_trust_state {
171415a64aaSHuy Nguyen MLX5_QPTS_TRUST_PCP = 1,
172415a64aaSHuy Nguyen MLX5_QPTS_TRUST_DSCP = 2,
173415a64aaSHuy Nguyen };
174415a64aaSHuy Nguyen
175415a64aaSHuy Nguyen enum mlx5_dcbx_oper_mode {
176341c5ee2SHuy Nguyen MLX5E_DCBX_PARAM_VER_OPER_HOST = 0x0,
177341c5ee2SHuy Nguyen MLX5E_DCBX_PARAM_VER_OPER_AUTO = 0x3,
178341c5ee2SHuy Nguyen };
179341c5ee2SHuy Nguyen
180341c5ee2SHuy Nguyen enum {
181da7525d2SEran Ben Elisha MLX5_ATOMIC_OPS_CMP_SWAP = 1 << 0,
182da7525d2SEran Ben Elisha MLX5_ATOMIC_OPS_FETCH_ADD = 1 << 1,
183da7525d2SEran Ben Elisha MLX5_ATOMIC_OPS_EXTENDED_CMP_SWAP = 1 << 2,
184a60109dcSYonatan Cohen MLX5_ATOMIC_OPS_EXTENDED_FETCH_ADD = 1 << 3,
185a60109dcSYonatan Cohen };
186da7525d2SEran Ben Elisha
187da7525d2SEran Ben Elisha enum mlx5_page_fault_resume_flags {
188e420f0c0SHaggai Eran MLX5_PAGE_FAULT_RESUME_REQUESTOR = 1 << 0,
189e420f0c0SHaggai Eran MLX5_PAGE_FAULT_RESUME_WRITE = 1 << 1,
190e420f0c0SHaggai Eran MLX5_PAGE_FAULT_RESUME_RDMA = 1 << 2,
191e420f0c0SHaggai Eran MLX5_PAGE_FAULT_RESUME_ERROR = 1 << 7,
192e420f0c0SHaggai Eran };
193e420f0c0SHaggai Eran
194e420f0c0SHaggai Eran enum dbg_rsc_type {
195e126ba97SEli Cohen MLX5_DBG_RSC_QP,
196e126ba97SEli Cohen MLX5_DBG_RSC_EQ,
197e126ba97SEli Cohen MLX5_DBG_RSC_CQ,
198e126ba97SEli Cohen };
199e126ba97SEli Cohen
200e126ba97SEli Cohen enum port_state_policy {
2017ecf6d8fSBodong Wang MLX5_POLICY_DOWN = 0,
2027ecf6d8fSBodong Wang MLX5_POLICY_UP = 1,
2037ecf6d8fSBodong Wang MLX5_POLICY_FOLLOW = 2,
2047ecf6d8fSBodong Wang MLX5_POLICY_INVALID = 0xffffffff
2057ecf6d8fSBodong Wang };
2067ecf6d8fSBodong Wang
2077ecf6d8fSBodong Wang enum mlx5_coredev_type {
208386e75afSHuy Nguyen MLX5_COREDEV_PF,
209386e75afSHuy Nguyen MLX5_COREDEV_VF,
2101958fc2fSParav Pandit MLX5_COREDEV_SF,
2111958fc2fSParav Pandit };
212386e75afSHuy Nguyen
213386e75afSHuy Nguyen struct mlx5_field_desc {
214e126ba97SEli Cohen int i;
215e126ba97SEli Cohen };
216e126ba97SEli Cohen
217e126ba97SEli Cohen struct mlx5_rsc_debug {
218e126ba97SEli Cohen struct mlx5_core_dev *dev;
219e126ba97SEli Cohen void *object;
220e126ba97SEli Cohen enum dbg_rsc_type type;
221e126ba97SEli Cohen struct dentry *root;
222e126ba97SEli Cohen struct mlx5_field_desc fields[];
223b6ca09cbSGustavo A. R. Silva };
224e126ba97SEli Cohen
225e126ba97SEli Cohen enum mlx5_dev_event {
226e126ba97SEli Cohen MLX5_DEV_EVENT_SYS_ERROR = 128, /* 0 - 127 are FW events */
22758d180b3SSaeed Mahameed MLX5_DEV_EVENT_PORT_AFFINITY = 129,
2286997b1c9SRoi Dayan MLX5_DEV_EVENT_MULTIPORT_ESW = 130,
22973af3711SRoi Dayan };
230e126ba97SEli Cohen
231e126ba97SEli Cohen enum mlx5_port_status {
2324c916a79SRana Shahout MLX5_PORT_UP = 1,
2336fa1bcabSAchiad Shochat MLX5_PORT_DOWN = 2,
2346fa1bcabSAchiad Shochat };
2354c916a79SRana Shahout
2364c916a79SRana Shahout enum mlx5_cmdif_state {
237f7936dddSEran Ben Elisha MLX5_CMDIF_STATE_UNINITIALIZED,
238f7936dddSEran Ben Elisha MLX5_CMDIF_STATE_UP,
239f7936dddSEran Ben Elisha MLX5_CMDIF_STATE_DOWN,
240f7936dddSEran Ben Elisha };
241f7936dddSEran Ben Elisha
242f7936dddSEran Ben Elisha struct mlx5_cmd_first {
243e126ba97SEli Cohen __be32 data[4];
244e126ba97SEli Cohen };
245e126ba97SEli Cohen
246e126ba97SEli Cohen struct mlx5_cmd_msg {
247e126ba97SEli Cohen struct list_head list;
248e126ba97SEli Cohen struct cmd_msg_cache *parent;
2490ac3ea70SMohamad Haj Yahia u32 len;
250e126ba97SEli Cohen struct mlx5_cmd_first first;
251e126ba97SEli Cohen struct mlx5_cmd_mailbox *next;
252e126ba97SEli Cohen };
253e126ba97SEli Cohen
254e126ba97SEli Cohen struct mlx5_cmd_debug {
255e126ba97SEli Cohen struct dentry *dbg_root;
256e126ba97SEli Cohen void *in_msg;
257e126ba97SEli Cohen void *out_msg;
258e126ba97SEli Cohen u8 status;
259e126ba97SEli Cohen u16 inlen;
260e126ba97SEli Cohen u16 outlen;
261e126ba97SEli Cohen };
262e126ba97SEli Cohen
263e126ba97SEli Cohen struct cmd_msg_cache {
2640ac3ea70SMohamad Haj Yahia /* protect block chain allocations
265e126ba97SEli Cohen */
266e126ba97SEli Cohen spinlock_t lock;
267e126ba97SEli Cohen struct list_head head;
268e126ba97SEli Cohen unsigned int max_inbox_size;
2690ac3ea70SMohamad Haj Yahia unsigned int num_ent;
2700ac3ea70SMohamad Haj Yahia };
271e126ba97SEli Cohen
272e126ba97SEli Cohen enum {
2730ac3ea70SMohamad Haj Yahia MLX5_NUM_COMMAND_CACHES = 5,
2740ac3ea70SMohamad Haj Yahia };
275e126ba97SEli Cohen
276e126ba97SEli Cohen struct mlx5_cmd_stats {
277e126ba97SEli Cohen u64 sum;
278e126ba97SEli Cohen u64 n;
279e126ba97SEli Cohen /* number of times command failed */
28034f46ae0SMoshe Shemesh u64 failed;
28134f46ae0SMoshe Shemesh /* number of times command failed on bad status returned by FW */
28234f46ae0SMoshe Shemesh u64 failed_mbox_status;
28334f46ae0SMoshe Shemesh /* last command failed returned errno */
28434f46ae0SMoshe Shemesh u32 last_failed_errno;
28534f46ae0SMoshe Shemesh /* last bad status returned by FW */
28634f46ae0SMoshe Shemesh u8 last_failed_mbox_status;
28734f46ae0SMoshe Shemesh /* last command failed syndrome returned by FW */
2881d2c717bSMoshe Shemesh u32 last_failed_syndrome;
2891d2c717bSMoshe Shemesh struct dentry *root;
290e126ba97SEli Cohen /* protect command average calculations */
291e126ba97SEli Cohen spinlock_t lock;
292e126ba97SEli Cohen };
293e126ba97SEli Cohen
294e126ba97SEli Cohen struct mlx5_cmd {
295e126ba97SEli Cohen struct mlx5_nb nb;
29671edc69cSSaeed Mahameed
29771edc69cSSaeed Mahameed /* members which needs to be queried or reinitialized each reload */
29858db7286SShay Drory struct {
29958db7286SShay Drory u16 cmdif_rev;
30058db7286SShay Drory u8 log_sz;
30158db7286SShay Drory u8 log_stride;
30258db7286SShay Drory int max_reg_cmds;
30358db7286SShay Drory unsigned long bitmask;
30458db7286SShay Drory struct semaphore sem;
30558db7286SShay Drory struct semaphore pages_sem;
30658db7286SShay Drory struct semaphore throttle_sem;
30758db7286SShay Drory struct semaphore unprivileged_sem;
308*f9deed09SChiara Meiohas struct xarray privileged_uids;
309*f9deed09SChiara Meiohas } vars;
31058db7286SShay Drory enum mlx5_cmdif_state state;
311f7936dddSEran Ben Elisha void *cmd_alloc_buf;
31264599ccaSEli Cohen dma_addr_t alloc_dma;
31364599ccaSEli Cohen int alloc_size;
31464599ccaSEli Cohen void *cmd_buf;
315e126ba97SEli Cohen dma_addr_t dma;
316e126ba97SEli Cohen
317e126ba97SEli Cohen /* protect command queue allocations
318e126ba97SEli Cohen */
319e126ba97SEli Cohen spinlock_t alloc_lock;
320e126ba97SEli Cohen
321e126ba97SEli Cohen /* protect token allocations
322e126ba97SEli Cohen */
323e126ba97SEli Cohen spinlock_t token_lock;
324e126ba97SEli Cohen u8 token;
325e126ba97SEli Cohen char wq_name[MLX5_CMD_WQ_MAX_NAME];
326e126ba97SEli Cohen struct workqueue_struct *wq;
327e126ba97SEli Cohen int mode;
328e126ba97SEli Cohen u16 allowed_opcode;
329d43b7007SEran Ben Elisha struct mlx5_cmd_work_ent *ent_arr[MLX5_MAX_COMMANDS];
330e126ba97SEli Cohen struct dma_pool *pool;
33118c90df9SRomain Perier struct mlx5_cmd_debug dbg;
332e126ba97SEli Cohen struct cmd_msg_cache cache[MLX5_NUM_COMMAND_CACHES];
3330ac3ea70SMohamad Haj Yahia int checksum_disabled;
334e126ba97SEli Cohen struct xarray stats;
335b90ebfc0SShay Drory };
336e126ba97SEli Cohen
337e126ba97SEli Cohen struct mlx5_cmd_mailbox {
338e126ba97SEli Cohen void *buf;
339e126ba97SEli Cohen dma_addr_t dma;
340e126ba97SEli Cohen struct mlx5_cmd_mailbox *next;
341e126ba97SEli Cohen };
342e126ba97SEli Cohen
343e126ba97SEli Cohen struct mlx5_buf_list {
344e126ba97SEli Cohen void *buf;
345e126ba97SEli Cohen dma_addr_t map;
346e126ba97SEli Cohen };
347e126ba97SEli Cohen
348e126ba97SEli Cohen struct mlx5_frag_buf {
3491c1b5228STariq Toukan struct mlx5_buf_list *frags;
3501c1b5228STariq Toukan int npages;
3511c1b5228STariq Toukan int size;
3521c1b5228STariq Toukan u8 page_shift;
3531c1b5228STariq Toukan };
3541c1b5228STariq Toukan
3551c1b5228STariq Toukan struct mlx5_frag_buf_ctrl {
356388ca8beSYonatan Cohen struct mlx5_buf_list *frags;
3574972e6faSTariq Toukan u32 sz_m1;
358388ca8beSYonatan Cohen u16 frag_sz_m1;
3598d71e818STariq Toukan u16 strides_offset;
360a0903622STariq Toukan u8 log_sz;
361388ca8beSYonatan Cohen u8 log_stride;
362388ca8beSYonatan Cohen u8 log_frag_strides;
363388ca8beSYonatan Cohen };
364388ca8beSYonatan Cohen
365388ca8beSYonatan Cohen struct mlx5_core_psv {
3663121e3c4SSagi Grimberg u32 psv_idx;
3673121e3c4SSagi Grimberg struct psv_layout {
3683121e3c4SSagi Grimberg u32 pd;
3693121e3c4SSagi Grimberg u16 syndrome;
3703121e3c4SSagi Grimberg u16 reserved;
3713121e3c4SSagi Grimberg u16 bg;
3723121e3c4SSagi Grimberg u16 app_tag;
3733121e3c4SSagi Grimberg u32 ref_tag;
3743121e3c4SSagi Grimberg } psv;
3753121e3c4SSagi Grimberg };
3763121e3c4SSagi Grimberg
3773121e3c4SSagi Grimberg struct mlx5_core_sig_ctx {
3783121e3c4SSagi Grimberg struct mlx5_core_psv psv_memory;
3793121e3c4SSagi Grimberg struct mlx5_core_psv psv_wire;
3803121e3c4SSagi Grimberg struct ib_sig_err err_item;
381d5436ba0SSagi Grimberg bool sig_status_checked;
382d5436ba0SSagi Grimberg bool sig_err_exists;
383d5436ba0SSagi Grimberg u32 sigerr_count;
384d5436ba0SSagi Grimberg };
3853121e3c4SSagi Grimberg
386e126ba97SEli Cohen #define MLX5_24BIT_MASK ((1 << 24) - 1)
387d9aaed83SArtemy Kovalyov
388d9aaed83SArtemy Kovalyov enum mlx5_res_type {
3895903325aSEli Cohen MLX5_RES_QP = MLX5_EVENT_QUEUE_TYPE_QP,
390e2013b21S[email protected] MLX5_RES_RQ = MLX5_EVENT_QUEUE_TYPE_RQ,
391e2013b21S[email protected] MLX5_RES_SQ = MLX5_EVENT_QUEUE_TYPE_SQ,
392e2013b21S[email protected] MLX5_RES_SRQ = 3,
393e2013b21S[email protected] MLX5_RES_XSRQ = 4,
394e2013b21S[email protected] MLX5_RES_XRQ = 5,
3955b3ec3fcSArtemy Kovalyov };
3965903325aSEli Cohen
3975903325aSEli Cohen struct mlx5_core_rsc_common {
3985903325aSEli Cohen enum mlx5_res_type res;
3995903325aSEli Cohen refcount_t refcount;
40094f3e14eSChuhong Yuan struct completion free;
4015903325aSEli Cohen };
4025903325aSEli Cohen
4035903325aSEli Cohen struct mlx5_uars_page {
404a6d51b68SEli Cohen void __iomem *map;
405e126ba97SEli Cohen bool wc;
406a6d51b68SEli Cohen u32 index;
407a6d51b68SEli Cohen struct list_head list;
408a6d51b68SEli Cohen unsigned int bfregs;
409a6d51b68SEli Cohen unsigned long *reg_bitmap; /* for non fast path bf regs */
410a6d51b68SEli Cohen unsigned long *fp_bitmap;
411a6d51b68SEli Cohen unsigned int reg_avail;
412a6d51b68SEli Cohen unsigned int fp_avail;
413a6d51b68SEli Cohen struct kref ref_count;
414a6d51b68SEli Cohen struct mlx5_core_dev *mdev;
415a6d51b68SEli Cohen };
416e126ba97SEli Cohen
417e126ba97SEli Cohen struct mlx5_bfreg_head {
418a6d51b68SEli Cohen /* protect blue flame registers allocations */
419a6d51b68SEli Cohen struct mutex lock;
420a6d51b68SEli Cohen struct list_head list;
421a6d51b68SEli Cohen };
422a6d51b68SEli Cohen
423a6d51b68SEli Cohen struct mlx5_bfreg_data {
424a6d51b68SEli Cohen struct mlx5_bfreg_head reg_head;
425a6d51b68SEli Cohen struct mlx5_bfreg_head wc_head;
426a6d51b68SEli Cohen };
427a6d51b68SEli Cohen
428a6d51b68SEli Cohen struct mlx5_sq_bfreg {
429a6d51b68SEli Cohen void __iomem *map;
430a6d51b68SEli Cohen struct mlx5_uars_page *up;
431a6d51b68SEli Cohen bool wc;
432a6d51b68SEli Cohen u32 index;
433a6d51b68SEli Cohen unsigned int offset;
434a6d51b68SEli Cohen };
435a6d51b68SEli Cohen
436e126ba97SEli Cohen struct mlx5_core_health {
437e126ba97SEli Cohen struct health_buffer __iomem *health;
438e126ba97SEli Cohen __be32 __iomem *health_counter;
439e126ba97SEli Cohen struct timer_list timer;
440e126ba97SEli Cohen u32 prev;
441e126ba97SEli Cohen int miss_counter;
442e126ba97SEli Cohen u8 synd;
443d1bf0e2cSMoshe Shemesh u32 fatal_error;
44463cbc552SFeras Daoud u32 crdump_size;
4458b9d8baaSAlex Vesker struct workqueue_struct *wq;
446ac6ea6e8SEli Cohen unsigned long flags;
44705ac2c0bSMohamad Haj Yahia struct work_struct fatal_report_work;
448b3bd076fSMoshe Shemesh struct work_struct report_work;
449d1bf0e2cSMoshe Shemesh struct devlink_health_reporter *fw_reporter;
4501e34f3efSMoshe Shemesh struct devlink_health_reporter *fw_fatal_reporter;
45196c82cdfSMoshe Shemesh struct devlink_health_reporter *vnic_reporter;
452b0bc615dSMaher Sanalla struct delayed_work update_fw_log_ts_work;
4535a1023deSAya Levin };
454e126ba97SEli Cohen
455e126ba97SEli Cohen enum {
456846e4373SYishai Hadas MLX5_PF_NOTIFY_DISABLE_VF,
457846e4373SYishai Hadas MLX5_PF_NOTIFY_ENABLE_VF,
458846e4373SYishai Hadas };
459846e4373SYishai Hadas
460846e4373SYishai Hadas struct mlx5_vf_context {
461fc50db98SEli Cohen int enabled;
462fc50db98SEli Cohen u64 port_guid;
4637ecf6d8fSBodong Wang u64 node_guid;
4647ecf6d8fSBodong Wang /* Valid bits are used to validate administrative guid only.
4654bbd4923SDanit Goldberg * Enabled after ndo_set_vf_guid
4664bbd4923SDanit Goldberg */
4674bbd4923SDanit Goldberg u8 port_guid_valid:1;
4684bbd4923SDanit Goldberg u8 node_guid_valid:1;
4694bbd4923SDanit Goldberg enum port_state_policy policy;
4707ecf6d8fSBodong Wang struct blocking_notifier_head notifier;
471846e4373SYishai Hadas };
472fc50db98SEli Cohen
473fc50db98SEli Cohen struct mlx5_core_sriov {
474fc50db98SEli Cohen struct mlx5_vf_context *vfs_ctx;
475fc50db98SEli Cohen int num_vfs;
476fc50db98SEli Cohen u16 max_vfs;
47786eec50bSBodong Wang u16 max_ec_vfs;
478dc131808SDaniel Jurgens };
479fc50db98SEli Cohen
480fc50db98SEli Cohen struct mlx5_events;
48169c1280bSSaeed Mahameed struct mlx5_mpfs;
482eeb66cdbSSaeed Mahameed struct mlx5_eswitch;
483073bb189SSaeed Mahameed struct mlx5_lag;
4847907f23aSAviv Heller struct mlx5_devcom_dev;
48588d162b4SRoi Dayan struct mlx5_fw_reset;
48638b9f903SMoshe Shemesh struct mlx5_eq_table;
487f2f3df55SSaeed Mahameed struct mlx5_irq_table;
488561aa15aSYuval Avnery struct mlx5_vhca_state_notifier;
489f3196bb0SParav Pandit struct mlx5_sf_dev_table;
49090d010b8SParav Pandit struct mlx5_sf_hw_table;
4918f010541SParav Pandit struct mlx5_sf_table;
4928f010541SParav Pandit struct mlx5_crypto_dek_priv;
493fe298bdfSJianbo Liu
494073bb189SSaeed Mahameed struct mlx5_rate_limit {
49505d3ac97SBodong Wang u32 rate;
4961466cc5bSYevgeny Petrilin u32 max_burst_sz;
49705d3ac97SBodong Wang u16 typical_pkt_sz;
49805d3ac97SBodong Wang };
49905d3ac97SBodong Wang
50005d3ac97SBodong Wang struct mlx5_rl_entry {
50105d3ac97SBodong Wang u8 rl_raw[MLX5_ST_SZ_BYTES(set_pp_rate_limit_context)];
5021326034bSYishai Hadas u64 refcount;
5031326034bSYishai Hadas u16 index;
5044c4c0a89SParav Pandit u16 uid;
5051326034bSYishai Hadas u8 dedicated : 1;
5061326034bSYishai Hadas };
5071466cc5bSYevgeny Petrilin
5081466cc5bSYevgeny Petrilin struct mlx5_rl_table {
5091466cc5bSYevgeny Petrilin /* protect rate limit table */
5101466cc5bSYevgeny Petrilin struct mutex rl_lock;
5111466cc5bSYevgeny Petrilin u16 max_size;
5121466cc5bSYevgeny Petrilin u32 max_rate;
5131466cc5bSYevgeny Petrilin u32 min_rate;
5141466cc5bSYevgeny Petrilin struct mlx5_rl_entry *rl_entry;
5151466cc5bSYevgeny Petrilin u64 refcount;
5166b30b6d4SParav Pandit };
5171466cc5bSYevgeny Petrilin
5181466cc5bSYevgeny Petrilin struct mlx5_core_roce {
51980f09dfcSMaor Gottlieb struct mlx5_flow_table *ft;
52080f09dfcSMaor Gottlieb struct mlx5_flow_group *fg;
52180f09dfcSMaor Gottlieb struct mlx5_flow_handle *allow_rule;
52280f09dfcSMaor Gottlieb };
52380f09dfcSMaor Gottlieb
52480f09dfcSMaor Gottlieb enum {
525a925b5e3SLeon Romanovsky MLX5_PRIV_FLAGS_DISABLE_IB_ADEV = 1 << 0,
526a925b5e3SLeon Romanovsky MLX5_PRIV_FLAGS_DISABLE_ALL_ADEV = 1 << 1,
527a925b5e3SLeon Romanovsky /* Set during device detach to block any further devices
528a5ae8fc9SDmytro Linkin * creation/deletion on drivers rescan. Unset during device attach.
529a5ae8fc9SDmytro Linkin */
530a5ae8fc9SDmytro Linkin MLX5_PRIV_FLAGS_DETACH = 1 << 2,
531a5ae8fc9SDmytro Linkin MLX5_PRIV_FLAGS_SWITCH_LEGACY = 1 << 3,
5322a4f56fbSJianbo Liu };
533a925b5e3SLeon Romanovsky
534a925b5e3SLeon Romanovsky struct mlx5_adev {
535a925b5e3SLeon Romanovsky struct auxiliary_device adev;
536a925b5e3SLeon Romanovsky struct mlx5_core_dev *mdev;
537a925b5e3SLeon Romanovsky int idx;
538a925b5e3SLeon Romanovsky };
539a925b5e3SLeon Romanovsky
540a925b5e3SLeon Romanovsky struct mlx5_debugfs_entries {
54166771a1cSMoshe Shemesh struct dentry *dbg_root;
54266771a1cSMoshe Shemesh struct dentry *qp_debugfs;
54366771a1cSMoshe Shemesh struct dentry *eq_debugfs;
54466771a1cSMoshe Shemesh struct dentry *cq_debugfs;
54566771a1cSMoshe Shemesh struct dentry *cmdif_debugfs;
54666771a1cSMoshe Shemesh struct dentry *pages_debugfs;
5474e05cbf0SMoshe Shemesh struct dentry *lag_debugfs;
5487f46a0b7SMark Bloch };
54966771a1cSMoshe Shemesh
55066771a1cSMoshe Shemesh enum mlx5_func_type {
551c3bdbaeaSMaher Sanalla MLX5_PF,
552c3bdbaeaSMaher Sanalla MLX5_VF,
553c3bdbaeaSMaher Sanalla MLX5_SF,
5549965bbebSMaher Sanalla MLX5_HOST_PF,
555c3bdbaeaSMaher Sanalla MLX5_EC_VF,
556395ccd6eSDaniel Jurgens MLX5_FUNC_TYPE_NUM,
557c3bdbaeaSMaher Sanalla };
558c3bdbaeaSMaher Sanalla
559c3bdbaeaSMaher Sanalla struct mlx5_ft_pool;
5604a98544dSPaul Blakey struct mlx5_priv {
561e126ba97SEli Cohen /* IRQ table valid only for real pci devices PF or VF */
562561aa15aSYuval Avnery struct mlx5_irq_table *irq_table;
563561aa15aSYuval Avnery struct mlx5_eq_table *eq_table;
564f2f3df55SSaeed Mahameed
565e126ba97SEli Cohen /* pages stuff */
566e126ba97SEli Cohen struct mlx5_nb pg_nb;
5670cf53c12SSaeed Mahameed struct workqueue_struct *pg_wq;
568e126ba97SEli Cohen struct xarray page_root_xa;
569d6945242SEran Ben Elisha atomic_t reg_pages;
5706aec21f6SHaggai Eran struct list_head free_list;
571bf0bf77fSEli Cohen u32 fw_pages;
572c3bdbaeaSMaher Sanalla u32 page_counters[MLX5_FUNC_TYPE_NUM];
573c3bdbaeaSMaher Sanalla u32 fw_pages_alloc_failed;
57432071187SMoshe Shemesh u32 give_pages_dropped;
57532071187SMoshe Shemesh u32 reclaim_pages_discard;
57632071187SMoshe Shemesh
577e126ba97SEli Cohen struct mlx5_core_health health;
578e126ba97SEli Cohen struct list_head traps;
5793d347b1bSAya Levin
580e126ba97SEli Cohen struct mlx5_debugfs_entries dbg;
58166771a1cSMoshe Shemesh
582e126ba97SEli Cohen /* start: alloc staff */
583e126ba97SEli Cohen /* protect buffer allocation according to numa node */
58439c538d6SCai Huoqing struct mutex alloc_mutex;
585311c7c71SSaeed Mahameed int numa_node;
586311c7c71SSaeed Mahameed
587311c7c71SSaeed Mahameed struct mutex pgdir_mutex;
588e126ba97SEli Cohen struct list_head pgdir_list;
589e126ba97SEli Cohen /* end: alloc staff */
590e126ba97SEli Cohen
591e126ba97SEli Cohen struct mlx5_adev **adev;
592a925b5e3SLeon Romanovsky int adev_idx;
593a925b5e3SLeon Romanovsky int sw_vhca_id;
594dc402cccSYishai Hadas struct mlx5_events *events;
59569c1280bSSaeed Mahameed struct mlx5_vhca_events *vhca_events;
5963f7f31ffSWei Zhang
59797834ebaSErez Shitrit struct mlx5_flow_steering *steering;
598fba53f7bSMaor Gottlieb struct mlx5_mpfs *mpfs;
599eeb66cdbSSaeed Mahameed struct mlx5_eswitch *eswitch;
600073bb189SSaeed Mahameed struct mlx5_core_sriov sriov;
601fc50db98SEli Cohen struct mlx5_lag *lag;
6027907f23aSAviv Heller u32 flags;
603a925b5e3SLeon Romanovsky struct mlx5_devcom_dev *devc;
60488d162b4SRoi Dayan struct mlx5_devcom_comp_dev *hca_devcom_comp;
605e534552cSShay Drory struct mlx5_fw_reset *fw_reset;
60638b9f903SMoshe Shemesh struct mlx5_core_roce roce;
60780f09dfcSMaor Gottlieb struct mlx5_fc_stats *fc_stats;
6085acd957aSCosmin Ratiu struct mlx5_rl_table rl_table;
6091466cc5bSYevgeny Petrilin struct mlx5_ft_pool *ft_pool;
6104a98544dSPaul Blakey
611d4eb4cd7SHuy Nguyen struct mlx5_bfreg_data bfregs;
612a6d51b68SEli Cohen struct mlx5_uars_page *uar;
61301187175SEli Cohen #ifdef CONFIG_MLX5_SF
614f3196bb0SParav Pandit struct mlx5_vhca_state_notifier *vhca_state_notifier;
615f3196bb0SParav Pandit struct mlx5_sf_dev_table *sf_dev_table;
61690d010b8SParav Pandit struct mlx5_core_dev *parent_mdev;
6171958fc2fSParav Pandit #endif
618f3196bb0SParav Pandit #ifdef CONFIG_MLX5_SF_MANAGER
6198f010541SParav Pandit struct mlx5_sf_hw_table *sf_hw_table;
6208f010541SParav Pandit struct mlx5_sf_table *sf_table;
6218f010541SParav Pandit #endif
6228f010541SParav Pandit struct blocking_notifier_head lag_nh;
6238d159eb2SChiara Meiohas };
624e126ba97SEli Cohen
625e126ba97SEli Cohen enum mlx5_device_state {
62689d44f0aSMajd Dibbiny MLX5_DEVICE_STATE_UP = 1,
6278e792700SLeon Romanovsky MLX5_DEVICE_STATE_INTERNAL_ERROR,
62889d44f0aSMajd Dibbiny };
62989d44f0aSMajd Dibbiny
63089d44f0aSMajd Dibbiny enum mlx5_interface_state {
63189d44f0aSMajd Dibbiny MLX5_INTERFACE_STATE_UP = BIT(0),
632b3cb5388SHuy Nguyen MLX5_BREAK_FW_WAIT = BIT(1),
6338324a02cSGavin Li };
63489d44f0aSMajd Dibbiny
63589d44f0aSMajd Dibbiny enum mlx5_pci_status {
63689d44f0aSMajd Dibbiny MLX5_PCI_STATUS_DISABLED,
63789d44f0aSMajd Dibbiny MLX5_PCI_STATUS_ENABLED,
63889d44f0aSMajd Dibbiny };
63989d44f0aSMajd Dibbiny
64089d44f0aSMajd Dibbiny enum mlx5_pagefault_type_flags {
641d9aaed83SArtemy Kovalyov MLX5_PFAULT_REQUESTOR = 1 << 0,
642d9aaed83SArtemy Kovalyov MLX5_PFAULT_WRITE = 1 << 1,
643d9aaed83SArtemy Kovalyov MLX5_PFAULT_RDMA = 1 << 2,
644d9aaed83SArtemy Kovalyov };
645d9aaed83SArtemy Kovalyov
646d9aaed83SArtemy Kovalyov struct mlx5_td {
647b50d292bSHadar Hen Zion /* protects tirs list changes while tirs refresh */
64880a2a902SYuval Avnery struct mutex list_lock;
64980a2a902SYuval Avnery struct list_head tirs_list;
650b50d292bSHadar Hen Zion u32 tdn;
651b50d292bSHadar Hen Zion };
652b50d292bSHadar Hen Zion
653b50d292bSHadar Hen Zion struct mlx5e_resources {
654b50d292bSHadar Hen Zion struct mlx5e_hw_objs {
655c276aae8SRoi Dayan u32 pdn;
656b50d292bSHadar Hen Zion struct mlx5_td td;
657b50d292bSHadar Hen Zion u32 mkey;
65883fec3f1SAharon Landau struct mlx5_sq_bfreg bfreg;
659aff26157SSaeed Mahameed #define MLX5_MAX_NUM_TC 8
660b25bd37cSTariq Toukan u32 tisn[MLX5_MAX_PORTS][MLX5_MAX_NUM_TC];
661b25bd37cSTariq Toukan bool tisn_valid;
66225461ce8SSaeed Mahameed } hw_objs;
663c276aae8SRoi Dayan struct net_device *uplink_netdev;
6647a9fb35eSRoi Dayan struct mutex uplink_netdev_lock;
665c7d4e6abSJiri Pirko struct mlx5_crypto_dek_priv *dek_priv;
666fe298bdfSJianbo Liu };
667b50d292bSHadar Hen Zion
668b50d292bSHadar Hen Zion enum mlx5_sw_icm_type {
669c9b9dcb4SAriel Levkovich MLX5_SW_ICM_TYPE_STEERING,
670c9b9dcb4SAriel Levkovich MLX5_SW_ICM_TYPE_HEADER_MODIFY,
671c9b9dcb4SAriel Levkovich MLX5_SW_ICM_TYPE_HEADER_MODIFY_PATTERN,
67266765836SYevgeny Kliteynik MLX5_SW_ICM_TYPE_SW_ENCAP,
673a429ec96SShun Hao };
674c9b9dcb4SAriel Levkovich
675c9b9dcb4SAriel Levkovich #define MLX5_MAX_RESERVED_GIDS 8
67652ec462eSIlan Tayari
67752ec462eSIlan Tayari struct mlx5_rsvd_gids {
67852ec462eSIlan Tayari unsigned int start;
67952ec462eSIlan Tayari unsigned int count;
68052ec462eSIlan Tayari struct ida ida;
68152ec462eSIlan Tayari };
68252ec462eSIlan Tayari
68352ec462eSIlan Tayari struct mlx5_clock;
6847c39afb3SFeras Daoud struct mlx5_clock_dev_state;
6857c39afb3SFeras Daoud struct mlx5_dm;
6867c39afb3SFeras Daoud struct mlx5_fw_tracer;
6877c39afb3SFeras Daoud struct mlx5_vxlan;
6887c39afb3SFeras Daoud struct mlx5_geneve;
6897c39afb3SFeras Daoud struct mlx5_hv_vhca;
690f0462bc3SAya Levin
691f0462bc3SAya Levin #define MLX5_LOG_SW_ICM_BLOCK_SIZE(dev) (MLX5_CAP_DEV_MEM(dev, log_sw_icm_alloc_granularity))
6927c39afb3SFeras Daoud #define MLX5_SW_ICM_BLOCK_SIZE(dev) (1 << MLX5_LOG_SW_ICM_BLOCK_SIZE(dev))
6937c39afb3SFeras Daoud
694d6f3dc8fSEran Ben Elisha enum {
6957c39afb3SFeras Daoud MLX5_PROF_MASK_QP_SIZE = (u64)1 << 0,
6967c39afb3SFeras Daoud MLX5_PROF_MASK_MR_CACHE = (u64)1 << 1,
6977c39afb3SFeras Daoud };
6987c39afb3SFeras Daoud
699d6f3dc8fSEran Ben Elisha enum {
700d6f3dc8fSEran Ben Elisha MKEY_CACHE_LAST_STD_ENTRY = 20,
701d6f3dc8fSEran Ben Elisha MLX5_IMR_KSM_CACHE_ENTRY,
702d6f3dc8fSEran Ben Elisha MAX_MKEY_CACHE_ENTRIES
703d6f3dc8fSEran Ben Elisha };
704d6f3dc8fSEran Ben Elisha
7057c39afb3SFeras Daoud struct mlx5_profile {
7067c39afb3SFeras Daoud u64 mask;
7077c39afb3SFeras Daoud u8 log_max_qp;
708d6f3dc8fSEran Ben Elisha u8 num_cmd_caches;
7097c39afb3SFeras Daoud struct {
7107c39afb3SFeras Daoud int size;
711c9b9dcb4SAriel Levkovich int limit;
712f53aaa31SFeras Daoud } mr_cache[MAX_MKEY_CACHE_ENTRIES];
713358aa5ceSSaeed Mahameed };
7140ccc171eSYevgeny Kliteynik
71587175120SEran Ben Elisha struct mlx5_hca_cap {
716f53aaa31SFeras Daoud u32 cur[MLX5_UN_SZ_DW(hca_cap_union)];
717c9b9dcb4SAriel Levkovich u32 max[MLX5_UN_SZ_DW(hca_cap_union)];
718c9b9dcb4SAriel Levkovich };
719c9b9dcb4SAriel Levkovich
7203410fbcdSMaor Gottlieb enum mlx5_wc_state {
7213410fbcdSMaor Gottlieb MLX5_WC_STATE_UNINITIALIZED,
7223410fbcdSMaor Gottlieb MLX5_WC_STATE_UNSUPPORTED,
7233410fbcdSMaor Gottlieb MLX5_WC_STATE_SUPPORTED,
7243410fbcdSMaor Gottlieb };
7253410fbcdSMaor Gottlieb
72601137808SAharon Landau struct mlx5_core_dev {
7273410fbcdSMaor Gottlieb struct device *device;
72801137808SAharon Landau enum mlx5_coredev_type coredev_type;
7293410fbcdSMaor Gottlieb struct pci_dev *pdev;
7303410fbcdSMaor Gottlieb /* sync pci state */
7313410fbcdSMaor Gottlieb struct mutex pci_status_mutex;
7323410fbcdSMaor Gottlieb enum mlx5_pci_status pci_status;
7333410fbcdSMaor Gottlieb u8 rev_id;
7349df839a7SParav Pandit char board_id[MLX5_BOARD_ID_LEN];
7353410fbcdSMaor Gottlieb struct mlx5_cmd cmd;
7363410fbcdSMaor Gottlieb struct {
7373410fbcdSMaor Gottlieb struct mlx5_hca_cap *hca[MLX5_CAP_NUM];
73801137808SAharon Landau u32 pcam[MLX5_ST_SZ_DW(pcam_reg)];
7393410fbcdSMaor Gottlieb u32 mcam[MLX5_MCAM_REGS_NUM][MLX5_ST_SZ_DW(mcam_reg)];
7403410fbcdSMaor Gottlieb u32 fpga[MLX5_ST_SZ_DW(fpga_cap)];
7415958a6faSParav Pandit u32 qcam[MLX5_ST_SZ_DW(qcam_reg)];
7425958a6faSParav Pandit u8 embedded_cpu;
7435958a6faSParav Pandit } caps;
7445958a6faSParav Pandit struct mlx5_timeouts *timeouts;
7455958a6faSParav Pandit u64 sys_image_guid;
746d98995b4SJianbo Liu phys_addr_t iseg_base;
747d98995b4SJianbo Liu struct mlx5_init_seg __iomem *iseg;
748d98995b4SJianbo Liu phys_addr_t bar_addr;
749d98995b4SJianbo Liu enum mlx5_device_state state;
750d98995b4SJianbo Liu /* sync interface state */
751d98995b4SJianbo Liu struct mutex intf_state_mutex;
752e126ba97SEli Cohen struct lock_class_key lock_key;
75327b942fbSParav Pandit unsigned long intf_state;
754386e75afSHuy Nguyen struct mlx5_priv priv;
755e126ba97SEli Cohen struct mlx5_profile profile;
75689d44f0aSMajd Dibbiny u32 issi;
75789d44f0aSMajd Dibbiny struct mlx5e_resources mlx5e_res;
75889d44f0aSMajd Dibbiny struct mlx5_dm *dm;
759e126ba97SEli Cohen struct mlx5_vxlan *vxlan;
760e126ba97SEli Cohen struct mlx5_geneve *geneve;
761e126ba97SEli Cohen struct {
76271862561SGal Pressman struct mlx5_rsvd_gids reserved_gids;
76348f02eefSParav Pandit u32 roce_en;
76471862561SGal Pressman } roce;
765932ef155SEran Ben Elisha #ifdef CONFIG_MLX5_FPGA
76699d3cd27SInbar Karmy struct mlx5_fpga_device *fpga;
767c02762ebSHuy Nguyen #endif
768591905baSBodong Wang struct mlx5_clock *clock;
76971862561SGal Pressman struct mlx5_clock_dev_state *clock_state;
7705945e1adSAmir Tzin struct mlx5_ib_clock_info *clock_info;
77159c9d35eSAlaa Hleihel struct mlx5_fw_tracer *tracer;
772e126ba97SEli Cohen struct mlx5_rsc_dump *rsc_dump;
773e126ba97SEli Cohen u32 vsc_addr;
774aa8106f1SHuy Nguyen struct mlx5_hv_vhca *hv_vhca;
77589d44f0aSMajd Dibbiny struct mlx5_hwmon *hwmon;
77689d44f0aSMajd Dibbiny u64 num_block_tc;
77789d44f0aSMajd Dibbiny u64 num_block_ipsec;
778d59b73a6SMoshe Shemesh #ifdef CONFIG_MLX5_MACSEC
7795fc7197dSMajd Dibbiny struct mlx5_macsec_fs *macsec_fs;
780e126ba97SEli Cohen /* MACsec notifier chain to sync MACsec core and IB database */
7813410fbcdSMaor Gottlieb struct blocking_notifier_head macsec_nh;
782f62b8bb8SAmir Vadai #endif
783b50d292bSHadar Hen Zion u64 num_ipsec_offloads;
784c9b9dcb4SAriel Levkovich struct mlx5_sd *sd;
785358aa5ceSSaeed Mahameed enum mlx5_wc_state wc_state;
7860ccc171eSYevgeny Kliteynik /* sync write combining state */
78752ec462eSIlan Tayari struct mutex wc_state_lock;
78852ec462eSIlan Tayari };
789734dc065SDaniel Jurgens
79052ec462eSIlan Tayari struct mlx5_db {
791e29341fbSIlan Tayari __be32 *db;
792e29341fbSIlan Tayari union {
793e29341fbSIlan Tayari struct mlx5_db_pgdir *pgdir;
7947c39afb3SFeras Daoud struct mlx5_ib_user_db_page *user_page;
79524d33d2cSFeras Daoud } u;
796f53aaa31SFeras Daoud dma_addr_t dma;
79712206b17SAya Levin int index;
798b25bbc2fSAlex Vesker };
79987175120SEran Ben Elisha
8001f507e80SAdham Faris enum {
801c8e350e6SJianbo Liu MLX5_COMP_EQ_SIZE = 1024,
802c8e350e6SJianbo Liu };
8032e92f669SPatrisious Haddad
8042e92f669SPatrisious Haddad enum {
805ac7ea1c7SPatrisious Haddad MLX5_PTYS_IB = 1 << 0,
806ac7ea1c7SPatrisious Haddad MLX5_PTYS_EN = 1 << 2,
8072e92f669SPatrisious Haddad };
8088efd7b17SLeon Romanovsky
809ed29705eSTariq Toukan typedef void (*mlx5_cmd_cbk_t)(int status, void *context);
810d98995b4SJianbo Liu
811d98995b4SJianbo Liu enum {
812d98995b4SJianbo Liu MLX5_CMD_ENT_STATE_PENDING_COMP,
813e126ba97SEli Cohen };
814e126ba97SEli Cohen
815e126ba97SEli Cohen struct mlx5_cmd_work_ent {
816e126ba97SEli Cohen unsigned long state;
817e126ba97SEli Cohen struct mlx5_cmd_msg *in;
818e126ba97SEli Cohen struct mlx5_cmd_msg *out;
819e126ba97SEli Cohen void *uout;
820e126ba97SEli Cohen int uout_size;
821e126ba97SEli Cohen mlx5_cmd_cbk_t callback;
822e126ba97SEli Cohen struct delayed_work cb_timeout_work;
823e126ba97SEli Cohen void *context;
824e126ba97SEli Cohen int idx;
825e126ba97SEli Cohen struct completion handling;
8266b367174SJakub Kicinski struct completion slotted;
8276b367174SJakub Kicinski struct completion done;
8286b367174SJakub Kicinski struct mlx5_cmd *cmd;
8296b367174SJakub Kicinski struct work_struct work;
830adb0c954SSaeed Mahameed struct mlx5_cmd_layout *lay;
831adb0c954SSaeed Mahameed int ret;
832adb0c954SSaeed Mahameed int page_queue;
833adb0c954SSaeed Mahameed u8 status;
834e126ba97SEli Cohen u8 token;
835e126ba97SEli Cohen u64 ts1;
83673dd3a48SMohamad Haj Yahia u64 ts2;
83773dd3a48SMohamad Haj Yahia u16 op;
83873dd3a48SMohamad Haj Yahia bool polling;
83973dd3a48SMohamad Haj Yahia /* Track the max comp handlers */
840e126ba97SEli Cohen refcount_t refcnt;
84173dd3a48SMohamad Haj Yahia };
842e126ba97SEli Cohen
843e126ba97SEli Cohen enum phy_port_state {
844746b5583SEli Cohen MLX5_AAA_111
845746b5583SEli Cohen };
846e126ba97SEli Cohen
84765ee6708SMohamad Haj Yahia struct mlx5_hca_vport_context {
848e126ba97SEli Cohen u32 field_select;
849e126ba97SEli Cohen bool sm_virt_aware;
85017d00e83SMoshe Shemesh bool has_smi;
851485d65e1SAkiva Goldberger bool has_raw;
852e126ba97SEli Cohen enum port_state_policy policy;
853e126ba97SEli Cohen enum phy_port_state phys_state;
854e126ba97SEli Cohen enum ib_port_state vport_state;
855e126ba97SEli Cohen u8 port_physical_state;
856e126ba97SEli Cohen u64 sys_image_guid;
857e126ba97SEli Cohen u64 port_guid;
858e126ba97SEli Cohen u64 node_guid;
859e126ba97SEli Cohen u32 cap_mask1;
86014a70046SThomas Gleixner u32 cap_mask1_perm;
86114a70046SThomas Gleixner u16 cap_mask2;
862746b5583SEli Cohen u16 cap_mask2_perm;
8634525abeaSMajd Dibbiny u16 lid;
86450b2412bSEran Ben Elisha u8 init_type_reply; /* bitmask: see ib spec 14.2.5.6 InitTypeReply */
86550b2412bSEran Ben Elisha u8 lmc;
866e126ba97SEli Cohen u8 subnet_timeout;
867e126ba97SEli Cohen u16 sm_lid;
868707c4602SMajd Dibbiny u8 sm_sl;
869707c4602SMajd Dibbiny u16 qkey_violation_counter;
870707c4602SMajd Dibbiny u16 pkey_violation_counter;
871707c4602SMajd Dibbiny bool grh_required;
872707c4602SMajd Dibbiny u8 num_plane;
873707c4602SMajd Dibbiny };
874707c4602SMajd Dibbiny
875707c4602SMajd Dibbiny #define STRUCT_FIELD(header, field) \
876707c4602SMajd Dibbiny .struct_offset_bytes = offsetof(struct ib_unpacked_ ## header, field), \
877707c4602SMajd Dibbiny .struct_size_bytes = sizeof((struct ib_unpacked_ ## header *)0)->field
878707c4602SMajd Dibbiny
879707c4602SMajd Dibbiny extern struct dentry *mlx5_debugfs_root;
880707c4602SMajd Dibbiny
fw_rev_maj(struct mlx5_core_dev * dev)881707c4602SMajd Dibbiny static inline u16 fw_rev_maj(struct mlx5_core_dev *dev)
882707c4602SMajd Dibbiny {
883707c4602SMajd Dibbiny return ioread32be(&dev->iseg->fw_rev) & 0xffff;
884707c4602SMajd Dibbiny }
885707c4602SMajd Dibbiny
fw_rev_min(struct mlx5_core_dev * dev)8864106a758SMichael Guralnik static inline u16 fw_rev_min(struct mlx5_core_dev *dev)
8874106a758SMichael Guralnik {
888707c4602SMajd Dibbiny return ioread32be(&dev->iseg->fw_rev) >> 16;
889707c4602SMajd Dibbiny }
890707c4602SMajd Dibbiny
fw_rev_sub(struct mlx5_core_dev * dev)891707c4602SMajd Dibbiny static inline u16 fw_rev_sub(struct mlx5_core_dev *dev)
892707c4602SMajd Dibbiny {
893707c4602SMajd Dibbiny return ioread32be(&dev->iseg->cmdif_rev_fw_sub) & 0xffff;
894707c4602SMajd Dibbiny }
895707c4602SMajd Dibbiny
mlx5_base_mkey(const u32 key)896707c4602SMajd Dibbiny static inline u32 mlx5_base_mkey(const u32 key)
8972a5db20fSMark Zhang {
898707c4602SMajd Dibbiny return key & 0xffffff00u;
899707c4602SMajd Dibbiny }
900e126ba97SEli Cohen
wq_get_byte_sz(u8 log_sz,u8 log_stride)901e126ba97SEli Cohen static inline u32 wq_get_byte_sz(u8 log_sz, u8 log_stride)
902e126ba97SEli Cohen {
903e126ba97SEli Cohen return ((u32)1 << log_sz) << log_stride;
904e126ba97SEli Cohen }
905e126ba97SEli Cohen
mlx5_init_fbc_offset(struct mlx5_buf_list * frags,u8 log_stride,u8 log_sz,u16 strides_offset,struct mlx5_frag_buf_ctrl * fbc)906e126ba97SEli Cohen static inline void mlx5_init_fbc_offset(struct mlx5_buf_list *frags,
907e126ba97SEli Cohen u8 log_stride, u8 log_sz,
908e126ba97SEli Cohen u16 strides_offset,
909e126ba97SEli Cohen struct mlx5_frag_buf_ctrl *fbc)
910e126ba97SEli Cohen {
911e126ba97SEli Cohen fbc->frags = frags;
912e126ba97SEli Cohen fbc->log_stride = log_stride;
913e126ba97SEli Cohen fbc->log_sz = log_sz;
914e126ba97SEli Cohen fbc->sz_m1 = (1 << fbc->log_sz) - 1;
915e126ba97SEli Cohen fbc->log_frag_strides = PAGE_SHIFT - fbc->log_stride;
916e126ba97SEli Cohen fbc->frag_sz_m1 = (1 << fbc->log_frag_strides) - 1;
917e126ba97SEli Cohen fbc->strides_offset = strides_offset;
918e126ba97SEli Cohen }
919e126ba97SEli Cohen
mlx5_init_fbc(struct mlx5_buf_list * frags,u8 log_stride,u8 log_sz,struct mlx5_frag_buf_ctrl * fbc)920e126ba97SEli Cohen static inline void mlx5_init_fbc(struct mlx5_buf_list *frags,
9213bcdb17aSSagi Grimberg u8 log_stride, u8 log_sz,
9223bcdb17aSSagi Grimberg struct mlx5_frag_buf_ctrl *fbc)
9233bcdb17aSSagi Grimberg {
9243bcdb17aSSagi Grimberg mlx5_init_fbc_offset(frags, log_stride, log_sz, 0, fbc);
9253bcdb17aSSagi Grimberg }
92626bf3090STariq Toukan
mlx5_frag_buf_get_wqe(struct mlx5_frag_buf_ctrl * fbc,u32 ix)92726bf3090STariq Toukan static inline void *mlx5_frag_buf_get_wqe(struct mlx5_frag_buf_ctrl *fbc,
92826bf3090STariq Toukan u32 ix)
92926bf3090STariq Toukan {
93026bf3090STariq Toukan unsigned int frag;
9314972e6faSTariq Toukan
9324972e6faSTariq Toukan ix += fbc->strides_offset;
933a0903622STariq Toukan frag = ix >> fbc->log_frag_strides;
9343a2f7033STariq Toukan
935388ca8beSYonatan Cohen return fbc->frags[frag].buf + ((fbc->frag_sz_m1 & ix) << fbc->log_stride);
9364972e6faSTariq Toukan }
9373a2f7033STariq Toukan
9383a2f7033STariq Toukan static inline u32
mlx5_frag_buf_get_idx_last_contig_stride(struct mlx5_frag_buf_ctrl * fbc,u32 ix)939388ca8beSYonatan Cohen mlx5_frag_buf_get_idx_last_contig_stride(struct mlx5_frag_buf_ctrl *fbc, u32 ix)
940388ca8beSYonatan Cohen {
941388ca8beSYonatan Cohen u32 last_frag_stride_idx = (ix + fbc->strides_offset) | fbc->frag_sz_m1;
942d7037ad7STariq Toukan
943d7037ad7STariq Toukan return min_t(u32, last_frag_stride_idx - fbc->strides_offset, fbc->sz_m1);
944d7037ad7STariq Toukan }
9454972e6faSTariq Toukan
9464972e6faSTariq Toukan enum {
947d7037ad7STariq Toukan CMD_ALLOWED_OPCODE_ALL,
948d7037ad7STariq Toukan };
9494972e6faSTariq Toukan
9503a2f7033STariq Toukan void mlx5_cmd_use_events(struct mlx5_core_dev *dev);
9513a2f7033STariq Toukan void mlx5_cmd_use_polling(struct mlx5_core_dev *dev);
952388ca8beSYonatan Cohen void mlx5_cmd_allowed_opcode(struct mlx5_core_dev *dev, u16 opcode);
953388ca8beSYonatan Cohen
954388ca8beSYonatan Cohen struct mlx5_async_ctx {
955d7037ad7STariq Toukan struct mlx5_core_dev *dev;
956d7037ad7STariq Toukan atomic_t num_inflight;
957d7037ad7STariq Toukan struct completion inflight_done;
958d7037ad7STariq Toukan };
959388ca8beSYonatan Cohen
9604972e6faSTariq Toukan struct mlx5_async_work;
961388ca8beSYonatan Cohen
962388ca8beSYonatan Cohen typedef void (*mlx5_async_cbk_t)(int status, struct mlx5_async_work *context);
96337fdffb2STariq Toukan
96437fdffb2STariq Toukan struct mlx5_async_work {
96537fdffb2STariq Toukan struct mlx5_async_ctx *ctx;
96637fdffb2STariq Toukan mlx5_async_cbk_t user_callback;
96737fdffb2STariq Toukan u16 opcode; /* cmd opcode */
96837fdffb2STariq Toukan u16 op_mod; /* cmd op_mod */
96937fdffb2STariq Toukan u8 throttle_locked:1;
97037fdffb2STariq Toukan u8 unpriv_locked:1;
971d43b7007SEran Ben Elisha void *out; /* pointer to the cmd output buffer */
972d43b7007SEran Ben Elisha };
973d43b7007SEran Ben Elisha
974d43b7007SEran Ben Elisha void mlx5_cmd_init_async_ctx(struct mlx5_core_dev *dev,
975e126ba97SEli Cohen struct mlx5_async_ctx *ctx);
976e126ba97SEli Cohen void mlx5_cmd_cleanup_async_ctx(struct mlx5_async_ctx *ctx);
977d43b7007SEran Ben Elisha int mlx5_cmd_exec_cb(struct mlx5_async_ctx *ctx, void *in, int in_size,
978c4f287c4SSaeed Mahameed void *out, int out_size, mlx5_async_cbk_t callback,
979e355477eSJason Gunthorpe struct mlx5_async_work *work);
980e355477eSJason Gunthorpe void mlx5_cmd_out_err(struct mlx5_core_dev *dev, u16 opcode, u16 op_mod, void *out);
981e355477eSJason Gunthorpe int mlx5_cmd_do(struct mlx5_core_dev *dev, void *in, int in_size, void *out, int out_size);
982bacd22dfSTariq Toukan int mlx5_cmd_check(struct mlx5_core_dev *dev, int err, void *in, void *out);
983e355477eSJason Gunthorpe int mlx5_cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out,
984e355477eSJason Gunthorpe int out_size);
985e355477eSJason Gunthorpe
986e355477eSJason Gunthorpe #define mlx5_cmd_exec_inout(dev, ifc_cmd, in, out) \
987e355477eSJason Gunthorpe ({ \
988e355477eSJason Gunthorpe mlx5_cmd_exec(dev, in, MLX5_ST_SZ_BYTES(ifc_cmd##_in), out, \
989e355477eSJason Gunthorpe MLX5_ST_SZ_BYTES(ifc_cmd##_out)); \
990e355477eSJason Gunthorpe })
991e355477eSJason Gunthorpe
99234f46ae0SMoshe Shemesh #define mlx5_cmd_exec_in(dev, ifc_cmd, in) \
993870c2481SMoshe Shemesh ({ \
9940a34fad1SChiara Meiohas u32 _out[MLX5_ST_SZ_DW(ifc_cmd##_out)] = {}; \
995*f9deed09SChiara Meiohas mlx5_cmd_exec_inout(dev, ifc_cmd, in, _out); \
9960a415276SSaeed Mahameed })
997e355477eSJason Gunthorpe
998e355477eSJason Gunthorpe int mlx5_cmd_exec_polling(struct mlx5_core_dev *dev, void *in, int in_size,
999e355477eSJason Gunthorpe void *out, int out_size);
1000e355477eSJason Gunthorpe bool mlx5_cmd_is_down(struct mlx5_core_dev *dev);
1001e355477eSJason Gunthorpe int mlx5_cmd_add_privileged_uid(struct mlx5_core_dev *dev, u16 uid);
1002e355477eSJason Gunthorpe void mlx5_cmd_remove_privileged_uid(struct mlx5_core_dev *dev, u16 uid);
1003e355477eSJason Gunthorpe
1004e355477eSJason Gunthorpe void mlx5_core_uplink_netdev_set(struct mlx5_core_dev *mdev, struct net_device *netdev);
10050a415276SSaeed Mahameed void mlx5_core_uplink_netdev_event_replay(struct mlx5_core_dev *mdev);
1006f23519e5SSaeed Mahameed
1007f23519e5SSaeed Mahameed void mlx5_core_mp_event_replay(struct mlx5_core_dev *dev, u32 event, void *data);
1008e126ba97SEli Cohen
1009e126ba97SEli Cohen void mlx5_health_cleanup(struct mlx5_core_dev *dev);
1010bb7fc863SLeon Romanovsky int mlx5_health_init(struct mlx5_core_dev *dev);
1011bb7fc863SLeon Romanovsky void mlx5_start_health_poll(struct mlx5_core_dev *dev);
1012bb7fc863SLeon Romanovsky void mlx5_stop_health_poll(struct mlx5_core_dev *dev, bool disable_health);
1013bb7fc863SLeon Romanovsky void mlx5_start_health_fw_log_up(struct mlx5_core_dev *dev);
1014bb7fc863SLeon Romanovsky void mlx5_drain_health_wq(struct mlx5_core_dev *dev);
1015bb7fc863SLeon Romanovsky void mlx5_trigger_health_work(struct mlx5_core_dev *dev);
1016bb7fc863SLeon Romanovsky int mlx5_frag_buf_alloc_node(struct mlx5_core_dev *dev, int size,
1017bb7fc863SLeon Romanovsky struct mlx5_frag_buf *buf, int node);
1018bb7fc863SLeon Romanovsky void mlx5_frag_buf_free(struct mlx5_core_dev *dev, struct mlx5_frag_buf *buf);
1019bb7fc863SLeon Romanovsky int mlx5_core_create_mkey(struct mlx5_core_dev *dev, u32 *mkey, u32 *in,
1020bb7fc863SLeon Romanovsky int inlen);
1021bb7fc863SLeon Romanovsky int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, u32 mkey);
1022bb7fc863SLeon Romanovsky int mlx5_core_query_mkey(struct mlx5_core_dev *dev, u32 mkey, u32 *out,
10234525abeaSMajd Dibbiny int outlen);
10244525abeaSMajd Dibbiny int mlx5_core_alloc_pd(struct mlx5_core_dev *dev, u32 *pdn);
1025b898ce7bSSaeed Mahameed int mlx5_core_dealloc_pd(struct mlx5_core_dev *dev, u32 pdn);
1026*f9deed09SChiara Meiohas int mlx5_pagealloc_init(struct mlx5_core_dev *dev);
1027*f9deed09SChiara Meiohas void mlx5_pagealloc_cleanup(struct mlx5_core_dev *dev);
1028c4f287c4SSaeed Mahameed void mlx5_pagealloc_start(struct mlx5_core_dev *dev);
1029c7d4e6abSJiri Pirko void mlx5_pagealloc_stop(struct mlx5_core_dev *dev);
1030c7d4e6abSJiri Pirko void mlx5_pages_debugfs_init(struct mlx5_core_dev *dev);
1031c7d4e6abSJiri Pirko void mlx5_pages_debugfs_cleanup(struct mlx5_core_dev *dev);
10320d293714SPatrisious Haddad int mlx5_satisfy_startup_pages(struct mlx5_core_dev *dev, int boot);
10330d293714SPatrisious Haddad int mlx5_reclaim_startup_pages(struct mlx5_core_dev *dev);
1034ac6ea6e8SEli Cohen void mlx5_register_debugfs(void);
1035ac6ea6e8SEli Cohen void mlx5_unregister_debugfs(void);
1036e126ba97SEli Cohen
103776d5581cSJack Morgenstein void mlx5_fill_page_frag_array_perm(struct mlx5_frag_buf *buf, __be64 *pas, u8 perm);
10389b98d395SMoshe Shemesh void mlx5_fill_page_frag_array(struct mlx5_frag_buf *frag_buf, __be64 *pas);
103905ac2c0bSMohamad Haj Yahia int mlx5_comp_eqn_get(struct mlx5_core_dev *dev, u16 vecidx, int *eqn);
10400179720dSIlan Tayari int mlx5_core_attach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn);
10411c1b5228STariq Toukan int mlx5_core_detach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn);
10421c1b5228STariq Toukan
10431c1b5228STariq Toukan struct dentry *mlx5_debugfs_get_dev_root(struct mlx5_core_dev *dev);
104483fec3f1SAharon Landau void mlx5_qp_debugfs_init(struct mlx5_core_dev *dev);
104583fec3f1SAharon Landau void mlx5_qp_debugfs_cleanup(struct mlx5_core_dev *dev);
104683fec3f1SAharon Landau int mlx5_access_reg(struct mlx5_core_dev *dev, void *data_in, int size_in,
104783fec3f1SAharon Landau void *data_out, int size_out, u16 reg_id, int arg,
104883fec3f1SAharon Landau int write, bool verbose);
1049e126ba97SEli Cohen int mlx5_core_access_reg(struct mlx5_core_dev *dev, void *data_in,
1050e126ba97SEli Cohen int size_in, void *data_out, int size_out,
10510cf53c12SSaeed Mahameed u16 reg_num, int arg, int write);
1052e126ba97SEli Cohen
10530cf53c12SSaeed Mahameed int mlx5_db_alloc_node(struct mlx5_core_dev *dev, struct mlx5_db *db,
1054e126ba97SEli Cohen int node);
10554e05cbf0SMoshe Shemesh
mlx5_db_alloc(struct mlx5_core_dev * dev,struct mlx5_db * db)10564e05cbf0SMoshe Shemesh static inline int mlx5_db_alloc(struct mlx5_core_dev *dev, struct mlx5_db *db)
1057cd23b14bSEli Cohen {
1058e126ba97SEli Cohen return mlx5_db_alloc_node(dev, db, dev->priv.numa_node);
1059e126ba97SEli Cohen }
1060e126ba97SEli Cohen
1061388ca8beSYonatan Cohen void mlx5_db_free(struct mlx5_core_dev *dev, struct mlx5_db *db);
10621dcb6c36SEli Cohen
10631c1b5228STariq Toukan const char *mlx5_command_str(int command);
1064f14c1a14SMaher Sanalla void mlx5_cmdif_debugfs_init(struct mlx5_core_dev *dev);
1065e126ba97SEli Cohen void mlx5_cmdif_debugfs_cleanup(struct mlx5_core_dev *dev);
1066e126ba97SEli Cohen int mlx5_core_create_psv(struct mlx5_core_dev *dev, u32 pdn,
1067e126ba97SEli Cohen int npsvs, u32 *sig_index);
106866771a1cSMoshe Shemesh int mlx5_core_destroy_psv(struct mlx5_core_dev *dev, int psv_num);
10699f818c8aSGreg Kroah-Hartman __be32 mlx5_core_get_terminate_scatter_list_mkey(struct mlx5_core_dev *dev);
1070e126ba97SEli Cohen void mlx5_core_put_rsc(struct mlx5_core_rsc_common *common);
107145fee8edSMoshe Shemesh
107245fee8edSMoshe Shemesh int mlx5_init_rl_table(struct mlx5_core_dev *dev);
107345fee8edSMoshe Shemesh void mlx5_cleanup_rl_table(struct mlx5_core_dev *dev);
1074e126ba97SEli Cohen int mlx5_rl_add_rate(struct mlx5_core_dev *dev, u16 *index,
1075e126ba97SEli Cohen struct mlx5_rate_limit *rl);
1076e126ba97SEli Cohen void mlx5_rl_remove_rate(struct mlx5_core_dev *dev, struct mlx5_rate_limit *rl);
1077adb0c954SSaeed Mahameed bool mlx5_rl_is_in_range(struct mlx5_core_dev *dev, u32 rate);
1078311c7c71SSaeed Mahameed int mlx5_rl_add_rate_raw(struct mlx5_core_dev *dev, void *rl_in, u16 uid,
1079311c7c71SSaeed Mahameed bool dedicated_entry, u16 *index);
10809b45bde8STariq Toukan void mlx5_rl_remove_rate_raw(struct mlx5_core_dev *dev, u16 index);
10819b45bde8STariq Toukan bool mlx5_rl_are_equal(struct mlx5_rate_limit *rl_0,
10829b45bde8STariq Toukan struct mlx5_rate_limit *rl_1);
10839b45bde8STariq Toukan int mlx5_alloc_bfreg(struct mlx5_core_dev *mdev, struct mlx5_sq_bfreg *bfreg,
10849b45bde8STariq Toukan bool map_wc, bool fast_path);
10859b45bde8STariq Toukan void mlx5_free_bfreg(struct mlx5_core_dev *mdev, struct mlx5_sq_bfreg *bfreg);
1086e126ba97SEli Cohen
1087e126ba97SEli Cohen unsigned int mlx5_comp_vectors_max(struct mlx5_core_dev *dev);
1088e126ba97SEli Cohen int mlx5_comp_vector_get_cpu(struct mlx5_core_dev *dev, int vector);
10899f818c8aSGreg Kroah-Hartman unsigned int mlx5_core_reserved_gids_count(struct mlx5_core_dev *dev);
1090e126ba97SEli Cohen int mlx5_core_roce_gid_set(struct mlx5_core_dev *dev, unsigned int index,
10913121e3c4SSagi Grimberg u8 roce_version, u8 roce_l3_type, const u8 *gid,
10923121e3c4SSagi Grimberg const u8 *mac, bool vlan, u16 vlan_id, u8 port_num);
10933121e3c4SSagi Grimberg
mlx5_mkey_to_idx(u32 mkey)10941db1f21cSDragos Tatulea static inline u32 mlx5_mkey_to_idx(u32 mkey)
10955903325aSEli Cohen {
1096e126ba97SEli Cohen return mkey >> 8;
10971466cc5bSYevgeny Petrilin }
10981466cc5bSYevgeny Petrilin
mlx5_idx_to_mkey(u32 mkey_idx)109905d3ac97SBodong Wang static inline u32 mlx5_idx_to_mkey(u32 mkey_idx)
110005d3ac97SBodong Wang {
110105d3ac97SBodong Wang return mkey_idx << 8;
11021466cc5bSYevgeny Petrilin }
11031326034bSYishai Hadas
mlx5_mkey_variant(u32 mkey)11041326034bSYishai Hadas static inline u8 mlx5_mkey_variant(u32 mkey)
11051326034bSYishai Hadas {
110605d3ac97SBodong Wang return mkey & 0xff;
110705d3ac97SBodong Wang }
1108a6d51b68SEli Cohen
1109a6d51b68SEli Cohen /* Async-atomic event notifier used by mlx5 core to forward FW
1110a6d51b68SEli Cohen * evetns received from event queue to mlx5 consumers.
11111466cc5bSYevgeny Petrilin * Optimise event queue dipatching.
1112674dd4e2SMaher Sanalla */
1113f3147015SMaher Sanalla int mlx5_notifier_register(struct mlx5_core_dev *dev, struct notifier_block *nb);
111452ec462eSIlan Tayari int mlx5_notifier_unregister(struct mlx5_core_dev *dev, struct notifier_block *nb);
111552ec462eSIlan Tayari
111652ec462eSIlan Tayari /* Async-atomic event notifier used for forwarding
1117cfe4e37fSDaniel Jurgens * evetns from the event queue into the to mlx5 events dispatcher,
111852ec462eSIlan Tayari * eswitch, clock and others.
1119e126ba97SEli Cohen */
1120e126ba97SEli Cohen int mlx5_eq_notifier_register(struct mlx5_core_dev *dev, struct mlx5_nb *nb);
1121e126ba97SEli Cohen int mlx5_eq_notifier_unregister(struct mlx5_core_dev *dev, struct mlx5_nb *nb);
1122e126ba97SEli Cohen
1123e126ba97SEli Cohen /* Blocking event notifier used to forward SW events, used for slow path */
1124e126ba97SEli Cohen int mlx5_blocking_notifier_register(struct mlx5_core_dev *dev, struct notifier_block *nb);
1125e126ba97SEli Cohen int mlx5_blocking_notifier_unregister(struct mlx5_core_dev *dev, struct notifier_block *nb);
1126e126ba97SEli Cohen int mlx5_blocking_notifier_call_chain(struct mlx5_core_dev *dev, unsigned int event,
1127e126ba97SEli Cohen void *data);
1128e126ba97SEli Cohen
1129746b5583SEli Cohen int mlx5_core_query_vendor_id(struct mlx5_core_dev *mdev, u32 *vendor_id);
1130746b5583SEli Cohen
1131746b5583SEli Cohen int mlx5_cmd_create_vport_lag(struct mlx5_core_dev *dev);
1132746b5583SEli Cohen int mlx5_cmd_destroy_vport_lag(struct mlx5_core_dev *dev);
1133746b5583SEli Cohen bool mlx5_lag_is_roce(struct mlx5_core_dev *dev);
1134241dc159SAya Levin bool mlx5_lag_is_sriov(struct mlx5_core_dev *dev);
113539c538d6SCai Huoqing bool mlx5_lag_is_active(struct mlx5_core_dev *dev);
1136241dc159SAya Levin bool mlx5_lag_mode_is_hash(struct mlx5_core_dev *dev);
1137241dc159SAya Levin bool mlx5_lag_is_master(struct mlx5_core_dev *dev);
113820902be4SSaeed Mahameed bool mlx5_lag_is_shared_fdb(struct mlx5_core_dev *dev);
113920902be4SSaeed Mahameed bool mlx5_lag_is_mpesw(struct mlx5_core_dev *dev);
1140241dc159SAya Levin u8 mlx5_lag_get_slave_port(struct mlx5_core_dev *dev,
1141241dc159SAya Levin struct net_device *slave);
1142241dc159SAya Levin int mlx5_lag_query_cong_counters(struct mlx5_core_dev *dev,
1143241dc159SAya Levin u64 *values,
1144241dc159SAya Levin int num_counters,
1145c0670781SYishai Hadas size_t *offsets);
1146c0670781SYishai Hadas struct mlx5_core_dev *mlx5_lag_get_next_peer_mdev(struct mlx5_core_dev *dev, int *i);
114720902be4SSaeed Mahameed
1148241dc159SAya Levin #define mlx5_lag_for_each_peer_mdev(dev, peer, i) \
1149241dc159SAya Levin for (i = 0, peer = mlx5_lag_get_next_peer_mdev(dev, &i); \
1150241dc159SAya Levin peer; \
1151241dc159SAya Levin peer = mlx5_lag_get_next_peer_mdev(dev, &i))
1152241dc159SAya Levin
1153241dc159SAya Levin u8 mlx5_lag_get_num_ports(struct mlx5_core_dev *dev);
1154211e6c80SMajd Dibbiny struct mlx5_uars_page *mlx5_get_uars_page(struct mlx5_core_dev *mdev);
11559603b61dSJack Morgenstein void mlx5_put_uars_page(struct mlx5_core_dev *mdev, struct mlx5_uars_page *up);
11563bc34f3bSAviv Heller int mlx5_dm_sw_icm_alloc(struct mlx5_core_dev *dev, enum mlx5_sw_icm_type type,
11573bc34f3bSAviv Heller u64 length, u32 log_alignment, u16 uid,
11587c34ec19SAviv Heller phys_addr_t *addr, u32 *obj_id);
11597c34ec19SAviv Heller int mlx5_dm_sw_icm_dealloc(struct mlx5_core_dev *dev, enum mlx5_sw_icm_type type,
11607907f23aSAviv Heller u64 length, u16 uid, phys_addr_t addr, u32 obj_id);
1161a83bb5dfSLiu, Changcheng
1162af8c0e25SMark Bloch struct mlx5_core_dev *mlx5_vf_get_core_dev(struct pci_dev *pdev);
1163af8c0e25SMark Bloch void mlx5_vf_put_core_dev(struct mlx5_core_dev *mdev);
116427f9e0ccSMark Bloch
1165c6bc6041SMaor Gottlieb int mlx5_sriov_blocking_notifier_register(struct mlx5_core_dev *mdev,
1166c6bc6041SMaor Gottlieb int vf_id,
116771a0ff65SMajd Dibbiny struct notifier_block *nb);
116871a0ff65SMajd Dibbiny void mlx5_sriov_blocking_notifier_unregister(struct mlx5_core_dev *mdev,
116971a0ff65SMajd Dibbiny int vf_id,
117071a0ff65SMajd Dibbiny struct notifier_block *nb);
1171222dd185SShay Drory int mlx5_rdma_rn_get_params(struct mlx5_core_dev *mdev,
1172222dd185SShay Drory struct ib_device *device,
1173222dd185SShay Drory struct rdma_netdev_alloc_params *params);
1174222dd185SShay Drory
1175222dd185SShay Drory enum {
1176222dd185SShay Drory MLX5_PCI_DEV_IS_VF = 1 << 0,
1177222dd185SShay Drory };
117834a30d76SMark Bloch
mlx5_core_is_pf(const struct mlx5_core_dev * dev)117901187175SEli Cohen static inline bool mlx5_core_is_pf(const struct mlx5_core_dev *dev)
118001187175SEli Cohen {
1181c9b9dcb4SAriel Levkovich return dev->coredev_type == MLX5_COREDEV_PF;
1182dff8e2d1SErez Shitrit }
1183dff8e2d1SErez Shitrit
mlx5_core_is_vf(const struct mlx5_core_dev * dev)1184c9b9dcb4SAriel Levkovich static inline bool mlx5_core_is_vf(const struct mlx5_core_dev *dev)
1185c9b9dcb4SAriel Levkovich {
11867907f23aSAviv Heller return dev->coredev_type == MLX5_COREDEV_VF;
11871695b97bSYishai Hadas }
11881695b97bSYishai Hadas
mlx5_core_same_coredev_type(const struct mlx5_core_dev * dev1,const struct mlx5_core_dev * dev2)11891695b97bSYishai Hadas static inline bool mlx5_core_same_coredev_type(const struct mlx5_core_dev *dev1,
1190846e4373SYishai Hadas const struct mlx5_core_dev *dev2)
1191846e4373SYishai Hadas {
1192846e4373SYishai Hadas return dev1->coredev_type == dev2->coredev_type;
1193846e4373SYishai Hadas }
1194846e4373SYishai Hadas
mlx5_core_is_ecpf(const struct mlx5_core_dev * dev)1195846e4373SYishai Hadas static inline bool mlx5_core_is_ecpf(const struct mlx5_core_dev *dev)
1196f6a8a19bSDenis Drozdov {
1197f6a8a19bSDenis Drozdov return dev->caps.embedded_cpu;
1198f6a8a19bSDenis Drozdov }
1199693dfd5aSErez Shitrit
1200fc50db98SEli Cohen static inline bool
mlx5_core_is_ecpf_esw_manager(const struct mlx5_core_dev * dev)1201fc50db98SEli Cohen mlx5_core_is_ecpf_esw_manager(const struct mlx5_core_dev *dev)
1202fc50db98SEli Cohen {
1203fc50db98SEli Cohen return dev->caps.embedded_cpu && MLX5_CAP_GEN(dev, eswitch_manager);
12042752b823SParav Pandit }
1205fc50db98SEli Cohen
mlx5_ecpf_vport_exists(const struct mlx5_core_dev * dev)1206386e75afSHuy Nguyen static inline bool mlx5_ecpf_vport_exists(const struct mlx5_core_dev *dev)
1207fc50db98SEli Cohen {
1208fc50db98SEli Cohen return mlx5_core_is_pf(dev) && MLX5_CAP_ESW(dev, ecpf_vport_exists);
1209e53a9d26SParav Pandit }
1210e53a9d26SParav Pandit
mlx5_core_max_vfs(const struct mlx5_core_dev * dev)1211e53a9d26SParav Pandit static inline u16 mlx5_core_max_vfs(const struct mlx5_core_dev *dev)
1212e53a9d26SParav Pandit {
1213e53a9d26SParav Pandit return dev->priv.sriov.max_vfs;
1214e05feab2SPatrisious Haddad }
1215e05feab2SPatrisious Haddad
mlx5_lag_is_lacp_owner(struct mlx5_core_dev * dev)1216e05feab2SPatrisious Haddad static inline int mlx5_lag_is_lacp_owner(struct mlx5_core_dev *dev)
1217e05feab2SPatrisious Haddad {
1218e05feab2SPatrisious Haddad /* LACP owner conditions:
1219e05feab2SPatrisious Haddad * 1) Function is physical.
12203b1e58aaSParav Pandit * 2) LAG is supported by FW.
1221591905baSBodong Wang * 3) LAG is managed by driver (currently the only option).
1222591905baSBodong Wang */
1223591905baSBodong Wang return MLX5_CAP_GEN(dev, vport_group_manager) &&
1224591905baSBodong Wang (MLX5_CAP_GEN(dev, num_lag_ports) > 1) &&
12252752b823SParav Pandit MLX5_CAP_GEN(dev, lag_master);
12262752b823SParav Pandit }
12277f0d11c7SBodong Wang
mlx5_core_max_ec_vfs(const struct mlx5_core_dev * dev)12287f0d11c7SBodong Wang static inline u16 mlx5_core_max_ec_vfs(const struct mlx5_core_dev *dev)
12297f0d11c7SBodong Wang {
12307f0d11c7SBodong Wang return dev->priv.sriov.max_ec_vfs;
12312752b823SParav Pandit }
123281cd229cSBodong Wang
mlx5_get_gid_table_len(u16 param)123381cd229cSBodong Wang static inline int mlx5_get_gid_table_len(u16 param)
123481cd229cSBodong Wang {
123581cd229cSBodong Wang if (param > 4) {
12362752b823SParav Pandit pr_warn("gid table length is zero\n");
1237feb39369SBodong Wang return 0;
123886eec50bSBodong Wang }
1239feb39369SBodong Wang
1240feb39369SBodong Wang return 8 * (1 << param);
1241617f5db1SMark Bloch }
1242617f5db1SMark Bloch
mlx5_rl_is_supported(struct mlx5_core_dev * dev)1243617f5db1SMark Bloch static inline bool mlx5_rl_is_supported(struct mlx5_core_dev *dev)
1244617f5db1SMark Bloch {
1245617f5db1SMark Bloch return !!(dev->priv.rl_table.max_size);
1246617f5db1SMark Bloch }
1247617f5db1SMark Bloch
mlx5_core_is_mp_slave(struct mlx5_core_dev * dev)1248617f5db1SMark Bloch static inline int mlx5_core_is_mp_slave(struct mlx5_core_dev *dev)
1249617f5db1SMark Bloch {
1250617f5db1SMark Bloch return MLX5_CAP_GEN(dev, affiliate_nic_vport_criteria) &&
1251617f5db1SMark Bloch MLX5_CAP_GEN(dev, num_vhca_ports) <= 1;
1252617f5db1SMark Bloch }
1253dc131808SDaniel Jurgens
mlx5_core_is_mp_master(struct mlx5_core_dev * dev)1254dc131808SDaniel Jurgens static inline int mlx5_core_is_mp_master(struct mlx5_core_dev *dev)
1255dc131808SDaniel Jurgens {
1256dc131808SDaniel Jurgens return MLX5_CAP_GEN(dev, num_vhca_ports) > 1;
1257dc131808SDaniel Jurgens }
1258707c4602SMajd Dibbiny
mlx5_core_mp_enabled(struct mlx5_core_dev * dev)1259707c4602SMajd Dibbiny static inline int mlx5_core_mp_enabled(struct mlx5_core_dev *dev)
1260707c4602SMajd Dibbiny {
1261707c4602SMajd Dibbiny return mlx5_core_is_mp_slave(dev) ||
1262707c4602SMajd Dibbiny mlx5_core_is_mp_master(dev);
1263707c4602SMajd Dibbiny }
1264707c4602SMajd Dibbiny
mlx5_core_native_port_num(struct mlx5_core_dev * dev)1265707c4602SMajd Dibbiny static inline int mlx5_core_native_port_num(struct mlx5_core_dev *dev)
1266707c4602SMajd Dibbiny {
1267707c4602SMajd Dibbiny if (!mlx5_core_mp_enabled(dev))
12681466cc5bSYevgeny Petrilin return 1;
12691466cc5bSYevgeny Petrilin
12701466cc5bSYevgeny Petrilin return MLX5_CAP_GEN(dev, native_port_num);
12711466cc5bSYevgeny Petrilin }
12721466cc5bSYevgeny Petrilin
mlx5_get_dev_index(struct mlx5_core_dev * dev)127332f69e4bSDaniel Jurgens static inline int mlx5_get_dev_index(struct mlx5_core_dev *dev)
127432f69e4bSDaniel Jurgens {
127532f69e4bSDaniel Jurgens int idx = MLX5_CAP_GEN(dev, native_port_num);
127632f69e4bSDaniel Jurgens
127732f69e4bSDaniel Jurgens if (idx >= 1 && idx <= MLX5_MAX_PORTS)
127832f69e4bSDaniel Jurgens return idx - 1;
127932f69e4bSDaniel Jurgens else
128032f69e4bSDaniel Jurgens return PCI_FUNC(dev->pdev->devfn);
128132f69e4bSDaniel Jurgens }
128232f69e4bSDaniel Jurgens
128332f69e4bSDaniel Jurgens enum {
128432f69e4bSDaniel Jurgens MLX5_TRIGGERED_CMD_COMP = (u64)1 << 32,
128532f69e4bSDaniel Jurgens };
128632f69e4bSDaniel Jurgens
128732f69e4bSDaniel Jurgens bool mlx5_is_roce_on(struct mlx5_core_dev *dev);
128832f69e4bSDaniel Jurgens
mlx5_get_roce_state(struct mlx5_core_dev * dev)128932f69e4bSDaniel Jurgens static inline bool mlx5_get_roce_state(struct mlx5_core_dev *dev)
12907fd8aefbSDaniel Jurgens {
12917fd8aefbSDaniel Jurgens if (MLX5_CAP_GEN(dev, roce_rw_supported))
129232f69e4bSDaniel Jurgens return MLX5_CAP_GEN(dev, roce);
12937fd8aefbSDaniel Jurgens
129432f69e4bSDaniel Jurgens /* If RoCE cap is read-only in FW, get RoCE state from devlink
129532f69e4bSDaniel Jurgens * in order to support RoCE enable/disable feature
12967fd8aefbSDaniel Jurgens */
12977fd8aefbSDaniel Jurgens return mlx5_is_roce_on(dev);
12982ec16dddSRongwei Liu }
12992ec16dddSRongwei Liu
13001021d064SRongwei Liu #ifdef CONFIG_MLX5_MACSEC
mlx5e_is_macsec_device(const struct mlx5_core_dev * mdev)13011021d064SRongwei Liu static inline bool mlx5e_is_macsec_device(const struct mlx5_core_dev *mdev)
13021021d064SRongwei Liu {
13031021d064SRongwei Liu if (!(MLX5_CAP_GEN_64(mdev, general_obj_types) &
13041021d064SRongwei Liu MLX5_GENERAL_OBJ_TYPES_CAP_MACSEC_OFFLOAD))
13052ec16dddSRongwei Liu return false;
13062ec16dddSRongwei Liu
13072ec16dddSRongwei Liu if (!MLX5_CAP_GEN(mdev, log_max_dek))
1308020446e0SEli Cohen return false;
1309020446e0SEli Cohen
1310020446e0SEli Cohen if (!MLX5_CAP_MACSEC(mdev, log_max_macsec_offload))
1311020446e0SEli Cohen return false;
13129ca05b0fSMaher Sanalla
1313cc9defcbSMichael Guralnik if (!MLX5_CAP_FLOWTABLE_NIC_RX(mdev, macsec_decrypt) ||
13149ca05b0fSMaher Sanalla !MLX5_CAP_FLOWTABLE_NIC_RX(mdev, reformat_remove_macsec))
13159ca05b0fSMaher Sanalla return false;
13169ca05b0fSMaher Sanalla
13179ca05b0fSMaher Sanalla if (!MLX5_CAP_FLOWTABLE_NIC_TX(mdev, macsec_encrypt) ||
13189ca05b0fSMaher Sanalla !MLX5_CAP_FLOWTABLE_NIC_TX(mdev, reformat_add_macsec))
13199ca05b0fSMaher Sanalla return false;
13209ca05b0fSMaher Sanalla
13219ca05b0fSMaher Sanalla if (!MLX5_CAP_MACSEC(mdev, macsec_crypto_esp_aes_gcm_128_encrypt) &&
13229ca05b0fSMaher Sanalla !MLX5_CAP_MACSEC(mdev, macsec_crypto_esp_aes_gcm_256_encrypt))
1323cc9defcbSMichael Guralnik return false;
1324cc9defcbSMichael Guralnik
132558dbd642SPatrisious Haddad if (!MLX5_CAP_MACSEC(mdev, macsec_crypto_esp_aes_gcm_128_decrypt) &&
1326758ce14aSPatrisious Haddad !MLX5_CAP_MACSEC(mdev, macsec_crypto_esp_aes_gcm_256_decrypt))
1327758ce14aSPatrisious Haddad return false;
1328758ce14aSPatrisious Haddad
1329758ce14aSPatrisious Haddad return true;
1330758ce14aSPatrisious Haddad }
1331758ce14aSPatrisious Haddad
1332758ce14aSPatrisious Haddad #define NIC_RDMA_BOTH_DIRS_CAPS (MLX5_FT_NIC_RX_2_NIC_RX_RDMA | MLX5_FT_NIC_TX_RDMA_2_NIC_TX)
1333758ce14aSPatrisious Haddad
mlx5_is_macsec_roce_supported(struct mlx5_core_dev * mdev)1334758ce14aSPatrisious Haddad static inline bool mlx5_is_macsec_roce_supported(struct mlx5_core_dev *mdev)
1335758ce14aSPatrisious Haddad {
1336758ce14aSPatrisious Haddad if (((MLX5_CAP_GEN_2(mdev, flow_table_type_2_type) &
1337758ce14aSPatrisious Haddad NIC_RDMA_BOTH_DIRS_CAPS) != NIC_RDMA_BOTH_DIRS_CAPS) ||
1338758ce14aSPatrisious Haddad !MLX5_CAP_FLOWTABLE_RDMA_TX(mdev, max_modify_header_actions) ||
1339758ce14aSPatrisious Haddad !mlx5e_is_macsec_device(mdev) || !mdev->macsec_fs)
1340758ce14aSPatrisious Haddad return false;
1341758ce14aSPatrisious Haddad
1342758ce14aSPatrisious Haddad return true;
1343758ce14aSPatrisious Haddad }
1344758ce14aSPatrisious Haddad #endif
1345758ce14aSPatrisious Haddad
1346758ce14aSPatrisious Haddad enum {
1347758ce14aSPatrisious Haddad MLX5_OCTWORD = 16,
1348758ce14aSPatrisious Haddad };
1349758ce14aSPatrisious Haddad
1350758ce14aSPatrisious Haddad bool mlx5_wc_support_get(struct mlx5_core_dev *mdev);
1351758ce14aSPatrisious Haddad #endif /* MLX5_DRIVER_H */
1352758ce14aSPatrisious Haddad