2023-03-10 17:14:24

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v4 0/4] PCI: Add pci_dev_for_each_resource() helper and update users

Provide two new helper macros to iterate over PCI device resources and
convert users.

Looking at it, refactor existing pci_bus_for_each_resource() and convert
users accordingly.

Changelog v4:
- rebased on top of v6.3-rc1
- added tag (Krzysztof)

Changelog v3:
- rebased on top of v2 by Mika, see above
- added tag to pcmcia patch (Dominik)

Changelog v2:
- refactor to have two macros
- refactor existing pci_bus_for_each_resource() in the same way and
convert users

Andy Shevchenko (3):
PCI: Split pci_bus_for_each_resource_p() out of
pci_bus_for_each_resource()
EISA: Convert to use pci_bus_for_each_resource_p()
pcmcia: Convert to use pci_bus_for_each_resource_p()

Mika Westerberg (1):
PCI: Introduce pci_dev_for_each_resource()

.clang-format | 3 ++
arch/alpha/kernel/pci.c | 5 ++-
arch/arm/kernel/bios32.c | 16 +++++-----
arch/arm/mach-dove/pcie.c | 10 +++---
arch/arm/mach-mv78xx0/pcie.c | 10 +++---
arch/arm/mach-orion5x/pci.c | 10 +++---
arch/mips/pci/ops-bcm63xx.c | 8 ++---
arch/mips/pci/pci-legacy.c | 3 +-
arch/powerpc/kernel/pci-common.c | 21 +++++++------
arch/powerpc/platforms/4xx/pci.c | 8 ++---
arch/powerpc/platforms/52xx/mpc52xx_pci.c | 4 +--
arch/powerpc/platforms/pseries/pci.c | 16 +++++-----
arch/sh/drivers/pci/pcie-sh7786.c | 10 +++---
arch/sparc/kernel/leon_pci.c | 5 ++-
arch/sparc/kernel/pci.c | 10 +++---
arch/sparc/kernel/pcic.c | 5 ++-
drivers/eisa/pci_eisa.c | 4 +--
drivers/pci/bus.c | 7 ++---
drivers/pci/hotplug/shpchp_sysfs.c | 8 ++---
drivers/pci/pci.c | 5 ++-
drivers/pci/probe.c | 2 +-
drivers/pci/remove.c | 5 ++-
drivers/pci/setup-bus.c | 37 +++++++++--------------
drivers/pci/setup-res.c | 4 +--
drivers/pci/vgaarb.c | 17 +++--------
drivers/pci/xen-pcifront.c | 4 +--
drivers/pcmcia/rsrc_nonstatic.c | 9 ++----
drivers/pcmcia/yenta_socket.c | 3 +-
drivers/pnp/quirks.c | 29 ++++++------------
include/linux/pci.h | 26 +++++++++++++---
30 files changed, 141 insertions(+), 163 deletions(-)

--
2.39.1



2023-03-10 17:14:44

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v4 3/4] EISA: Convert to use pci_bus_for_each_resource_p()

The pci_bus_for_each_resource_p() hides the iterator loop since
it may be not used otherwise. With this, we may drop that iterator
variable definition.

Signed-off-by: Andy Shevchenko <[email protected]>
Reviewed-by: Krzysztof Wilczyński <[email protected]>
---
drivers/eisa/pci_eisa.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/eisa/pci_eisa.c b/drivers/eisa/pci_eisa.c
index 930c2332c3c4..907b86384396 100644
--- a/drivers/eisa/pci_eisa.c
+++ b/drivers/eisa/pci_eisa.c
@@ -20,8 +20,8 @@ static struct eisa_root_device pci_eisa_root;

static int __init pci_eisa_init(struct pci_dev *pdev)
{
- int rc, i;
struct resource *res, *bus_res = NULL;
+ int rc;

if ((rc = pci_enable_device (pdev))) {
dev_err(&pdev->dev, "Could not enable device\n");
@@ -38,7 +38,7 @@ static int __init pci_eisa_init(struct pci_dev *pdev)
* eisa_root_register() can only deal with a single io port resource,
* so we use the first valid io port resource.
*/
- pci_bus_for_each_resource(pdev->bus, res, i)
+ pci_bus_for_each_resource_p(pdev->bus, res)
if (res && (res->flags & IORESOURCE_IO)) {
bus_res = res;
break;
--
2.39.1


2023-03-10 17:15:21

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v4 4/4] pcmcia: Convert to use pci_bus_for_each_resource_p()

The pci_bus_for_each_resource_p() hides the iterator loop since
it may be not used otherwise. With this, we may drop that iterator
variable definition.

Signed-off-by: Andy Shevchenko <[email protected]>
Reviewed-by: Krzysztof Wilczyński <[email protected]>
Acked-by: Dominik Brodowski <[email protected]>
---
drivers/pcmcia/rsrc_nonstatic.c | 9 +++------
drivers/pcmcia/yenta_socket.c | 3 +--
2 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c
index ad1141fddb4c..9d92d4bb6239 100644
--- a/drivers/pcmcia/rsrc_nonstatic.c
+++ b/drivers/pcmcia/rsrc_nonstatic.c
@@ -934,7 +934,7 @@ static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long
static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
{
struct resource *res;
- int i, done = 0;
+ int done = 0;

if (!s->cb_dev || !s->cb_dev->bus)
return -ENODEV;
@@ -960,12 +960,9 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
*/
if (s->cb_dev->bus->number == 0)
return -EINVAL;
-
- for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
- res = s->cb_dev->bus->resource[i];
-#else
- pci_bus_for_each_resource(s->cb_dev->bus, res, i) {
#endif
+
+ pci_bus_for_each_resource_p(s->cb_dev->bus, res) {
if (!res)
continue;

diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
index 1365eaa20ff4..2e5bdf3db0ba 100644
--- a/drivers/pcmcia/yenta_socket.c
+++ b/drivers/pcmcia/yenta_socket.c
@@ -673,9 +673,8 @@ static int yenta_search_res(struct yenta_socket *socket, struct resource *res,
u32 min)
{
struct resource *root;
- int i;

- pci_bus_for_each_resource(socket->dev->bus, root, i) {
+ pci_bus_for_each_resource_p(socket->dev->bus, root) {
if (!root)
continue;

--
2.39.1


2023-03-10 17:15:27

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v4 1/4] PCI: Introduce pci_dev_for_each_resource()

From: Mika Westerberg <[email protected]>

Instead of open-coding it everywhere introduce a tiny helper that can be
used to iterate over each resource of a PCI device, and convert the most
obvious users into it.

While at it drop doubled empty line before pdev_sort_resources().

No functional changes intended.

Suggested-by: Andy Shevchenko <[email protected]>
Signed-off-by: Mika Westerberg <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
Reviewed-by: Krzysztof Wilczyński <[email protected]>
---
.clang-format | 2 ++
arch/alpha/kernel/pci.c | 5 ++--
arch/arm/kernel/bios32.c | 16 ++++++-------
arch/arm/mach-dove/pcie.c | 10 ++++----
arch/arm/mach-mv78xx0/pcie.c | 10 ++++----
arch/arm/mach-orion5x/pci.c | 10 ++++----
arch/mips/pci/ops-bcm63xx.c | 8 +++----
arch/mips/pci/pci-legacy.c | 3 +--
arch/powerpc/kernel/pci-common.c | 21 ++++++++--------
arch/powerpc/platforms/4xx/pci.c | 8 +++----
arch/powerpc/platforms/52xx/mpc52xx_pci.c | 4 ++--
arch/powerpc/platforms/pseries/pci.c | 16 ++++++-------
arch/sh/drivers/pci/pcie-sh7786.c | 10 ++++----
arch/sparc/kernel/leon_pci.c | 5 ++--
arch/sparc/kernel/pci.c | 10 ++++----
arch/sparc/kernel/pcic.c | 5 ++--
drivers/pci/remove.c | 5 ++--
drivers/pci/setup-bus.c | 27 ++++++++-------------
drivers/pci/setup-res.c | 4 +---
drivers/pci/vgaarb.c | 17 ++++---------
drivers/pci/xen-pcifront.c | 4 +---
drivers/pnp/quirks.c | 29 ++++++++---------------
include/linux/pci.h | 12 ++++++++++
23 files changed, 110 insertions(+), 131 deletions(-)

diff --git a/.clang-format b/.clang-format
index d988e9fa9b26..266abb843654 100644
--- a/.clang-format
+++ b/.clang-format
@@ -520,6 +520,8 @@ ForEachMacros:
- 'of_property_for_each_string'
- 'of_property_for_each_u32'
- 'pci_bus_for_each_resource'
+ - 'pci_dev_for_each_resource'
+ - 'pci_dev_for_each_resource_p'
- 'pci_doe_for_each_off'
- 'pcl_for_each_chunk'
- 'pcl_for_each_segment'
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c
index 64fbfb0763b2..4458eb7f44f0 100644
--- a/arch/alpha/kernel/pci.c
+++ b/arch/alpha/kernel/pci.c
@@ -288,11 +288,10 @@ pcibios_claim_one_bus(struct pci_bus *b)
struct pci_bus *child_bus;

list_for_each_entry(dev, &b->devices, bus_list) {
+ struct resource *r;
int i;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, r, i) {
if (r->parent || !r->start || !r->flags)
continue;
if (pci_has_flag(PCI_PROBE_ONLY) ||
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
index e7ef2b5bea9c..5254734b23e6 100644
--- a/arch/arm/kernel/bios32.c
+++ b/arch/arm/kernel/bios32.c
@@ -142,15 +142,15 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C940F,
*/
static void pci_fixup_dec21285(struct pci_dev *dev)
{
- int i;
-
if (dev->devfn == 0) {
+ struct resource *r;
+
dev->class &= 0xff;
dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- dev->resource[i].start = 0;
- dev->resource[i].end = 0;
- dev->resource[i].flags = 0;
+ pci_dev_for_each_resource_p(dev, r) {
+ r->start = 0;
+ r->end = 0;
+ r->flags = 0;
}
}
}
@@ -162,13 +162,11 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285, pci_fixup_d
static void pci_fixup_ide_bases(struct pci_dev *dev)
{
struct resource *r;
- int i;

if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE)
return;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- r = dev->resource + i;
+ pci_dev_for_each_resource_p(dev, r) {
if ((r->start & ~0x80) == 0x374) {
r->start |= 2;
r->end = r->start;
diff --git a/arch/arm/mach-dove/pcie.c b/arch/arm/mach-dove/pcie.c
index 754ca381f600..58cecd79a204 100644
--- a/arch/arm/mach-dove/pcie.c
+++ b/arch/arm/mach-dove/pcie.c
@@ -142,14 +142,14 @@ static struct pci_ops pcie_ops = {
static void rc_pci_fixup(struct pci_dev *dev)
{
if (dev->bus->parent == NULL && dev->devfn == 0) {
- int i;
+ struct resource *r;

dev->class &= 0xff;
dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- dev->resource[i].start = 0;
- dev->resource[i].end = 0;
- dev->resource[i].flags = 0;
+ pci_dev_for_each_resource_p(dev, r) {
+ r->start = 0;
+ r->end = 0;
+ r->flags = 0;
}
}
}
diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c
index 6190f538a124..f59f02150a36 100644
--- a/arch/arm/mach-mv78xx0/pcie.c
+++ b/arch/arm/mach-mv78xx0/pcie.c
@@ -186,14 +186,14 @@ static struct pci_ops pcie_ops = {
static void rc_pci_fixup(struct pci_dev *dev)
{
if (dev->bus->parent == NULL && dev->devfn == 0) {
- int i;
+ struct resource *r;

dev->class &= 0xff;
dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- dev->resource[i].start = 0;
- dev->resource[i].end = 0;
- dev->resource[i].flags = 0;
+ pci_dev_for_each_resource_p(dev, r) {
+ r->start = 0;
+ r->end = 0;
+ r->flags = 0;
}
}
}
diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c
index 888fdc9099c5..0933b47b601a 100644
--- a/arch/arm/mach-orion5x/pci.c
+++ b/arch/arm/mach-orion5x/pci.c
@@ -522,14 +522,14 @@ static int __init pci_setup(struct pci_sys_data *sys)
static void rc_pci_fixup(struct pci_dev *dev)
{
if (dev->bus->parent == NULL && dev->devfn == 0) {
- int i;
+ struct resource *r;

dev->class &= 0xff;
dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- dev->resource[i].start = 0;
- dev->resource[i].end = 0;
- dev->resource[i].flags = 0;
+ pci_dev_for_each_resource_p(dev, r) {
+ r->start = 0;
+ r->end = 0;
+ r->flags = 0;
}
}
}
diff --git a/arch/mips/pci/ops-bcm63xx.c b/arch/mips/pci/ops-bcm63xx.c
index dc6dc2741272..c0efcbf3c63f 100644
--- a/arch/mips/pci/ops-bcm63xx.c
+++ b/arch/mips/pci/ops-bcm63xx.c
@@ -413,18 +413,18 @@ struct pci_ops bcm63xx_cb_ops = {
static void bcm63xx_fixup(struct pci_dev *dev)
{
static int io_window = -1;
- int i, found, new_io_window;
+ int found, new_io_window;
+ struct resource *r;
u32 val;

/* look for any io resource */
found = 0;
- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- if (pci_resource_flags(dev, i) & IORESOURCE_IO) {
+ pci_dev_for_each_resource_p(dev, r) {
+ if (resource_type(r) == IORESOURCE_IO) {
found = 1;
break;
}
}
-
if (!found)
return;

diff --git a/arch/mips/pci/pci-legacy.c b/arch/mips/pci/pci-legacy.c
index 468722c8a5c6..ec2567f8efd8 100644
--- a/arch/mips/pci/pci-legacy.c
+++ b/arch/mips/pci/pci-legacy.c
@@ -249,12 +249,11 @@ static int pcibios_enable_resources(struct pci_dev *dev, int mask)

pci_read_config_word(dev, PCI_COMMAND, &cmd);
old_cmd = cmd;
- for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) {
+ pci_dev_for_each_resource(dev, r, idx) {
/* Only set up the requested stuff */
if (!(mask & (1<<idx)))
continue;

- r = &dev->resource[idx];
if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
continue;
if ((idx == PCI_ROM_RESOURCE) &&
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index d67cf79bf5d0..1908a46cad54 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -880,6 +880,7 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
static void pcibios_fixup_resources(struct pci_dev *dev)
{
struct pci_controller *hose = pci_bus_to_host(dev->bus);
+ struct resource *res;
int i;

if (!hose) {
@@ -891,9 +892,9 @@ static void pcibios_fixup_resources(struct pci_dev *dev)
if (dev->is_virtfn)
return;

- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- struct resource *res = dev->resource + i;
+ pci_dev_for_each_resource(dev, res, i) {
struct pci_bus_region reg;
+
if (!res->flags)
continue;

@@ -1452,11 +1453,10 @@ void pcibios_claim_one_bus(struct pci_bus *bus)
struct pci_bus *child_bus;

list_for_each_entry(dev, &bus->devices, bus_list) {
+ struct resource *r;
int i;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, r, i) {
if (r->parent || !r->start || !r->flags)
continue;

@@ -1705,19 +1705,20 @@ EXPORT_SYMBOL_GPL(pcibios_scan_phb);

static void fixup_hide_host_resource_fsl(struct pci_dev *dev)
{
- int i, class = dev->class >> 8;
+ int class = dev->class >> 8;
/* When configured as agent, programming interface = 1 */
int prog_if = dev->class & 0xf;
+ struct resource *r;

if ((class == PCI_CLASS_PROCESSOR_POWERPC ||
class == PCI_CLASS_BRIDGE_OTHER) &&
(dev->hdr_type == PCI_HEADER_TYPE_NORMAL) &&
(prog_if == 0) &&
(dev->bus->parent == NULL)) {
- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- dev->resource[i].start = 0;
- dev->resource[i].end = 0;
- dev->resource[i].flags = 0;
+ pci_dev_for_each_resource_p(dev, r) {
+ r->start = 0;
+ r->end = 0;
+ r->flags = 0;
}
}
}
diff --git a/arch/powerpc/platforms/4xx/pci.c b/arch/powerpc/platforms/4xx/pci.c
index ca5dd7a5842a..9d19123c0da8 100644
--- a/arch/powerpc/platforms/4xx/pci.c
+++ b/arch/powerpc/platforms/4xx/pci.c
@@ -57,7 +57,7 @@ static inline int ppc440spe_revA(void)
static void fixup_ppc4xx_pci_bridge(struct pci_dev *dev)
{
struct pci_controller *hose;
- int i;
+ struct resource *r;

if (dev->devfn != 0 || dev->bus->self != NULL)
return;
@@ -79,9 +79,9 @@ static void fixup_ppc4xx_pci_bridge(struct pci_dev *dev)
/* Hide the PCI host BARs from the kernel as their content doesn't
* fit well in the resource management
*/
- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- dev->resource[i].start = dev->resource[i].end = 0;
- dev->resource[i].flags = 0;
+ pci_dev_for_each_resource_p(dev, r) {
+ r->start = r->end = 0;
+ r->flags = 0;
}

printk(KERN_INFO "PCI: Hiding 4xx host bridge resources %s\n",
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_pci.c b/arch/powerpc/platforms/52xx/mpc52xx_pci.c
index 859e2818c43d..f0b0ac298484 100644
--- a/arch/powerpc/platforms/52xx/mpc52xx_pci.c
+++ b/arch/powerpc/platforms/52xx/mpc52xx_pci.c
@@ -327,14 +327,14 @@ mpc52xx_pci_setup(struct pci_controller *hose,
static void
mpc52xx_pci_fixup_resources(struct pci_dev *dev)
{
+ struct resource *res;
int i;

pr_debug("%s() %.4x:%.4x\n", __func__, dev->vendor, dev->device);

/* We don't rely on boot loader for PCI and resets all
devices */
- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- struct resource *res = &dev->resource[i];
+ pci_dev_for_each_resource_p(dev, res) {
if (res->end > res->start) { /* Only valid resources */
res->end -= res->start;
res->start = 0;
diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c
index 60e0a58928ef..ee7b2c737c92 100644
--- a/arch/powerpc/platforms/pseries/pci.c
+++ b/arch/powerpc/platforms/pseries/pci.c
@@ -240,7 +240,7 @@ void __init pSeries_final_fixup(void)
*/
static void fixup_winbond_82c105(struct pci_dev* dev)
{
- int i;
+ struct resource *r;
unsigned int reg;

if (!machine_is(pseries))
@@ -251,14 +251,14 @@ static void fixup_winbond_82c105(struct pci_dev* dev)
/* Enable LEGIRQ to use INTC instead of ISA interrupts */
pci_write_config_dword(dev, 0x40, reg | (1<<11));

- for (i = 0; i < DEVICE_COUNT_RESOURCE; ++i) {
+ pci_dev_for_each_resource_p(dev, r) {
/* zap the 2nd function of the winbond chip */
- if (dev->resource[i].flags & IORESOURCE_IO
- && dev->bus->number == 0 && dev->devfn == 0x81)
- dev->resource[i].flags &= ~IORESOURCE_IO;
- if (dev->resource[i].start == 0 && dev->resource[i].end) {
- dev->resource[i].flags = 0;
- dev->resource[i].end = 0;
+ if (dev->bus->number == 0 && dev->devfn == 0x81 &&
+ r->flags & IORESOURCE_IO)
+ r->flags &= ~IORESOURCE_IO;
+ if (r->start == 0 && r->end) {
+ r->flags = 0;
+ r->end = 0;
}
}
}
diff --git a/arch/sh/drivers/pci/pcie-sh7786.c b/arch/sh/drivers/pci/pcie-sh7786.c
index b0c2a5238d04..982f9aec2f2f 100644
--- a/arch/sh/drivers/pci/pcie-sh7786.c
+++ b/arch/sh/drivers/pci/pcie-sh7786.c
@@ -140,12 +140,12 @@ static void sh7786_pci_fixup(struct pci_dev *dev)
* Prevent enumeration of root complex resources.
*/
if (pci_is_root_bus(dev->bus) && dev->devfn == 0) {
- int i;
+ struct resource *r;

- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- dev->resource[i].start = 0;
- dev->resource[i].end = 0;
- dev->resource[i].flags = 0;
+ pci_dev_for_each_resource_p(dev, r) {
+ r->start = 0;
+ r->end = 0;
+ r->flags = 0;
}
}
}
diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c
index e5e5ff6b9a5c..b6663a3fbae9 100644
--- a/arch/sparc/kernel/leon_pci.c
+++ b/arch/sparc/kernel/leon_pci.c
@@ -62,15 +62,14 @@ void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info)

int pcibios_enable_device(struct pci_dev *dev, int mask)
{
+ struct resource *res;
u16 cmd, oldcmd;
int i;

pci_read_config_word(dev, PCI_COMMAND, &cmd);
oldcmd = cmd;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *res = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, res, i) {
/* Only set up the requested stuff */
if (!(mask & (1<<i)))
continue;
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
index cb1ef25116e9..a948a49817c7 100644
--- a/arch/sparc/kernel/pci.c
+++ b/arch/sparc/kernel/pci.c
@@ -663,11 +663,10 @@ static void pci_claim_bus_resources(struct pci_bus *bus)
struct pci_dev *dev;

list_for_each_entry(dev, &bus->devices, bus_list) {
+ struct resource *r;
int i;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, r, i) {
if (r->parent || !r->start || !r->flags)
continue;

@@ -724,15 +723,14 @@ struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,

int pcibios_enable_device(struct pci_dev *dev, int mask)
{
+ struct resource *res;
u16 cmd, oldcmd;
int i;

pci_read_config_word(dev, PCI_COMMAND, &cmd);
oldcmd = cmd;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *res = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, res, i) {
/* Only set up the requested stuff */
if (!(mask & (1<<i)))
continue;
diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c
index ee4c9a9a171c..25fe0a061732 100644
--- a/arch/sparc/kernel/pcic.c
+++ b/arch/sparc/kernel/pcic.c
@@ -643,15 +643,14 @@ void pcibios_fixup_bus(struct pci_bus *bus)

int pcibios_enable_device(struct pci_dev *dev, int mask)
{
+ struct resource *res;
u16 cmd, oldcmd;
int i;

pci_read_config_word(dev, PCI_COMMAND, &cmd);
oldcmd = cmd;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *res = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, res, i) {
/* Only set up the requested stuff */
if (!(mask & (1<<i)))
continue;
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c
index 0145aef1b930..1310e01fb540 100644
--- a/drivers/pci/remove.c
+++ b/drivers/pci/remove.c
@@ -5,10 +5,9 @@

static void pci_free_resources(struct pci_dev *dev)
{
- int i;
+ struct resource *res;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *res = dev->resource + i;
+ pci_dev_for_each_resource_p(dev, res) {
if (res->parent)
release_resource(res);
}
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index c690572b10ce..d4fc7665f70a 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -124,20 +124,17 @@ static resource_size_t get_res_add_align(struct list_head *head,
return dev_res ? dev_res->min_align : 0;
}

-
/* Sort resources by alignment */
static void pdev_sort_resources(struct pci_dev *dev, struct list_head *head)
{
+ struct resource *r;
int i;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r;
+ pci_dev_for_each_resource(dev, r, i) {
struct pci_dev_resource *dev_res, *tmp;
resource_size_t r_align;
struct list_head *n;

- r = &dev->resource[i];
-
if (r->flags & IORESOURCE_PCI_FIXED)
continue;

@@ -895,10 +892,9 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size,

min_align = window_alignment(bus, IORESOURCE_IO);
list_for_each_entry(dev, &bus->devices, bus_list) {
- int i;
+ struct resource *r;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r = &dev->resource[i];
+ pci_dev_for_each_resource_p(dev, r) {
unsigned long r_size;

if (r->parent || !(r->flags & IORESOURCE_IO))
@@ -1014,10 +1010,10 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
size = 0;

list_for_each_entry(dev, &bus->devices, bus_list) {
+ struct resource *r;
int i;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r = &dev->resource[i];
+ pci_dev_for_each_resource(dev, r, i) {
resource_size_t r_size;

if (r->parent || (r->flags & IORESOURCE_PCI_FIXED) ||
@@ -1358,11 +1354,10 @@ static void assign_fixed_resource_on_bus(struct pci_bus *b, struct resource *r)
*/
static void pdev_assign_fixed_resources(struct pci_dev *dev)
{
- int i;
+ struct resource *r;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+ pci_dev_for_each_resource_p(dev, r) {
struct pci_bus *b;
- struct resource *r = &dev->resource[i];

if (r->parent || !(r->flags & IORESOURCE_PCI_FIXED) ||
!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
@@ -1795,11 +1790,9 @@ static void remove_dev_resources(struct pci_dev *dev, struct resource *io,
struct resource *mmio,
struct resource *mmio_pref)
{
- int i;
-
- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *res = &dev->resource[i];
+ struct resource *res;

+ pci_dev_for_each_resource_p(dev, res) {
if (resource_type(res) == IORESOURCE_IO) {
remove_dev_resource(io, dev, res);
} else if (resource_type(res) == IORESOURCE_MEM) {
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
index b492e67c3d87..967f9a758923 100644
--- a/drivers/pci/setup-res.c
+++ b/drivers/pci/setup-res.c
@@ -484,12 +484,10 @@ int pci_enable_resources(struct pci_dev *dev, int mask)
pci_read_config_word(dev, PCI_COMMAND, &cmd);
old_cmd = cmd;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+ pci_dev_for_each_resource(dev, r, i) {
if (!(mask & (1 << i)))
continue;

- r = &dev->resource[i];
-
if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
continue;
if ((i == PCI_ROM_RESOURCE) &&
diff --git a/drivers/pci/vgaarb.c b/drivers/pci/vgaarb.c
index f80b6ec88dc3..3ec6a0b7dbf0 100644
--- a/drivers/pci/vgaarb.c
+++ b/drivers/pci/vgaarb.c
@@ -548,10 +548,8 @@ static bool vga_is_firmware_default(struct pci_dev *pdev)
#if defined(CONFIG_X86) || defined(CONFIG_IA64)
u64 base = screen_info.lfb_base;
u64 size = screen_info.lfb_size;
+ struct resource *r;
u64 limit;
- resource_size_t start, end;
- unsigned long flags;
- int i;

/* Select the device owning the boot framebuffer if there is one */

@@ -561,19 +559,14 @@ static bool vga_is_firmware_default(struct pci_dev *pdev)
limit = base + size;

/* Does firmware framebuffer belong to us? */
- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- flags = pci_resource_flags(pdev, i);
-
- if ((flags & IORESOURCE_MEM) == 0)
+ pci_dev_for_each_resource_p(pdev, r) {
+ if (resource_type(r) != IORESOURCE_MEM)
continue;

- start = pci_resource_start(pdev, i);
- end = pci_resource_end(pdev, i);
-
- if (!start || !end)
+ if (!r->start || !r->end)
continue;

- if (base < start || limit >= end)
+ if (base < r->start || limit >= r->end)
continue;

return true;
diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c
index fcd029ca2eb1..83c0ab50676d 100644
--- a/drivers/pci/xen-pcifront.c
+++ b/drivers/pci/xen-pcifront.c
@@ -390,9 +390,7 @@ static int pcifront_claim_resource(struct pci_dev *dev, void *data)
int i;
struct resource *r;

- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- r = &dev->resource[i];
-
+ pci_dev_for_each_resource(dev, r, i) {
if (!r->parent && r->start && r->flags) {
dev_info(&pdev->xdev->dev, "claiming resource %s/%d\n",
pci_name(dev), i);
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c
index ac98b9919029..420121954ffd 100644
--- a/drivers/pnp/quirks.c
+++ b/drivers/pnp/quirks.c
@@ -229,8 +229,7 @@ static void quirk_ad1815_mpu_resources(struct pnp_dev *dev)
static void quirk_system_pci_resources(struct pnp_dev *dev)
{
struct pci_dev *pdev = NULL;
- struct resource *res;
- resource_size_t pnp_start, pnp_end, pci_start, pci_end;
+ struct resource *res, *r;
int i, j;

/*
@@ -243,32 +242,26 @@ static void quirk_system_pci_resources(struct pnp_dev *dev)
* so they won't be claimed by the PNP system driver.
*/
for_each_pci_dev(pdev) {
- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- unsigned long flags, type;
+ pci_dev_for_each_resource(pdev, r, i) {
+ unsigned long type = resource_type(r);

- flags = pci_resource_flags(pdev, i);
- type = flags & (IORESOURCE_IO | IORESOURCE_MEM);
- if (!type || pci_resource_len(pdev, i) == 0)
+ if (type != IORESOURCE_IO || type != IORESOURCE_MEM ||
+ resource_size(r) == 0)
continue;

- if (flags & IORESOURCE_UNSET)
+ if (r->flags & IORESOURCE_UNSET)
continue;

- pci_start = pci_resource_start(pdev, i);
- pci_end = pci_resource_end(pdev, i);
for (j = 0;
(res = pnp_get_resource(dev, type, j)); j++) {
if (res->start == 0 && res->end == 0)
continue;

- pnp_start = res->start;
- pnp_end = res->end;
-
/*
* If the PNP region doesn't overlap the PCI
* region at all, there's no problem.
*/
- if (pnp_end < pci_start || pnp_start > pci_end)
+ if (!resource_overlaps(res, r))
continue;

/*
@@ -278,8 +271,7 @@ static void quirk_system_pci_resources(struct pnp_dev *dev)
* PNP device describes a bridge with PCI
* behind it.
*/
- if (pnp_start <= pci_start &&
- pnp_end >= pci_end)
+ if (res->start <= r->start && res->end >= r->end)
continue;

/*
@@ -288,9 +280,8 @@ static void quirk_system_pci_resources(struct pnp_dev *dev)
* driver from requesting its resources.
*/
dev_warn(&dev->dev,
- "disabling %pR because it overlaps "
- "%s BAR %d %pR\n", res,
- pci_name(pdev), i, &pdev->resource[i]);
+ "disabling %pR because it overlaps %s BAR %d %pR\n",
+ res, pci_name(pdev), i, r);
res->flags |= IORESOURCE_DISABLED;
}
}
diff --git a/include/linux/pci.h b/include/linux/pci.h
index fafd8020c6d7..670f01c5538c 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1404,6 +1404,18 @@ void pdev_enable_device(struct pci_dev *);
int pci_enable_resources(struct pci_dev *, int mask);
void pci_assign_irq(struct pci_dev *dev);
struct resource *pci_find_resource(struct pci_dev *dev, struct resource *res);
+
+#define __pci_dev_for_each_resource(dev, res, __i, vartype) \
+ for (vartype __i = 0; \
+ res = &(dev)->resource[__i], __i < PCI_NUM_RESOURCES; \
+ __i++)
+
+#define pci_dev_for_each_resource(dev, res, i) \
+ __pci_dev_for_each_resource(dev, res, i, )
+
+#define pci_dev_for_each_resource_p(dev, res) \
+ __pci_dev_for_each_resource(dev, res, i, unsigned int)
+
#define HAVE_PCI_REQ_REGIONS 2
int __must_check pci_request_regions(struct pci_dev *, const char *);
int __must_check pci_request_regions_exclusive(struct pci_dev *, const char *);
--
2.39.1


2023-03-10 21:59:39

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v4 1/4] PCI: Introduce pci_dev_for_each_resource()

Hi Andy,

I love your patch! Yet something to improve:

[auto build test ERROR on pci/next]
[also build test ERROR on pci/for-linus powerpc/next powerpc/fixes linus/master v6.3-rc1 next-20230310]
[cannot apply to soc/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/PCI-Introduce-pci_dev_for_each_resource/20230311-011642
base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
patch link: https://lore.kernel.org/r/20230310171416.23356-2-andriy.shevchenko%40linux.intel.com
patch subject: [PATCH v4 1/4] PCI: Introduce pci_dev_for_each_resource()
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230311/[email protected]/config)
compiler: m68k-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/059b4a086017fbf2baacdbe0cc454f569f618ffd
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Andy-Shevchenko/PCI-Introduce-pci_dev_for_each_resource/20230311-011642
git checkout 059b4a086017fbf2baacdbe0cc454f569f618ffd
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k olddefconfig
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash drivers/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
| Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

drivers/pnp/quirks.c: In function 'quirk_system_pci_resources':
>> drivers/pnp/quirks.c:245:17: error: implicit declaration of function 'pci_dev_for_each_resource' [-Werror=implicit-function-declaration]
245 | pci_dev_for_each_resource(pdev, r, i) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/pnp/quirks.c:245:54: error: expected ';' before '{' token
245 | pci_dev_for_each_resource(pdev, r, i) {
| ^~
| ;
drivers/pnp/quirks.c:233:16: warning: unused variable 'j' [-Wunused-variable]
233 | int i, j;
| ^
drivers/pnp/quirks.c:232:26: warning: unused variable 'res' [-Wunused-variable]
232 | struct resource *res, *r;
| ^~~
cc1: some warnings being treated as errors


vim +/pci_dev_for_each_resource +245 drivers/pnp/quirks.c

228
229 static void quirk_system_pci_resources(struct pnp_dev *dev)
230 {
231 struct pci_dev *pdev = NULL;
232 struct resource *res, *r;
233 int i, j;
234
235 /*
236 * Some BIOSes have PNP motherboard devices with resources that
237 * partially overlap PCI BARs. The PNP system driver claims these
238 * motherboard resources, which prevents the normal PCI driver from
239 * requesting them later.
240 *
241 * This patch disables the PNP resources that conflict with PCI BARs
242 * so they won't be claimed by the PNP system driver.
243 */
244 for_each_pci_dev(pdev) {
> 245 pci_dev_for_each_resource(pdev, r, i) {
246 unsigned long type = resource_type(r);
247
248 if (type != IORESOURCE_IO || type != IORESOURCE_MEM ||
249 resource_size(r) == 0)
250 continue;
251
252 if (r->flags & IORESOURCE_UNSET)
253 continue;
254
255 for (j = 0;
256 (res = pnp_get_resource(dev, type, j)); j++) {
257 if (res->start == 0 && res->end == 0)
258 continue;
259
260 /*
261 * If the PNP region doesn't overlap the PCI
262 * region at all, there's no problem.
263 */
264 if (!resource_overlaps(res, r))
265 continue;
266
267 /*
268 * If the PNP region completely encloses (or is
269 * at least as large as) the PCI region, that's
270 * also OK. For example, this happens when the
271 * PNP device describes a bridge with PCI
272 * behind it.
273 */
274 if (res->start <= r->start && res->end >= r->end)
275 continue;
276
277 /*
278 * Otherwise, the PNP region overlaps *part* of
279 * the PCI region, and that might prevent a PCI
280 * driver from requesting its resources.
281 */
282 dev_warn(&dev->dev,
283 "disabling %pR because it overlaps %s BAR %d %pR\n",
284 res, pci_name(pdev), i, r);
285 res->flags |= IORESOURCE_DISABLED;
286 }
287 }
288 }
289 }
290

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests

2023-03-10 22:15:55

by Keith Busch

[permalink] [raw]
Subject: Re: [PATCH v4 1/4] PCI: Introduce pci_dev_for_each_resource()

On Fri, Mar 10, 2023 at 07:14:13PM +0200, Andy Shevchenko wrote:
> +#define __pci_dev_for_each_resource(dev, res, __i, vartype) \
> + for (vartype __i = 0; \
> + res = &(dev)->resource[__i], __i < PCI_NUM_RESOURCES; \
> + __i++)

...

> +#define pci_dev_for_each_resource_p(dev, res) \
> + __pci_dev_for_each_resource(dev, res, i, unsigned int)

It looks dangerous to have a macro declare a variable when starting a new
scope. How do you know the name 'i' won't clash with something defined above?

2023-03-11 13:55:01

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH v4 1/4] PCI: Introduce pci_dev_for_each_resource()

Hi Andy,

https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/PCI-Introduce-pci_dev_for_each_resource/20230311-011642
base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
patch link: https://lore.kernel.org/r/20230310171416.23356-2-andriy.shevchenko%40linux.intel.com
patch subject: [PATCH v4 1/4] PCI: Introduce pci_dev_for_each_resource()
config: x86_64-randconfig-m001 (https://download.01.org/0day-ci/archive/20230311/[email protected]/config)
compiler: gcc-11 (Debian 11.3.0-8) 11.3.0

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
| Reported-by: Dan Carpenter <[email protected]>
| Link: https://lore.kernel.org/r/[email protected]/

smatch warnings:
drivers/pnp/quirks.c:248 quirk_system_pci_resources() warn: was && intended here instead of ||?

vim +248 drivers/pnp/quirks.c

0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 229 static void quirk_system_pci_resources(struct pnp_dev *dev)
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 230 {
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 231 struct pci_dev *pdev = NULL;
059b4a086017fb Mika Westerberg 2023-03-10 232 struct resource *res, *r;
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 233 int i, j;
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 234
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 235 /*
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 236 * Some BIOSes have PNP motherboard devices with resources that
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 237 * partially overlap PCI BARs. The PNP system driver claims these
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 238 * motherboard resources, which prevents the normal PCI driver from
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 239 * requesting them later.
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 240 *
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 241 * This patch disables the PNP resources that conflict with PCI BARs
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 242 * so they won't be claimed by the PNP system driver.
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 243 */
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 244 for_each_pci_dev(pdev) {
059b4a086017fb Mika Westerberg 2023-03-10 245 pci_dev_for_each_resource(pdev, r, i) {
059b4a086017fb Mika Westerberg 2023-03-10 246 unsigned long type = resource_type(r);
999ed65ad12e37 Rene Herman 2008-07-25 247
059b4a086017fb Mika Westerberg 2023-03-10 @248 if (type != IORESOURCE_IO || type != IORESOURCE_MEM ||
^^
This || needs to be &&. This loop will always hit the continue path
without doing anything.

059b4a086017fb Mika Westerberg 2023-03-10 249 resource_size(r) == 0)
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 250 continue;
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 251
059b4a086017fb Mika Westerberg 2023-03-10 252 if (r->flags & IORESOURCE_UNSET)
f7834c092c4299 Bjorn Helgaas 2015-03-03 253 continue;
f7834c092c4299 Bjorn Helgaas 2015-03-03 254
95ab3669f78306 Bjorn Helgaas 2008-04-28 255 for (j = 0;
999ed65ad12e37 Rene Herman 2008-07-25 256 (res = pnp_get_resource(dev, type, j)); j++) {
aee3ad815dd291 Bjorn Helgaas 2008-06-27 257 if (res->start == 0 && res->end == 0)
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 258 continue;
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 259
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 260 /*
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 261 * If the PNP region doesn't overlap the PCI
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 262 * region at all, there's no problem.
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 263 */
059b4a086017fb Mika Westerberg 2023-03-10 264 if (!resource_overlaps(res, r))
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 265 continue;
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 266
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 267 /*
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 268 * If the PNP region completely encloses (or is
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 269 * at least as large as) the PCI region, that's
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 270 * also OK. For example, this happens when the
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 271 * PNP device describes a bridge with PCI
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 272 * behind it.
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 273 */
059b4a086017fb Mika Westerberg 2023-03-10 274 if (res->start <= r->start && res->end >= r->end)
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 275 continue;
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 276
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 277 /*
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 278 * Otherwise, the PNP region overlaps *part* of
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 279 * the PCI region, and that might prevent a PCI
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 280 * driver from requesting its resources.
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 281 */
c7dabef8a2c59e Bjorn Helgaas 2009-10-27 282 dev_warn(&dev->dev,
059b4a086017fb Mika Westerberg 2023-03-10 283 "disabling %pR because it overlaps %s BAR %d %pR\n",
059b4a086017fb Mika Westerberg 2023-03-10 284 res, pci_name(pdev), i, r);
4b34fe156455d2 Bjorn Helgaas 2008-06-02 285 res->flags |= IORESOURCE_DISABLED;
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 286 }
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 287 }
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 288 }
0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 289 }

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests


2023-03-14 18:41:58

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v4 1/4] PCI: Introduce pci_dev_for_each_resource()

On Fri, Mar 10, 2023 at 03:15:38PM -0700, Keith Busch wrote:
> On Fri, Mar 10, 2023 at 07:14:13PM +0200, Andy Shevchenko wrote:

...

> > +#define pci_dev_for_each_resource_p(dev, res) \
> > + __pci_dev_for_each_resource(dev, res, i, unsigned int)
>
> It looks dangerous to have a macro declare a variable when starting a new
> scope. How do you know the name 'i' won't clash with something defined above?

I'll rename. Thank you.

--
With Best Regards,
Andy Shevchenko



2023-03-14 18:46:04

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v4 1/4] PCI: Introduce pci_dev_for_each_resource()

On Sat, Mar 11, 2023 at 04:54:32PM +0300, Dan Carpenter wrote:

> 059b4a086017fb Mika Westerberg 2023-03-10 246 unsigned long type = resource_type(r);
> 999ed65ad12e37 Rene Herman 2008-07-25 247
> 059b4a086017fb Mika Westerberg 2023-03-10 @248 if (type != IORESOURCE_IO || type != IORESOURCE_MEM ||
> ^^
> This || needs to be &&. This loop will always hit the continue path
> without doing anything.
>
> 059b4a086017fb Mika Westerberg 2023-03-10 249 resource_size(r) == 0)
> 0509ad5e1a7d92 Bjorn Helgaas 2008-03-11 250 continue;

Thanks, I'll fix in v5.

--
With Best Regards,
Andy Shevchenko