Message ID | 20221025181124.421628-1-Raju.Rangoju@amd.com |
---|---|
State | New |
Headers | show |
Series | i2c: amd-mp2: use msix/msi if the hardware supports | expand |
On 10/25/2022 11:41 PM, Raju Rangoju wrote: > Use msix or msi interrupts if the hardware supports it. Else, fallback to > legacy interrupts. > > Fixes: 529766e0a011 ("i2c: Add drivers for the AMD PCIe MP2 I2C controller") > Co-developed-by: Basavaraj Natikar <basavaraj.natikar@amd.com> > Signed-off-by: Basavaraj Natikar <basavaraj.natikar@amd.com> > Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com> Looks good to me. Acked-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> > --- > drivers/i2c/busses/i2c-amd-mp2-pci.c | 30 +++++++++++++++++++--------- > drivers/i2c/busses/i2c-amd-mp2.h | 1 + > 2 files changed, 22 insertions(+), 9 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-amd-mp2-pci.c b/drivers/i2c/busses/i2c-amd-mp2-pci.c > index f57077a7448d..143165300949 100644 > --- a/drivers/i2c/busses/i2c-amd-mp2-pci.c > +++ b/drivers/i2c/busses/i2c-amd-mp2-pci.c > @@ -288,7 +288,7 @@ static void amd_mp2_clear_reg(struct amd_mp2_dev *privdata) > static int amd_mp2_pci_init(struct amd_mp2_dev *privdata, > struct pci_dev *pci_dev) > { > - int rc; > + int irq_flag = 0, rc; > > pci_set_drvdata(pci_dev, privdata); > > @@ -311,17 +311,29 @@ static int amd_mp2_pci_init(struct amd_mp2_dev *privdata, > if (rc) > goto err_dma_mask; > > - /* Set up intx irq */ > + /* request and enable interrupt */ > writel(0, privdata->mmio + AMD_P2C_MSG_INTEN); > - pci_intx(pci_dev, 1); > - rc = devm_request_irq(&pci_dev->dev, pci_dev->irq, amd_mp2_irq_isr, > - IRQF_SHARED, dev_name(&pci_dev->dev), privdata); > - if (rc) > - pci_err(pci_dev, "Failure requesting irq %i: %d\n", > - pci_dev->irq, rc); > + rc = pci_alloc_irq_vectors(pci_dev, 1, 1, PCI_IRQ_ALL_TYPES); > + if (rc < 0) { > + dev_err(&pci_dev->dev, "Failed to allocate single IRQ err=%d\n", rc); > + goto err_dma_mask; > + } > + > + privdata->dev_irq = pci_irq_vector(pci_dev, 0); > + if (!pci_dev->msix_enabled && !pci_dev->msi_enabled) > + irq_flag = IRQF_SHARED; > + > + rc = devm_request_irq(&pci_dev->dev, privdata->dev_irq, > + amd_mp2_irq_isr, irq_flag, dev_name(&pci_dev->dev), privdata); > + if (rc) { > + pci_err(pci_dev, "Failure requesting irq %i: %d\n", privdata->dev_irq, rc); > + goto free_irq_vectors; > + } > > return rc; > > +free_irq_vectors: > + free_irq(privdata->dev_irq, privdata); > err_dma_mask: > pci_clear_master(pci_dev); > err_pci_enable: > @@ -364,7 +376,7 @@ static void amd_mp2_pci_remove(struct pci_dev *pci_dev) > pm_runtime_forbid(&pci_dev->dev); > pm_runtime_get_noresume(&pci_dev->dev); > > - pci_intx(pci_dev, 0); > + free_irq(privdata->dev_irq, privdata); > pci_clear_master(pci_dev); > > amd_mp2_clear_reg(privdata); > diff --git a/drivers/i2c/busses/i2c-amd-mp2.h b/drivers/i2c/busses/i2c-amd-mp2.h > index ddecd0c88656..018a42de8b1e 100644 > --- a/drivers/i2c/busses/i2c-amd-mp2.h > +++ b/drivers/i2c/busses/i2c-amd-mp2.h > @@ -183,6 +183,7 @@ struct amd_mp2_dev { > struct mutex c2p_lock; > u8 c2p_lock_busid; > unsigned int probed; > + int dev_irq; > }; > > /* PCIe communication driver */ >
On Tue, Oct 25, 2022 at 11:41:24PM +0530, Raju Rangoju wrote: > Use msix or msi interrupts if the hardware supports it. Else, fallback to > legacy interrupts. > > Fixes: 529766e0a011 ("i2c: Add drivers for the AMD PCIe MP2 I2C controller") > Co-developed-by: Basavaraj Natikar <basavaraj.natikar@amd.com> > Signed-off-by: Basavaraj Natikar <basavaraj.natikar@amd.com> > Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com> Applied to for-next, thanks!
> > Fixes: 529766e0a011 ("i2c: Add drivers for the AMD PCIe MP2 I2C controller")
I dropped this Fixes tag, though. Looks like a new feature to me.
diff --git a/drivers/i2c/busses/i2c-amd-mp2-pci.c b/drivers/i2c/busses/i2c-amd-mp2-pci.c index f57077a7448d..143165300949 100644 --- a/drivers/i2c/busses/i2c-amd-mp2-pci.c +++ b/drivers/i2c/busses/i2c-amd-mp2-pci.c @@ -288,7 +288,7 @@ static void amd_mp2_clear_reg(struct amd_mp2_dev *privdata) static int amd_mp2_pci_init(struct amd_mp2_dev *privdata, struct pci_dev *pci_dev) { - int rc; + int irq_flag = 0, rc; pci_set_drvdata(pci_dev, privdata); @@ -311,17 +311,29 @@ static int amd_mp2_pci_init(struct amd_mp2_dev *privdata, if (rc) goto err_dma_mask; - /* Set up intx irq */ + /* request and enable interrupt */ writel(0, privdata->mmio + AMD_P2C_MSG_INTEN); - pci_intx(pci_dev, 1); - rc = devm_request_irq(&pci_dev->dev, pci_dev->irq, amd_mp2_irq_isr, - IRQF_SHARED, dev_name(&pci_dev->dev), privdata); - if (rc) - pci_err(pci_dev, "Failure requesting irq %i: %d\n", - pci_dev->irq, rc); + rc = pci_alloc_irq_vectors(pci_dev, 1, 1, PCI_IRQ_ALL_TYPES); + if (rc < 0) { + dev_err(&pci_dev->dev, "Failed to allocate single IRQ err=%d\n", rc); + goto err_dma_mask; + } + + privdata->dev_irq = pci_irq_vector(pci_dev, 0); + if (!pci_dev->msix_enabled && !pci_dev->msi_enabled) + irq_flag = IRQF_SHARED; + + rc = devm_request_irq(&pci_dev->dev, privdata->dev_irq, + amd_mp2_irq_isr, irq_flag, dev_name(&pci_dev->dev), privdata); + if (rc) { + pci_err(pci_dev, "Failure requesting irq %i: %d\n", privdata->dev_irq, rc); + goto free_irq_vectors; + } return rc; +free_irq_vectors: + free_irq(privdata->dev_irq, privdata); err_dma_mask: pci_clear_master(pci_dev); err_pci_enable: @@ -364,7 +376,7 @@ static void amd_mp2_pci_remove(struct pci_dev *pci_dev) pm_runtime_forbid(&pci_dev->dev); pm_runtime_get_noresume(&pci_dev->dev); - pci_intx(pci_dev, 0); + free_irq(privdata->dev_irq, privdata); pci_clear_master(pci_dev); amd_mp2_clear_reg(privdata); diff --git a/drivers/i2c/busses/i2c-amd-mp2.h b/drivers/i2c/busses/i2c-amd-mp2.h index ddecd0c88656..018a42de8b1e 100644 --- a/drivers/i2c/busses/i2c-amd-mp2.h +++ b/drivers/i2c/busses/i2c-amd-mp2.h @@ -183,6 +183,7 @@ struct amd_mp2_dev { struct mutex c2p_lock; u8 c2p_lock_busid; unsigned int probed; + int dev_irq; }; /* PCIe communication driver */