aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ice/ice_iflib.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ice/ice_iflib.h')
-rw-r--r--sys/dev/ice/ice_iflib.h358
1 files changed, 358 insertions, 0 deletions
diff --git a/sys/dev/ice/ice_iflib.h b/sys/dev/ice/ice_iflib.h
new file mode 100644
index 000000000000..e1d5307a9516
--- /dev/null
+++ b/sys/dev/ice/ice_iflib.h
@@ -0,0 +1,358 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/* Copyright (c) 2024, 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_iflib.h
+ * @brief main header for the iflib driver implementation
+ *
+ * Contains the definitions for various structures used by the iflib driver
+ * implementation, including the Tx and Rx queue structures and the ice_softc
+ * structure.
+ */
+
+#ifndef _ICE_IFLIB_H_
+#define _ICE_IFLIB_H_
+
+/* include kernel options first */
+#include "ice_opts.h"
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <net/if.h>
+#include <net/if_var.h>
+#include <net/if_media.h>
+#include <net/ethernet.h>
+#include <net/iflib.h>
+#include "ifdi_if.h"
+
+#include "ice_lib.h"
+#include "ice_osdep.h"
+#include "ice_resmgr.h"
+#include "ice_type.h"
+#include "ice_features.h"
+
+/**
+ * ASSERT_CTX_LOCKED - Assert that the iflib context lock is held
+ * @sc: ice softc pointer
+ *
+ * Macro to trigger an assertion if the iflib context lock is not
+ * currently held.
+ */
+#define ASSERT_CTX_LOCKED(sc) sx_assert((sc)->iflib_ctx_lock, SA_XLOCKED)
+
+/**
+ * IFLIB_CTX_LOCK - lock the iflib context lock
+ * @sc: ice softc pointer
+ *
+ * Macro used to unlock the iflib context lock.
+ */
+#define IFLIB_CTX_LOCK(sc) sx_xlock((sc)->iflib_ctx_lock)
+
+/**
+ * IFLIB_CTX_UNLOCK - unlock the iflib context lock
+ * @sc: ice softc pointer
+ *
+ * Macro used to unlock the iflib context lock.
+ */
+#define IFLIB_CTX_UNLOCK(sc) sx_xunlock((sc)->iflib_ctx_lock)
+
+/**
+ * ASSERT_CFG_LOCKED - Assert that a configuration lock is held
+ * @sc: ice softc pointer
+ *
+ * Macro used by ice_lib.c to verify that certain functions are called while
+ * holding a configuration lock. For the iflib implementation, this will be
+ * the iflib context lock.
+ */
+#define ASSERT_CFG_LOCKED(sc) ASSERT_CTX_LOCKED(sc)
+
+/**
+ * ICE_IFLIB_MAX_DESC_COUNT - Maximum ring size for iflib
+ *
+ * The iflib stack currently requires that the ring size, or number of
+ * descriptors, be a power of 2. The ice hardware is limited to a maximum of
+ * 8160 descriptors, which is not quite 2^13. Limit the maximum ring size for
+ * iflib to just 2^12 (4096).
+ */
+#define ICE_IFLIB_MAX_DESC_COUNT 4096
+
+/**
+ * @struct ice_irq_vector
+ * @brief Driver irq vector structure
+ *
+ * ice_lib.c requires the following parameters
+ * @me: the vector number
+ *
+ * Other parameters may be iflib driver specific
+ *
+ * The iflib driver uses a single hardware interrupt per Rx queue, and uses
+ * software interrupts for the Tx queues.
+ */
+struct ice_irq_vector {
+ u32 me;
+
+ struct if_irq irq;
+};
+
+/**
+ * @struct ice_tx_queue
+ * @brief Driver Tx queue structure
+ *
+ * ice_lib.c requires the following parameters:
+ * @vsi: backpointer the VSI structure
+ * @me: this queue's index into the queue array
+ * @irqv: always NULL for iflib
+ * @desc_count: the number of descriptors
+ * @tx_paddr: the physical address for this queue
+ * @q_teid: the Tx queue TEID returned from firmware
+ * @stats: queue statistics
+ * @tc: traffic class queue belongs to
+ * @q_handle: qidx in tc; used in TXQ enable functions
+ *
+ * ice_iov.c requires the following parameters (when PCI_IOV is defined):
+ * @itr_idx: ITR index to use for this queue
+ *
+ * Other parameters may be iflib driver specific
+ */
+struct ice_tx_queue {
+ struct ice_vsi *vsi;
+ struct ice_tx_desc *tx_base;
+ bus_addr_t tx_paddr;
+ struct tx_stats stats;
+ u16 desc_count;
+ u32 tail;
+ struct ice_irq_vector *irqv;
+ u32 q_teid;
+ u32 me;
+ u16 q_handle;
+ u8 tc;
+#ifdef PCI_IOV
+ u8 itr_idx;
+#endif
+
+ /* descriptor writeback status */
+ qidx_t *tx_rsq;
+ qidx_t tx_rs_cidx;
+ qidx_t tx_rs_pidx;
+ qidx_t tx_cidx_processed;
+};
+
+/**
+ * @struct ice_rx_queue
+ * @brief Driver Rx queue structure
+ *
+ * ice_lib.c requires the following parameters:
+ * @vsi: backpointer the VSI structure
+ * @me: this queue's index into the queue array
+ * @irqv: pointer to vector structure associated with this queue
+ * @desc_count: the number of descriptors
+ * @rx_paddr: the physical address for this queue
+ * @tail: the tail register address for this queue
+ * @stats: queue statistics
+ * @tc: traffic class queue belongs to
+ *
+ * ice_iov.c requires the following parameters (when PCI_IOV is defined):
+ * @itr_idx: ITR index to use for this queue
+ *
+ * Other parameters may be iflib driver specific
+ */
+struct ice_rx_queue {
+ struct ice_vsi *vsi;
+ union ice_32b_rx_flex_desc *rx_base;
+ bus_addr_t rx_paddr;
+ struct rx_stats stats;
+ u16 desc_count;
+ u32 tail;
+ struct ice_irq_vector *irqv;
+ u32 me;
+ u8 tc;
+#ifdef PCI_IOV
+ u8 itr_idx;
+#endif
+
+ struct if_irq que_irq;
+};
+
+/**
+ * @struct ice_mirr_if
+ * @brief structure representing a mirroring interface
+ */
+struct ice_mirr_if {
+ struct ice_softc *back;
+ struct ifnet *ifp;
+ struct ice_vsi *vsi;
+
+ device_t subdev;
+ if_ctx_t subctx;
+ if_softc_ctx_t subscctx;
+
+ u16 num_irq_vectors;
+ u16 *if_imap;
+ u16 *os_imap;
+ struct ice_irq_vector *rx_irqvs;
+
+ u32 state;
+
+ bool if_attached;
+};
+
+/**
+ * @struct ice_softc
+ * @brief main structure representing one device
+ *
+ * ice_lib.c requires the following parameters
+ * @all_vsi: the array of all allocated VSIs
+ * @debug_sysctls: sysctl node for debug sysctls
+ * @dev: device_t pointer
+ * @feat_en: bitmap of enabled driver features
+ * @hw: embedded ice_hw structure
+ * @ifp: pointer to the ifnet structure
+ * @link_up: boolean indicating if link is up
+ * @num_available_vsi: size of the VSI array
+ * @pf_vsi: embedded VSI structure for the main PF VSI
+ * @rx_qmgr: queue manager for Rx queues
+ * @soft_stats: software statistics for this device
+ * @state: driver state flags
+ * @stats: hardware statistics for this device
+ * @tx_qmgr: queue manager for Tx queues
+ * @vsi_sysctls: sysctl node for all VSI sysctls
+ * @enable_tx_fc_filter: boolean indicating if the Tx FC filter is enabled
+ * @enable_tx_lldp_filter: boolean indicating if the Tx LLDP filter is enabled
+ * @rebuild_ticks: indicates when a post-reset rebuild started
+ * @imgr: resource manager for interrupt allocations
+ * @pf_imap: interrupt mapping for PF LAN interrupts
+ * @lan_vectors: # of vectors used by LAN driver (length of pf_imap)
+ * @ldo_tlv: LAN Default Override settings from NVM
+ *
+ * ice_iov.c requires the following parameters (when PCI_IOV is defined):
+ * @vfs: array of VF context structures
+ * @num_vfs: number of VFs to use for SR-IOV
+ *
+ * The main representation for a single OS device, used to represent a single
+ * physical function.
+ */
+struct ice_softc {
+ struct ice_hw hw;
+ struct ice_vsi pf_vsi; /* Main PF VSI */
+
+ char admin_mtx_name[16]; /* name of the admin mutex */
+ struct mtx admin_mtx; /* mutex to protect the admin timer */
+ struct callout admin_timer; /* timer to trigger admin task */
+
+ /* iRDMA peer interface */
+ struct ice_rdma_entry rdma_entry;
+ int irdma_vectors;
+ u16 *rdma_imap;
+
+ struct ice_vsi **all_vsi; /* Array of VSI pointers */
+ u16 num_available_vsi; /* Size of VSI array */
+
+ struct sysctl_oid *vsi_sysctls; /* Sysctl node for VSI sysctls */
+ struct sysctl_oid *debug_sysctls; /* Sysctl node for debug sysctls */
+
+ device_t dev;
+ if_ctx_t ctx;
+ if_shared_ctx_t sctx;
+ if_softc_ctx_t scctx;
+ struct ifmedia *media;
+ struct ifnet *ifp;
+
+ /* device statistics */
+ struct ice_pf_hw_stats stats;
+ struct ice_pf_sw_stats soft_stats;
+
+ /* Tx/Rx queue managers */
+ struct ice_resmgr tx_qmgr;
+ struct ice_resmgr rx_qmgr;
+
+ /* Interrupt allocation manager */
+ struct ice_resmgr dev_imgr;
+ u16 *pf_imap;
+ int lan_vectors;
+
+ /* iflib Tx/Rx queue count sysctl values */
+ int ifc_sysctl_ntxqs;
+ int ifc_sysctl_nrxqs;
+
+ /* IRQ Vector data */
+ struct resource *msix_table;
+ int num_irq_vectors;
+ struct ice_irq_vector *irqvs;
+
+ /* BAR info */
+ struct ice_bar_info bar0;
+
+ /* link status */
+ bool link_up;
+
+ /* Ethertype filters enabled */
+ bool enable_tx_fc_filter;
+ bool enable_tx_lldp_filter;
+
+ /* Other tunable flags */
+ bool enable_health_events;
+
+ /* 5-layer scheduler topology enabled */
+ bool tx_balance_en;
+
+ /* Allow additional non-standard FEC mode */
+ bool allow_no_fec_mod_in_auto;
+
+ int rebuild_ticks;
+
+ /* driver state flags, only access using atomic functions */
+ u32 state;
+
+ /* NVM link override settings */
+ struct ice_link_default_override_tlv ldo_tlv;
+
+ u32 fw_debug_dump_cluster_mask;
+
+ struct sx *iflib_ctx_lock;
+
+ /* Tri-state feature flags (capable/enabled) */
+ ice_declare_bitmap(feat_cap, ICE_FEATURE_COUNT);
+ ice_declare_bitmap(feat_en, ICE_FEATURE_COUNT);
+
+#ifdef PCI_IOV
+ struct ice_vf *vfs;
+ u16 num_vfs;
+#endif
+ struct ice_resmgr os_imgr;
+ /* For mirror interface */
+ struct ice_mirr_if *mirr_if;
+ int extra_vectors;
+ int last_rid;
+};
+
+#endif /* _ICE_IFLIB_H_ */