All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH v2] PCI: Only enable IO window if supported
@ 2015-07-07 18:11 Guenter Roeck
  2015-07-24  3:09 ` Guenter Roeck
  2015-07-29 16:09 ` Bjorn Helgaas
  0 siblings, 2 replies; 15+ messages in thread
From: Guenter Roeck @ 2015-07-07 18:11 UTC (permalink / raw)
  To: Bjorn Helgaas; +Cc: linux-pci, Guenter Roeck, Lorenzo Pieralisi

The PCI subsystem always assumes that I/O is supported on PCIe bridges
and tries to assign an I/O window to each child bus even if that is not
the case.

This may result in messages such as

pcieport 0000:02:00.0: res[7]=[io  0x1000-0x0fff]
					get_res_add_size add_size 1000
pcieport 0000:02:00.0: BAR 7: no space for [io  size 0x1000]
pcieport 0000:02:00.0: BAR 7: failed to assign [io  size 0x1000]

for each bridge port, even if a bus or its parent does not support
I/O in the first place.

To avoid this message, check if a bus supports I/O before trying to
enable it. Also check if the root bus has an IO window assigned;
if not, it does not make sense to try to assign one to any of its
child busses.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v2: Use a new bus flag to indicate if IO is supported on a bus or not.
    Using IORESOURCE_DISABLED in resource flags turned out to be futile,
    since the term "!res->flags" is widely used to detect if a resource
    window is enabled or not, and setting IORESOURCE_DISABLED would
    affect all this code.

This patch depends on 'PCI: move pci_read_bridge_bases to the generic
PCI layer' by Lorenzo Pieralisi; without it, pci_read_bridge_io()
is not always called.

With this version of the patch, pci_bridge_check_ranges() still sets
IORESOURCE_IO. Moving this into pci_read_bridge_io() had undesirable
side effects and resulted in missing IO window assignments on one of
the x86 platforms I tested with. I'll have to explore this further.

 drivers/pci/probe.c     | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 drivers/pci/setup-bus.c |  9 +--------
 include/linux/pci.h     |  1 +
 3 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index cefd636681b6..b21cba7aeb79 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -332,6 +332,35 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
 	}
 }
 
+static bool pci_bus_supports_io(struct pci_bus *bus)
+{
+	struct pci_dev *dev = bus->self;
+	u16 io;
+
+	pci_read_config_word(dev, PCI_IO_BASE, &io);
+	if (!io) {
+		pci_write_config_word(dev, PCI_IO_BASE, 0xe0f0);
+		pci_read_config_word(dev, PCI_IO_BASE, &io);
+		pci_write_config_word(dev, PCI_IO_BASE, 0x0);
+	}
+	return !!io;
+}
+
+static bool pci_root_has_io_resource(struct pci_bus *bus)
+{
+	struct resource *res;
+	int i;
+
+	while (bus->parent)
+		bus = bus->parent;
+
+	 pci_bus_for_each_resource(bus, res, i) {
+		if (res && (res->flags & IORESOURCE_IO))
+			return true;
+	 }
+	 return false;
+}
+
 static void pci_read_bridge_io(struct pci_bus *child)
 {
 	struct pci_dev *dev = child->self;
@@ -340,6 +369,23 @@ static void pci_read_bridge_io(struct pci_bus *child)
 	struct pci_bus_region region;
 	struct resource *res;
 
+	if (child->bus_flags & PCI_BUS_FLAGS_NO_IO)
+		return;
+
+	if (!pci_bus_supports_io(child)) {
+		dev_printk(KERN_DEBUG, &dev->dev,
+			   "  bus does not support IO\n");
+		child->bus_flags |= PCI_BUS_FLAGS_NO_IO;
+		return;
+	}
+
+	if (!pci_root_has_io_resource(child)) {
+		dev_printk(KERN_DEBUG, &dev->dev,
+			   "  no IO window on root bus\n");
+		child->bus_flags |= PCI_BUS_FLAGS_NO_IO;
+		return;
+	}
+
 	io_mask = PCI_IO_RANGE_MASK;
 	io_granularity = 0x1000;
 	if (dev->io_window_1k) {
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 508cc56130e3..c8c7eecadbfe 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -744,7 +744,6 @@ int pci_claim_bridge_resource(struct pci_dev *bridge, int i)
    base/limit registers must be read-only and read as 0. */
 static void pci_bridge_check_ranges(struct pci_bus *bus)
 {
-	u16 io;
 	u32 pmem;
 	struct pci_dev *bridge = bus->self;
 	struct resource *b_res;
@@ -752,13 +751,7 @@ static void pci_bridge_check_ranges(struct pci_bus *bus)
 	b_res = &bridge->resource[PCI_BRIDGE_RESOURCES];
 	b_res[1].flags |= IORESOURCE_MEM;
 
-	pci_read_config_word(bridge, PCI_IO_BASE, &io);
-	if (!io) {
-		pci_write_config_word(bridge, PCI_IO_BASE, 0xe0f0);
-		pci_read_config_word(bridge, PCI_IO_BASE, &io);
-		pci_write_config_word(bridge, PCI_IO_BASE, 0x0);
-	}
-	if (io)
+	if (!(bus->bus_flags & PCI_BUS_FLAGS_NO_IO))
 		b_res[0].flags |= IORESOURCE_IO;
 
 	/*  DECchip 21050 pass 2 errata: the bridge may miss an address
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 8a0321a8fb59..b910ed04aa0b 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -191,6 +191,7 @@ typedef unsigned short __bitwise pci_bus_flags_t;
 enum pci_bus_flags {
 	PCI_BUS_FLAGS_NO_MSI   = (__force pci_bus_flags_t) 1,
 	PCI_BUS_FLAGS_NO_MMRBC = (__force pci_bus_flags_t) 2,
+	PCI_BUS_FLAGS_NO_IO    = (__force pci_bus_flags_t) 4,
 };
 
 /* These values come from the PCI Express Spec */
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-07 18:11 [RFC PATCH v2] PCI: Only enable IO window if supported Guenter Roeck
@ 2015-07-24  3:09 ` Guenter Roeck
  2015-07-29 16:09 ` Bjorn Helgaas
  1 sibling, 0 replies; 15+ messages in thread
From: Guenter Roeck @ 2015-07-24  3:09 UTC (permalink / raw)
  To: Bjorn Helgaas; +Cc: linux-pci, Lorenzo Pieralisi

On 07/07/2015 11:11 AM, Guenter Roeck wrote:
> The PCI subsystem always assumes that I/O is supported on PCIe bridges
> and tries to assign an I/O window to each child bus even if that is not
> the case.
>
> This may result in messages such as
>
> pcieport 0000:02:00.0: res[7]=[io  0x1000-0x0fff]
> 					get_res_add_size add_size 1000
> pcieport 0000:02:00.0: BAR 7: no space for [io  size 0x1000]
> pcieport 0000:02:00.0: BAR 7: failed to assign [io  size 0x1000]
>
> for each bridge port, even if a bus or its parent does not support
> I/O in the first place.
>
> To avoid this message, check if a bus supports I/O before trying to
> enable it. Also check if the root bus has an IO window assigned;
> if not, it does not make sense to try to assign one to any of its
> child busses.
>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v2: Use a new bus flag to indicate if IO is supported on a bus or not.
>      Using IORESOURCE_DISABLED in resource flags turned out to be futile,
>      since the term "!res->flags" is widely used to detect if a resource
>      window is enabled or not, and setting IORESOURCE_DISABLED would
>      affect all this code.
>
> This patch depends on 'PCI: move pci_read_bridge_bases to the generic
> PCI layer' by Lorenzo Pieralisi; without it, pci_read_bridge_io()
> is not always called.
>
> With this version of the patch, pci_bridge_check_ranges() still sets
> IORESOURCE_IO. Moving this into pci_read_bridge_io() had undesirable
> side effects and resulted in missing IO window assignments on one of
> the x86 platforms I tested with. I'll have to explore this further.
>

Hi Bjorn,

any comments on this patch ? Is the new bus flag acceptable ?

Thanks,
Guenter

>   drivers/pci/probe.c     | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>   drivers/pci/setup-bus.c |  9 +--------
>   include/linux/pci.h     |  1 +
>   3 files changed, 48 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index cefd636681b6..b21cba7aeb79 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -332,6 +332,35 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
>   	}
>   }
>
> +static bool pci_bus_supports_io(struct pci_bus *bus)
> +{
> +	struct pci_dev *dev = bus->self;
> +	u16 io;
> +
> +	pci_read_config_word(dev, PCI_IO_BASE, &io);
> +	if (!io) {
> +		pci_write_config_word(dev, PCI_IO_BASE, 0xe0f0);
> +		pci_read_config_word(dev, PCI_IO_BASE, &io);
> +		pci_write_config_word(dev, PCI_IO_BASE, 0x0);
> +	}
> +	return !!io;
> +}
> +
> +static bool pci_root_has_io_resource(struct pci_bus *bus)
> +{
> +	struct resource *res;
> +	int i;
> +
> +	while (bus->parent)
> +		bus = bus->parent;
> +
> +	 pci_bus_for_each_resource(bus, res, i) {
> +		if (res && (res->flags & IORESOURCE_IO))
> +			return true;
> +	 }
> +	 return false;
> +}
> +
>   static void pci_read_bridge_io(struct pci_bus *child)
>   {
>   	struct pci_dev *dev = child->self;
> @@ -340,6 +369,23 @@ static void pci_read_bridge_io(struct pci_bus *child)
>   	struct pci_bus_region region;
>   	struct resource *res;
>
> +	if (child->bus_flags & PCI_BUS_FLAGS_NO_IO)
> +		return;
> +
> +	if (!pci_bus_supports_io(child)) {
> +		dev_printk(KERN_DEBUG, &dev->dev,
> +			   "  bus does not support IO\n");
> +		child->bus_flags |= PCI_BUS_FLAGS_NO_IO;
> +		return;
> +	}
> +
> +	if (!pci_root_has_io_resource(child)) {
> +		dev_printk(KERN_DEBUG, &dev->dev,
> +			   "  no IO window on root bus\n");
> +		child->bus_flags |= PCI_BUS_FLAGS_NO_IO;
> +		return;
> +	}
> +
>   	io_mask = PCI_IO_RANGE_MASK;
>   	io_granularity = 0x1000;
>   	if (dev->io_window_1k) {
> diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
> index 508cc56130e3..c8c7eecadbfe 100644
> --- a/drivers/pci/setup-bus.c
> +++ b/drivers/pci/setup-bus.c
> @@ -744,7 +744,6 @@ int pci_claim_bridge_resource(struct pci_dev *bridge, int i)
>      base/limit registers must be read-only and read as 0. */
>   static void pci_bridge_check_ranges(struct pci_bus *bus)
>   {
> -	u16 io;
>   	u32 pmem;
>   	struct pci_dev *bridge = bus->self;
>   	struct resource *b_res;
> @@ -752,13 +751,7 @@ static void pci_bridge_check_ranges(struct pci_bus *bus)
>   	b_res = &bridge->resource[PCI_BRIDGE_RESOURCES];
>   	b_res[1].flags |= IORESOURCE_MEM;
>
> -	pci_read_config_word(bridge, PCI_IO_BASE, &io);
> -	if (!io) {
> -		pci_write_config_word(bridge, PCI_IO_BASE, 0xe0f0);
> -		pci_read_config_word(bridge, PCI_IO_BASE, &io);
> -		pci_write_config_word(bridge, PCI_IO_BASE, 0x0);
> -	}
> -	if (io)
> +	if (!(bus->bus_flags & PCI_BUS_FLAGS_NO_IO))
>   		b_res[0].flags |= IORESOURCE_IO;
>
>   	/*  DECchip 21050 pass 2 errata: the bridge may miss an address
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 8a0321a8fb59..b910ed04aa0b 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -191,6 +191,7 @@ typedef unsigned short __bitwise pci_bus_flags_t;
>   enum pci_bus_flags {
>   	PCI_BUS_FLAGS_NO_MSI   = (__force pci_bus_flags_t) 1,
>   	PCI_BUS_FLAGS_NO_MMRBC = (__force pci_bus_flags_t) 2,
> +	PCI_BUS_FLAGS_NO_IO    = (__force pci_bus_flags_t) 4,
>   };
>
>   /* These values come from the PCI Express Spec */
>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-07 18:11 [RFC PATCH v2] PCI: Only enable IO window if supported Guenter Roeck
  2015-07-24  3:09 ` Guenter Roeck
@ 2015-07-29 16:09 ` Bjorn Helgaas
  2015-07-29 19:30   ` Yinghai Lu
  1 sibling, 1 reply; 15+ messages in thread
From: Bjorn Helgaas @ 2015-07-29 16:09 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-pci, Lorenzo Pieralisi

On Tue, Jul 07, 2015 at 11:11:20AM -0700, Guenter Roeck wrote:
> The PCI subsystem always assumes that I/O is supported on PCIe bridges
> and tries to assign an I/O window to each child bus even if that is not
> the case.
> 
> This may result in messages such as
> 
> pcieport 0000:02:00.0: res[7]=[io  0x1000-0x0fff]
> 					get_res_add_size add_size 1000
> pcieport 0000:02:00.0: BAR 7: no space for [io  size 0x1000]
> pcieport 0000:02:00.0: BAR 7: failed to assign [io  size 0x1000]
> 
> for each bridge port, even if a bus or its parent does not support
> I/O in the first place.
> 
> To avoid this message, check if a bus supports I/O before trying to
> enable it. Also check if the root bus has an IO window assigned;
> if not, it does not make sense to try to assign one to any of its
> child busses.
> 
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>

Applied to pci/resource for v4.3, thanks!

> ---
> v2: Use a new bus flag to indicate if IO is supported on a bus or not.
>     Using IORESOURCE_DISABLED in resource flags turned out to be futile,
>     since the term "!res->flags" is widely used to detect if a resource
>     window is enabled or not, and setting IORESOURCE_DISABLED would
>     affect all this code.
> 
> This patch depends on 'PCI: move pci_read_bridge_bases to the generic
> PCI layer' by Lorenzo Pieralisi; without it, pci_read_bridge_io()
> is not always called.
> 
> With this version of the patch, pci_bridge_check_ranges() still sets
> IORESOURCE_IO. Moving this into pci_read_bridge_io() had undesirable
> side effects and resulted in missing IO window assignments on one of
> the x86 platforms I tested with. I'll have to explore this further.
> 
>  drivers/pci/probe.c     | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/pci/setup-bus.c |  9 +--------
>  include/linux/pci.h     |  1 +
>  3 files changed, 48 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index cefd636681b6..b21cba7aeb79 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -332,6 +332,35 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
>  	}
>  }
>  
> +static bool pci_bus_supports_io(struct pci_bus *bus)
> +{
> +	struct pci_dev *dev = bus->self;
> +	u16 io;
> +
> +	pci_read_config_word(dev, PCI_IO_BASE, &io);
> +	if (!io) {
> +		pci_write_config_word(dev, PCI_IO_BASE, 0xe0f0);
> +		pci_read_config_word(dev, PCI_IO_BASE, &io);
> +		pci_write_config_word(dev, PCI_IO_BASE, 0x0);
> +	}
> +	return !!io;
> +}
> +
> +static bool pci_root_has_io_resource(struct pci_bus *bus)
> +{
> +	struct resource *res;
> +	int i;
> +
> +	while (bus->parent)
> +		bus = bus->parent;
> +
> +	 pci_bus_for_each_resource(bus, res, i) {
> +		if (res && (res->flags & IORESOURCE_IO))
> +			return true;
> +	 }
> +	 return false;
> +}
> +
>  static void pci_read_bridge_io(struct pci_bus *child)
>  {
>  	struct pci_dev *dev = child->self;
> @@ -340,6 +369,23 @@ static void pci_read_bridge_io(struct pci_bus *child)
>  	struct pci_bus_region region;
>  	struct resource *res;
>  
> +	if (child->bus_flags & PCI_BUS_FLAGS_NO_IO)
> +		return;
> +
> +	if (!pci_bus_supports_io(child)) {
> +		dev_printk(KERN_DEBUG, &dev->dev,
> +			   "  bus does not support IO\n");
> +		child->bus_flags |= PCI_BUS_FLAGS_NO_IO;
> +		return;
> +	}
> +
> +	if (!pci_root_has_io_resource(child)) {
> +		dev_printk(KERN_DEBUG, &dev->dev,
> +			   "  no IO window on root bus\n");
> +		child->bus_flags |= PCI_BUS_FLAGS_NO_IO;
> +		return;
> +	}
> +
>  	io_mask = PCI_IO_RANGE_MASK;
>  	io_granularity = 0x1000;
>  	if (dev->io_window_1k) {
> diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
> index 508cc56130e3..c8c7eecadbfe 100644
> --- a/drivers/pci/setup-bus.c
> +++ b/drivers/pci/setup-bus.c
> @@ -744,7 +744,6 @@ int pci_claim_bridge_resource(struct pci_dev *bridge, int i)
>     base/limit registers must be read-only and read as 0. */
>  static void pci_bridge_check_ranges(struct pci_bus *bus)
>  {
> -	u16 io;
>  	u32 pmem;
>  	struct pci_dev *bridge = bus->self;
>  	struct resource *b_res;
> @@ -752,13 +751,7 @@ static void pci_bridge_check_ranges(struct pci_bus *bus)
>  	b_res = &bridge->resource[PCI_BRIDGE_RESOURCES];
>  	b_res[1].flags |= IORESOURCE_MEM;
>  
> -	pci_read_config_word(bridge, PCI_IO_BASE, &io);
> -	if (!io) {
> -		pci_write_config_word(bridge, PCI_IO_BASE, 0xe0f0);
> -		pci_read_config_word(bridge, PCI_IO_BASE, &io);
> -		pci_write_config_word(bridge, PCI_IO_BASE, 0x0);
> -	}
> -	if (io)
> +	if (!(bus->bus_flags & PCI_BUS_FLAGS_NO_IO))
>  		b_res[0].flags |= IORESOURCE_IO;
>  
>  	/*  DECchip 21050 pass 2 errata: the bridge may miss an address
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 8a0321a8fb59..b910ed04aa0b 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -191,6 +191,7 @@ typedef unsigned short __bitwise pci_bus_flags_t;
>  enum pci_bus_flags {
>  	PCI_BUS_FLAGS_NO_MSI   = (__force pci_bus_flags_t) 1,
>  	PCI_BUS_FLAGS_NO_MMRBC = (__force pci_bus_flags_t) 2,
> +	PCI_BUS_FLAGS_NO_IO    = (__force pci_bus_flags_t) 4,
>  };
>  
>  /* These values come from the PCI Express Spec */
> -- 
> 2.1.0
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-29 16:09 ` Bjorn Helgaas
@ 2015-07-29 19:30   ` Yinghai Lu
  2015-07-29 19:46     ` Guenter Roeck
  0 siblings, 1 reply; 15+ messages in thread
From: Yinghai Lu @ 2015-07-29 19:30 UTC (permalink / raw)
  To: Bjorn Helgaas; +Cc: Guenter Roeck, linux-pci, Lorenzo Pieralisi

On Wed, Jul 29, 2015 at 9:09 AM, Bjorn Helgaas <bhelgaas@google.com> wrote:
> On Tue, Jul 07, 2015 at 11:11:20AM -0700, Guenter Roeck wrote:
>> The PCI subsystem always assumes that I/O is supported on PCIe bridges
>> and tries to assign an I/O window to each child bus even if that is not
>> the case.
>>
>> This may result in messages such as
>>
>> pcieport 0000:02:00.0: res[7]=[io  0x1000-0x0fff]
>>                                       get_res_add_size add_size 1000
>> pcieport 0000:02:00.0: BAR 7: no space for [io  size 0x1000]
>> pcieport 0000:02:00.0: BAR 7: failed to assign [io  size 0x1000]
>>
>
> Applied to pci/resource for v4.3, thanks!
>> @@ -340,6 +369,23 @@ static void pci_read_bridge_io(struct pci_bus *child)
>>       struct pci_bus_region region;
>>       struct resource *res;
>>
>> +     if (child->bus_flags & PCI_BUS_FLAGS_NO_IO)
>> +             return;
>> +
>> +     if (!pci_bus_supports_io(child)) {
>> +             dev_printk(KERN_DEBUG, &dev->dev,
>> +                        "  bus does not support IO\n");
>> +             child->bus_flags |= PCI_BUS_FLAGS_NO_IO;
>> +             return;
>> +     }
>> +
>> +     if (!pci_root_has_io_resource(child)) {
>> +             dev_printk(KERN_DEBUG, &dev->dev,
>> +                        "  no IO window on root bus\n");
>> +             child->bus_flags |= PCI_BUS_FLAGS_NO_IO;
>> +             return;
>> +     }
>> +
>>       io_mask = PCI_IO_RANGE_MASK;
>>       io_granularity = 0x1000;
>>       if (dev->io_window_1k) {

Hi Bjorn,

Looks like you flip the PCI_BUS_FLAGS_NO_IO to
PCI_BUS_FLAGS_SUPPORT_IO, and now have

@@ -340,6 +373,21 @@ static void pci_read_bridge_io(struct pci_bus *child)
        struct pci_bus_region region;
        struct resource *res;

+       if (!(child->bus_flags & PCI_BUS_FLAGS_SUPPORTS_IO))
+               return;
+
+       if (!pci_bridge_supports_io(dev)) {
+               dev_printk(KERN_DEBUG, &dev->dev, "  no I/O window\n");
+               return;
+       }
+
+       if (!pci_root_has_io_resource(child)) {
+               dev_printk(KERN_DEBUG, &dev->dev, "  no I/O resource
on root bus\n");
+               return;
+       }
+
+       child->bus_flags |= PCI_BUS_FLAGS_SUPPORTS_IO;
+

so PCI_BUS_FLAGS_SUPPORTS_IO will never get set.

Yinghai

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-29 19:30   ` Yinghai Lu
@ 2015-07-29 19:46     ` Guenter Roeck
  2015-07-29 19:53       ` Yinghai Lu
  0 siblings, 1 reply; 15+ messages in thread
From: Guenter Roeck @ 2015-07-29 19:46 UTC (permalink / raw)
  To: Yinghai Lu, Bjorn Helgaas; +Cc: linux-pci, Lorenzo Pieralisi

On 07/29/2015 12:30 PM, Yinghai Lu wrote:
> On Wed, Jul 29, 2015 at 9:09 AM, Bjorn Helgaas <bhelgaas@google.com> wrote:
>> On Tue, Jul 07, 2015 at 11:11:20AM -0700, Guenter Roeck wrote:
>>> The PCI subsystem always assumes that I/O is supported on PCIe bridges
>>> and tries to assign an I/O window to each child bus even if that is not
>>> the case.
>>>
>>> This may result in messages such as
>>>
>>> pcieport 0000:02:00.0: res[7]=[io  0x1000-0x0fff]
>>>                                        get_res_add_size add_size 1000
>>> pcieport 0000:02:00.0: BAR 7: no space for [io  size 0x1000]
>>> pcieport 0000:02:00.0: BAR 7: failed to assign [io  size 0x1000]
>>>
>>
>> Applied to pci/resource for v4.3, thanks!
>>> @@ -340,6 +369,23 @@ static void pci_read_bridge_io(struct pci_bus *child)
>>>        struct pci_bus_region region;
>>>        struct resource *res;
>>>
>>> +     if (child->bus_flags & PCI_BUS_FLAGS_NO_IO)
>>> +             return;
>>> +
>>> +     if (!pci_bus_supports_io(child)) {
>>> +             dev_printk(KERN_DEBUG, &dev->dev,
>>> +                        "  bus does not support IO\n");
>>> +             child->bus_flags |= PCI_BUS_FLAGS_NO_IO;
>>> +             return;
>>> +     }
>>> +
>>> +     if (!pci_root_has_io_resource(child)) {
>>> +             dev_printk(KERN_DEBUG, &dev->dev,
>>> +                        "  no IO window on root bus\n");
>>> +             child->bus_flags |= PCI_BUS_FLAGS_NO_IO;
>>> +             return;
>>> +     }
>>> +
>>>        io_mask = PCI_IO_RANGE_MASK;
>>>        io_granularity = 0x1000;
>>>        if (dev->io_window_1k) {
>
> Hi Bjorn,
>
> Looks like you flip the PCI_BUS_FLAGS_NO_IO to
> PCI_BUS_FLAGS_SUPPORT_IO, and now have
>
> @@ -340,6 +373,21 @@ static void pci_read_bridge_io(struct pci_bus *child)
>          struct pci_bus_region region;
>          struct resource *res;
>
> +       if (!(child->bus_flags & PCI_BUS_FLAGS_SUPPORTS_IO))
> +               return;
> +
> +       if (!pci_bridge_supports_io(dev)) {
> +               dev_printk(KERN_DEBUG, &dev->dev, "  no I/O window\n");
> +               return;
> +       }
> +
> +       if (!pci_root_has_io_resource(child)) {
> +               dev_printk(KERN_DEBUG, &dev->dev, "  no I/O resource
> on root bus\n");
> +               return;
> +       }
> +
> +       child->bus_flags |= PCI_BUS_FLAGS_SUPPORTS_IO;
> +
>
> so PCI_BUS_FLAGS_SUPPORTS_IO will never get set.
>

Hi Yinghai,

excellent catch. Unfortunately, I don't know how to make it
work with the reversed flag. The idea here was that the flag
propagates from parent to child. This makes sense for an
"it doesn't work" flag to be inherited from the child,
but not for an "it works" flag.

Guenter


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-29 19:46     ` Guenter Roeck
@ 2015-07-29 19:53       ` Yinghai Lu
  2015-07-29 20:02         ` Guenter Roeck
  2015-07-29 20:18         ` Guenter Roeck
  0 siblings, 2 replies; 15+ messages in thread
From: Yinghai Lu @ 2015-07-29 19:53 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi

On Wed, Jul 29, 2015 at 12:46 PM, Guenter Roeck <linux@roeck-us.net> wrote:
> On 07/29/2015 12:30 PM, Yinghai Lu wrote:
>
>>
>> so PCI_BUS_FLAGS_SUPPORTS_IO will never get set.
>>
>
> excellent catch. Unfortunately, I don't know how to make it
> work with the reversed flag. The idea here was that the flag
> propagates from parent to child. This makes sense for an
> "it doesn't work" flag to be inherited from the child,
> but not for an "it works" flag.
>

also would be better if we can add has_ioport in hostbridge instead.
like has_mem64 in https://patchwork.ozlabs.org/patch/500926/
and use

to_pci_host_bridge(bus->bridge)->has_ioport

to replace pci_root_has_io_resource()

Thanks

Yinghai

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-29 19:53       ` Yinghai Lu
@ 2015-07-29 20:02         ` Guenter Roeck
  2015-07-29 20:24           ` Yinghai Lu
  2015-07-29 20:26           ` Bjorn Helgaas
  2015-07-29 20:18         ` Guenter Roeck
  1 sibling, 2 replies; 15+ messages in thread
From: Guenter Roeck @ 2015-07-29 20:02 UTC (permalink / raw)
  To: Yinghai Lu; +Cc: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi

On 07/29/2015 12:53 PM, Yinghai Lu wrote:
> On Wed, Jul 29, 2015 at 12:46 PM, Guenter Roeck <linux@roeck-us.net> wrote:
>> On 07/29/2015 12:30 PM, Yinghai Lu wrote:
>>
>>>
>>> so PCI_BUS_FLAGS_SUPPORTS_IO will never get set.
>>>
>>
>> excellent catch. Unfortunately, I don't know how to make it
>> work with the reversed flag. The idea here was that the flag
>> propagates from parent to child. This makes sense for an
>> "it doesn't work" flag to be inherited from the child,
>> but not for an "it works" flag.
>>
>
> also would be better if we can add has_ioport in hostbridge instead.
> like has_mem64 in https://patchwork.ozlabs.org/patch/500926/
> and use
>
> to_pci_host_bridge(bus->bridge)->has_ioport
>
> to replace pci_root_has_io_resource()
>

Sure, that would make sense.

Bjorn, how do you want to handle the flag problem ?
Do you have an idea on how to make it work with
the reversed definition ?

Thanks,
Guenter


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-29 19:53       ` Yinghai Lu
  2015-07-29 20:02         ` Guenter Roeck
@ 2015-07-29 20:18         ` Guenter Roeck
  2015-07-29 20:21           ` Yinghai Lu
  1 sibling, 1 reply; 15+ messages in thread
From: Guenter Roeck @ 2015-07-29 20:18 UTC (permalink / raw)
  To: Yinghai Lu; +Cc: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi

On 07/29/2015 12:53 PM, Yinghai Lu wrote:
> On Wed, Jul 29, 2015 at 12:46 PM, Guenter Roeck <linux@roeck-us.net> wrote:
>> On 07/29/2015 12:30 PM, Yinghai Lu wrote:
>>
>>>
>>> so PCI_BUS_FLAGS_SUPPORTS_IO will never get set.
>>>
>>
>> excellent catch. Unfortunately, I don't know how to make it
>> work with the reversed flag. The idea here was that the flag
>> propagates from parent to child. This makes sense for an
>> "it doesn't work" flag to be inherited from the child,
>> but not for an "it works" flag.
>>
>
> also would be better if we can add has_ioport in hostbridge instead.
> like has_mem64 in https://patchwork.ozlabs.org/patch/500926/
> and use
>
> to_pci_host_bridge(bus->bridge)->has_ioport
>
> to replace pci_root_has_io_resource()
>

Is there a function to get the root bus ? Otherwise I still need to
find the root bus first.

Guenter


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-29 20:18         ` Guenter Roeck
@ 2015-07-29 20:21           ` Yinghai Lu
  0 siblings, 0 replies; 15+ messages in thread
From: Yinghai Lu @ 2015-07-29 20:21 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi

On Wed, Jul 29, 2015 at 1:18 PM, Guenter Roeck <linux@roeck-us.net> wrote:
> On 07/29/2015 12:53 PM, Yinghai Lu wrote:
>>
>> On Wed, Jul 29, 2015 at 12:46 PM, Guenter Roeck <linux@roeck-us.net>
>> wrote:
>>>
>>> On 07/29/2015 12:30 PM, Yinghai Lu wrote:
>>>
>>>>
>>>> so PCI_BUS_FLAGS_SUPPORTS_IO will never get set.
>>>>
>>>
>>> excellent catch. Unfortunately, I don't know how to make it
>>> work with the reversed flag. The idea here was that the flag
>>> propagates from parent to child. This makes sense for an
>>> "it doesn't work" flag to be inherited from the child,
>>> but not for an "it works" flag.
>>>
>>
>> also would be better if we can add has_ioport in hostbridge instead.
>> like has_mem64 in https://patchwork.ozlabs.org/patch/500926/
>> and use
>>
>> to_pci_host_bridge(bus->bridge)->has_ioport
>>
>> to replace pci_root_has_io_resource()
>>
>
> Is there a function to get the root bus ? Otherwise I still need to
> find the root bus first.
host-bridge and rootbus is one to one mapping.

drivers/pci/host-bridge.c has related function.


Yinghai

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-29 20:02         ` Guenter Roeck
@ 2015-07-29 20:24           ` Yinghai Lu
  2015-07-29 20:26           ` Bjorn Helgaas
  1 sibling, 0 replies; 15+ messages in thread
From: Yinghai Lu @ 2015-07-29 20:24 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi

[-- Attachment #1: Type: text/plain, Size: 1245 bytes --]

On Wed, Jul 29, 2015 at 1:02 PM, Guenter Roeck <linux@roeck-us.net> wrote:

> Do you have an idea on how to make it work with
> the reversed definition ?

attached one should address the problem.

index ddda0916..e8def25 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -378,16 +378,16 @@ static void pci_read_bridge_io(struct pci_bus *child)

     if (!pci_bridge_supports_io(dev)) {
         dev_printk(KERN_DEBUG, &dev->dev, "  no I/O window\n");
+        child->bus_flags &= ~PCI_BUS_FLAGS_SUPPORTS_IO;
         return;
     }

     if (!pci_root_has_io_resource(child)) {
         dev_printk(KERN_DEBUG, &dev->dev, "  no I/O resource on root bus\n");
+        child->bus_flags &= ~PCI_BUS_FLAGS_SUPPORTS_IO;
         return;
     }

-    child->bus_flags |= PCI_BUS_FLAGS_SUPPORTS_IO;
-
     io_mask = PCI_IO_RANGE_MASK;
     io_granularity = 0x1000;
     if (dev->io_window_1k) {
@@ -544,6 +544,7 @@ static struct pci_bus *pci_alloc_bus(struct pci_bus *parent)
     INIT_LIST_HEAD(&b->resources);
     b->max_bus_speed = PCI_SPEED_UNKNOWN;
     b->cur_bus_speed = PCI_SPEED_UNKNOWN;
+    b->bus_flags |= PCI_BUS_FLAGS_SUPPORTS_IO;
 #ifdef CONFIG_PCI_DOMAINS_GENERIC
     if (parent)
         b->domain_nr = parent->domain_nr;

[-- Attachment #2: supports_io.patch --]
[-- Type: text/x-patch, Size: 1025 bytes --]

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index ddda0916..e8def25 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -378,16 +378,16 @@ static void pci_read_bridge_io(struct pci_bus *child)
 
 	if (!pci_bridge_supports_io(dev)) {
 		dev_printk(KERN_DEBUG, &dev->dev, "  no I/O window\n");
+		child->bus_flags &= ~PCI_BUS_FLAGS_SUPPORTS_IO;
 		return;
 	}
 
 	if (!pci_root_has_io_resource(child)) {
 		dev_printk(KERN_DEBUG, &dev->dev, "  no I/O resource on root bus\n");
+		child->bus_flags &= ~PCI_BUS_FLAGS_SUPPORTS_IO;
 		return;
 	}
 
-	child->bus_flags |= PCI_BUS_FLAGS_SUPPORTS_IO;
-
 	io_mask = PCI_IO_RANGE_MASK;
 	io_granularity = 0x1000;
 	if (dev->io_window_1k) {
@@ -544,6 +544,7 @@ static struct pci_bus *pci_alloc_bus(struct pci_bus *parent)
 	INIT_LIST_HEAD(&b->resources);
 	b->max_bus_speed = PCI_SPEED_UNKNOWN;
 	b->cur_bus_speed = PCI_SPEED_UNKNOWN;
+	b->bus_flags |= PCI_BUS_FLAGS_SUPPORTS_IO;
 #ifdef CONFIG_PCI_DOMAINS_GENERIC
 	if (parent)
 		b->domain_nr = parent->domain_nr;

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-29 20:02         ` Guenter Roeck
  2015-07-29 20:24           ` Yinghai Lu
@ 2015-07-29 20:26           ` Bjorn Helgaas
  2015-07-30  3:59             ` Yinghai Lu
  1 sibling, 1 reply; 15+ messages in thread
From: Bjorn Helgaas @ 2015-07-29 20:26 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Yinghai Lu, linux-pci, Lorenzo Pieralisi

On Wed, Jul 29, 2015 at 01:02:25PM -0700, Guenter Roeck wrote:
> On 07/29/2015 12:53 PM, Yinghai Lu wrote:
> >On Wed, Jul 29, 2015 at 12:46 PM, Guenter Roeck <linux@roeck-us.net> wrote:
> >>On 07/29/2015 12:30 PM, Yinghai Lu wrote:
> >>
> >>>
> >>>so PCI_BUS_FLAGS_SUPPORTS_IO will never get set.
> >>>
> >>
> >>excellent catch. Unfortunately, I don't know how to make it
> >>work with the reversed flag. The idea here was that the flag
> >>propagates from parent to child. This makes sense for an
> >>"it doesn't work" flag to be inherited from the child,
> >>but not for an "it works" flag.
> >>
> >
> >also would be better if we can add has_ioport in hostbridge instead.
> >like has_mem64 in https://patchwork.ozlabs.org/patch/500926/
> >and use
> >
> >to_pci_host_bridge(bus->bridge)->has_ioport
> >
> >to replace pci_root_has_io_resource()
> >
> 
> Sure, that would make sense.
> 
> Bjorn, how do you want to handle the flag problem ?
> Do you have an idea on how to make it work with
> the reversed definition ?

I'll wait for the revised patch.  Sorry for screwing this up.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-29 20:26           ` Bjorn Helgaas
@ 2015-07-30  3:59             ` Yinghai Lu
  2015-07-30  4:17               ` Guenter Roeck
  0 siblings, 1 reply; 15+ messages in thread
From: Yinghai Lu @ 2015-07-30  3:59 UTC (permalink / raw)
  To: Bjorn Helgaas; +Cc: Guenter Roeck, linux-pci, Lorenzo Pieralisi

[-- Attachment #1: Type: text/plain, Size: 391 bytes --]

On Wed, Jul 29, 2015 at 1:26 PM, Bjorn Helgaas <bhelgaas@google.com> wrote:
> On Wed, Jul 29, 2015 at 01:02:25PM -0700, Guenter Roeck wrote:
>> Bjorn, how do you want to handle the flag problem ?
>> Do you have an idea on how to make it work with
>> the reversed definition ?
>
> I'll wait for the revised patch.  Sorry for screwing this up.

Please check attached updated version.

Yinghai

[-- Attachment #2: commit-4b59da5_x.patch --]
[-- Type: text/x-patch, Size: 5312 bytes --]

commit 4b59da521f7e0aedff75c2aa90b6a653727cdf7f
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Tue Jul 7 11:11:20 2015 -0700

    The PCI subsystem always assumes that I/O is supported on PCIe bridges and
    tries to assign an I/O window to each child bus even if that is not the
    case.
    
    This may result in messages such as:
    
      pcieport 0000:02:00.0: res[7]=[io  0x1000-0x0fff] get_res_add_size add_size 1000
      pcieport 0000:02:00.0: BAR 7: no space for [io  size 0x1000]
      pcieport 0000:02:00.0: BAR 7: failed to assign [io  size 0x1000]
    
    for each bridge port, even if a bus or its parent does not support I/O in
    the first place.
    
    To avoid this message, check if a bus supports I/O before trying to enable
    it.  Also check if the root bus has an IO window assigned; if not, it does
    not make sense to try to assign one to any of its child busses.
    
    [bhelgaas: reverse sense of new pci_bus_flags_t value]
    [yinghai: simplify root bus flag check, fix flags initial setting, change to bool]
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    CC: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>

---
 drivers/pci/probe.c     |   51 ++++++++++++++++++++++++++++++++++++++++++++++++
 drivers/pci/setup-bus.c |   11 ++--------
 include/linux/pci.h     |    1 
 3 files changed, 55 insertions(+), 8 deletions(-)

Index: linux-2.6/drivers/pci/probe.c
===================================================================
--- linux-2.6.orig/drivers/pci/probe.c
+++ linux-2.6/drivers/pci/probe.c
@@ -332,6 +332,32 @@ static void pci_read_bases(struct pci_de
 	}
 }
 
+static bool pci_bridge_supports_io(struct pci_dev *bridge)
+{
+	u16 io;
+
+	pci_read_config_word(bridge, PCI_IO_BASE, &io);
+	if (io)
+		return true;
+
+	/* IO_BASE/LIMIT is either hard-wired to zero or programmed to zero */
+	pci_write_config_word(bridge, PCI_IO_BASE, 0xe0f0);
+	pci_read_config_word(bridge, PCI_IO_BASE, &io);
+	pci_write_config_word(bridge, PCI_IO_BASE, 0x0);
+	if (io)
+		return true;
+
+	return false;
+}
+
+static bool pci_root_has_io_resource(struct pci_bus *bus)
+{
+	while (bus->parent)
+		bus = bus->parent;
+
+	return !!(bus->bus_flags & PCI_BUS_FLAGS_SUPPORTS_IO);
+}
+
 static void pci_read_bridge_io(struct pci_bus *child)
 {
 	struct pci_dev *dev = child->self;
@@ -340,6 +366,21 @@ static void pci_read_bridge_io(struct pc
 	struct pci_bus_region region;
 	struct resource *res;
 
+	if (!(child->bus_flags & PCI_BUS_FLAGS_SUPPORTS_IO))
+		return;
+
+	if (!pci_bridge_supports_io(dev)) {
+		dev_printk(KERN_DEBUG, &dev->dev, "  no I/O window\n");
+		child->bus_flags &= ~PCI_BUS_FLAGS_SUPPORTS_IO;
+		return;
+	}
+
+	if (!pci_root_has_io_resource(child)) {
+		dev_printk(KERN_DEBUG, &dev->dev, "  no I/O resource on root bus\n");
+		child->bus_flags &= ~PCI_BUS_FLAGS_SUPPORTS_IO;
+		return;
+	}
+
 	io_mask = PCI_IO_RANGE_MASK;
 	io_granularity = 0x1000;
 	if (dev->io_window_1k) {
@@ -496,6 +537,7 @@ static struct pci_bus *pci_alloc_bus(str
 	INIT_LIST_HEAD(&b->resources);
 	b->max_bus_speed = PCI_SPEED_UNKNOWN;
 	b->cur_bus_speed = PCI_SPEED_UNKNOWN;
+	b->bus_flags |= PCI_BUS_FLAGS_SUPPORTS_IO;
 #ifdef CONFIG_PCI_DOMAINS_GENERIC
 	if (parent)
 		b->domain_nr = parent->domain_nr;
@@ -2058,6 +2100,15 @@ int pci_bus_insert_busn_res(struct pci_b
 		res->flags |= IORESOURCE_PCI_FIXED;
 	}
 
+	b->bus_flags &= ~PCI_BUS_FLAGS_SUPPORTS_IO;
+	resource_list_for_each_entry(window, &bridge->windows) {
+		res = window->res;
+		if (resource_type(res) == IORESOURCE_IO) {
+			b->bus_flags |= PCI_BUS_FLAGS_SUPPORTS_IO;
+			break;
+		}
+	}
+
 	conflict = request_resource_conflict(parent_res, res);
 
 	if (conflict)
Index: linux-2.6/drivers/pci/setup-bus.c
===================================================================
--- linux-2.6.orig/drivers/pci/setup-bus.c
+++ linux-2.6/drivers/pci/setup-bus.c
@@ -744,7 +744,6 @@ int pci_claim_bridge_resource(struct pci
    base/limit registers must be read-only and read as 0. */
 static void pci_bridge_check_ranges(struct pci_bus *bus)
 {
-	u16 io;
 	u32 pmem;
 	struct pci_dev *bridge = bus->self;
 	struct resource *b_res;
@@ -752,14 +751,10 @@ static void pci_bridge_check_ranges(stru
 	b_res = &bridge->resource[PCI_BRIDGE_RESOURCES];
 	b_res[1].flags |= IORESOURCE_MEM;
 
-	pci_read_config_word(bridge, PCI_IO_BASE, &io);
-	if (!io) {
-		pci_write_config_word(bridge, PCI_IO_BASE, 0xe0f0);
-		pci_read_config_word(bridge, PCI_IO_BASE, &io);
-		pci_write_config_word(bridge, PCI_IO_BASE, 0x0);
-	}
-	if (io)
+	if (bus->bus_flags & PCI_BUS_FLAGS_SUPPORTS_IO)
 		b_res[0].flags |= IORESOURCE_IO;
+	else
+		b_res[0].flags &= ~IORESOURCE_IO;
 
 	/*  DECchip 21050 pass 2 errata: the bridge may miss an address
 	    disconnect boundary by one PCI data phase.
Index: linux-2.6/include/linux/pci.h
===================================================================
--- linux-2.6.orig/include/linux/pci.h
+++ linux-2.6/include/linux/pci.h
@@ -193,6 +193,7 @@ typedef unsigned short __bitwise pci_bus
 enum pci_bus_flags {
 	PCI_BUS_FLAGS_NO_MSI   = (__force pci_bus_flags_t) 1,
 	PCI_BUS_FLAGS_NO_MMRBC = (__force pci_bus_flags_t) 2,
+	PCI_BUS_FLAGS_SUPPORTS_IO = (__force pci_bus_flags_t) 4,
 };
 
 /* These values come from the PCI Express Spec */

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-30  3:59             ` Yinghai Lu
@ 2015-07-30  4:17               ` Guenter Roeck
  2015-07-30 16:18                 ` Bjorn Helgaas
  0 siblings, 1 reply; 15+ messages in thread
From: Guenter Roeck @ 2015-07-30  4:17 UTC (permalink / raw)
  To: Yinghai Lu, Bjorn Helgaas; +Cc: linux-pci, Lorenzo Pieralisi

On 07/29/2015 08:59 PM, Yinghai Lu wrote:
> On Wed, Jul 29, 2015 at 1:26 PM, Bjorn Helgaas <bhelgaas@google.com> wrote:
>> On Wed, Jul 29, 2015 at 01:02:25PM -0700, Guenter Roeck wrote:
>>> Bjorn, how do you want to handle the flag problem ?
>>> Do you have an idea on how to make it work with
>>> the reversed definition ?
>>
>> I'll wait for the revised patch.  Sorry for screwing this up.
>
> Please check attached updated version.
>
> Yinghai
>

My version is slightly different, but this one should work as well.

The subject line got lost somehow.

Guenter


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-30  4:17               ` Guenter Roeck
@ 2015-07-30 16:18                 ` Bjorn Helgaas
  2015-07-30 17:06                   ` Guenter Roeck
  0 siblings, 1 reply; 15+ messages in thread
From: Bjorn Helgaas @ 2015-07-30 16:18 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: Yinghai Lu, linux-pci, Lorenzo Pieralisi

On Wed, Jul 29, 2015 at 11:17 PM, Guenter Roeck <linux@roeck-us.net> wrote:
> On 07/29/2015 08:59 PM, Yinghai Lu wrote:
>>
>> On Wed, Jul 29, 2015 at 1:26 PM, Bjorn Helgaas <bhelgaas@google.com>
>> wrote:
>>>
>>> On Wed, Jul 29, 2015 at 01:02:25PM -0700, Guenter Roeck wrote:
>>>>
>>>> Bjorn, how do you want to handle the flag problem ?
>>>> Do you have an idea on how to make it work with
>>>> the reversed definition ?
>>>
>>>
>>> I'll wait for the revised patch.  Sorry for screwing this up.
>>
>>
>> Please check attached updated version.
>>
>> Yinghai
>>
>
> My version is slightly different, but this one should work as well.
>
> The subject line got lost somehow.

Guenter, would you mind just sending me a fresh version of your patch
with whatever Yinghai tweaks you want to keep?

It's a PITA for me to deal with attachments.

Bjorn

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH v2] PCI: Only enable IO window if supported
  2015-07-30 16:18                 ` Bjorn Helgaas
@ 2015-07-30 17:06                   ` Guenter Roeck
  0 siblings, 0 replies; 15+ messages in thread
From: Guenter Roeck @ 2015-07-30 17:06 UTC (permalink / raw)
  To: Bjorn Helgaas; +Cc: Yinghai Lu, linux-pci, Lorenzo Pieralisi

On Thu, Jul 30, 2015 at 11:18:40AM -0500, Bjorn Helgaas wrote:
> >
> > My version is slightly different, but this one should work as well.
> >
> > The subject line got lost somehow.
> 
> Guenter, would you mind just sending me a fresh version of your patch
> with whatever Yinghai tweaks you want to keep?
> 
Sure, as soon as I completed testing. I am currently having trouble
with our infrastructure [again :-(], so it may take a couple of days.

> It's a PITA for me to deal with attachments.
> 
Same here.

Guenter

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2015-07-30 17:06 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-07 18:11 [RFC PATCH v2] PCI: Only enable IO window if supported Guenter Roeck
2015-07-24  3:09 ` Guenter Roeck
2015-07-29 16:09 ` Bjorn Helgaas
2015-07-29 19:30   ` Yinghai Lu
2015-07-29 19:46     ` Guenter Roeck
2015-07-29 19:53       ` Yinghai Lu
2015-07-29 20:02         ` Guenter Roeck
2015-07-29 20:24           ` Yinghai Lu
2015-07-29 20:26           ` Bjorn Helgaas
2015-07-30  3:59             ` Yinghai Lu
2015-07-30  4:17               ` Guenter Roeck
2015-07-30 16:18                 ` Bjorn Helgaas
2015-07-30 17:06                   ` Guenter Roeck
2015-07-29 20:18         ` Guenter Roeck
2015-07-29 20:21           ` Yinghai Lu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.