Re: kill off pci_enable_msi_{exact,range}

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jan 13, 2017 at 09:05:53AM +0100, Christoph Hellwig wrote:
> On Fri, Jan 13, 2017 at 08:55:03AM +0100, Christoph Hellwig wrote:
> > On Thu, Jan 12, 2017 at 03:29:00PM -0600, Bjorn Helgaas wrote:
> > > Applied all three (with Tom's ack on the amd-xgbe patch) to pci/msi for
> > > v4.11, thanks!
> > 
> > Tom had just send me an event better version of the xgbe patch.  Tom,
> > maybe you can resend that relative to the PCI tree [1], so that we don't
> > lose it for next merge window?
> 
> Actually - Bjorn, your msi branch contains an empty commit from this
> thread:
> 
> 	https://git.kernel.org/cgit/linux/kernel/git/helgaas/pci.git/commit/?h=pci/msi&id=7a8191de43faa9869b421a1b06075d8126ce7c0b

Yep, I botched that.  Thought I'd fixed it, but guess I got distracted.

> Maybe we should rebase it after all to avoid that?  In that case please
> pick up the xgbe patch from Tom below:

I dropped the empty commit and replaced the xgbe patch with the one below.
Can you take a look at [1] and make sure it's what you expected?

[1] https://git.kernel.org/cgit/linux/kernel/git/helgaas/pci.git/log/?h=pci/msi

Thanks!

> ---
> From: Tom Lendacky <thomas.lendacky@xxxxxxx>
> Subject: [PATCH] amd-xgbe: Update PCI support to use new IRQ functions
> 
> Some of the PCI MSI/MSI-X functions have been deprecated and it is
> recommended to use the new pci_alloc_irq_vectors() function. Convert
> the code over to use the new function. Also, modify the way in which
> the IRQs are requested - try for multiple MSI-X/MSI first, then a
> single MSI/legacy interrupt.
> 
> Signed-off-by: Tom Lendacky <thomas.lendacky@xxxxxxx>
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>
> ---
>  drivers/net/ethernet/amd/xgbe/xgbe-pci.c |  128 +++++++++---------------------
>  drivers/net/ethernet/amd/xgbe/xgbe.h     |    8 +-
>  2 files changed, 41 insertions(+), 95 deletions(-)
> 
> diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-pci.c b/drivers/net/ethernet/amd/xgbe/xgbe-pci.c
> index e76b7f6..e436902 100644
> --- a/drivers/net/ethernet/amd/xgbe/xgbe-pci.c
> +++ b/drivers/net/ethernet/amd/xgbe/xgbe-pci.c
> @@ -122,104 +122,40 @@
>  #include "xgbe.h"
>  #include "xgbe-common.h"
>  
> -static int xgbe_config_msi(struct xgbe_prv_data *pdata)
> +static int xgbe_config_multi_msi(struct xgbe_prv_data *pdata)
>  {
> -	unsigned int msi_count;
> +	unsigned int vector_count;
>  	unsigned int i, j;
>  	int ret;
>  
> -	msi_count = XGBE_MSIX_BASE_COUNT;
> -	msi_count += max(pdata->rx_ring_count,
> -			 pdata->tx_ring_count);
> -	msi_count = roundup_pow_of_two(msi_count);
> +	vector_count = XGBE_MSI_BASE_COUNT;
> +	vector_count += max(pdata->rx_ring_count,
> +			    pdata->tx_ring_count);
>  
> -	ret = pci_enable_msi_exact(pdata->pcidev, msi_count);
> +	ret = pci_alloc_irq_vectors(pdata->pcidev, XGBE_MSI_MIN_COUNT,
> +				    vector_count, PCI_IRQ_MSI | PCI_IRQ_MSIX);
>  	if (ret < 0) {
> -		dev_info(pdata->dev, "MSI request for %u interrupts failed\n",
> -			 msi_count);
> -
> -		ret = pci_enable_msi(pdata->pcidev);
> -		if (ret < 0) {
> -			dev_info(pdata->dev, "MSI enablement failed\n");
> -			return ret;
> -		}
> -
> -		msi_count = 1;
> -	}
> -
> -	pdata->irq_count = msi_count;
> -
> -	pdata->dev_irq = pdata->pcidev->irq;
> -
> -	if (msi_count > 1) {
> -		pdata->ecc_irq = pdata->pcidev->irq + 1;
> -		pdata->i2c_irq = pdata->pcidev->irq + 2;
> -		pdata->an_irq = pdata->pcidev->irq + 3;
> -
> -		for (i = XGBE_MSIX_BASE_COUNT, j = 0;
> -		     (i < msi_count) && (j < XGBE_MAX_DMA_CHANNELS);
> -		     i++, j++)
> -			pdata->channel_irq[j] = pdata->pcidev->irq + i;
> -		pdata->channel_irq_count = j;
> -
> -		pdata->per_channel_irq = 1;
> -		pdata->channel_irq_mode = XGBE_IRQ_MODE_LEVEL;
> -	} else {
> -		pdata->ecc_irq = pdata->pcidev->irq;
> -		pdata->i2c_irq = pdata->pcidev->irq;
> -		pdata->an_irq = pdata->pcidev->irq;
> -	}
> -
> -	if (netif_msg_probe(pdata))
> -		dev_dbg(pdata->dev, "MSI interrupts enabled\n");
> -
> -	return 0;
> -}
> -
> -static int xgbe_config_msix(struct xgbe_prv_data *pdata)
> -{
> -	unsigned int msix_count;
> -	unsigned int i, j;
> -	int ret;
> -
> -	msix_count = XGBE_MSIX_BASE_COUNT;
> -	msix_count += max(pdata->rx_ring_count,
> -			  pdata->tx_ring_count);
> -
> -	pdata->msix_entries = devm_kcalloc(pdata->dev, msix_count,
> -					   sizeof(struct msix_entry),
> -					   GFP_KERNEL);
> -	if (!pdata->msix_entries)
> -		return -ENOMEM;
> -
> -	for (i = 0; i < msix_count; i++)
> -		pdata->msix_entries[i].entry = i;
> -
> -	ret = pci_enable_msix_range(pdata->pcidev, pdata->msix_entries,
> -				    XGBE_MSIX_MIN_COUNT, msix_count);
> -	if (ret < 0) {
> -		dev_info(pdata->dev, "MSI-X enablement failed\n");
> -		devm_kfree(pdata->dev, pdata->msix_entries);
> -		pdata->msix_entries = NULL;
> +		dev_info(pdata->dev, "multi MSI/MSI-X enablement failed\n");
>  		return ret;
>  	}
>  
>  	pdata->irq_count = ret;
>  
> -	pdata->dev_irq = pdata->msix_entries[0].vector;
> -	pdata->ecc_irq = pdata->msix_entries[1].vector;
> -	pdata->i2c_irq = pdata->msix_entries[2].vector;
> -	pdata->an_irq = pdata->msix_entries[3].vector;
> +	pdata->dev_irq = pci_irq_vector(pdata->pcidev, 0);
> +	pdata->ecc_irq = pci_irq_vector(pdata->pcidev, 1);
> +	pdata->i2c_irq = pci_irq_vector(pdata->pcidev, 2);
> +	pdata->an_irq = pci_irq_vector(pdata->pcidev, 3);
>  
> -	for (i = XGBE_MSIX_BASE_COUNT, j = 0; i < ret; i++, j++)
> -		pdata->channel_irq[j] = pdata->msix_entries[i].vector;
> +	for (i = XGBE_MSI_BASE_COUNT, j = 0; i < ret; i++, j++)
> +		pdata->channel_irq[j] = pci_irq_vector(pdata->pcidev, i);
>  	pdata->channel_irq_count = j;
>  
>  	pdata->per_channel_irq = 1;
>  	pdata->channel_irq_mode = XGBE_IRQ_MODE_LEVEL;
>  
>  	if (netif_msg_probe(pdata))
> -		dev_dbg(pdata->dev, "MSI-X interrupts enabled\n");
> +		dev_dbg(pdata->dev, "multi %s interrupts enabled\n",
> +			pdata->pcidev->msix_enabled ? "MSI-X" : "MSI");
>  
>  	return 0;
>  }
> @@ -228,21 +164,28 @@ static int xgbe_config_irqs(struct xgbe_prv_data *pdata)
>  {
>  	int ret;
>  
> -	ret = xgbe_config_msix(pdata);
> +	ret = xgbe_config_multi_msi(pdata);
>  	if (!ret)
>  		goto out;
>  
> -	ret = xgbe_config_msi(pdata);
> -	if (!ret)
> -		goto out;
> +	ret = pci_alloc_irq_vectors(pdata->pcidev, 1, 1,
> +				    PCI_IRQ_LEGACY | PCI_IRQ_MSI);
> +	if (ret < 0) {
> +		dev_info(pdata->dev, "single IRQ enablement failed\n");
> +		return ret;
> +	}
>  
>  	pdata->irq_count = 1;
> -	pdata->irq_shared = 1;
> +	pdata->channel_irq_count = 1;
> +
> +	pdata->dev_irq = pci_irq_vector(pdata->pcidev, 0);
> +	pdata->ecc_irq = pci_irq_vector(pdata->pcidev, 0);
> +	pdata->i2c_irq = pci_irq_vector(pdata->pcidev, 0);
> +	pdata->an_irq = pci_irq_vector(pdata->pcidev, 0);
>  
> -	pdata->dev_irq = pdata->pcidev->irq;
> -	pdata->ecc_irq = pdata->pcidev->irq;
> -	pdata->i2c_irq = pdata->pcidev->irq;
> -	pdata->an_irq = pdata->pcidev->irq;
> +	if (netif_msg_probe(pdata))
> +		dev_dbg(pdata->dev, "single %s interrupt enabled\n",
> +			pdata->pcidev->msi_enabled ?  "MSI" : "legacy");
>  
>  out:
>  	if (netif_msg_probe(pdata)) {
> @@ -412,12 +355,15 @@ static int xgbe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
>  	/* Configure the netdev resource */
>  	ret = xgbe_config_netdev(pdata);
>  	if (ret)
> -		goto err_pci_enable;
> +		goto err_irq_vectors;
>  
>  	netdev_notice(pdata->netdev, "net device enabled\n");
>  
>  	return 0;
>  
> +err_irq_vectors:
> +	pci_free_irq_vectors(pdata->pcidev);
> +
>  err_pci_enable:
>  	xgbe_free_pdata(pdata);
>  
> @@ -433,6 +379,8 @@ static void xgbe_pci_remove(struct pci_dev *pdev)
>  
>  	xgbe_deconfig_netdev(pdata);
>  
> +	pci_free_irq_vectors(pdata->pcidev);
> +
>  	xgbe_free_pdata(pdata);
>  }
>  
> diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h
> index f52a9bd..99f1c87 100644
> --- a/drivers/net/ethernet/amd/xgbe/xgbe.h
> +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h
> @@ -211,9 +211,9 @@
>  #define XGBE_MAC_PROP_OFFSET	0x1d000
>  #define XGBE_I2C_CTRL_OFFSET	0x1e000
>  
> -/* PCI MSIx support */
> -#define XGBE_MSIX_BASE_COUNT	4
> -#define XGBE_MSIX_MIN_COUNT	(XGBE_MSIX_BASE_COUNT + 1)
> +/* PCI MSI/MSIx support */
> +#define XGBE_MSI_BASE_COUNT	4
> +#define XGBE_MSI_MIN_COUNT	(XGBE_MSI_BASE_COUNT + 1)
>  
>  /* PCI clock frequencies */
>  #define XGBE_V2_DMA_CLOCK_FREQ	500000000	/* 500 MHz */
> @@ -980,14 +980,12 @@ struct xgbe_prv_data {
>  	unsigned int desc_ded_count;
>  	unsigned int desc_sec_count;
>  
> -	struct msix_entry *msix_entries;
>  	int dev_irq;
>  	int ecc_irq;
>  	int i2c_irq;
>  	int channel_irq[XGBE_MAX_DMA_CHANNELS];
>  
>  	unsigned int per_channel_irq;
> -	unsigned int irq_shared;
>  	unsigned int irq_count;
>  	unsigned int channel_irq_count;
>  	unsigned int channel_irq_mode;
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux