[PATCH v5 02/23] PCI: Enable bridge's I/O and MEM access for hotplugged devices
Bjorn Helgaas
helgaas at kernel.org
Sat Sep 28 08:01:35 AEST 2019
On Fri, Aug 16, 2019 at 07:50:40PM +0300, Sergey Miroshnichenko wrote:
> The PCI_COMMAND_IO and PCI_COMMAND_MEMORY bits of the bridge must be
> updated not only when enabling the bridge for the first time, but also if a
> hotplugged device requests these types of resources.
Yeah, this assumption that pci_is_enabled() means PCI_COMMAND_IO and
PCI_COMMAND_MEMORY are set correctly even though we may now need
*different* settings than when we incremented pdev->enable_cnt is
quite broken.
> Originally these bits were set by the pci_enable_device_flags() only, which
> exits early if the bridge is already pci_is_enabled(). So if the bridge was
> empty initially (an edge case), then hotplugged devices fail to IO/MEM.
>
> Signed-off-by: Sergey Miroshnichenko <s.miroshnichenko at yadro.com>
> ---
> drivers/pci/pci.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index e7f8c354e644..61d951766087 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -1652,6 +1652,14 @@ static void pci_enable_bridge(struct pci_dev *dev)
> pci_enable_bridge(bridge);
>
> if (pci_is_enabled(dev)) {
> + int i, bars = 0;
> +
> + for (i = PCI_BRIDGE_RESOURCES; i < DEVICE_COUNT_RESOURCE; i++) {
> + if (dev->resource[i].flags & (IORESOURCE_MEM | IORESOURCE_IO))
> + bars |= (1 << i);
> + }
> + do_pci_enable_device(dev, bars);
> +
> if (!dev->is_busmaster)
> pci_set_master(dev);
> mutex_unlock(&dev->enable_mutex);
> --
> 2.21.0
>
More information about the Linuxppc-dev
mailing list