freebsd-dev/sys/dev/ice/ice_rdma.h
Bartosz Sobczak 01fbb86991
irdma(4): upgrade to 1.2.17-k
Update Intel irdma driver to version 1.2.17-k

Notable changes:
- pf-reset handling improvements, including fixes in communication with if_ice(4)
- avoid racing when handling various events
- adding sw stats sysctls
- hand over pe_criterr handling from ice(4) to irdma(4)
- debug prints adjustments
- fix crash after changes in irdma_add_mqh_ifa_cb

Signed-off-by: Bartosz Sobczak <bartosz.sobczak@intel.com>
Signed-off-by: Eric Joyner <erj@FreeBSD.org>

Reviewed by:	erj@
MFC after:	1 month
Sponsored by:	Intel Corporation
Differential Revision:	https://reviews.freebsd.org/D41425
2023-08-18 11:28:58 -07:00

312 lines
8.4 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause */
/* Copyright (c) 2023, Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. 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.
*
* 3. Neither the name of the Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file ice_rdma.h
* @brief header file for RDMA client interface functions
*
* Contains definitions and function calls shared by the ice driver and the
* RDMA client interface driver.
*
* Since these definitions are shared between drivers it is important that any
* changes are considered carefully for backwards compatibility.
*/
#ifndef _ICE_RDMA_H_
#define _ICE_RDMA_H_
/*
* The RDMA client interface version is used to help determine
* incompatibilities between the interface definition shared between the main
* driver and the client driver.
*
* It will follows the semantic version guidelines, that is:
* Given the version number MAJOR.MINOR.PATCH, increment the:
*
* MAJOR version when you make incompatible changes,
* MINOR version when you add functionality in a backwards-compatible manner, and
* PATCH version when you make backwards-compatible bug fixes.
*
* Any change to this file, or one of the kobject interface files must come
* with an associated change in one of the MAJOR, MINOR, or PATCH versions,
* and care must be taken that backwards incompatible changes MUST increment
* the MAJOR version.
*
* Note: Until the MAJOR version is set to at least 1, the above semantic
* version guarantees may not hold, and this interface should not be
* considered stable.
*/
#define ICE_RDMA_MAJOR_VERSION 1
#define ICE_RDMA_MINOR_VERSION 1
#define ICE_RDMA_PATCH_VERSION 0
/**
* @def ICE_RDMA_MAX_MSIX
* @brief Maximum number of MSI-X vectors that will be reserved
*
* Defines the maximum number of MSI-X vectors that an RDMA interface will
* have reserved in advance. Does not guarantee that many vectors have
* actually been enabled.
*/
#define ICE_RDMA_MAX_MSIX 64
/**
* @struct ice_rdma_info
* @brief RDMA information from the client driver
*
* The RDMA client driver will fill in this structure and pass its contents
* back to the main driver using the ice_rdma_register function.
*
* It should fill the version in with the ICE_RDMA_* versions as defined in
* the ice_rdma.h header.
*
* Additionally it must provide a pointer to a kobject class which extends the
* ice_rdma_di_class with the operations defined in the rdma_if.m interface.
*
* If the version specified is not compatible, then the registration will
* of the RDMA driver will fail.
*/
struct ice_rdma_info {
uint16_t major_version;
uint16_t minor_version;
uint16_t patch_version;
kobj_class_t rdma_class;
};
#define ICE_RDMA_MAX_USER_PRIORITY 8
#define ICE_RDMA_MAX_MSIX 64
/* Declare the ice_rdma_di kobject class */
DECLARE_CLASS(ice_rdma_di_class);
/**
* @struct ice_rdma_msix_mapping
* @brief MSI-X mapping requested by the peer RDMA driver
*
* Defines a mapping for MSI-X vectors being requested by the peer RDMA driver
* for a given PF.
*/
struct ice_rdma_msix_mapping {
uint8_t itr_indx;
int aeq_vector;
int ceq_cnt;
int *ceq_vector;
};
/**
* @struct ice_rdma_msix
* @brief RDMA MSI-X vectors reserved for the peer RDMA driver
*
* Defines the segment of the MSI-X vectors for use by the RDMA driver. These
* are reserved by the PF when it initializes.
*/
struct ice_rdma_msix {
int base;
int count;
};
/**
* @struct ice_qos_info
* @brief QoS information to be shared with RDMA driver
*/
struct ice_qos_info {
uint64_t tc_ctx;
uint8_t rel_bw;
uint8_t prio_type;
uint8_t egress_virt_up;
uint8_t ingress_virt_up;
};
/**
* @struct ice_qos_app_priority_table
* @brief Application priority data
*/
struct ice_qos_app_priority_table {
uint16_t prot_id;
uint8_t priority;
uint8_t selector;
};
#define IEEE_8021QAZ_MAX_TCS 8
#define ICE_TC_MAX_USER_PRIORITY 8
#define ICE_QOS_MAX_APPS 32
#define ICE_QOS_DSCP_NUM_VAL 64
/**
* @struct ice_qos_params
* @brief Holds all necessary data for RDMA to work with DCB
*
* Struct to hold QoS info
*/
struct ice_qos_params {
struct ice_qos_info tc_info[IEEE_8021QAZ_MAX_TCS];
uint8_t up2tc[ICE_TC_MAX_USER_PRIORITY];
uint8_t vsi_relative_bw;
uint8_t vsi_priority_type;
uint32_t num_apps;
uint8_t pfc_mode;
uint8_t dscp_map[ICE_QOS_DSCP_NUM_VAL];
struct ice_qos_app_priority_table apps[ICE_QOS_MAX_APPS];
uint8_t num_tc;
};
/**
* @struct ice_rdma_peer
* @brief RDMA driver information
*
* Shared structure used by the RDMA client driver when talking with the main
* device driver.
*
* Because the definition of this structure is shared between the two drivers,
* its ABI should be handled carefully.
*/
struct ice_rdma_peer {
/**
* The KOBJ_FIELDS macro must come first, in order for it to be used
* as a kobject.
*/
KOBJ_FIELDS;
struct ifnet *ifp;
device_t dev;
struct resource *pci_mem;
struct ice_qos_params initial_qos_info;
struct ice_rdma_msix msix;
uint16_t mtu;
uint16_t pf_vsi_num;
uint8_t pf_id;
};
/**
* @enum ice_res_type
* @brief enum for type of resource registration
*
* enum for type of resource registration.
* created for plausible compatibility with IDC
*/
enum ice_res_type {
ICE_INVAL_RES = 0x0,
ICE_RDMA_QSET_ALLOC = 0x8,
ICE_RDMA_QSET_FREE = 0x18,
};
/**
* @struct ice_rdma_qset_params
* @brief struct to hold per RDMA Qset info
*/
struct ice_rdma_qset_params {
uint32_t teid; /* qset TEID */
uint16_t qs_handle; /* RDMA driver provides this */
uint16_t vsi_id; /* VSI index */
uint8_t tc; /* TC branch the QSet should belong to */
uint8_t reserved[3];
};
#define ICE_MAX_TXQ_PER_TXQG 128
/**
* @struct ice_rdma_qset_update
* @brief struct used to register and unregister qsets for RDMA driver
*/
struct ice_rdma_qset_update {
enum ice_res_type res_type;
uint16_t cnt_req;
uint16_t res_allocated;
uint32_t res_handle;
struct ice_rdma_qset_params qsets;
};
/**
* @enum ice_rdma_event_type
* @brief enum for type of event from base driver
*/
enum ice_rdma_event_type {
ICE_RDMA_EVENT_NONE = 0,
ICE_RDMA_EVENT_LINK_CHANGE,
ICE_RDMA_EVENT_MTU_CHANGE,
ICE_RDMA_EVENT_TC_CHANGE,
ICE_RDMA_EVENT_API_CHANGE,
ICE_RDMA_EVENT_CRIT_ERR,
ICE_RDMA_EVENT_RESET,
ICE_RDMA_EVENT_QSET_REGISTER,
ICE_RDMA_EVENT_VSI_FILTER_UPDATE,
ICE_RDMA_EVENT_LAST
};
/**
* @struct ice_rdma_event
* @brief struct for event information to pass to RDMA driver
*/
struct ice_rdma_event {
enum ice_rdma_event_type type;
union {
/* link change event */
struct {
int linkstate;
uint64_t baudrate;
};
/* MTU change event */
int mtu;
/*
* TC/QoS/DCB change event
* prep: if true, this is a pre-event, post-event otherwise
*/
struct {
struct ice_qos_params port_qos;
bool prep;
};
/*
* CRIT_ERR event
*/
uint32_t oicr_reg;
};
};
/**
* @struct ice_rdma_request
* @brief struct with data for a request from the RDMA driver
*/
struct ice_rdma_request {
enum ice_rdma_event_type type;
union {
struct {
struct ice_rdma_qset_update res;
};
struct {
bool enable_filter;
};
};
};
int ice_rdma_register(struct ice_rdma_info *info);
int ice_rdma_unregister(void);
#endif