diff options
| author | Piotr Raczynski <piotr.raczynski@intel.com> | 2023-05-15 21:03:17 +0200 | 
|---|---|---|
| committer | Tony Nguyen <anthony.l.nguyen@intel.com> | 2023-05-16 09:38:38 -0700 | 
| commit | 4aad5335969f25c4dc966a15c5497db3718538bb (patch) | |
| tree | d67e1744fdb2291c4ba427ae889b259757773f48 /drivers/net/ethernet/intel/ice/ice_main.c | |
| parent | 524012c69ee1421d4a343291a0cfc1998ccba99a (diff) | |
ice: add individual interrupt allocation
Currently interrupt allocations, depending on a feature are distributed
in batches. Also, after allocation there is a series of operations that
distributes per irq settings through that batch of interrupts.
Although driver does not yet support dynamic interrupt allocation, keep
allocated interrupts in a pool and add allocation abstraction logic to
make code more flexible. Keep per interrupt information in the
ice_q_vector structure, which yields ice_vsi::base_vector redundant.
Also, as a result there are a few functions that can be removed.
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Piotr Raczynski <piotr.raczynski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_main.c | 44 | 
1 files changed, 19 insertions, 25 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index ce8cd49ae10c..efc621c0bd6c 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -2490,7 +2490,6 @@ static int ice_vsi_req_irq_msix(struct ice_vsi *vsi, char *basename)  {  	int q_vectors = vsi->num_q_vectors;  	struct ice_pf *pf = vsi->back; -	int base = vsi->base_vector;  	struct device *dev;  	int rx_int_idx = 0;  	int tx_int_idx = 0; @@ -2501,7 +2500,7 @@ static int ice_vsi_req_irq_msix(struct ice_vsi *vsi, char *basename)  	for (vector = 0; vector < q_vectors; vector++) {  		struct ice_q_vector *q_vector = vsi->q_vectors[vector]; -		irq_num = pci_irq_vector(pf->pdev, base + vector); +		irq_num = q_vector->irq.virq;  		if (q_vector->tx.tx_ring && q_vector->rx.rx_ring) {  			snprintf(q_vector->name, sizeof(q_vector->name) - 1, @@ -2555,9 +2554,8 @@ static int ice_vsi_req_irq_msix(struct ice_vsi *vsi, char *basename)  	return 0;  free_q_irqs: -	while (vector) { -		vector--; -		irq_num = pci_irq_vector(pf->pdev, base + vector); +	while (vector--) { +		irq_num = vsi->q_vectors[vector]->irq.virq;  		if (!IS_ENABLED(CONFIG_RFS_ACCEL))  			irq_set_affinity_notifier(irq_num, NULL);  		irq_set_affinity_hint(irq_num, NULL); @@ -3047,7 +3045,7 @@ static void ice_ena_misc_vector(struct ice_pf *pf)  	wr32(hw, PFINT_OICR_ENA, val);  	/* SW_ITR_IDX = 0, but don't change INTENA */ -	wr32(hw, GLINT_DYN_CTL(pf->oicr_idx), +	wr32(hw, GLINT_DYN_CTL(pf->oicr_irq.index),  	     GLINT_DYN_CTL_SW_ITR_INDX_M | GLINT_DYN_CTL_INTENA_MSK_M);  } @@ -3234,7 +3232,7 @@ static void ice_dis_ctrlq_interrupts(struct ice_hw *hw)   */  static void ice_free_irq_msix_misc(struct ice_pf *pf)  { -	int misc_irq_num = pci_irq_vector(pf->pdev, pf->oicr_idx); +	int misc_irq_num = pf->oicr_irq.virq;  	struct ice_hw *hw = &pf->hw;  	ice_dis_ctrlq_interrupts(hw); @@ -3246,8 +3244,7 @@ static void ice_free_irq_msix_misc(struct ice_pf *pf)  	synchronize_irq(misc_irq_num);  	devm_free_irq(ice_pf_to_dev(pf), misc_irq_num, pf); -	pf->num_avail_sw_msix += 1; -	ice_free_res(pf->irq_tracker, pf->oicr_idx, ICE_RES_MISC_VEC_ID); +	ice_free_irq(pf, pf->oicr_irq);  }  /** @@ -3293,7 +3290,8 @@ static int ice_req_irq_msix_misc(struct ice_pf *pf)  {  	struct device *dev = ice_pf_to_dev(pf);  	struct ice_hw *hw = &pf->hw; -	int oicr_idx, err = 0; +	struct msi_map oicr_irq; +	int err = 0;  	if (!pf->int_name[0])  		snprintf(pf->int_name, sizeof(pf->int_name) - 1, "%s-%s:misc", @@ -3307,30 +3305,26 @@ static int ice_req_irq_msix_misc(struct ice_pf *pf)  		goto skip_req_irq;  	/* reserve one vector in irq_tracker for misc interrupts */ -	oicr_idx = ice_get_res(pf, pf->irq_tracker, 1, ICE_RES_MISC_VEC_ID); -	if (oicr_idx < 0) -		return oicr_idx; - -	pf->num_avail_sw_msix -= 1; -	pf->oicr_idx = (u16)oicr_idx; - -	err = devm_request_threaded_irq(dev, -					pci_irq_vector(pf->pdev, pf->oicr_idx), -					ice_misc_intr, ice_misc_intr_thread_fn, -					0, pf->int_name, pf); +	oicr_irq = ice_alloc_irq(pf); +	if (oicr_irq.index < 0) +		return oicr_irq.index; + +	pf->oicr_irq = oicr_irq; +	err = devm_request_threaded_irq(dev, pf->oicr_irq.virq, ice_misc_intr, +					ice_misc_intr_thread_fn, 0, +					pf->int_name, pf);  	if (err) {  		dev_err(dev, "devm_request_threaded_irq for %s failed: %d\n",  			pf->int_name, err); -		ice_free_res(pf->irq_tracker, 1, ICE_RES_MISC_VEC_ID); -		pf->num_avail_sw_msix += 1; +		ice_free_irq(pf, pf->oicr_irq);  		return err;  	}  skip_req_irq:  	ice_ena_misc_vector(pf); -	ice_ena_ctrlq_interrupts(hw, pf->oicr_idx); -	wr32(hw, GLINT_ITR(ICE_RX_ITR, pf->oicr_idx), +	ice_ena_ctrlq_interrupts(hw, pf->oicr_irq.index); +	wr32(hw, GLINT_ITR(ICE_RX_ITR, pf->oicr_irq.index),  	     ITR_REG_ALIGN(ICE_ITR_8K) >> ICE_ITR_GRAN_S);  	ice_flush(hw);  | 
