restore lost packages from 0.2.3 + fix overwritten 0.2.4 files
- Restore 29 recipe symlinks (libdrm, qtbase, dbus, sddm, pipewire, etc.) - Restore 33 patches (KDE, libdrm, mesa, pipewire, sddm, wireplumber) - Restore 20+ local/scripts (audit, lint, test, build helpers) - Restore src/cook/scheduler.rs, status.rs, gnu-config/ - Restore scripts/patch-inclusion-gate.sh, run_mini1.sh, validate-collision-log.sh - Recover TLC source from HEAD (was overwritten by 0.2.3 checkout) - Recover 11 local/docs plans from HEAD (were overwritten) - Recover qt6-wayland-smoke symlink from HEAD - Fix MOTD: remove garbled ASCII art, use clean text - Update version: 0.2.0 -> 0.2.4 in os-release, motd, config - Reduce filesystem_size: 1536 -> 512 MiB - Add ABSOLUTE RULE to AGENTS.md: never delete/ignore packages - Reduce pcid scheme log verbosity: info -> debug
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MLX5_CORE_CQ_H
|
||||
#define MLX5_CORE_CQ_H
|
||||
|
||||
#include <linux/mlx5/driver.h>
|
||||
#include <linux/refcount.h>
|
||||
|
||||
struct mlx5_core_cq {
|
||||
u32 cqn;
|
||||
int cqe_sz;
|
||||
__be32 *set_ci_db;
|
||||
__be32 *arm_db;
|
||||
refcount_t refcount;
|
||||
struct completion free;
|
||||
unsigned vector;
|
||||
unsigned int irqn;
|
||||
void (*comp)(struct mlx5_core_cq *cq, struct mlx5_eqe *eqe);
|
||||
void (*event) (struct mlx5_core_cq *, enum mlx5_event);
|
||||
u32 cons_index;
|
||||
unsigned arm_sn;
|
||||
struct mlx5_rsc_debug *dbg;
|
||||
int pid;
|
||||
struct {
|
||||
struct list_head list;
|
||||
void (*comp)(struct mlx5_core_cq *cq, struct mlx5_eqe *eqe);
|
||||
void *priv;
|
||||
} tasklet_ctx;
|
||||
int reset_notify_added;
|
||||
struct list_head reset_notify;
|
||||
struct mlx5_eq_comp *eq;
|
||||
u16 uid;
|
||||
};
|
||||
|
||||
|
||||
enum {
|
||||
MLX5_CQE_SYNDROME_LOCAL_LENGTH_ERR = 0x01,
|
||||
MLX5_CQE_SYNDROME_LOCAL_QP_OP_ERR = 0x02,
|
||||
MLX5_CQE_SYNDROME_LOCAL_PROT_ERR = 0x04,
|
||||
MLX5_CQE_SYNDROME_WR_FLUSH_ERR = 0x05,
|
||||
MLX5_CQE_SYNDROME_MW_BIND_ERR = 0x06,
|
||||
MLX5_CQE_SYNDROME_BAD_RESP_ERR = 0x10,
|
||||
MLX5_CQE_SYNDROME_LOCAL_ACCESS_ERR = 0x11,
|
||||
MLX5_CQE_SYNDROME_REMOTE_INVAL_REQ_ERR = 0x12,
|
||||
MLX5_CQE_SYNDROME_REMOTE_ACCESS_ERR = 0x13,
|
||||
MLX5_CQE_SYNDROME_REMOTE_OP_ERR = 0x14,
|
||||
MLX5_CQE_SYNDROME_TRANSPORT_RETRY_EXC_ERR = 0x15,
|
||||
MLX5_CQE_SYNDROME_RNR_RETRY_EXC_ERR = 0x16,
|
||||
MLX5_CQE_SYNDROME_REMOTE_ABORTED_ERR = 0x22,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_CQE_OWNER_MASK = 1,
|
||||
MLX5_CQE_REQ = 0,
|
||||
MLX5_CQE_RESP_WR_IMM = 1,
|
||||
MLX5_CQE_RESP_SEND = 2,
|
||||
MLX5_CQE_RESP_SEND_IMM = 3,
|
||||
MLX5_CQE_RESP_SEND_INV = 4,
|
||||
MLX5_CQE_RESIZE_CQ = 5,
|
||||
MLX5_CQE_SIG_ERR = 12,
|
||||
MLX5_CQE_REQ_ERR = 13,
|
||||
MLX5_CQE_RESP_ERR = 14,
|
||||
MLX5_CQE_INVALID = 15,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_CQ_MODIFY_PERIOD = BIT(0),
|
||||
MLX5_CQ_MODIFY_COUNT = BIT(1),
|
||||
MLX5_CQ_MODIFY_OVERRUN = BIT(2),
|
||||
MLX5_CQ_MODIFY_PERIOD_MODE = BIT(4),
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_CQ_OPMOD_RESIZE = 1,
|
||||
MLX5_MODIFY_CQ_MASK_LOG_SIZE = 1 << 0,
|
||||
MLX5_MODIFY_CQ_MASK_PG_OFFSET = 1 << 1,
|
||||
MLX5_MODIFY_CQ_MASK_PG_SIZE = 1 << 2,
|
||||
};
|
||||
|
||||
struct mlx5_cq_modify_params {
|
||||
int type;
|
||||
union {
|
||||
struct {
|
||||
u32 page_offset;
|
||||
u8 log_cq_size;
|
||||
} resize;
|
||||
|
||||
struct {
|
||||
} moder;
|
||||
|
||||
struct {
|
||||
} mapping;
|
||||
} params;
|
||||
};
|
||||
|
||||
enum {
|
||||
CQE_STRIDE_64 = 0,
|
||||
CQE_STRIDE_128 = 1,
|
||||
CQE_STRIDE_128_PAD = 2,
|
||||
};
|
||||
|
||||
#define MLX5_MAX_CQ_PERIOD (BIT(__mlx5_bit_sz(cqc, cq_period)) - 1)
|
||||
#define MLX5_MAX_CQ_COUNT (BIT(__mlx5_bit_sz(cqc, cq_max_count)) - 1)
|
||||
|
||||
static inline int cqe_sz_to_mlx_sz(u8 size, int padding_128_en)
|
||||
{
|
||||
return padding_128_en ? CQE_STRIDE_128_PAD :
|
||||
size == 64 ? CQE_STRIDE_64 : CQE_STRIDE_128;
|
||||
}
|
||||
|
||||
static inline void mlx5_cq_set_ci(struct mlx5_core_cq *cq)
|
||||
{
|
||||
*cq->set_ci_db = cpu_to_be32(cq->cons_index & 0xffffff);
|
||||
}
|
||||
|
||||
enum {
|
||||
MLX5_CQ_DB_REQ_NOT_SOL = 1 << 24,
|
||||
MLX5_CQ_DB_REQ_NOT = 0 << 24
|
||||
};
|
||||
|
||||
static inline void mlx5_cq_arm(struct mlx5_core_cq *cq, u32 cmd,
|
||||
void __iomem *uar_page,
|
||||
u32 cons_index)
|
||||
{
|
||||
__be32 doorbell[2];
|
||||
u32 sn;
|
||||
u32 ci;
|
||||
|
||||
sn = cq->arm_sn & 3;
|
||||
ci = cons_index & 0xffffff;
|
||||
|
||||
*cq->arm_db = cpu_to_be32(sn << 28 | cmd | ci);
|
||||
|
||||
/* Make sure that the doorbell record in host memory is
|
||||
* written before ringing the doorbell via PCI MMIO.
|
||||
*/
|
||||
wmb();
|
||||
|
||||
doorbell[0] = cpu_to_be32(sn << 28 | cmd | ci);
|
||||
doorbell[1] = cpu_to_be32(cq->cqn);
|
||||
|
||||
mlx5_write64(doorbell, uar_page + MLX5_CQ_DOORBELL);
|
||||
}
|
||||
|
||||
static inline void mlx5_cq_hold(struct mlx5_core_cq *cq)
|
||||
{
|
||||
refcount_inc(&cq->refcount);
|
||||
}
|
||||
|
||||
static inline void mlx5_cq_put(struct mlx5_core_cq *cq)
|
||||
{
|
||||
if (refcount_dec_and_test(&cq->refcount))
|
||||
complete(&cq->free);
|
||||
}
|
||||
|
||||
void mlx5_add_cq_to_tasklet(struct mlx5_core_cq *cq, struct mlx5_eqe *eqe);
|
||||
int mlx5_create_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq,
|
||||
u32 *in, int inlen, u32 *out, int outlen);
|
||||
int mlx5_core_create_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq,
|
||||
u32 *in, int inlen, u32 *out, int outlen);
|
||||
int mlx5_core_destroy_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq);
|
||||
int mlx5_core_query_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq,
|
||||
u32 *out);
|
||||
int mlx5_core_modify_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq,
|
||||
u32 *in, int inlen);
|
||||
int mlx5_core_modify_cq_moderation(struct mlx5_core_dev *dev,
|
||||
struct mlx5_core_cq *cq, u16 cq_period,
|
||||
u16 cq_max_count);
|
||||
static inline void mlx5_dump_err_cqe(struct mlx5_core_dev *dev,
|
||||
struct mlx5_err_cqe *err_cqe)
|
||||
{
|
||||
print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1, err_cqe,
|
||||
sizeof(*err_cqe), false);
|
||||
}
|
||||
int mlx5_debug_cq_add(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq);
|
||||
void mlx5_debug_cq_remove(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq);
|
||||
|
||||
#endif /* MLX5_CORE_CQ_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MLX5_DOORBELL_H
|
||||
#define MLX5_DOORBELL_H
|
||||
|
||||
#define MLX5_BF_OFFSET 0x800
|
||||
#define MLX5_CQ_DOORBELL 0x20
|
||||
|
||||
/* Assume that we can just write a 64-bit doorbell atomically. s390
|
||||
* actually doesn't have writeq() but S/390 systems don't even have
|
||||
* PCI so we won't worry about it.
|
||||
*
|
||||
* Note that the write is not atomic on 32-bit systems! In contrast to 64-bit
|
||||
* ones, it requires proper locking. mlx5_write64 doesn't do any locking, so use
|
||||
* it at your own discretion, protected by some kind of lock on 32 bits.
|
||||
*
|
||||
* TODO: use write{q,l}_relaxed()
|
||||
*/
|
||||
|
||||
static inline void mlx5_write64(__be32 val[2], void __iomem *dest)
|
||||
{
|
||||
#if BITS_PER_LONG == 64
|
||||
__raw_writeq(*(u64 *)val, dest);
|
||||
#else
|
||||
__raw_writel((__force u32) val[0], dest);
|
||||
__raw_writel((__force u32) val[1], dest + 4);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* MLX5_DOORBELL_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,63 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
|
||||
/* Copyright (c) 2018 Mellanox Technologies. */
|
||||
|
||||
#ifndef MLX5_CORE_EQ_H
|
||||
#define MLX5_CORE_EQ_H
|
||||
|
||||
#define MLX5_NUM_CMD_EQE (32)
|
||||
#define MLX5_NUM_ASYNC_EQE (0x1000)
|
||||
#define MLX5_NUM_SPARE_EQE (0x80)
|
||||
|
||||
struct mlx5_eq;
|
||||
struct mlx5_irq;
|
||||
struct mlx5_core_dev;
|
||||
|
||||
struct mlx5_eq_param {
|
||||
int nent;
|
||||
u64 mask[4];
|
||||
struct mlx5_irq *irq;
|
||||
};
|
||||
|
||||
struct mlx5_eq *
|
||||
mlx5_eq_create_generic(struct mlx5_core_dev *dev, struct mlx5_eq_param *param);
|
||||
int
|
||||
mlx5_eq_destroy_generic(struct mlx5_core_dev *dev, struct mlx5_eq *eq);
|
||||
int mlx5_eq_enable(struct mlx5_core_dev *dev, struct mlx5_eq *eq,
|
||||
struct notifier_block *nb);
|
||||
void mlx5_eq_disable(struct mlx5_core_dev *dev, struct mlx5_eq *eq,
|
||||
struct notifier_block *nb);
|
||||
|
||||
struct mlx5_eqe *mlx5_eq_get_eqe(struct mlx5_eq *eq, u32 cc);
|
||||
void mlx5_eq_update_ci(struct mlx5_eq *eq, u32 cc, bool arm);
|
||||
|
||||
/* The HCA will think the queue has overflowed if we
|
||||
* don't tell it we've been processing events. We
|
||||
* create EQs with MLX5_NUM_SPARE_EQE extra entries,
|
||||
* so we must update our consumer index at
|
||||
* least that often.
|
||||
*
|
||||
* mlx5_eq_update_cc must be called on every EQE @EQ irq handler
|
||||
*/
|
||||
static inline u32 mlx5_eq_update_cc(struct mlx5_eq *eq, u32 cc)
|
||||
{
|
||||
if (unlikely(cc >= MLX5_NUM_SPARE_EQE)) {
|
||||
mlx5_eq_update_ci(eq, cc, 0);
|
||||
cc = 0;
|
||||
}
|
||||
return cc;
|
||||
}
|
||||
|
||||
struct mlx5_nb {
|
||||
struct notifier_block nb;
|
||||
u8 event_type;
|
||||
};
|
||||
|
||||
#define mlx5_nb_cof(ptr, type, member) \
|
||||
(container_of(container_of(ptr, struct mlx5_nb, nb), type, member))
|
||||
|
||||
#define MLX5_NB_INIT(name, handler, event) do { \
|
||||
(name)->nb.notifier_call = handler; \
|
||||
(name)->event_type = MLX5_EVENT_TYPE_##event; \
|
||||
} while (0)
|
||||
|
||||
#endif /* MLX5_CORE_EQ_H */
|
||||
@@ -0,0 +1,223 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2018 Mellanox Technologies. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _MLX5_ESWITCH_
|
||||
#define _MLX5_ESWITCH_
|
||||
|
||||
#include <linux/mlx5/driver.h>
|
||||
#include <linux/mlx5/vport.h>
|
||||
#include <net/devlink.h>
|
||||
|
||||
#define MLX5_ESWITCH_MANAGER(mdev) MLX5_CAP_GEN(mdev, eswitch_manager)
|
||||
|
||||
enum {
|
||||
MLX5_ESWITCH_LEGACY,
|
||||
MLX5_ESWITCH_OFFLOADS
|
||||
};
|
||||
|
||||
enum {
|
||||
REP_ETH,
|
||||
REP_IB,
|
||||
NUM_REP_TYPES,
|
||||
};
|
||||
|
||||
enum {
|
||||
REP_UNREGISTERED,
|
||||
REP_REGISTERED,
|
||||
REP_LOADED,
|
||||
};
|
||||
|
||||
enum mlx5_switchdev_event {
|
||||
MLX5_SWITCHDEV_EVENT_PAIR,
|
||||
MLX5_SWITCHDEV_EVENT_UNPAIR,
|
||||
};
|
||||
|
||||
struct mlx5_eswitch_rep;
|
||||
struct mlx5_eswitch_rep_ops {
|
||||
int (*load)(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep);
|
||||
void (*unload)(struct mlx5_eswitch_rep *rep);
|
||||
void *(*get_proto_dev)(struct mlx5_eswitch_rep *rep);
|
||||
int (*event)(struct mlx5_eswitch *esw,
|
||||
struct mlx5_eswitch_rep *rep,
|
||||
enum mlx5_switchdev_event event,
|
||||
void *data);
|
||||
};
|
||||
|
||||
struct mlx5_eswitch_rep_data {
|
||||
void *priv;
|
||||
atomic_t state;
|
||||
};
|
||||
|
||||
struct mlx5_eswitch_rep {
|
||||
struct mlx5_eswitch_rep_data rep_data[NUM_REP_TYPES];
|
||||
u16 vport;
|
||||
u16 vlan;
|
||||
/* Only IB rep is using vport_index */
|
||||
u16 vport_index;
|
||||
u32 vlan_refcount;
|
||||
struct mlx5_eswitch *esw;
|
||||
};
|
||||
|
||||
void mlx5_eswitch_register_vport_reps(struct mlx5_eswitch *esw,
|
||||
const struct mlx5_eswitch_rep_ops *ops,
|
||||
u8 rep_type);
|
||||
void mlx5_eswitch_unregister_vport_reps(struct mlx5_eswitch *esw, u8 rep_type);
|
||||
void *mlx5_eswitch_get_proto_dev(struct mlx5_eswitch *esw,
|
||||
u16 vport_num,
|
||||
u8 rep_type);
|
||||
struct mlx5_eswitch_rep *mlx5_eswitch_vport_rep(struct mlx5_eswitch *esw,
|
||||
u16 vport_num);
|
||||
void *mlx5_eswitch_uplink_get_proto_dev(struct mlx5_eswitch *esw, u8 rep_type);
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *on_esw,
|
||||
struct mlx5_eswitch *from_esw,
|
||||
struct mlx5_eswitch_rep *rep, u32 sqn);
|
||||
|
||||
#ifdef CONFIG_MLX5_ESWITCH
|
||||
enum devlink_eswitch_encap_mode
|
||||
mlx5_eswitch_get_encap_mode(const struct mlx5_core_dev *dev);
|
||||
|
||||
bool mlx5_eswitch_reg_c1_loopback_enabled(const struct mlx5_eswitch *esw);
|
||||
bool mlx5_eswitch_vport_match_metadata_enabled(const struct mlx5_eswitch *esw);
|
||||
|
||||
/* Reg C0 usage:
|
||||
* Reg C0 = < ESW_PFNUM_BITS(4) | ESW_VPORT BITS(12) | ESW_REG_C0_OBJ(16) >
|
||||
*
|
||||
* Highest 4 bits of the reg c0 is the PF_NUM (range 0-15), 12 bits of
|
||||
* unique non-zero vport id (range 1-4095). The rest (lowest 16 bits) is left
|
||||
* for user data objects managed by a common mapping context.
|
||||
* PFNUM + VPORT comprise the SOURCE_PORT matching.
|
||||
*/
|
||||
#define ESW_VPORT_BITS 12
|
||||
#define ESW_PFNUM_BITS 4
|
||||
#define ESW_SOURCE_PORT_METADATA_BITS (ESW_PFNUM_BITS + ESW_VPORT_BITS)
|
||||
#define ESW_SOURCE_PORT_METADATA_OFFSET (32 - ESW_SOURCE_PORT_METADATA_BITS)
|
||||
#define ESW_REG_C0_USER_DATA_METADATA_BITS (32 - ESW_SOURCE_PORT_METADATA_BITS)
|
||||
#define ESW_REG_C0_USER_DATA_METADATA_MASK GENMASK(ESW_REG_C0_USER_DATA_METADATA_BITS - 1, 0)
|
||||
|
||||
static inline u32 mlx5_eswitch_get_vport_metadata_mask(void)
|
||||
{
|
||||
return GENMASK(31, 32 - ESW_SOURCE_PORT_METADATA_BITS);
|
||||
}
|
||||
|
||||
u32 mlx5_eswitch_get_vport_metadata_for_match(struct mlx5_eswitch *esw,
|
||||
u16 vport_num);
|
||||
u32 mlx5_eswitch_get_vport_metadata_for_set(struct mlx5_eswitch *esw,
|
||||
u16 vport_num);
|
||||
|
||||
/* Reg C1 usage:
|
||||
* Reg C1 = < Reserved(1) | ESW_TUN_ID(12) | ESW_TUN_OPTS(11) | ESW_ZONE_ID(8) >
|
||||
*
|
||||
* Highest bit is reserved for other offloads as marker bit, next 12 bits of reg c1
|
||||
* is the encapsulation tunnel id, next 11 bits is encapsulation tunnel options,
|
||||
* and the lowest 8 bits are used for zone id.
|
||||
*
|
||||
* Zone id is used to restore CT flow when packet misses on chain.
|
||||
*
|
||||
* Tunnel id and options are used together to restore the tunnel info metadata
|
||||
* on miss and to support inner header rewrite by means of implicit chain 0
|
||||
* flows.
|
||||
*/
|
||||
#define ESW_RESERVED_BITS 1
|
||||
#define ESW_ZONE_ID_BITS 8
|
||||
#define ESW_TUN_OPTS_BITS 11
|
||||
#define ESW_TUN_ID_BITS 12
|
||||
#define ESW_TUN_OPTS_OFFSET ESW_ZONE_ID_BITS
|
||||
#define ESW_TUN_OFFSET ESW_TUN_OPTS_OFFSET
|
||||
#define ESW_ZONE_ID_MASK GENMASK(ESW_ZONE_ID_BITS - 1, 0)
|
||||
#define ESW_TUN_OPTS_MASK GENMASK(31 - ESW_TUN_ID_BITS - ESW_RESERVED_BITS, ESW_TUN_OPTS_OFFSET)
|
||||
#define ESW_TUN_MASK GENMASK(31 - ESW_RESERVED_BITS, ESW_TUN_OFFSET)
|
||||
#define ESW_TUN_ID_SLOW_TABLE_GOTO_VPORT 0 /* 0 is not a valid tunnel id */
|
||||
#define ESW_TUN_ID_BRIDGE_INGRESS_PUSH_VLAN ESW_TUN_ID_SLOW_TABLE_GOTO_VPORT
|
||||
/* 0x7FF is a reserved mapping */
|
||||
#define ESW_TUN_OPTS_SLOW_TABLE_GOTO_VPORT GENMASK(ESW_TUN_OPTS_BITS - 1, 0)
|
||||
#define ESW_TUN_SLOW_TABLE_GOTO_VPORT ((ESW_TUN_ID_SLOW_TABLE_GOTO_VPORT << ESW_TUN_OPTS_BITS) | \
|
||||
ESW_TUN_OPTS_SLOW_TABLE_GOTO_VPORT)
|
||||
#define ESW_TUN_SLOW_TABLE_GOTO_VPORT_MARK ESW_TUN_OPTS_MASK
|
||||
/* 0x7FE is a reserved mapping for bridge ingress push vlan mark */
|
||||
#define ESW_TUN_OPTS_BRIDGE_INGRESS_PUSH_VLAN (ESW_TUN_OPTS_SLOW_TABLE_GOTO_VPORT - 1)
|
||||
#define ESW_TUN_BRIDGE_INGRESS_PUSH_VLAN ((ESW_TUN_ID_BRIDGE_INGRESS_PUSH_VLAN << \
|
||||
ESW_TUN_OPTS_BITS) | \
|
||||
ESW_TUN_OPTS_BRIDGE_INGRESS_PUSH_VLAN)
|
||||
#define ESW_TUN_BRIDGE_INGRESS_PUSH_VLAN_MARK \
|
||||
GENMASK(31 - ESW_TUN_ID_BITS - ESW_RESERVED_BITS, \
|
||||
ESW_TUN_OPTS_OFFSET + 1)
|
||||
|
||||
/* reuse tun_opts for the mapped ipsec obj id when tun_id is 0 (invalid) */
|
||||
#define ESW_IPSEC_RX_MAPPED_ID_MASK GENMASK(ESW_TUN_OPTS_BITS - 1, 0)
|
||||
#define ESW_IPSEC_RX_MAPPED_ID_MATCH_MASK \
|
||||
GENMASK(31 - ESW_RESERVED_BITS, ESW_ZONE_ID_BITS)
|
||||
|
||||
u8 mlx5_eswitch_mode(const struct mlx5_core_dev *dev);
|
||||
u16 mlx5_eswitch_get_total_vports(const struct mlx5_core_dev *dev);
|
||||
struct mlx5_core_dev *mlx5_eswitch_get_core_dev(struct mlx5_eswitch *esw);
|
||||
|
||||
#else /* CONFIG_MLX5_ESWITCH */
|
||||
|
||||
static inline u8 mlx5_eswitch_mode(const struct mlx5_core_dev *dev)
|
||||
{
|
||||
return MLX5_ESWITCH_LEGACY;
|
||||
}
|
||||
|
||||
static inline enum devlink_eswitch_encap_mode
|
||||
mlx5_eswitch_get_encap_mode(const struct mlx5_core_dev *dev)
|
||||
{
|
||||
return DEVLINK_ESWITCH_ENCAP_MODE_NONE;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
mlx5_eswitch_reg_c1_loopback_enabled(const struct mlx5_eswitch *esw)
|
||||
{
|
||||
return false;
|
||||
};
|
||||
|
||||
static inline bool
|
||||
mlx5_eswitch_vport_match_metadata_enabled(const struct mlx5_eswitch *esw)
|
||||
{
|
||||
return false;
|
||||
};
|
||||
|
||||
static inline u32
|
||||
mlx5_eswitch_get_vport_metadata_for_match(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
{
|
||||
return 0;
|
||||
};
|
||||
|
||||
static inline u32
|
||||
mlx5_eswitch_get_vport_metadata_mask(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u16 mlx5_eswitch_get_total_vports(const struct mlx5_core_dev *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct mlx5_core_dev *mlx5_eswitch_get_core_dev(struct mlx5_eswitch *esw)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MLX5_ESWITCH */
|
||||
|
||||
static inline bool is_mdev_legacy_mode(struct mlx5_core_dev *dev)
|
||||
{
|
||||
return mlx5_eswitch_mode(dev) == MLX5_ESWITCH_LEGACY;
|
||||
}
|
||||
|
||||
static inline bool is_mdev_switchdev_mode(struct mlx5_core_dev *dev)
|
||||
{
|
||||
return mlx5_eswitch_mode(dev) == MLX5_ESWITCH_OFFLOADS;
|
||||
}
|
||||
|
||||
/* The returned number is valid only when the dev is eswitch manager. */
|
||||
static inline u16 mlx5_eswitch_manager_vport(struct mlx5_core_dev *dev)
|
||||
{
|
||||
return mlx5_core_is_ecpf_esw_manager(dev) ?
|
||||
MLX5_VPORT_ECPF : MLX5_VPORT_PF;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,385 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Mellanox Technologies. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _MLX5_FS_
|
||||
#define _MLX5_FS_
|
||||
|
||||
#include <linux/mlx5/driver.h>
|
||||
#include <linux/mlx5/mlx5_ifc.h>
|
||||
|
||||
#define MLX5_FS_DEFAULT_FLOW_TAG 0x0
|
||||
|
||||
#define MLX5_SET_CFG(p, f, v) MLX5_SET(create_flow_group_in, p, f, v)
|
||||
|
||||
#define MLX5_RDMA_TRANSPORT_BYPASS_PRIO 16
|
||||
#define MLX5_FS_MAX_POOL_SIZE BIT(30)
|
||||
|
||||
enum mlx5_flow_destination_type {
|
||||
MLX5_FLOW_DESTINATION_TYPE_NONE,
|
||||
MLX5_FLOW_DESTINATION_TYPE_VPORT,
|
||||
MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE,
|
||||
MLX5_FLOW_DESTINATION_TYPE_TIR,
|
||||
MLX5_FLOW_DESTINATION_TYPE_FLOW_SAMPLER,
|
||||
MLX5_FLOW_DESTINATION_TYPE_UPLINK,
|
||||
MLX5_FLOW_DESTINATION_TYPE_PORT,
|
||||
MLX5_FLOW_DESTINATION_TYPE_COUNTER,
|
||||
MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM,
|
||||
MLX5_FLOW_DESTINATION_TYPE_RANGE,
|
||||
MLX5_FLOW_DESTINATION_TYPE_TABLE_TYPE,
|
||||
MLX5_FLOW_DESTINATION_TYPE_VHCA_RX,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO = 1 << 16,
|
||||
MLX5_FLOW_CONTEXT_ACTION_ENCRYPT = 1 << 17,
|
||||
MLX5_FLOW_CONTEXT_ACTION_DECRYPT = 1 << 18,
|
||||
MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_NS = 1 << 19,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT = BIT(0),
|
||||
MLX5_FLOW_TABLE_TUNNEL_EN_DECAP = BIT(1),
|
||||
MLX5_FLOW_TABLE_TERMINATION = BIT(2),
|
||||
MLX5_FLOW_TABLE_UNMANAGED = BIT(3),
|
||||
MLX5_FLOW_TABLE_OTHER_VPORT = BIT(4),
|
||||
MLX5_FLOW_TABLE_UPLINK_VPORT = BIT(5),
|
||||
MLX5_FLOW_TABLE_OTHER_ESWITCH = BIT(6),
|
||||
};
|
||||
|
||||
#define LEFTOVERS_RULE_NUM 2
|
||||
static inline void build_leftovers_ft_param(int *priority,
|
||||
int *n_ent,
|
||||
int *n_grp)
|
||||
{
|
||||
*priority = 0; /* Priority of leftovers_prio-0 */
|
||||
*n_ent = LEFTOVERS_RULE_NUM;
|
||||
*n_grp = LEFTOVERS_RULE_NUM;
|
||||
}
|
||||
|
||||
enum mlx5_flow_namespace_type {
|
||||
MLX5_FLOW_NAMESPACE_BYPASS,
|
||||
MLX5_FLOW_NAMESPACE_KERNEL_RX_MACSEC,
|
||||
MLX5_FLOW_NAMESPACE_LAG,
|
||||
MLX5_FLOW_NAMESPACE_OFFLOADS,
|
||||
MLX5_FLOW_NAMESPACE_ETHTOOL,
|
||||
MLX5_FLOW_NAMESPACE_KERNEL,
|
||||
MLX5_FLOW_NAMESPACE_LEFTOVERS,
|
||||
MLX5_FLOW_NAMESPACE_ANCHOR,
|
||||
MLX5_FLOW_NAMESPACE_FDB_BYPASS,
|
||||
MLX5_FLOW_NAMESPACE_FDB,
|
||||
MLX5_FLOW_NAMESPACE_ESW_EGRESS,
|
||||
MLX5_FLOW_NAMESPACE_ESW_INGRESS,
|
||||
MLX5_FLOW_NAMESPACE_SNIFFER_RX,
|
||||
MLX5_FLOW_NAMESPACE_SNIFFER_TX,
|
||||
MLX5_FLOW_NAMESPACE_EGRESS,
|
||||
MLX5_FLOW_NAMESPACE_EGRESS_IPSEC,
|
||||
MLX5_FLOW_NAMESPACE_EGRESS_MACSEC,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_RX,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_TX,
|
||||
MLX5_FLOW_NAMESPACE_PORT_SEL,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_RX_IPSEC,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_TX_IPSEC,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_RX_MACSEC,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_TX_MACSEC,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX,
|
||||
MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX,
|
||||
};
|
||||
|
||||
enum {
|
||||
FDB_DROP_ROOT,
|
||||
FDB_BYPASS_PATH,
|
||||
FDB_CRYPTO_INGRESS,
|
||||
FDB_TC_OFFLOAD,
|
||||
FDB_FT_OFFLOAD,
|
||||
FDB_TC_MISS,
|
||||
FDB_BR_OFFLOAD,
|
||||
FDB_SLOW_PATH,
|
||||
FDB_CRYPTO_EGRESS,
|
||||
FDB_PER_VPORT,
|
||||
};
|
||||
|
||||
enum fs_flow_table_type {
|
||||
FS_FT_NIC_RX = 0x0,
|
||||
FS_FT_NIC_TX = 0x1,
|
||||
FS_FT_ESW_EGRESS_ACL = 0x2,
|
||||
FS_FT_ESW_INGRESS_ACL = 0x3,
|
||||
FS_FT_FDB = 0X4,
|
||||
FS_FT_SNIFFER_RX = 0X5,
|
||||
FS_FT_SNIFFER_TX = 0X6,
|
||||
FS_FT_RDMA_RX = 0X7,
|
||||
FS_FT_RDMA_TX = 0X8,
|
||||
FS_FT_PORT_SEL = 0X9,
|
||||
FS_FT_FDB_RX = 0xa,
|
||||
FS_FT_FDB_TX = 0xb,
|
||||
FS_FT_RDMA_TRANSPORT_RX = 0xd,
|
||||
FS_FT_RDMA_TRANSPORT_TX = 0xe,
|
||||
FS_FT_MAX_TYPE = FS_FT_RDMA_TRANSPORT_TX,
|
||||
};
|
||||
|
||||
struct mlx5_pkt_reformat;
|
||||
struct mlx5_modify_hdr;
|
||||
struct mlx5_flow_definer;
|
||||
struct mlx5_flow_table;
|
||||
struct mlx5_flow_group;
|
||||
struct mlx5_flow_namespace;
|
||||
struct mlx5_flow_handle;
|
||||
|
||||
enum {
|
||||
FLOW_CONTEXT_HAS_TAG = BIT(0),
|
||||
FLOW_CONTEXT_UPLINK_HAIRPIN_EN = BIT(1),
|
||||
};
|
||||
|
||||
struct mlx5_flow_context {
|
||||
u32 flags;
|
||||
u32 flow_tag;
|
||||
u32 flow_source;
|
||||
};
|
||||
|
||||
struct mlx5_flow_spec {
|
||||
u8 match_criteria_enable;
|
||||
u32 match_criteria[MLX5_ST_SZ_DW(fte_match_param)];
|
||||
u32 match_value[MLX5_ST_SZ_DW(fte_match_param)];
|
||||
struct mlx5_flow_context flow_context;
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_FLOW_DEST_VPORT_VHCA_ID = BIT(0),
|
||||
MLX5_FLOW_DEST_VPORT_REFORMAT_ID = BIT(1),
|
||||
};
|
||||
|
||||
enum mlx5_flow_dest_range_field {
|
||||
MLX5_FLOW_DEST_RANGE_FIELD_PKT_LEN = 0,
|
||||
};
|
||||
|
||||
struct mlx5_flow_destination {
|
||||
enum mlx5_flow_destination_type type;
|
||||
union {
|
||||
u32 tir_num;
|
||||
u32 ft_num;
|
||||
struct mlx5_flow_table *ft;
|
||||
struct mlx5_fc *counter;
|
||||
struct {
|
||||
u16 id;
|
||||
} vhca;
|
||||
struct {
|
||||
u16 num;
|
||||
u16 vhca_id;
|
||||
struct mlx5_pkt_reformat *pkt_reformat;
|
||||
u8 flags;
|
||||
} vport;
|
||||
struct {
|
||||
struct mlx5_flow_table *hit_ft;
|
||||
struct mlx5_flow_table *miss_ft;
|
||||
enum mlx5_flow_dest_range_field field;
|
||||
u32 min;
|
||||
u32 max;
|
||||
} range;
|
||||
u32 sampler_id;
|
||||
};
|
||||
};
|
||||
|
||||
struct mod_hdr_tbl {
|
||||
struct mutex lock; /* protects hlist */
|
||||
DECLARE_HASHTABLE(hlist, 8);
|
||||
};
|
||||
|
||||
struct mlx5_flow_namespace *
|
||||
mlx5_get_fdb_sub_ns(struct mlx5_core_dev *dev, int n);
|
||||
struct mlx5_flow_namespace *
|
||||
mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
|
||||
enum mlx5_flow_namespace_type type);
|
||||
struct mlx5_flow_namespace *
|
||||
mlx5_get_flow_vport_namespace(struct mlx5_core_dev *dev,
|
||||
enum mlx5_flow_namespace_type type,
|
||||
int vport_idx);
|
||||
|
||||
struct mlx5_flow_table_attr {
|
||||
int prio;
|
||||
int max_fte;
|
||||
u32 level;
|
||||
u32 flags;
|
||||
u16 uid;
|
||||
u16 vport;
|
||||
u16 esw_owner_vhca_id;
|
||||
struct mlx5_flow_table *next_ft;
|
||||
|
||||
struct {
|
||||
int max_num_groups;
|
||||
int num_reserved_entries;
|
||||
} autogroup;
|
||||
};
|
||||
|
||||
struct mlx5_flow_table *
|
||||
mlx5_create_flow_table(struct mlx5_flow_namespace *ns,
|
||||
struct mlx5_flow_table_attr *ft_attr);
|
||||
|
||||
struct mlx5_flow_table *
|
||||
mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns,
|
||||
struct mlx5_flow_table_attr *ft_attr);
|
||||
|
||||
struct mlx5_flow_table *
|
||||
mlx5_create_vport_flow_table(struct mlx5_flow_namespace *ns,
|
||||
struct mlx5_flow_table_attr *ft_attr, u16 vport);
|
||||
struct mlx5_flow_table *
|
||||
mlx5_create_lag_demux_flow_table(struct mlx5_flow_namespace *ns,
|
||||
struct mlx5_flow_table_attr *ft_attr);
|
||||
int mlx5_destroy_flow_table(struct mlx5_flow_table *ft);
|
||||
|
||||
/* inbox should be set with the following values:
|
||||
* start_flow_index
|
||||
* end_flow_index
|
||||
* match_criteria_enable
|
||||
* match_criteria
|
||||
*/
|
||||
struct mlx5_flow_group *
|
||||
mlx5_create_flow_group(struct mlx5_flow_table *ft, u32 *in);
|
||||
void mlx5_destroy_flow_group(struct mlx5_flow_group *fg);
|
||||
|
||||
struct mlx5_exe_aso {
|
||||
u32 object_id;
|
||||
int base_id;
|
||||
u8 type;
|
||||
u8 return_reg_id;
|
||||
union {
|
||||
u32 ctrl_data;
|
||||
struct {
|
||||
u8 meter_idx;
|
||||
u8 init_color;
|
||||
} flow_meter;
|
||||
};
|
||||
};
|
||||
|
||||
struct mlx5_fs_vlan {
|
||||
u16 ethtype;
|
||||
u16 vid;
|
||||
u8 prio;
|
||||
};
|
||||
|
||||
#define MLX5_FS_VLAN_DEPTH 2
|
||||
|
||||
enum {
|
||||
FLOW_ACT_NO_APPEND = BIT(0),
|
||||
FLOW_ACT_IGNORE_FLOW_LEVEL = BIT(1),
|
||||
};
|
||||
|
||||
struct mlx5_flow_act {
|
||||
u32 action;
|
||||
struct mlx5_modify_hdr *modify_hdr;
|
||||
struct mlx5_pkt_reformat *pkt_reformat;
|
||||
struct mlx5_flow_act_crypto_params {
|
||||
u8 type;
|
||||
u32 obj_id;
|
||||
} crypto;
|
||||
u32 flags;
|
||||
struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH];
|
||||
struct ib_counters *counters;
|
||||
struct mlx5_flow_group *fg;
|
||||
struct mlx5_exe_aso exe_aso;
|
||||
};
|
||||
|
||||
#define MLX5_DECLARE_FLOW_ACT(name) \
|
||||
struct mlx5_flow_act name = { .action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST,\
|
||||
.flags = 0, }
|
||||
|
||||
/* Single destination per rule.
|
||||
* Group ID is implied by the match criteria.
|
||||
*/
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_add_flow_rules(struct mlx5_flow_table *ft,
|
||||
const struct mlx5_flow_spec *spec,
|
||||
struct mlx5_flow_act *flow_act,
|
||||
struct mlx5_flow_destination *dest,
|
||||
int num_dest);
|
||||
void mlx5_del_flow_rules(struct mlx5_flow_handle *fr);
|
||||
|
||||
int mlx5_modify_rule_destination(struct mlx5_flow_handle *handler,
|
||||
struct mlx5_flow_destination *new_dest,
|
||||
struct mlx5_flow_destination *old_dest);
|
||||
|
||||
struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging);
|
||||
|
||||
void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter);
|
||||
struct mlx5_fc *mlx5_fc_local_create(u32 counter_id, u32 offset, u32 bulk_size);
|
||||
void mlx5_fc_local_destroy(struct mlx5_fc *counter);
|
||||
void mlx5_fc_local_get(struct mlx5_fc *counter);
|
||||
void mlx5_fc_local_put(struct mlx5_fc *counter);
|
||||
u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter);
|
||||
void mlx5_fc_query_cached(struct mlx5_fc *counter,
|
||||
u64 *bytes, u64 *packets, u64 *lastuse);
|
||||
void mlx5_fc_query_cached_raw(struct mlx5_fc *counter,
|
||||
u64 *bytes, u64 *packets, u64 *lastuse);
|
||||
int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter,
|
||||
u64 *packets, u64 *bytes);
|
||||
u32 mlx5_fc_id(struct mlx5_fc *counter);
|
||||
|
||||
int mlx5_fs_add_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn);
|
||||
int mlx5_fs_remove_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn);
|
||||
|
||||
struct mlx5_modify_hdr *mlx5_modify_header_alloc(struct mlx5_core_dev *dev,
|
||||
u8 ns_type, u8 num_actions,
|
||||
void *modify_actions);
|
||||
void mlx5_modify_header_dealloc(struct mlx5_core_dev *dev,
|
||||
struct mlx5_modify_hdr *modify_hdr);
|
||||
struct mlx5_flow_definer *
|
||||
mlx5_create_match_definer(struct mlx5_core_dev *dev,
|
||||
enum mlx5_flow_namespace_type ns_type, u16 format_id,
|
||||
u32 *match_mask);
|
||||
void mlx5_destroy_match_definer(struct mlx5_core_dev *dev,
|
||||
struct mlx5_flow_definer *definer);
|
||||
int mlx5_get_match_definer_id(struct mlx5_flow_definer *definer);
|
||||
|
||||
struct mlx5_pkt_reformat_params {
|
||||
int type;
|
||||
u8 param_0;
|
||||
u8 param_1;
|
||||
size_t size;
|
||||
void *data;
|
||||
};
|
||||
|
||||
struct mlx5_pkt_reformat *mlx5_packet_reformat_alloc(struct mlx5_core_dev *dev,
|
||||
struct mlx5_pkt_reformat_params *params,
|
||||
enum mlx5_flow_namespace_type ns_type);
|
||||
void mlx5_packet_reformat_dealloc(struct mlx5_core_dev *dev,
|
||||
struct mlx5_pkt_reformat *reformat);
|
||||
|
||||
u32 mlx5_flow_table_id(struct mlx5_flow_table *ft);
|
||||
|
||||
struct mlx5_flow_root_namespace *
|
||||
mlx5_get_root_namespace(struct mlx5_core_dev *dev, enum mlx5_flow_namespace_type ns_type);
|
||||
|
||||
int mlx5_fs_set_root_dev(struct mlx5_core_dev *dev,
|
||||
struct mlx5_core_dev *new_dev,
|
||||
enum fs_flow_table_type table_type);
|
||||
#endif
|
||||
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Mellanox Technologies. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _MLX5_FS_HELPERS_
|
||||
#define _MLX5_FS_HELPERS_
|
||||
|
||||
#include <linux/mlx5/mlx5_ifc.h>
|
||||
|
||||
#define MLX5_FS_IPV4_VERSION 4
|
||||
#define MLX5_FS_IPV6_VERSION 6
|
||||
|
||||
static inline bool _mlx5_fs_is_outer_ipv_flow(struct mlx5_core_dev *mdev,
|
||||
const u32 *match_c,
|
||||
const u32 *match_v, int version)
|
||||
{
|
||||
int match_ipv = MLX5_CAP_FLOWTABLE_NIC_RX(mdev,
|
||||
ft_field_support.outer_ip_version);
|
||||
const void *headers_c = MLX5_ADDR_OF(fte_match_param, match_c,
|
||||
outer_headers);
|
||||
const void *headers_v = MLX5_ADDR_OF(fte_match_param, match_v,
|
||||
outer_headers);
|
||||
|
||||
if (!match_ipv) {
|
||||
u16 ethertype;
|
||||
|
||||
switch (version) {
|
||||
case MLX5_FS_IPV4_VERSION:
|
||||
ethertype = ETH_P_IP;
|
||||
break;
|
||||
case MLX5_FS_IPV6_VERSION:
|
||||
ethertype = ETH_P_IPV6;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return MLX5_GET(fte_match_set_lyr_2_4, headers_c,
|
||||
ethertype) == 0xffff &&
|
||||
MLX5_GET(fte_match_set_lyr_2_4, headers_v,
|
||||
ethertype) == ethertype;
|
||||
}
|
||||
|
||||
return MLX5_GET(fte_match_set_lyr_2_4, headers_c,
|
||||
ip_version) == 0xf &&
|
||||
MLX5_GET(fte_match_set_lyr_2_4, headers_v,
|
||||
ip_version) == version;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
mlx5_fs_is_outer_ipv4_flow(struct mlx5_core_dev *mdev, const u32 *match_c,
|
||||
const u32 *match_v)
|
||||
{
|
||||
return _mlx5_fs_is_outer_ipv_flow(mdev, match_c, match_v,
|
||||
MLX5_FS_IPV4_VERSION);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
mlx5_fs_is_outer_ipv6_flow(struct mlx5_core_dev *mdev, const u32 *match_c,
|
||||
const u32 *match_v)
|
||||
{
|
||||
return _mlx5_fs_is_outer_ipv_flow(mdev, match_c, match_v,
|
||||
MLX5_FS_IPV6_VERSION);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
|
||||
/* Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. */
|
||||
|
||||
#ifndef __MLX5_LAG_API_H__
|
||||
#define __MLX5_LAG_API_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct mlx5_core_dev;
|
||||
struct mlx5_flow_table;
|
||||
struct mlx5_flow_table_attr;
|
||||
|
||||
int mlx5_lag_demux_init(struct mlx5_core_dev *dev,
|
||||
struct mlx5_flow_table_attr *ft_attr);
|
||||
void mlx5_lag_demux_cleanup(struct mlx5_core_dev *dev);
|
||||
int mlx5_lag_demux_rule_add(struct mlx5_core_dev *dev, u16 vport_num,
|
||||
int vport_index);
|
||||
void mlx5_lag_demux_rule_del(struct mlx5_core_dev *dev, int vport_index);
|
||||
int mlx5_lag_get_dev_seq(struct mlx5_core_dev *dev);
|
||||
|
||||
#endif /* __MLX5_LAG_API_H__ */
|
||||
@@ -0,0 +1,32 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
|
||||
/* Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. */
|
||||
|
||||
#ifndef MLX5_MACSEC_H
|
||||
#define MLX5_MACSEC_H
|
||||
|
||||
#ifdef CONFIG_MLX5_MACSEC
|
||||
struct mlx5_macsec_event_data {
|
||||
struct mlx5_macsec_fs *macsec_fs;
|
||||
void *macdev;
|
||||
u32 fs_id;
|
||||
bool is_tx;
|
||||
};
|
||||
|
||||
int mlx5_macsec_add_roce_rule(void *macdev, const struct sockaddr *addr, u16 gid_idx,
|
||||
struct list_head *tx_rules_list, struct list_head *rx_rules_list,
|
||||
struct mlx5_macsec_fs *macsec_fs);
|
||||
|
||||
void mlx5_macsec_del_roce_rule(u16 gid_idx, struct mlx5_macsec_fs *macsec_fs,
|
||||
struct list_head *tx_rules_list, struct list_head *rx_rules_list);
|
||||
|
||||
void mlx5_macsec_add_roce_sa_rules(u32 fs_id, const struct sockaddr *addr, u16 gid_idx,
|
||||
struct list_head *tx_rules_list,
|
||||
struct list_head *rx_rules_list,
|
||||
struct mlx5_macsec_fs *macsec_fs, bool is_tx);
|
||||
|
||||
void mlx5_macsec_del_roce_sa_rules(u32 fs_id, struct mlx5_macsec_fs *macsec_fs,
|
||||
struct list_head *tx_rules_list,
|
||||
struct list_head *rx_rules_list, bool is_tx);
|
||||
|
||||
#endif
|
||||
#endif /* MLX5_MACSEC_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,381 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Mellanox Technologies, Ltd. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
#ifndef MLX5_IFC_FPGA_H
|
||||
#define MLX5_IFC_FPGA_H
|
||||
|
||||
struct mlx5_ifc_fpga_shell_caps_bits {
|
||||
u8 max_num_qps[0x10];
|
||||
u8 reserved_at_10[0x8];
|
||||
u8 total_rcv_credits[0x8];
|
||||
|
||||
u8 reserved_at_20[0xe];
|
||||
u8 qp_type[0x2];
|
||||
u8 reserved_at_30[0x5];
|
||||
u8 rae[0x1];
|
||||
u8 rwe[0x1];
|
||||
u8 rre[0x1];
|
||||
u8 reserved_at_38[0x4];
|
||||
u8 dc[0x1];
|
||||
u8 ud[0x1];
|
||||
u8 uc[0x1];
|
||||
u8 rc[0x1];
|
||||
|
||||
u8 reserved_at_40[0x1a];
|
||||
u8 log_ddr_size[0x6];
|
||||
|
||||
u8 max_fpga_qp_msg_size[0x20];
|
||||
|
||||
u8 reserved_at_80[0x180];
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_cap_bits {
|
||||
u8 fpga_id[0x8];
|
||||
u8 fpga_device[0x18];
|
||||
|
||||
u8 register_file_ver[0x20];
|
||||
|
||||
u8 fpga_ctrl_modify[0x1];
|
||||
u8 reserved_at_41[0x5];
|
||||
u8 access_reg_query_mode[0x2];
|
||||
u8 reserved_at_48[0x6];
|
||||
u8 access_reg_modify_mode[0x2];
|
||||
u8 reserved_at_50[0x10];
|
||||
|
||||
u8 reserved_at_60[0x20];
|
||||
|
||||
u8 image_version[0x20];
|
||||
|
||||
u8 image_date[0x20];
|
||||
|
||||
u8 image_time[0x20];
|
||||
|
||||
u8 shell_version[0x20];
|
||||
|
||||
u8 reserved_at_100[0x80];
|
||||
|
||||
struct mlx5_ifc_fpga_shell_caps_bits shell_caps;
|
||||
|
||||
u8 reserved_at_380[0x8];
|
||||
u8 ieee_vendor_id[0x18];
|
||||
|
||||
u8 sandbox_product_version[0x10];
|
||||
u8 sandbox_product_id[0x10];
|
||||
|
||||
u8 sandbox_basic_caps[0x20];
|
||||
|
||||
u8 reserved_at_3e0[0x10];
|
||||
u8 sandbox_extended_caps_len[0x10];
|
||||
|
||||
u8 sandbox_extended_caps_addr[0x40];
|
||||
|
||||
u8 fpga_ddr_start_addr[0x40];
|
||||
|
||||
u8 fpga_cr_space_start_addr[0x40];
|
||||
|
||||
u8 fpga_ddr_size[0x20];
|
||||
|
||||
u8 fpga_cr_space_size[0x20];
|
||||
|
||||
u8 reserved_at_500[0x300];
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_FPGA_CTRL_OPERATION_LOAD = 0x1,
|
||||
MLX5_FPGA_CTRL_OPERATION_RESET = 0x2,
|
||||
MLX5_FPGA_CTRL_OPERATION_FLASH_SELECT = 0x3,
|
||||
MLX5_FPGA_CTRL_OPERATION_SANDBOX_BYPASS_ON = 0x4,
|
||||
MLX5_FPGA_CTRL_OPERATION_SANDBOX_BYPASS_OFF = 0x5,
|
||||
MLX5_FPGA_CTRL_OPERATION_RESET_SANDBOX = 0x6,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_ctrl_bits {
|
||||
u8 reserved_at_0[0x8];
|
||||
u8 operation[0x8];
|
||||
u8 reserved_at_10[0x8];
|
||||
u8 status[0x8];
|
||||
|
||||
u8 reserved_at_20[0x8];
|
||||
u8 flash_select_admin[0x8];
|
||||
u8 reserved_at_30[0x8];
|
||||
u8 flash_select_oper[0x8];
|
||||
|
||||
u8 reserved_at_40[0x40];
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_FPGA_ERROR_EVENT_SYNDROME_CORRUPTED_DDR = 0x1,
|
||||
MLX5_FPGA_ERROR_EVENT_SYNDROME_FLASH_TIMEOUT = 0x2,
|
||||
MLX5_FPGA_ERROR_EVENT_SYNDROME_INTERNAL_LINK_ERROR = 0x3,
|
||||
MLX5_FPGA_ERROR_EVENT_SYNDROME_WATCHDOG_FAILURE = 0x4,
|
||||
MLX5_FPGA_ERROR_EVENT_SYNDROME_I2C_FAILURE = 0x5,
|
||||
MLX5_FPGA_ERROR_EVENT_SYNDROME_IMAGE_CHANGED = 0x6,
|
||||
MLX5_FPGA_ERROR_EVENT_SYNDROME_TEMPERATURE_CRITICAL = 0x7,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_error_event_bits {
|
||||
u8 reserved_at_0[0x40];
|
||||
|
||||
u8 reserved_at_40[0x18];
|
||||
u8 syndrome[0x8];
|
||||
|
||||
u8 reserved_at_60[0x80];
|
||||
};
|
||||
|
||||
#define MLX5_FPGA_ACCESS_REG_SIZE_MAX 64
|
||||
|
||||
struct mlx5_ifc_fpga_access_reg_bits {
|
||||
u8 reserved_at_0[0x20];
|
||||
|
||||
u8 reserved_at_20[0x10];
|
||||
u8 size[0x10];
|
||||
|
||||
u8 address[0x40];
|
||||
|
||||
u8 data[0][0x8];
|
||||
};
|
||||
|
||||
enum mlx5_ifc_fpga_qp_state {
|
||||
MLX5_FPGA_QPC_STATE_INIT = 0x0,
|
||||
MLX5_FPGA_QPC_STATE_ACTIVE = 0x1,
|
||||
MLX5_FPGA_QPC_STATE_ERROR = 0x2,
|
||||
};
|
||||
|
||||
enum mlx5_ifc_fpga_qp_type {
|
||||
MLX5_FPGA_QPC_QP_TYPE_SHELL_QP = 0x0,
|
||||
MLX5_FPGA_QPC_QP_TYPE_SANDBOX_QP = 0x1,
|
||||
};
|
||||
|
||||
enum mlx5_ifc_fpga_qp_service_type {
|
||||
MLX5_FPGA_QPC_ST_RC = 0x0,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_qpc_bits {
|
||||
u8 state[0x4];
|
||||
u8 reserved_at_4[0x1b];
|
||||
u8 qp_type[0x1];
|
||||
|
||||
u8 reserved_at_20[0x4];
|
||||
u8 st[0x4];
|
||||
u8 reserved_at_28[0x10];
|
||||
u8 traffic_class[0x8];
|
||||
|
||||
u8 ether_type[0x10];
|
||||
u8 prio[0x3];
|
||||
u8 dei[0x1];
|
||||
u8 vid[0xc];
|
||||
|
||||
u8 reserved_at_60[0x20];
|
||||
|
||||
u8 reserved_at_80[0x8];
|
||||
u8 next_rcv_psn[0x18];
|
||||
|
||||
u8 reserved_at_a0[0x8];
|
||||
u8 next_send_psn[0x18];
|
||||
|
||||
u8 reserved_at_c0[0x10];
|
||||
u8 pkey[0x10];
|
||||
|
||||
u8 reserved_at_e0[0x8];
|
||||
u8 remote_qpn[0x18];
|
||||
|
||||
u8 reserved_at_100[0x15];
|
||||
u8 rnr_retry[0x3];
|
||||
u8 reserved_at_118[0x5];
|
||||
u8 retry_count[0x3];
|
||||
|
||||
u8 reserved_at_120[0x20];
|
||||
|
||||
u8 reserved_at_140[0x10];
|
||||
u8 remote_mac_47_32[0x10];
|
||||
|
||||
u8 remote_mac_31_0[0x20];
|
||||
|
||||
u8 remote_ip[16][0x8];
|
||||
|
||||
u8 reserved_at_200[0x40];
|
||||
|
||||
u8 reserved_at_240[0x10];
|
||||
u8 fpga_mac_47_32[0x10];
|
||||
|
||||
u8 fpga_mac_31_0[0x20];
|
||||
|
||||
u8 fpga_ip[16][0x8];
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_create_qp_in_bits {
|
||||
u8 opcode[0x10];
|
||||
u8 reserved_at_10[0x10];
|
||||
|
||||
u8 reserved_at_20[0x10];
|
||||
u8 op_mod[0x10];
|
||||
|
||||
u8 reserved_at_40[0x40];
|
||||
|
||||
struct mlx5_ifc_fpga_qpc_bits fpga_qpc;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_create_qp_out_bits {
|
||||
u8 status[0x8];
|
||||
u8 reserved_at_8[0x18];
|
||||
|
||||
u8 syndrome[0x20];
|
||||
|
||||
u8 reserved_at_40[0x8];
|
||||
u8 fpga_qpn[0x18];
|
||||
|
||||
u8 reserved_at_60[0x20];
|
||||
|
||||
struct mlx5_ifc_fpga_qpc_bits fpga_qpc;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_modify_qp_in_bits {
|
||||
u8 opcode[0x10];
|
||||
u8 reserved_at_10[0x10];
|
||||
|
||||
u8 reserved_at_20[0x10];
|
||||
u8 op_mod[0x10];
|
||||
|
||||
u8 reserved_at_40[0x8];
|
||||
u8 fpga_qpn[0x18];
|
||||
|
||||
u8 field_select[0x20];
|
||||
|
||||
struct mlx5_ifc_fpga_qpc_bits fpga_qpc;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_modify_qp_out_bits {
|
||||
u8 status[0x8];
|
||||
u8 reserved_at_8[0x18];
|
||||
|
||||
u8 syndrome[0x20];
|
||||
|
||||
u8 reserved_at_40[0x40];
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_query_qp_in_bits {
|
||||
u8 opcode[0x10];
|
||||
u8 reserved_at_10[0x10];
|
||||
|
||||
u8 reserved_at_20[0x10];
|
||||
u8 op_mod[0x10];
|
||||
|
||||
u8 reserved_at_40[0x8];
|
||||
u8 fpga_qpn[0x18];
|
||||
|
||||
u8 reserved_at_60[0x20];
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_query_qp_out_bits {
|
||||
u8 status[0x8];
|
||||
u8 reserved_at_8[0x18];
|
||||
|
||||
u8 syndrome[0x20];
|
||||
|
||||
u8 reserved_at_40[0x40];
|
||||
|
||||
struct mlx5_ifc_fpga_qpc_bits fpga_qpc;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_query_qp_counters_in_bits {
|
||||
u8 opcode[0x10];
|
||||
u8 reserved_at_10[0x10];
|
||||
|
||||
u8 reserved_at_20[0x10];
|
||||
u8 op_mod[0x10];
|
||||
|
||||
u8 clear[0x1];
|
||||
u8 reserved_at_41[0x7];
|
||||
u8 fpga_qpn[0x18];
|
||||
|
||||
u8 reserved_at_60[0x20];
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_query_qp_counters_out_bits {
|
||||
u8 status[0x8];
|
||||
u8 reserved_at_8[0x18];
|
||||
|
||||
u8 syndrome[0x20];
|
||||
|
||||
u8 reserved_at_40[0x40];
|
||||
|
||||
u8 rx_ack_packets[0x40];
|
||||
|
||||
u8 rx_send_packets[0x40];
|
||||
|
||||
u8 tx_ack_packets[0x40];
|
||||
|
||||
u8 tx_send_packets[0x40];
|
||||
|
||||
u8 rx_total_drop[0x40];
|
||||
|
||||
u8 reserved_at_1c0[0x1c0];
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_destroy_qp_in_bits {
|
||||
u8 opcode[0x10];
|
||||
u8 reserved_at_10[0x10];
|
||||
|
||||
u8 reserved_at_20[0x10];
|
||||
u8 op_mod[0x10];
|
||||
|
||||
u8 reserved_at_40[0x8];
|
||||
u8 fpga_qpn[0x18];
|
||||
|
||||
u8 reserved_at_60[0x20];
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_destroy_qp_out_bits {
|
||||
u8 status[0x8];
|
||||
u8 reserved_at_8[0x18];
|
||||
|
||||
u8 syndrome[0x20];
|
||||
|
||||
u8 reserved_at_40[0x40];
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_FPGA_QP_ERROR_EVENT_SYNDROME_RETRY_COUNTER_EXPIRED = 0x1,
|
||||
MLX5_FPGA_QP_ERROR_EVENT_SYNDROME_RNR_EXPIRED = 0x2,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fpga_qp_error_event_bits {
|
||||
u8 reserved_at_0[0x40];
|
||||
|
||||
u8 reserved_at_40[0x18];
|
||||
u8 syndrome[0x8];
|
||||
|
||||
u8 reserved_at_60[0x60];
|
||||
|
||||
u8 reserved_at_c0[0x8];
|
||||
u8 fpga_qpn[0x18];
|
||||
};
|
||||
#endif /* MLX5_IFC_FPGA_H */
|
||||
@@ -0,0 +1,226 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
|
||||
/* Copyright (c) 2020 Mellanox Technologies Ltd. */
|
||||
|
||||
#ifndef __MLX5_IFC_VDPA_H_
|
||||
#define __MLX5_IFC_VDPA_H_
|
||||
|
||||
enum {
|
||||
MLX5_VIRTIO_Q_EVENT_MODE_NO_MSIX_MODE = 0x0,
|
||||
MLX5_VIRTIO_Q_EVENT_MODE_QP_MODE = 0x1,
|
||||
MLX5_VIRTIO_Q_EVENT_MODE_MSIX_MODE = 0x2,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_SPLIT = 0,
|
||||
MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_PACKED = 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT =
|
||||
BIT(MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_SPLIT),
|
||||
MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_PACKED =
|
||||
BIT(MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_PACKED),
|
||||
};
|
||||
|
||||
struct mlx5_ifc_virtio_q_bits {
|
||||
u8 virtio_q_type[0x8];
|
||||
u8 reserved_at_8[0x5];
|
||||
u8 event_mode[0x3];
|
||||
u8 queue_index[0x10];
|
||||
|
||||
u8 full_emulation[0x1];
|
||||
u8 virtio_version_1_0[0x1];
|
||||
u8 reserved_at_22[0x2];
|
||||
u8 offload_type[0x4];
|
||||
u8 event_qpn_or_msix[0x18];
|
||||
|
||||
u8 doorbell_stride_index[0x10];
|
||||
u8 queue_size[0x10];
|
||||
|
||||
u8 device_emulation_id[0x20];
|
||||
|
||||
u8 desc_addr[0x40];
|
||||
|
||||
u8 used_addr[0x40];
|
||||
|
||||
u8 available_addr[0x40];
|
||||
|
||||
u8 virtio_q_mkey[0x20];
|
||||
|
||||
u8 max_tunnel_desc[0x10];
|
||||
u8 reserved_at_170[0x8];
|
||||
u8 error_type[0x8];
|
||||
|
||||
u8 umem_1_id[0x20];
|
||||
|
||||
u8 umem_1_size[0x20];
|
||||
|
||||
u8 umem_1_offset[0x40];
|
||||
|
||||
u8 umem_2_id[0x20];
|
||||
|
||||
u8 umem_2_size[0x20];
|
||||
|
||||
u8 umem_2_offset[0x40];
|
||||
|
||||
u8 umem_3_id[0x20];
|
||||
|
||||
u8 umem_3_size[0x20];
|
||||
|
||||
u8 umem_3_offset[0x40];
|
||||
|
||||
u8 counter_set_id[0x20];
|
||||
|
||||
u8 reserved_at_320[0x8];
|
||||
u8 pd[0x18];
|
||||
|
||||
u8 reserved_at_340[0x20];
|
||||
|
||||
u8 desc_group_mkey[0x20];
|
||||
|
||||
u8 reserved_at_380[0x80];
|
||||
};
|
||||
|
||||
struct mlx5_ifc_virtio_net_q_object_bits {
|
||||
u8 modify_field_select[0x40];
|
||||
|
||||
u8 reserved_at_40[0x20];
|
||||
|
||||
u8 vhca_id[0x10];
|
||||
u8 reserved_at_70[0x10];
|
||||
|
||||
u8 queue_feature_bit_mask_12_3[0xa];
|
||||
u8 dirty_bitmap_dump_enable[0x1];
|
||||
u8 vhost_log_page[0x5];
|
||||
u8 reserved_at_90[0xc];
|
||||
u8 state[0x4];
|
||||
|
||||
u8 reserved_at_a0[0x5];
|
||||
u8 queue_feature_bit_mask_2_0[0x3];
|
||||
u8 tisn_or_qpn[0x18];
|
||||
|
||||
u8 dirty_bitmap_mkey[0x20];
|
||||
|
||||
u8 dirty_bitmap_size[0x20];
|
||||
|
||||
u8 dirty_bitmap_addr[0x40];
|
||||
|
||||
u8 hw_available_index[0x10];
|
||||
u8 hw_used_index[0x10];
|
||||
|
||||
u8 reserved_at_160[0xa0];
|
||||
|
||||
struct mlx5_ifc_virtio_q_bits virtio_q_context;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_create_virtio_net_q_in_bits {
|
||||
struct mlx5_ifc_general_obj_in_cmd_hdr_bits general_obj_in_cmd_hdr;
|
||||
|
||||
struct mlx5_ifc_virtio_net_q_object_bits obj_context;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_create_virtio_net_q_out_bits {
|
||||
struct mlx5_ifc_general_obj_out_cmd_hdr_bits general_obj_out_cmd_hdr;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_destroy_virtio_net_q_in_bits {
|
||||
struct mlx5_ifc_general_obj_in_cmd_hdr_bits general_obj_out_cmd_hdr;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_destroy_virtio_net_q_out_bits {
|
||||
struct mlx5_ifc_general_obj_out_cmd_hdr_bits general_obj_out_cmd_hdr;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_query_virtio_net_q_in_bits {
|
||||
struct mlx5_ifc_general_obj_in_cmd_hdr_bits general_obj_in_cmd_hdr;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_query_virtio_net_q_out_bits {
|
||||
struct mlx5_ifc_general_obj_out_cmd_hdr_bits general_obj_out_cmd_hdr;
|
||||
|
||||
struct mlx5_ifc_virtio_net_q_object_bits obj_context;
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_VIRTQ_MODIFY_MASK_STATE = (u64)1 << 0,
|
||||
MLX5_VIRTQ_MODIFY_MASK_DIRTY_BITMAP_PARAMS = (u64)1 << 3,
|
||||
MLX5_VIRTQ_MODIFY_MASK_DIRTY_BITMAP_DUMP_ENABLE = (u64)1 << 4,
|
||||
MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_ADDRS = (u64)1 << 6,
|
||||
MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_AVAIL_IDX = (u64)1 << 7,
|
||||
MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_USED_IDX = (u64)1 << 8,
|
||||
MLX5_VIRTQ_MODIFY_MASK_QUEUE_VIRTIO_VERSION = (u64)1 << 10,
|
||||
MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_MKEY = (u64)1 << 11,
|
||||
MLX5_VIRTQ_MODIFY_MASK_QUEUE_FEATURES = (u64)1 << 12,
|
||||
MLX5_VIRTQ_MODIFY_MASK_DESC_GROUP_MKEY = (u64)1 << 14,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_VIRTIO_NET_Q_OBJECT_STATE_INIT = 0x0,
|
||||
MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY = 0x1,
|
||||
MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND = 0x2,
|
||||
MLX5_VIRTIO_NET_Q_OBJECT_STATE_ERR = 0x3,
|
||||
};
|
||||
|
||||
/* This indicates that the object was not created or has already
|
||||
* been desroyed. It is very safe to assume that this object will never
|
||||
* have so many states
|
||||
*/
|
||||
enum {
|
||||
MLX5_VIRTIO_NET_Q_OBJECT_NONE = 0xffffffff
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_RQTC_LIST_Q_TYPE_RQ = 0x0,
|
||||
MLX5_RQTC_LIST_Q_TYPE_VIRTIO_NET_Q = 0x1,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_modify_virtio_net_q_in_bits {
|
||||
struct mlx5_ifc_general_obj_in_cmd_hdr_bits general_obj_in_cmd_hdr;
|
||||
|
||||
struct mlx5_ifc_virtio_net_q_object_bits obj_context;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_modify_virtio_net_q_out_bits {
|
||||
struct mlx5_ifc_general_obj_out_cmd_hdr_bits general_obj_out_cmd_hdr;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_virtio_q_counters_bits {
|
||||
u8 modify_field_select[0x40];
|
||||
u8 reserved_at_40[0x40];
|
||||
u8 received_desc[0x40];
|
||||
u8 completed_desc[0x40];
|
||||
u8 error_cqes[0x20];
|
||||
u8 bad_desc_errors[0x20];
|
||||
u8 exceed_max_chain[0x20];
|
||||
u8 invalid_buffer[0x20];
|
||||
u8 reserved_at_180[0x280];
|
||||
};
|
||||
|
||||
struct mlx5_ifc_create_virtio_q_counters_in_bits {
|
||||
struct mlx5_ifc_general_obj_in_cmd_hdr_bits hdr;
|
||||
struct mlx5_ifc_virtio_q_counters_bits virtio_q_counters;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_create_virtio_q_counters_out_bits {
|
||||
struct mlx5_ifc_general_obj_in_cmd_hdr_bits hdr;
|
||||
struct mlx5_ifc_virtio_q_counters_bits virtio_q_counters;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_destroy_virtio_q_counters_in_bits {
|
||||
struct mlx5_ifc_general_obj_in_cmd_hdr_bits hdr;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_destroy_virtio_q_counters_out_bits {
|
||||
struct mlx5_ifc_general_obj_out_cmd_hdr_bits hdr;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_query_virtio_q_counters_in_bits {
|
||||
struct mlx5_ifc_general_obj_in_cmd_hdr_bits hdr;
|
||||
};
|
||||
|
||||
struct mlx5_ifc_query_virtio_q_counters_out_bits {
|
||||
struct mlx5_ifc_general_obj_in_cmd_hdr_bits hdr;
|
||||
struct mlx5_ifc_virtio_q_counters_bits counters;
|
||||
};
|
||||
|
||||
#endif /* __MLX5_IFC_VDPA_H_ */
|
||||
@@ -0,0 +1,18 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
|
||||
* Copyright (c) 2021 Mellanox Technologies Ltd.
|
||||
*/
|
||||
|
||||
#ifndef _MLX5_MPFS_
|
||||
#define _MLX5_MPFS_
|
||||
|
||||
struct mlx5_core_dev;
|
||||
|
||||
#ifdef CONFIG_MLX5_MPFS
|
||||
int mlx5_mpfs_add_mac(struct mlx5_core_dev *dev, u8 *mac);
|
||||
int mlx5_mpfs_del_mac(struct mlx5_core_dev *dev, u8 *mac);
|
||||
#else /* #ifndef CONFIG_MLX5_MPFS */
|
||||
static inline int mlx5_mpfs_add_mac(struct mlx5_core_dev *dev, u8 *mac) { return 0; }
|
||||
static inline int mlx5_mpfs_del_mac(struct mlx5_core_dev *dev, u8 *mac) { return 0; }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Mellanox Technologies. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __MLX5_PORT_H__
|
||||
#define __MLX5_PORT_H__
|
||||
|
||||
#include <linux/mlx5/driver.h>
|
||||
|
||||
enum mlx5_beacon_duration {
|
||||
MLX5_BEACON_DURATION_OFF = 0x0,
|
||||
MLX5_BEACON_DURATION_INF = 0xffff,
|
||||
};
|
||||
|
||||
enum mlx5_module_id {
|
||||
MLX5_MODULE_ID_SFP = 0x3,
|
||||
MLX5_MODULE_ID_QSFP = 0xC,
|
||||
MLX5_MODULE_ID_QSFP_PLUS = 0xD,
|
||||
MLX5_MODULE_ID_QSFP28 = 0x11,
|
||||
MLX5_MODULE_ID_DSFP = 0x1B,
|
||||
};
|
||||
|
||||
enum mlx5_an_status {
|
||||
MLX5_AN_UNAVAILABLE = 0,
|
||||
MLX5_AN_COMPLETE = 1,
|
||||
MLX5_AN_FAILED = 2,
|
||||
MLX5_AN_LINK_UP = 3,
|
||||
MLX5_AN_LINK_DOWN = 4,
|
||||
};
|
||||
|
||||
#define MLX5_I2C_ADDR_LOW 0x50
|
||||
#define MLX5_I2C_ADDR_HIGH 0x51
|
||||
#define MLX5_EEPROM_PAGE_LENGTH 256
|
||||
#define MLX5_EEPROM_HIGH_PAGE_LENGTH 128
|
||||
|
||||
enum mlx5e_link_mode {
|
||||
MLX5E_1000BASE_CX_SGMII = 0,
|
||||
MLX5E_1000BASE_KX = 1,
|
||||
MLX5E_10GBASE_CX4 = 2,
|
||||
MLX5E_10GBASE_KX4 = 3,
|
||||
MLX5E_10GBASE_KR = 4,
|
||||
MLX5E_20GBASE_KR2 = 5,
|
||||
MLX5E_40GBASE_CR4 = 6,
|
||||
MLX5E_40GBASE_KR4 = 7,
|
||||
MLX5E_56GBASE_R4 = 8,
|
||||
MLX5E_10GBASE_CR = 12,
|
||||
MLX5E_10GBASE_SR = 13,
|
||||
MLX5E_10GBASE_ER = 14,
|
||||
MLX5E_40GBASE_SR4 = 15,
|
||||
MLX5E_40GBASE_LR4 = 16,
|
||||
MLX5E_50GBASE_SR2 = 18,
|
||||
MLX5E_100GBASE_CR4 = 20,
|
||||
MLX5E_100GBASE_SR4 = 21,
|
||||
MLX5E_100GBASE_KR4 = 22,
|
||||
MLX5E_100GBASE_LR4 = 23,
|
||||
MLX5E_100BASE_TX = 24,
|
||||
MLX5E_1000BASE_T = 25,
|
||||
MLX5E_10GBASE_T = 26,
|
||||
MLX5E_25GBASE_CR = 27,
|
||||
MLX5E_25GBASE_KR = 28,
|
||||
MLX5E_25GBASE_SR = 29,
|
||||
MLX5E_50GBASE_CR2 = 30,
|
||||
MLX5E_50GBASE_KR2 = 31,
|
||||
MLX5E_LINK_MODES_NUMBER,
|
||||
};
|
||||
|
||||
enum mlx5e_ext_link_mode {
|
||||
MLX5E_SGMII_100M = 0,
|
||||
MLX5E_1000BASE_X_SGMII = 1,
|
||||
MLX5E_5GBASE_R = 3,
|
||||
MLX5E_10GBASE_XFI_XAUI_1 = 4,
|
||||
MLX5E_40GBASE_XLAUI_4_XLPPI_4 = 5,
|
||||
MLX5E_25GAUI_1_25GBASE_CR_KR = 6,
|
||||
MLX5E_50GAUI_2_LAUI_2_50GBASE_CR2_KR2 = 7,
|
||||
MLX5E_50GAUI_1_LAUI_1_50GBASE_CR_KR = 8,
|
||||
MLX5E_CAUI_4_100GBASE_CR4_KR4 = 9,
|
||||
MLX5E_100GAUI_2_100GBASE_CR2_KR2 = 10,
|
||||
MLX5E_100GAUI_1_100GBASE_CR_KR = 11,
|
||||
MLX5E_200GAUI_4_200GBASE_CR4_KR4 = 12,
|
||||
MLX5E_200GAUI_2_200GBASE_CR2_KR2 = 13,
|
||||
MLX5E_200GAUI_1_200GBASE_CR1_KR1 = 14,
|
||||
MLX5E_400GAUI_8_400GBASE_CR8 = 15,
|
||||
MLX5E_400GAUI_4_400GBASE_CR4_KR4 = 16,
|
||||
MLX5E_400GAUI_2_400GBASE_CR2_KR2 = 17,
|
||||
MLX5E_800GAUI_8_800GBASE_CR8_KR8 = 19,
|
||||
MLX5E_800GAUI_4_800GBASE_CR4_KR4 = 20,
|
||||
MLX5E_1600GAUI_8_1600GBASE_CR8_KR8 = 23,
|
||||
MLX5E_EXT_LINK_MODES_NUMBER,
|
||||
};
|
||||
|
||||
enum mlx5e_connector_type {
|
||||
MLX5E_PORT_UNKNOWN = 0,
|
||||
MLX5E_PORT_NONE = 1,
|
||||
MLX5E_PORT_TP = 2,
|
||||
MLX5E_PORT_AUI = 3,
|
||||
MLX5E_PORT_BNC = 4,
|
||||
MLX5E_PORT_MII = 5,
|
||||
MLX5E_PORT_FIBRE = 6,
|
||||
MLX5E_PORT_DA = 7,
|
||||
MLX5E_PORT_OTHER = 8,
|
||||
MLX5E_CONNECTOR_TYPE_NUMBER,
|
||||
};
|
||||
|
||||
enum mlx5_ptys_width {
|
||||
MLX5_PTYS_WIDTH_1X = 1 << 0,
|
||||
MLX5_PTYS_WIDTH_2X = 1 << 1,
|
||||
MLX5_PTYS_WIDTH_4X = 1 << 2,
|
||||
MLX5_PTYS_WIDTH_8X = 1 << 3,
|
||||
MLX5_PTYS_WIDTH_12X = 1 << 4,
|
||||
};
|
||||
|
||||
#define MLX5E_PROT_MASK(link_mode) (1U << link_mode)
|
||||
#define MLX5_GET_ETH_PROTO(reg, out, ext, field) \
|
||||
(ext ? MLX5_GET(reg, out, ext_##field) : \
|
||||
MLX5_GET(reg, out, field))
|
||||
|
||||
int mlx5_set_port_caps(struct mlx5_core_dev *dev, u8 port_num, u32 caps);
|
||||
int mlx5_query_port_ptys(struct mlx5_core_dev *dev, u32 *ptys,
|
||||
int ptys_size, int proto_mask,
|
||||
u8 local_port, u8 plane_index);
|
||||
|
||||
int mlx5_query_ib_port_oper(struct mlx5_core_dev *dev, u16 *link_width_oper,
|
||||
u16 *proto_oper, u8 local_port, u8 plane_index);
|
||||
|
||||
void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, u16 *max_mtu, u8 port);
|
||||
void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, u16 *oper_mtu,
|
||||
u8 port);
|
||||
|
||||
int mlx5_query_port_vl_hw_cap(struct mlx5_core_dev *dev,
|
||||
u8 *vl_hw_cap, u8 local_port);
|
||||
|
||||
#endif /* __MLX5_PORT_H__ */
|
||||
@@ -0,0 +1,588 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MLX5_QP_H
|
||||
#define MLX5_QP_H
|
||||
|
||||
#include <linux/mlx5/device.h>
|
||||
#include <linux/mlx5/driver.h>
|
||||
|
||||
#define MLX5_TERMINATE_SCATTER_LIST_LKEY cpu_to_be32(0x100)
|
||||
/* UMR (3 WQE_BB's) + SIG (3 WQE_BB's) + PSV (mem) + PSV (wire) */
|
||||
#define MLX5_SIG_WQE_SIZE (MLX5_SEND_WQE_BB * 8)
|
||||
#define MLX5_DIF_SIZE 8
|
||||
#define MLX5_STRIDE_BLOCK_OP 0x400
|
||||
#define MLX5_CPY_GRD_MASK 0xc0
|
||||
#define MLX5_CPY_APP_MASK 0x30
|
||||
#define MLX5_CPY_REF_MASK 0x0f
|
||||
#define MLX5_BSF_INC_REFTAG (1 << 6)
|
||||
#define MLX5_BSF_INL_VALID (1 << 15)
|
||||
#define MLX5_BSF_REFRESH_DIF (1 << 14)
|
||||
#define MLX5_BSF_REPEAT_BLOCK (1 << 7)
|
||||
#define MLX5_BSF_APPTAG_ESCAPE 0x1
|
||||
#define MLX5_BSF_APPREF_ESCAPE 0x2
|
||||
|
||||
enum mlx5_qp_optpar {
|
||||
MLX5_QP_OPTPAR_ALT_ADDR_PATH = 1 << 0,
|
||||
MLX5_QP_OPTPAR_RRE = 1 << 1,
|
||||
MLX5_QP_OPTPAR_RAE = 1 << 2,
|
||||
MLX5_QP_OPTPAR_RWE = 1 << 3,
|
||||
MLX5_QP_OPTPAR_PKEY_INDEX = 1 << 4,
|
||||
MLX5_QP_OPTPAR_Q_KEY = 1 << 5,
|
||||
MLX5_QP_OPTPAR_RNR_TIMEOUT = 1 << 6,
|
||||
MLX5_QP_OPTPAR_PRIMARY_ADDR_PATH = 1 << 7,
|
||||
MLX5_QP_OPTPAR_SRA_MAX = 1 << 8,
|
||||
MLX5_QP_OPTPAR_RRA_MAX = 1 << 9,
|
||||
MLX5_QP_OPTPAR_PM_STATE = 1 << 10,
|
||||
MLX5_QP_OPTPAR_RETRY_COUNT = 1 << 12,
|
||||
MLX5_QP_OPTPAR_RNR_RETRY = 1 << 13,
|
||||
MLX5_QP_OPTPAR_ACK_TIMEOUT = 1 << 14,
|
||||
MLX5_QP_OPTPAR_LAG_TX_AFF = 1 << 15,
|
||||
MLX5_QP_OPTPAR_PRI_PORT = 1 << 16,
|
||||
MLX5_QP_OPTPAR_SRQN = 1 << 18,
|
||||
MLX5_QP_OPTPAR_CQN_RCV = 1 << 19,
|
||||
MLX5_QP_OPTPAR_DC_HS = 1 << 20,
|
||||
MLX5_QP_OPTPAR_DC_KEY = 1 << 21,
|
||||
MLX5_QP_OPTPAR_COUNTER_SET_ID = 1 << 25,
|
||||
};
|
||||
|
||||
enum mlx5_qp_state {
|
||||
MLX5_QP_STATE_RST = 0,
|
||||
MLX5_QP_STATE_INIT = 1,
|
||||
MLX5_QP_STATE_RTR = 2,
|
||||
MLX5_QP_STATE_RTS = 3,
|
||||
MLX5_QP_STATE_SQER = 4,
|
||||
MLX5_QP_STATE_SQD = 5,
|
||||
MLX5_QP_STATE_ERR = 6,
|
||||
MLX5_QP_STATE_SQ_DRAINING = 7,
|
||||
MLX5_QP_STATE_SUSPENDED = 9,
|
||||
MLX5_QP_NUM_STATE,
|
||||
MLX5_QP_STATE,
|
||||
MLX5_QP_STATE_BAD,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_SQ_STATE_NA = MLX5_SQC_STATE_ERR + 1,
|
||||
MLX5_SQ_NUM_STATE = MLX5_SQ_STATE_NA + 1,
|
||||
MLX5_RQ_STATE_NA = MLX5_RQC_STATE_ERR + 1,
|
||||
MLX5_RQ_NUM_STATE = MLX5_RQ_STATE_NA + 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_QP_ST_RC = 0x0,
|
||||
MLX5_QP_ST_UC = 0x1,
|
||||
MLX5_QP_ST_UD = 0x2,
|
||||
MLX5_QP_ST_XRC = 0x3,
|
||||
MLX5_QP_ST_MLX = 0x4,
|
||||
MLX5_QP_ST_DCI = 0x5,
|
||||
MLX5_QP_ST_DCT = 0x6,
|
||||
MLX5_QP_ST_QP0 = 0x7,
|
||||
MLX5_QP_ST_QP1 = 0x8,
|
||||
MLX5_QP_ST_RAW_ETHERTYPE = 0x9,
|
||||
MLX5_QP_ST_RAW_IPV6 = 0xa,
|
||||
MLX5_QP_ST_SNIFFER = 0xb,
|
||||
MLX5_QP_ST_SYNC_UMR = 0xe,
|
||||
MLX5_QP_ST_PTP_1588 = 0xd,
|
||||
MLX5_QP_ST_REG_UMR = 0xc,
|
||||
MLX5_QP_ST_MAX
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_QP_PM_MIGRATED = 0x3,
|
||||
MLX5_QP_PM_ARMED = 0x0,
|
||||
MLX5_QP_PM_REARM = 0x1
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_NON_ZERO_RQ = 0x0,
|
||||
MLX5_SRQ_RQ = 0x1,
|
||||
MLX5_CRQ_RQ = 0x2,
|
||||
MLX5_ZERO_LEN_RQ = 0x3
|
||||
};
|
||||
|
||||
/* TODO REM */
|
||||
enum {
|
||||
/* params1 */
|
||||
MLX5_QP_BIT_SRE = 1 << 15,
|
||||
MLX5_QP_BIT_SWE = 1 << 14,
|
||||
MLX5_QP_BIT_SAE = 1 << 13,
|
||||
/* params2 */
|
||||
MLX5_QP_BIT_RRE = 1 << 15,
|
||||
MLX5_QP_BIT_RWE = 1 << 14,
|
||||
MLX5_QP_BIT_RAE = 1 << 13,
|
||||
MLX5_QP_BIT_RIC = 1 << 4,
|
||||
MLX5_QP_BIT_CC_SLAVE_RECV = 1 << 2,
|
||||
MLX5_QP_BIT_CC_SLAVE_SEND = 1 << 1,
|
||||
MLX5_QP_BIT_CC_MASTER = 1 << 0
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_WQE_CTRL_CQ_UPDATE = 2 << 2,
|
||||
MLX5_WQE_CTRL_CQ_UPDATE_AND_EQE = 3 << 2,
|
||||
MLX5_WQE_CTRL_SOLICITED = 1 << 1,
|
||||
MLX5_WQE_CTRL_INITIATOR_SMALL_FENCE = 1 << 5,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_SEND_WQE_DS = 16,
|
||||
MLX5_SEND_WQE_BB = 64,
|
||||
};
|
||||
|
||||
#define MLX5_SEND_WQEBB_NUM_DS (MLX5_SEND_WQE_BB / MLX5_SEND_WQE_DS)
|
||||
|
||||
enum {
|
||||
MLX5_SEND_WQE_MAX_WQEBBS = 16,
|
||||
};
|
||||
|
||||
#define MLX5_SEND_WQE_MAX_SIZE (MLX5_SEND_WQE_MAX_WQEBBS * MLX5_SEND_WQE_BB)
|
||||
|
||||
enum {
|
||||
MLX5_WQE_FMR_PERM_LOCAL_READ = 1 << 27,
|
||||
MLX5_WQE_FMR_PERM_LOCAL_WRITE = 1 << 28,
|
||||
MLX5_WQE_FMR_PERM_REMOTE_READ = 1 << 29,
|
||||
MLX5_WQE_FMR_PERM_REMOTE_WRITE = 1 << 30,
|
||||
MLX5_WQE_FMR_PERM_ATOMIC = 1 << 31
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_FENCE_MODE_NONE = 0 << 5,
|
||||
MLX5_FENCE_MODE_INITIATOR_SMALL = 1 << 5,
|
||||
MLX5_FENCE_MODE_FENCE = 2 << 5,
|
||||
MLX5_FENCE_MODE_STRONG_ORDERING = 3 << 5,
|
||||
MLX5_FENCE_MODE_SMALL_AND_FENCE = 4 << 5,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_RCV_DBR = 0,
|
||||
MLX5_SND_DBR = 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_FLAGS_INLINE = 1<<7,
|
||||
MLX5_FLAGS_CHECK_FREE = 1<<5,
|
||||
};
|
||||
|
||||
struct mlx5_wqe_fmr_seg {
|
||||
__be32 flags;
|
||||
__be32 mem_key;
|
||||
__be64 buf_list;
|
||||
__be64 start_addr;
|
||||
__be64 reg_len;
|
||||
__be32 offset;
|
||||
__be32 page_size;
|
||||
u32 reserved[2];
|
||||
};
|
||||
|
||||
struct mlx5_wqe_ctrl_seg {
|
||||
__be32 opmod_idx_opcode;
|
||||
__be32 qpn_ds;
|
||||
|
||||
struct_group(trailer,
|
||||
|
||||
u8 signature;
|
||||
u8 rsvd[2];
|
||||
u8 fm_ce_se;
|
||||
union {
|
||||
__be32 general_id;
|
||||
__be32 imm;
|
||||
__be32 umr_mkey;
|
||||
__be32 tis_tir_num;
|
||||
};
|
||||
|
||||
); /* end of trailer group */
|
||||
};
|
||||
|
||||
#define MLX5_WQE_CTRL_DS_MASK 0x3f
|
||||
#define MLX5_WQE_CTRL_QPN_MASK 0xffffff00
|
||||
#define MLX5_WQE_CTRL_QPN_SHIFT 8
|
||||
#define MLX5_WQE_DS_UNITS 16
|
||||
#define MLX5_WQE_CTRL_OPCODE_MASK 0xff
|
||||
#define MLX5_WQE_CTRL_WQE_INDEX_MASK 0x00ffff00
|
||||
#define MLX5_WQE_CTRL_WQE_INDEX_SHIFT 8
|
||||
|
||||
enum {
|
||||
MLX5_ETH_WQE_L3_INNER_CSUM = 1 << 4,
|
||||
MLX5_ETH_WQE_L4_INNER_CSUM = 1 << 5,
|
||||
MLX5_ETH_WQE_L3_CSUM = 1 << 6,
|
||||
MLX5_ETH_WQE_L4_CSUM = 1 << 7,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_ETH_WQE_TRAILER_HDR_OUTER_IP_ASSOC = 1 << 26,
|
||||
MLX5_ETH_WQE_TRAILER_HDR_OUTER_L4_ASSOC = 1 << 27,
|
||||
MLX5_ETH_WQE_TRAILER_HDR_INNER_IP_ASSOC = 3 << 26,
|
||||
MLX5_ETH_WQE_TRAILER_HDR_INNER_L4_ASSOC = 1 << 28,
|
||||
MLX5_ETH_WQE_INSERT_TRAILER = 1 << 30,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_ETH_WQE_SWP_INNER_L3_IPV6 = 1 << 0,
|
||||
MLX5_ETH_WQE_SWP_INNER_L4_UDP = 1 << 1,
|
||||
MLX5_ETH_WQE_SWP_OUTER_L3_IPV6 = 1 << 4,
|
||||
MLX5_ETH_WQE_SWP_OUTER_L4_UDP = 1 << 5,
|
||||
};
|
||||
|
||||
/* Metadata bits 0-7 are used by timestamping */
|
||||
/* Base shift for metadata bits used by IPsec and MACsec */
|
||||
#define MLX5_ETH_WQE_FT_META_SHIFT 8
|
||||
|
||||
enum {
|
||||
MLX5_ETH_WQE_FT_META_IPSEC = BIT(0) << MLX5_ETH_WQE_FT_META_SHIFT,
|
||||
MLX5_ETH_WQE_FT_META_MACSEC = BIT(1) << MLX5_ETH_WQE_FT_META_SHIFT,
|
||||
MLX5_ETH_WQE_FT_META_MACSEC_FS_ID_MASK =
|
||||
GENMASK(5, 2) << MLX5_ETH_WQE_FT_META_SHIFT,
|
||||
};
|
||||
|
||||
struct mlx5_wqe_eth_seg {
|
||||
u8 swp_outer_l4_offset;
|
||||
u8 swp_outer_l3_offset;
|
||||
u8 swp_inner_l4_offset;
|
||||
u8 swp_inner_l3_offset;
|
||||
u8 cs_flags;
|
||||
u8 swp_flags;
|
||||
__be16 mss;
|
||||
__be32 flow_table_metadata;
|
||||
union {
|
||||
struct {
|
||||
__be16 sz;
|
||||
union {
|
||||
u8 start[2];
|
||||
DECLARE_FLEX_ARRAY(u8, data);
|
||||
};
|
||||
} inline_hdr;
|
||||
__be32 trailer;
|
||||
};
|
||||
};
|
||||
|
||||
struct mlx5_wqe_xrc_seg {
|
||||
__be32 xrc_srqn;
|
||||
u8 rsvd[12];
|
||||
};
|
||||
|
||||
struct mlx5_wqe_masked_atomic_seg {
|
||||
__be64 swap_add;
|
||||
__be64 compare;
|
||||
__be64 swap_add_mask;
|
||||
__be64 compare_mask;
|
||||
};
|
||||
|
||||
struct mlx5_base_av {
|
||||
union {
|
||||
struct {
|
||||
__be32 qkey;
|
||||
__be32 reserved;
|
||||
} qkey;
|
||||
__be64 dc_key;
|
||||
} key;
|
||||
__be32 dqp_dct;
|
||||
u8 stat_rate_sl;
|
||||
u8 fl_mlid;
|
||||
union {
|
||||
__be16 rlid;
|
||||
__be16 udp_sport;
|
||||
};
|
||||
};
|
||||
|
||||
struct mlx5_av {
|
||||
union {
|
||||
struct {
|
||||
__be32 qkey;
|
||||
__be32 reserved;
|
||||
} qkey;
|
||||
__be64 dc_key;
|
||||
} key;
|
||||
__be32 dqp_dct;
|
||||
u8 stat_rate_sl;
|
||||
u8 fl_mlid;
|
||||
union {
|
||||
__be16 rlid;
|
||||
__be16 udp_sport;
|
||||
};
|
||||
u8 reserved0[4];
|
||||
u8 rmac[6];
|
||||
u8 tclass;
|
||||
u8 hop_limit;
|
||||
__be32 grh_gid_fl;
|
||||
u8 rgid[16];
|
||||
};
|
||||
|
||||
struct mlx5_ib_ah {
|
||||
struct ib_ah ibah;
|
||||
struct mlx5_av av;
|
||||
u8 xmit_port;
|
||||
};
|
||||
|
||||
static inline struct mlx5_ib_ah *to_mah(struct ib_ah *ibah)
|
||||
{
|
||||
return container_of(ibah, struct mlx5_ib_ah, ibah);
|
||||
}
|
||||
|
||||
struct mlx5_wqe_datagram_seg {
|
||||
struct mlx5_av av;
|
||||
};
|
||||
|
||||
struct mlx5_wqe_raddr_seg {
|
||||
__be64 raddr;
|
||||
__be32 rkey;
|
||||
u32 reserved;
|
||||
};
|
||||
|
||||
struct mlx5_wqe_atomic_seg {
|
||||
__be64 swap_add;
|
||||
__be64 compare;
|
||||
};
|
||||
|
||||
struct mlx5_wqe_data_seg {
|
||||
__be32 byte_count;
|
||||
__be32 lkey;
|
||||
__be64 addr;
|
||||
};
|
||||
|
||||
struct mlx5_wqe_umr_ctrl_seg {
|
||||
u8 flags;
|
||||
u8 rsvd0[3];
|
||||
__be16 xlt_octowords;
|
||||
union {
|
||||
__be16 xlt_offset;
|
||||
__be16 bsf_octowords;
|
||||
};
|
||||
__be64 mkey_mask;
|
||||
__be32 xlt_offset_47_16;
|
||||
u8 rsvd1[28];
|
||||
};
|
||||
|
||||
struct mlx5_seg_set_psv {
|
||||
__be32 psv_num;
|
||||
__be16 syndrome;
|
||||
__be16 status;
|
||||
__be32 transient_sig;
|
||||
__be32 ref_tag;
|
||||
};
|
||||
|
||||
struct mlx5_seg_get_psv {
|
||||
u8 rsvd[19];
|
||||
u8 num_psv;
|
||||
__be32 l_key;
|
||||
__be64 va;
|
||||
__be32 psv_index[4];
|
||||
};
|
||||
|
||||
struct mlx5_seg_check_psv {
|
||||
u8 rsvd0[2];
|
||||
__be16 err_coalescing_op;
|
||||
u8 rsvd1[2];
|
||||
__be16 xport_err_op;
|
||||
u8 rsvd2[2];
|
||||
__be16 xport_err_mask;
|
||||
u8 rsvd3[7];
|
||||
u8 num_psv;
|
||||
__be32 l_key;
|
||||
__be64 va;
|
||||
__be32 psv_index[4];
|
||||
};
|
||||
|
||||
struct mlx5_rwqe_sig {
|
||||
u8 rsvd0[4];
|
||||
u8 signature;
|
||||
u8 rsvd1[11];
|
||||
};
|
||||
|
||||
struct mlx5_wqe_signature_seg {
|
||||
u8 rsvd0[4];
|
||||
u8 signature;
|
||||
u8 rsvd1[11];
|
||||
};
|
||||
|
||||
#define MLX5_WQE_INLINE_SEG_BYTE_COUNT_MASK 0x3ff
|
||||
|
||||
struct mlx5_wqe_inline_seg {
|
||||
__be32 byte_count;
|
||||
__be32 data[];
|
||||
};
|
||||
|
||||
enum mlx5_sig_type {
|
||||
MLX5_DIF_CRC = 0x1,
|
||||
MLX5_DIF_IPCS = 0x2,
|
||||
};
|
||||
|
||||
struct mlx5_bsf_inl {
|
||||
__be16 vld_refresh;
|
||||
__be16 dif_apptag;
|
||||
__be32 dif_reftag;
|
||||
u8 sig_type;
|
||||
u8 rp_inv_seed;
|
||||
u8 rsvd[3];
|
||||
u8 dif_inc_ref_guard_check;
|
||||
__be16 dif_app_bitmask_check;
|
||||
};
|
||||
|
||||
struct mlx5_bsf {
|
||||
struct mlx5_bsf_basic {
|
||||
u8 bsf_size_sbs;
|
||||
u8 check_byte_mask;
|
||||
union {
|
||||
u8 copy_byte_mask;
|
||||
u8 bs_selector;
|
||||
u8 rsvd_wflags;
|
||||
} wire;
|
||||
union {
|
||||
u8 bs_selector;
|
||||
u8 rsvd_mflags;
|
||||
} mem;
|
||||
__be32 raw_data_size;
|
||||
__be32 w_bfs_psv;
|
||||
__be32 m_bfs_psv;
|
||||
} basic;
|
||||
struct mlx5_bsf_ext {
|
||||
__be32 t_init_gen_pro_size;
|
||||
__be32 rsvd_epi_size;
|
||||
__be32 w_tfs_psv;
|
||||
__be32 m_tfs_psv;
|
||||
} ext;
|
||||
struct mlx5_bsf_inl w_inl;
|
||||
struct mlx5_bsf_inl m_inl;
|
||||
};
|
||||
|
||||
struct mlx5_mtt {
|
||||
__be64 ptag;
|
||||
};
|
||||
|
||||
struct mlx5_klm {
|
||||
__be32 bcount;
|
||||
__be32 key;
|
||||
__be64 va;
|
||||
};
|
||||
|
||||
struct mlx5_ksm {
|
||||
__be32 reserved;
|
||||
__be32 key;
|
||||
__be64 va;
|
||||
};
|
||||
|
||||
struct mlx5_stride_block_entry {
|
||||
__be16 stride;
|
||||
__be16 bcount;
|
||||
__be32 key;
|
||||
__be64 va;
|
||||
};
|
||||
|
||||
struct mlx5_stride_block_ctrl_seg {
|
||||
__be32 bcount_per_cycle;
|
||||
__be32 op;
|
||||
__be32 repeat_count;
|
||||
u16 rsvd;
|
||||
__be16 num_entries;
|
||||
};
|
||||
|
||||
struct mlx5_wqe_flow_update_ctrl_seg {
|
||||
__be32 flow_idx_update;
|
||||
__be32 dest_handle;
|
||||
u8 reserved0[40];
|
||||
};
|
||||
|
||||
struct mlx5_wqe_header_modify_argument_update_seg {
|
||||
u8 argument_list[64];
|
||||
};
|
||||
|
||||
struct mlx5_core_qp {
|
||||
struct mlx5_core_rsc_common common; /* must be first */
|
||||
void (*event) (struct mlx5_core_qp *, int);
|
||||
int qpn;
|
||||
struct mlx5_rsc_debug *dbg;
|
||||
int pid;
|
||||
u16 uid;
|
||||
};
|
||||
|
||||
struct mlx5_core_dct {
|
||||
struct mlx5_core_qp mqp;
|
||||
struct completion drained;
|
||||
};
|
||||
|
||||
int mlx5_debug_qp_add(struct mlx5_core_dev *dev, struct mlx5_core_qp *qp);
|
||||
void mlx5_debug_qp_remove(struct mlx5_core_dev *dev, struct mlx5_core_qp *qp);
|
||||
|
||||
static inline const char *mlx5_qp_type_str(int type)
|
||||
{
|
||||
switch (type) {
|
||||
case MLX5_QP_ST_RC: return "RC";
|
||||
case MLX5_QP_ST_UC: return "C";
|
||||
case MLX5_QP_ST_UD: return "UD";
|
||||
case MLX5_QP_ST_XRC: return "XRC";
|
||||
case MLX5_QP_ST_MLX: return "MLX";
|
||||
case MLX5_QP_ST_QP0: return "QP0";
|
||||
case MLX5_QP_ST_QP1: return "QP1";
|
||||
case MLX5_QP_ST_RAW_ETHERTYPE: return "RAW_ETHERTYPE";
|
||||
case MLX5_QP_ST_RAW_IPV6: return "RAW_IPV6";
|
||||
case MLX5_QP_ST_SNIFFER: return "SNIFFER";
|
||||
case MLX5_QP_ST_SYNC_UMR: return "SYNC_UMR";
|
||||
case MLX5_QP_ST_PTP_1588: return "PTP_1588";
|
||||
case MLX5_QP_ST_REG_UMR: return "REG_UMR";
|
||||
default: return "Invalid transport type";
|
||||
}
|
||||
}
|
||||
|
||||
static inline const char *mlx5_qp_state_str(int state)
|
||||
{
|
||||
switch (state) {
|
||||
case MLX5_QP_STATE_RST:
|
||||
return "RST";
|
||||
case MLX5_QP_STATE_INIT:
|
||||
return "INIT";
|
||||
case MLX5_QP_STATE_RTR:
|
||||
return "RTR";
|
||||
case MLX5_QP_STATE_RTS:
|
||||
return "RTS";
|
||||
case MLX5_QP_STATE_SQER:
|
||||
return "SQER";
|
||||
case MLX5_QP_STATE_SQD:
|
||||
return "SQD";
|
||||
case MLX5_QP_STATE_ERR:
|
||||
return "ERR";
|
||||
case MLX5_QP_STATE_SQ_DRAINING:
|
||||
return "SQ_DRAINING";
|
||||
case MLX5_QP_STATE_SUSPENDED:
|
||||
return "SUSPENDED";
|
||||
default: return "Invalid QP state";
|
||||
}
|
||||
}
|
||||
|
||||
static inline int mlx5_get_qp_default_ts(struct mlx5_core_dev *dev)
|
||||
{
|
||||
u8 supported_ts_cap = mlx5_get_roce_state(dev) ?
|
||||
MLX5_CAP_ROCE(dev, qp_ts_format) :
|
||||
MLX5_CAP_GEN(dev, sq_ts_format);
|
||||
|
||||
return supported_ts_cap ? MLX5_TIMESTAMP_FORMAT_DEFAULT :
|
||||
MLX5_TIMESTAMP_FORMAT_FREE_RUNNING;
|
||||
}
|
||||
|
||||
#endif /* MLX5_QP_H */
|
||||
@@ -0,0 +1,51 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
|
||||
/* Copyright (c) 2020 Mellanox Technologies inc. */
|
||||
|
||||
#include <linux/mlx5/driver.h>
|
||||
|
||||
#ifndef __MLX5_RSC_DUMP
|
||||
#define __MLX5_RSC_DUMP
|
||||
|
||||
enum mlx5_sgmt_type {
|
||||
MLX5_SGMT_TYPE_HW_CQPC,
|
||||
MLX5_SGMT_TYPE_HW_SQPC,
|
||||
MLX5_SGMT_TYPE_HW_RQPC,
|
||||
MLX5_SGMT_TYPE_FULL_SRQC,
|
||||
MLX5_SGMT_TYPE_FULL_CQC,
|
||||
MLX5_SGMT_TYPE_FULL_EQC,
|
||||
MLX5_SGMT_TYPE_FULL_QPC,
|
||||
MLX5_SGMT_TYPE_SND_BUFF,
|
||||
MLX5_SGMT_TYPE_RCV_BUFF,
|
||||
MLX5_SGMT_TYPE_SRQ_BUFF,
|
||||
MLX5_SGMT_TYPE_CQ_BUFF,
|
||||
MLX5_SGMT_TYPE_EQ_BUFF,
|
||||
MLX5_SGMT_TYPE_SX_SLICE,
|
||||
MLX5_SGMT_TYPE_SX_SLICE_ALL,
|
||||
MLX5_SGMT_TYPE_RDB,
|
||||
MLX5_SGMT_TYPE_RX_SLICE_ALL,
|
||||
MLX5_SGMT_TYPE_PRM_QUERY_QP,
|
||||
MLX5_SGMT_TYPE_PRM_QUERY_CQ,
|
||||
MLX5_SGMT_TYPE_PRM_QUERY_MKEY,
|
||||
MLX5_SGMT_TYPE_MENU,
|
||||
MLX5_SGMT_TYPE_TERMINATE,
|
||||
|
||||
MLX5_SGMT_TYPE_NUM, /* Keep last */
|
||||
};
|
||||
|
||||
struct mlx5_rsc_key {
|
||||
enum mlx5_sgmt_type rsc;
|
||||
int index1;
|
||||
int index2;
|
||||
int num_of_obj1;
|
||||
int num_of_obj2;
|
||||
int size;
|
||||
};
|
||||
|
||||
struct mlx5_rsc_dump_cmd;
|
||||
|
||||
struct mlx5_rsc_dump_cmd *mlx5_rsc_dump_cmd_create(struct mlx5_core_dev *dev,
|
||||
struct mlx5_rsc_key *key);
|
||||
void mlx5_rsc_dump_cmd_destroy(struct mlx5_rsc_dump_cmd *cmd);
|
||||
int mlx5_rsc_dump_next(struct mlx5_core_dev *dev, struct mlx5_rsc_dump_cmd *cmd,
|
||||
struct page *page, int *size);
|
||||
#endif /* __MLX5_RSC_DUMP */
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2015, Mellanox Technologies, Ltd. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __TRANSOBJ_H__
|
||||
#define __TRANSOBJ_H__
|
||||
|
||||
#include <linux/mlx5/driver.h>
|
||||
|
||||
int mlx5_core_alloc_transport_domain(struct mlx5_core_dev *dev, u32 *tdn);
|
||||
void mlx5_core_dealloc_transport_domain(struct mlx5_core_dev *dev, u32 tdn);
|
||||
int mlx5_core_create_rq(struct mlx5_core_dev *dev, u32 *in, int inlen,
|
||||
u32 *rqn);
|
||||
int mlx5_core_modify_rq(struct mlx5_core_dev *dev, u32 rqn, u32 *in);
|
||||
void mlx5_core_destroy_rq(struct mlx5_core_dev *dev, u32 rqn);
|
||||
int mlx5_core_query_rq(struct mlx5_core_dev *dev, u32 rqn, u32 *out);
|
||||
int mlx5_core_create_sq(struct mlx5_core_dev *dev, u32 *in, int inlen,
|
||||
u32 *sqn);
|
||||
int mlx5_core_modify_sq(struct mlx5_core_dev *dev, u32 sqn, u32 *in);
|
||||
void mlx5_core_destroy_sq(struct mlx5_core_dev *dev, u32 sqn);
|
||||
int mlx5_core_query_sq(struct mlx5_core_dev *dev, u32 sqn, u32 *out);
|
||||
int mlx5_core_query_sq_state(struct mlx5_core_dev *dev, u32 sqn, u8 *state);
|
||||
int mlx5_core_create_tir(struct mlx5_core_dev *dev, u32 *in, u32 *tirn);
|
||||
int mlx5_core_modify_tir(struct mlx5_core_dev *dev, u32 tirn, u32 *in);
|
||||
void mlx5_core_destroy_tir(struct mlx5_core_dev *dev, u32 tirn);
|
||||
int mlx5_core_create_tis(struct mlx5_core_dev *dev, u32 *in, u32 *tisn);
|
||||
int mlx5_core_modify_tis(struct mlx5_core_dev *dev, u32 tisn, u32 *in);
|
||||
void mlx5_core_destroy_tis(struct mlx5_core_dev *dev, u32 tisn);
|
||||
int mlx5_core_create_rqt(struct mlx5_core_dev *dev, u32 *in, int inlen,
|
||||
u32 *rqtn);
|
||||
int mlx5_core_modify_rqt(struct mlx5_core_dev *dev, u32 rqtn, u32 *in,
|
||||
int inlen);
|
||||
void mlx5_core_destroy_rqt(struct mlx5_core_dev *dev, u32 rqtn);
|
||||
|
||||
struct mlx5_hairpin_params {
|
||||
u8 log_data_size;
|
||||
u8 log_num_packets;
|
||||
u16 q_counter;
|
||||
int num_channels;
|
||||
};
|
||||
|
||||
struct mlx5_hairpin {
|
||||
struct mlx5_core_dev *func_mdev;
|
||||
struct mlx5_core_dev *peer_mdev;
|
||||
|
||||
int num_channels;
|
||||
|
||||
u32 *rqn;
|
||||
u32 *sqn;
|
||||
|
||||
bool peer_gone;
|
||||
};
|
||||
|
||||
struct mlx5_hairpin *
|
||||
mlx5_core_hairpin_create(struct mlx5_core_dev *func_mdev,
|
||||
struct mlx5_core_dev *peer_mdev,
|
||||
struct mlx5_hairpin_params *params);
|
||||
|
||||
void mlx5_core_hairpin_destroy(struct mlx5_hairpin *pair);
|
||||
void mlx5_core_hairpin_clear_dead_peer(struct mlx5_hairpin *hp);
|
||||
#endif /* __TRANSOBJ_H__ */
|
||||
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2015, Mellanox Technologies, Ltd. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __MLX5_VPORT_H__
|
||||
#define __MLX5_VPORT_H__
|
||||
|
||||
#include <linux/mlx5/driver.h>
|
||||
#include <linux/mlx5/device.h>
|
||||
|
||||
#define MLX5_VPORT_MANAGER(mdev) \
|
||||
(MLX5_CAP_GEN(mdev, vport_group_manager) && \
|
||||
(MLX5_CAP_GEN(mdev, port_type) == MLX5_CAP_PORT_TYPE_ETH) && \
|
||||
mlx5_core_is_pf(mdev))
|
||||
|
||||
#define MLX5_MAX_TX_SPEED_UNIT 100
|
||||
|
||||
enum {
|
||||
MLX5_CAP_INLINE_MODE_L2,
|
||||
MLX5_CAP_INLINE_MODE_VPORT_CONTEXT,
|
||||
MLX5_CAP_INLINE_MODE_NOT_REQUIRED,
|
||||
};
|
||||
|
||||
/* Vport number for each function must keep unchanged */
|
||||
enum {
|
||||
MLX5_VPORT_PF = 0x0,
|
||||
MLX5_VPORT_FIRST_VF = 0x1,
|
||||
MLX5_VPORT_ECPF = 0xfffe,
|
||||
MLX5_VPORT_UPLINK = 0xffff
|
||||
};
|
||||
|
||||
u8 mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod, u16 vport);
|
||||
int mlx5_modify_vport_admin_state(struct mlx5_core_dev *mdev, u8 opmod,
|
||||
u16 vport, u8 other_vport, u8 state);
|
||||
int mlx5_query_vport_max_tx_speed(struct mlx5_core_dev *mdev, u8 op_mod,
|
||||
u16 vport, u8 other_vport, u32 *max_tx_speed);
|
||||
int mlx5_modify_vport_max_tx_speed(struct mlx5_core_dev *mdev, u8 opmod,
|
||||
u16 vport, u8 other_vport, u16 max_tx_speed);
|
||||
int mlx5_query_nic_vport_mac_address(struct mlx5_core_dev *mdev,
|
||||
u16 vport, bool other, u8 *addr);
|
||||
int mlx5_query_mac_address(struct mlx5_core_dev *mdev, u8 *addr);
|
||||
int mlx5_query_nic_vport_min_inline(struct mlx5_core_dev *mdev,
|
||||
u16 vport, u8 *min_inline);
|
||||
void mlx5_query_min_inline(struct mlx5_core_dev *mdev, u8 *min_inline);
|
||||
int mlx5_modify_nic_vport_min_inline(struct mlx5_core_dev *mdev,
|
||||
u16 vport, u8 min_inline);
|
||||
int mlx5_modify_nic_vport_mac_address(struct mlx5_core_dev *dev,
|
||||
u16 vport, const u8 *addr);
|
||||
int mlx5_query_nic_vport_mtu(struct mlx5_core_dev *mdev, u16 *mtu);
|
||||
int mlx5_modify_nic_vport_mtu(struct mlx5_core_dev *mdev, u16 mtu);
|
||||
int mlx5_query_nic_vport_system_image_guid(struct mlx5_core_dev *mdev,
|
||||
u64 *system_image_guid);
|
||||
int mlx5_query_nic_vport_sd_group(struct mlx5_core_dev *mdev, u8 *sd_group);
|
||||
int mlx5_query_nic_vport_node_guid(struct mlx5_core_dev *mdev,
|
||||
u16 vport, bool other_vport, u64 *node_guid);
|
||||
int mlx5_modify_nic_vport_node_guid(struct mlx5_core_dev *mdev,
|
||||
u16 vport, u64 node_guid);
|
||||
int mlx5_query_nic_vport_qkey_viol_cntr(struct mlx5_core_dev *mdev,
|
||||
u16 *qkey_viol_cntr);
|
||||
int mlx5_query_hca_vport_gid(struct mlx5_core_dev *dev, u8 other_vport,
|
||||
u8 port_num, u16 vf_num, u16 gid_index,
|
||||
union ib_gid *gid);
|
||||
int mlx5_query_hca_vport_pkey(struct mlx5_core_dev *dev, u8 other_vport,
|
||||
u8 port_num, u16 vf_num, u16 pkey_index,
|
||||
u16 *pkey);
|
||||
int mlx5_query_hca_vport_context(struct mlx5_core_dev *dev,
|
||||
u8 other_vport, u8 port_num,
|
||||
u16 vf_num,
|
||||
struct mlx5_hca_vport_context *rep);
|
||||
int mlx5_query_hca_vport_system_image_guid(struct mlx5_core_dev *dev,
|
||||
u64 *sys_image_guid);
|
||||
int mlx5_query_hca_vport_node_guid(struct mlx5_core_dev *dev,
|
||||
u64 *node_guid);
|
||||
int mlx5_query_nic_vport_mac_list(struct mlx5_core_dev *dev,
|
||||
u16 vport,
|
||||
enum mlx5_list_type list_type,
|
||||
u8 addr_list[][ETH_ALEN],
|
||||
int *list_size);
|
||||
int mlx5_modify_nic_vport_mac_list(struct mlx5_core_dev *dev,
|
||||
enum mlx5_list_type list_type,
|
||||
u8 addr_list[][ETH_ALEN],
|
||||
int list_size);
|
||||
int mlx5_query_nic_vport_promisc(struct mlx5_core_dev *mdev,
|
||||
u16 vport,
|
||||
int *promisc_uc,
|
||||
int *promisc_mc,
|
||||
int *promisc_all);
|
||||
int mlx5_modify_nic_vport_promisc(struct mlx5_core_dev *mdev,
|
||||
int promisc_uc,
|
||||
int promisc_mc,
|
||||
int promisc_all);
|
||||
int mlx5_modify_nic_vport_vlans(struct mlx5_core_dev *dev,
|
||||
u16 vlans[],
|
||||
int list_size);
|
||||
|
||||
int mlx5_nic_vport_enable_roce(struct mlx5_core_dev *mdev);
|
||||
int mlx5_nic_vport_disable_roce(struct mlx5_core_dev *mdev);
|
||||
int mlx5_query_vport_down_stats(struct mlx5_core_dev *mdev, u16 vport,
|
||||
u8 other_vport, u64 *rx_discard_vport_down,
|
||||
u64 *tx_discard_vport_down);
|
||||
int mlx5_core_query_vport_counter(struct mlx5_core_dev *dev, u8 other_vport,
|
||||
int vf, u8 port_num, void *out);
|
||||
int mlx5_core_modify_hca_vport_context(struct mlx5_core_dev *dev,
|
||||
u8 other_vport, u8 port_num,
|
||||
int vf,
|
||||
struct mlx5_hca_vport_context *req);
|
||||
int mlx5_nic_vport_update_local_lb(struct mlx5_core_dev *mdev, bool enable);
|
||||
int mlx5_nic_vport_query_local_lb(struct mlx5_core_dev *mdev, bool *status);
|
||||
|
||||
int mlx5_nic_vport_affiliate_multiport(struct mlx5_core_dev *master_mdev,
|
||||
struct mlx5_core_dev *port_mdev);
|
||||
int mlx5_nic_vport_unaffiliate_multiport(struct mlx5_core_dev *port_mdev);
|
||||
|
||||
u64 mlx5_query_nic_system_image_guid(struct mlx5_core_dev *mdev);
|
||||
int mlx5_vport_get_other_func_cap(struct mlx5_core_dev *dev, u16 vport, void *out,
|
||||
u16 opmod);
|
||||
int mlx5_vport_get_vhca_id(struct mlx5_core_dev *dev, u16 vport, u16 *vhca_id);
|
||||
|
||||
#endif /* __MLX5_VPORT_H__ */
|
||||
Reference in New Issue
Block a user