2021-06-06 07:06:34

by Dejin Zheng

[permalink] [raw]
Subject: [PATCH v6 0/4] Introduce pcim_alloc_irq_vectors()

Introduce pcim_alloc_irq_vectors(), a device-managed version of
pci_alloc_irq_vectors(), In some i2c drivers, If pcim_enable_device()
has been called before, then pci_alloc_irq_vectors() is actually a
device-managed function. It is used as a device-managed function, So
replace it with pcim_alloc_irq_vectors().

Changelog
---------
v5 -> v6:
- rebase to 5.13-rc4
v4 -> v5:
- Remove the check of enable device in pcim_alloc_irq_vectors()
and make it as a static line function.
- Modify the subject name in patch 3 and patch 4.
v3 -> v4:
- add some commit comments for patch 3
v2 -> v3:
- Add some commit comments for replace some codes in
pcim_release() by pci_free_irq_vectors().
- Simplify the error handling path in i2c designware
driver.
v1 -> v2:
- Use pci_free_irq_vectors() to replace some code in
pcim_release().
- Modify some commit messages.

Dejin Zheng (4):
PCI: Introduce pcim_alloc_irq_vectors()
Documentation: devres: Add pcim_alloc_irq_vectors()
i2c: designware: Use pcim_alloc_irq_vectors() to allocate IRQ vectors
i2c: thunderx: Use pcim_alloc_irq_vectors() to allocate IRQ vectors

.../driver-api/driver-model/devres.rst | 1 +
drivers/i2c/busses/i2c-designware-pcidrv.c | 15 ++++--------
drivers/i2c/busses/i2c-thunderx-pcidrv.c | 2 +-
drivers/pci/pci.c | 5 +---
include/linux/pci.h | 24 +++++++++++++++++++
5 files changed, 31 insertions(+), 16 deletions(-)

--
2.30.1


2021-06-06 07:08:20

by Dejin Zheng

[permalink] [raw]
Subject: [PATCH v6 3/4] i2c: designware: Use pcim_alloc_irq_vectors() to allocate IRQ vectors

The pcim_alloc_irq_vectors() function, an explicit device-managed version
of pci_alloc_irq_vectors(). If pcim_enable_device() has been called
before, then pci_alloc_irq_vectors() is actually a device-managed
function. It is used here as a device-managed function, So replace it
with pcim_alloc_irq_vectors(). At the same time, Remove the
pci_free_irq_vectors() function to simplify the error handling path.
the freeing resources will take automatically when device is gone.

Reviewed-by: Robert Richter <[email protected]>
Acked-by: Andy Shevchenko <[email protected]>
Acked-by: Jarkko Nikula <[email protected]>
Signed-off-by: Dejin Zheng <[email protected]>
---
v5 -> v6:
- rebase to 5.13-rc4
v4 -> v5:
- Modify the subject name.
v3 -> v4:
- add some commit comments.
v2 -> v3:
- simplify the error handling path.
v1 -> v2:
- Modify some commit messages.

drivers/i2c/busses/i2c-designware-pcidrv.c | 15 ++++-----------
1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c
index 0f409a4c2da0..2b1ef0934445 100644
--- a/drivers/i2c/busses/i2c-designware-pcidrv.c
+++ b/drivers/i2c/busses/i2c-designware-pcidrv.c
@@ -268,7 +268,7 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev,
if (!dev)
return -ENOMEM;

- r = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
+ r = pcim_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
if (r < 0)
return r;

@@ -283,10 +283,8 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev,

if (controller->setup) {
r = controller->setup(pdev, controller);
- if (r) {
- pci_free_irq_vectors(pdev);
+ if (r)
return r;
- }
}

i2c_dw_adjust_bus_speed(dev);
@@ -295,10 +293,8 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev,
i2c_dw_acpi_configure(&pdev->dev);

r = i2c_dw_validate_speed(dev);
- if (r) {
- pci_free_irq_vectors(pdev);
+ if (r)
return r;
- }

i2c_dw_configure(dev);

@@ -318,10 +314,8 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev,
adap->nr = controller->bus_num;

r = i2c_dw_probe(dev);
- if (r) {
- pci_free_irq_vectors(pdev);
+ if (r)
return r;
- }

if ((dev->flags & MODEL_MASK) == MODEL_AMD_NAVI_GPU) {
r = navi_amd_register_client(dev);
@@ -349,7 +343,6 @@ static void i2c_dw_pci_remove(struct pci_dev *pdev)

i2c_del_adapter(&dev->adapter);
devm_free_irq(&pdev->dev, dev->irq, dev);
- pci_free_irq_vectors(pdev);
}

/* work with hotplug and coldplug */
--
2.30.1

2021-06-06 07:08:30

by Dejin Zheng

[permalink] [raw]
Subject: [PATCH v6 2/4] Documentation: devres: Add pcim_alloc_irq_vectors()

Add pcim_alloc_irq_vectors(), a device-managed version of
pci_alloc_irq_vectors(). introducing this function can simplify
the error handling path in many drivers.

Reviewed-by: Robert Richter <[email protected]>
Signed-off-by: Dejin Zheng <[email protected]>
---
v5 -> v6:
- rebase to 5.13-rc4
v4 -> v5:
- No change
v3 -> v4:
- No change
v2 -> v3:
- No change
v1 -> v2:
- Modify some commit messages.

Documentation/driver-api/driver-model/devres.rst | 1 +
1 file changed, 1 insertion(+)

diff --git a/Documentation/driver-api/driver-model/devres.rst b/Documentation/driver-api/driver-model/devres.rst
index e0814d214048..fad7d26ccf35 100644
--- a/Documentation/driver-api/driver-model/devres.rst
+++ b/Documentation/driver-api/driver-model/devres.rst
@@ -382,6 +382,7 @@ PCI
devm_pci_alloc_host_bridge() : managed PCI host bridge allocation
devm_pci_remap_cfgspace() : ioremap PCI configuration space
devm_pci_remap_cfg_resource() : ioremap PCI configuration space resource
+ pcim_alloc_irq_vectors() : managed IRQ vectors allocation
pcim_enable_device() : after success, all PCI ops become managed
pcim_pin_device() : keep PCI device enabled after release

--
2.30.1

2021-06-06 07:09:54

by Dejin Zheng

[permalink] [raw]
Subject: [PATCH v6 1/4] PCI: Introduce pcim_alloc_irq_vectors()

Introduce pcim_alloc_irq_vectors(), a device-managed version of
pci_alloc_irq_vectors(). Introducing this function can simplify
the error handling path in many drivers.

And use pci_free_irq_vectors() to replace some code in pcim_release(),
they are equivalent, and no functional change. It is more explicit
that pcim_alloc_irq_vectors() is a device-managed function.

Suggested-by: Andy Shevchenko <[email protected]>
Reviewed-by: Robert Richter <[email protected]>
Reviewed-by: Andy Shevchenko <[email protected]>
Acked-by: Bjorn Helgaas <[email protected]>
Signed-off-by: Dejin Zheng <[email protected]>
---
v5 -> v6:
- rebase to 5.13-rc4
v4 -> v5:
- Remove the check of enable device in pcim_alloc_irq_vectors()
and make it as a static line function.
v3 -> v4:
- No change
v2 -> v3:
- Add some commit comments for replace some codes in
pcim_release() by pci_free_irq_vectors().
v1 -> v2:
- Use pci_free_irq_vectors() to replace some code in
pcim_release().
- Modify some commit messages.

drivers/pci/pci.c | 5 +----
include/linux/pci.h | 24 ++++++++++++++++++++++++
2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index b717680377a9..6319e5889688 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1989,10 +1989,7 @@ static void pcim_release(struct device *gendev, void *res)
struct pci_devres *this = res;
int i;

- if (dev->msi_enabled)
- pci_disable_msi(dev);
- if (dev->msix_enabled)
- pci_disable_msix(dev);
+ pci_free_irq_vectors(dev);

for (i = 0; i < DEVICE_COUNT_RESOURCE; i++)
if (this->region_mask & (1 << i))
diff --git a/include/linux/pci.h b/include/linux/pci.h
index c20211e59a57..e9c95cab2540 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1825,6 +1825,30 @@ pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
NULL);
}

+/**
+ * pcim_alloc_irq_vectors - a device-managed pci_alloc_irq_vectors()
+ * @dev: PCI device to operate on
+ * @min_vecs: minimum number of vectors required (must be >= 1)
+ * @max_vecs: maximum (desired) number of vectors
+ * @flags: flags or quirks for the allocation
+ *
+ * Return the number of vectors allocated, (which might be smaller than
+ * @max_vecs) if successful, or a negative error code on error. If less
+ * than @min_vecs interrupt vectors are available for @dev the function
+ * will fail with -ENOSPC.
+ *
+ * It depends on calling pcim_enable_device() to make IRQ resources
+ * manageable.
+ */
+static inline int
+pcim_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags)
+{
+ if (!pci_is_managed(dev))
+ return -EINVAL;
+ return pci_alloc_irq_vectors(dev, min_vecs, max_vecs, flags);
+}
+
/* Include architecture-dependent settings and functions */

#include <asm/pci.h>
--
2.30.1

2021-06-06 07:11:03

by Dejin Zheng

[permalink] [raw]
Subject: [PATCH v6 4/4] i2c: thunderx: Use pcim_alloc_irq_vectors() to allocate IRQ vectors

The pcim_alloc_irq_vectors() function, an explicit device-managed version
of pci_alloc_irq_vectors(). If pcim_enable_device() has been called
before, then pci_alloc_irq_vectors() is actually a device-managed
function. It is used here as a device-managed function, So replace it
with pcim_alloc_irq_vectors().

Acked-by: Robert Richter <[email protected]>
Signed-off-by: Dejin Zheng <[email protected]>
---
v5 -> v6:
- rebase to 5.13-rc4
v4 -> v5:
- Modify the subject name.
v3 -> v4:
- No change.
v2 -> v3:
- No change.
v1 -> v2:
- Modify some commit messages.

drivers/i2c/busses/i2c-thunderx-pcidrv.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/i2c/busses/i2c-thunderx-pcidrv.c b/drivers/i2c/busses/i2c-thunderx-pcidrv.c
index 12c90aa0900e..63354e9fb726 100644
--- a/drivers/i2c/busses/i2c-thunderx-pcidrv.c
+++ b/drivers/i2c/busses/i2c-thunderx-pcidrv.c
@@ -192,7 +192,7 @@ static int thunder_i2c_probe_pci(struct pci_dev *pdev,
i2c->hlc_int_enable = thunder_i2c_hlc_int_enable;
i2c->hlc_int_disable = thunder_i2c_hlc_int_disable;

- ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSIX);
+ ret = pcim_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSIX);
if (ret < 0)
goto error;

--
2.30.1

2021-06-07 09:13:14

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v6 0/4] Introduce pcim_alloc_irq_vectors()

On Sun, Jun 06, 2021 at 03:05:07PM +0800, Dejin Zheng wrote:
> Introduce pcim_alloc_irq_vectors(), a device-managed version of
> pci_alloc_irq_vectors(), In some i2c drivers, If pcim_enable_device()
> has been called before, then pci_alloc_irq_vectors() is actually a
> device-managed function. It is used as a device-managed function, So
> replace it with pcim_alloc_irq_vectors().

Thanks!

> Changelog
> ---------
> v5 -> v6:
> - rebase to 5.13-rc4

It's already rc5 and I believe you better use the subsystem tree against which
your series is (i.e. PCI for-next or how it is called there).

Besides that kbuild bot is not happy.


--
With Best Regards,
Andy Shevchenko


2021-06-07 14:35:11

by Dejin Zheng

[permalink] [raw]
Subject: Re: [PATCH v6 0/4] Introduce pcim_alloc_irq_vectors()

On Mon, Jun 07, 2021 at 12:09:20PM +0300, Andy Shevchenko wrote:
> On Sun, Jun 06, 2021 at 03:05:07PM +0800, Dejin Zheng wrote:
> > Introduce pcim_alloc_irq_vectors(), a device-managed version of
> > pci_alloc_irq_vectors(), In some i2c drivers, If pcim_enable_device()
> > has been called before, then pci_alloc_irq_vectors() is actually a
> > device-managed function. It is used as a device-managed function, So
> > replace it with pcim_alloc_irq_vectors().
>
> Thanks!
>
> > Changelog
> > ---------
> > v5 -> v6:
> > - rebase to 5.13-rc4
>
> It's already rc5 and I believe you better use the subsystem tree against which
> your series is (i.e. PCI for-next or how it is called there).
>

Andy, Thanks for your reminder, I will use PCI for-next branch for new patch
version.

BR,
Dejin
> Besides that kbuild bot is not happy.
>
>
> --
> With Best Regards,
> Andy Shevchenko
>
>