diff mbox series

[iwl-next,2/2] ice: look up VF MSI-X index from q_vector->irq.index

Message ID 20240319203328.890350-3-jacob.e.keller@intel.com
State Changes Requested
Headers show
Series ice: minor cleanups for VF IRQ logic | expand

Commit Message

Jacob Keller March 19, 2024, 8:33 p.m. UTC
The ice physical function driver needs to configure the association of
queues and interrupts on behalf of its virtual functions. This is done over
virtchnl by the VF sending messages during its initialization phase. These
messages contain a vector_id which the VF wants to associate with a given
queue. This ID is relative to the VF space, where 0 indicates the control
IRQ for non-queue interrupts.

When programming the mapping, the PF driver currently passes this vector_id
directly to the low level functions for programming. This works for SR-IOV,
because the hardware uses the VF-based indexing for interrupts.

The future Scalable IOV work does not use VF-based indexing, as the
interrupts are used from the PF space and mapped via VFIO into the VM.
Thus, the interrupt indexes used on the PF are PF-based. To handle this,
the driver will need to be able to locate the proper index for programming
the hardware registers. For standard IRQs allocated from the PF area, this
would just  be the irq.index field.

This field is currently unused for SR-IOV. When initializing the queue
vectors for ICE_VSI_VF, populate the irq.index field appropriately. Replace
the direct use of the vector_id parameter passed from VF with the
q_vector->irq.index when programming the queues.

Now that we lookup the vector_id from the q_vector structure, we no longer
need to pass the value as a parameter in ice_cfg_interrupt. Also notice
that this function returns an int, but then is cast to the virtchnl error
enumeration, virtchnl_status_code. Update the return type to indicate it
does not return an integer error code. We can't use normal error codes here
because the return values are passed across the virtchnl interface.

This prepares the virtchnl logic for configuring interrupts to support the
upcoming Scalable IOV VFs, without breaking existing SR-IOV functionality.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
---
 drivers/net/ethernet/intel/ice/ice_base.c     |  6 ++++++
 drivers/net/ethernet/intel/ice/ice_virtchnl.c | 12 +++++-------
 2 files changed, 11 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/drivers/net/ethernet/intel/ice/ice_base.c b/drivers/net/ethernet/intel/ice/ice_base.c
index 662fc395edcc..013b3509028a 100644
--- a/drivers/net/ethernet/intel/ice/ice_base.c
+++ b/drivers/net/ethernet/intel/ice/ice_base.c
@@ -122,6 +122,12 @@  static int ice_vsi_alloc_q_vector(struct ice_vsi *vsi, u16 v_idx)
 
 	if (vsi->type == ICE_VSI_VF) {
 		q_vector->reg_idx = ice_calc_vf_reg_idx(vsi->vf, q_vector);
+		/* The index value is used to configure the hardware when
+		 * programming the Tx and Rx queues. It is relative to each VF
+		 * but must account for the non-queue vectors associated with
+		 * that VF.
+		 */
+		q_vector->irq.index = v_idx + ICE_NONQ_VECS_VF;
 		goto out;
 	} else if (vsi->type == ICE_VSI_CTRL && vsi->vf) {
 		struct ice_vsi *ctrl_vsi = ice_get_vf_ctrl_vsi(pf, vsi);
diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl.c b/drivers/net/ethernet/intel/ice/ice_virtchnl.c
index 1ff9818b4c84..2d20cfc97647 100644
--- a/drivers/net/ethernet/intel/ice/ice_virtchnl.c
+++ b/drivers/net/ethernet/intel/ice/ice_virtchnl.c
@@ -1505,13 +1505,12 @@  static int ice_vc_dis_qs_msg(struct ice_vf *vf, u8 *msg)
  * ice_cfg_interrupt
  * @vf: pointer to the VF info
  * @vsi: the VSI being configured
- * @vector_id: vector ID
  * @map: vector map for mapping vectors to queues
  * @q_vector: structure for interrupt vector
  * configure the IRQ to queue map
  */
-static int
-ice_cfg_interrupt(struct ice_vf *vf, struct ice_vsi *vsi, u16 vector_id,
+static enum virtchnl_status_code
+ice_cfg_interrupt(struct ice_vf *vf, struct ice_vsi *vsi,
 		  struct virtchnl_vector_map *map,
 		  struct ice_q_vector *q_vector)
 {
@@ -1531,7 +1530,7 @@  ice_cfg_interrupt(struct ice_vf *vf, struct ice_vsi *vsi, u16 vector_id,
 		q_vector->num_ring_rx++;
 		q_vector->rx.itr_idx = map->rxitr_idx;
 		vsi->rx_rings[vsi_q_id]->q_vector = q_vector;
-		ice_cfg_rxq_interrupt(vsi, vsi_q_id, vector_id,
+		ice_cfg_rxq_interrupt(vsi, vsi_q_id, q_vector->irq.index,
 				      q_vector->rx.itr_idx);
 	}
 
@@ -1545,7 +1544,7 @@  ice_cfg_interrupt(struct ice_vf *vf, struct ice_vsi *vsi, u16 vector_id,
 		q_vector->num_ring_tx++;
 		q_vector->tx.itr_idx = map->txitr_idx;
 		vsi->tx_rings[vsi_q_id]->q_vector = q_vector;
-		ice_cfg_txq_interrupt(vsi, vsi_q_id, vector_id,
+		ice_cfg_txq_interrupt(vsi, vsi_q_id, q_vector->irq.index,
 				      q_vector->tx.itr_idx);
 	}
 
@@ -1619,8 +1618,7 @@  static int ice_vc_cfg_irq_map_msg(struct ice_vf *vf, u8 *msg)
 		}
 
 		/* lookout for the invalid queue index */
-		v_ret = (enum virtchnl_status_code)
-			ice_cfg_interrupt(vf, vsi, vector_id, map, q_vector);
+		v_ret = ice_cfg_interrupt(vf, vsi, map, q_vector);
 		if (v_ret)
 			goto error_param;
 	}