From: Bjorn Helgaas <helgaas@kernel.org>
To: Sergey Miroshnichenko <s.miroshnichenko@yadro.com>
Cc: linux-pci@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
linux@yadro.com
Subject: Re: [PATCH RFC v4 17/21] PCI: Calculate boundaries for bridge windows
Date: Tue, 26 Mar 2019 16:01:28 -0500 [thread overview]
Message-ID: <20190326210128.GW24180@google.com> (raw)
In-Reply-To: <20190311133122.11417-18-s.miroshnichenko@yadro.com>
On Mon, Mar 11, 2019 at 04:31:18PM +0300, Sergey Miroshnichenko wrote:
> If a bridge window contains fixed areas (there are PCIe devices with
> immovable BARs located on this bus),
I think what you mean by "immovable BARs" is "drivers that don't
support moving BARs". I want to keep the concept of legacy and EA
resources separate because those are immovable in principle, but
drivers can always be improved.
> this window must be allocated
> within the bound memory area, limited by windows size and by address
> range of fixed resources, calculated as follows:
>
> | <-- bus's fixed_range_hard --> |
> | <-- fixed_range_hard.end - window size --> |
> | <-- fixed_range_hard.start + window size --> |
> | <-- bus's fixed_range_soft --> |
>
> Signed-off-by: Sergey Miroshnichenko <s.miroshnichenko@yadro.com>
> ---
> drivers/pci/setup-bus.c | 56 +++++++++++++++++++++++++++++++++++++++++
> include/linux/pci.h | 4 ++-
> 2 files changed, 59 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
> index a1fd7f3c5ea8..f4737339d5ec 100644
> --- a/drivers/pci/setup-bus.c
> +++ b/drivers/pci/setup-bus.c
> @@ -1809,6 +1809,61 @@ static enum enable_type pci_realloc_detect(struct pci_bus *bus,
> }
> #endif
>
> +static void pci_bus_update_fixed_range_soft(struct pci_bus *bus)
> +{
> + struct pci_dev *dev;
> + struct pci_bus *parent = bus->parent;
> + int idx;
> +
> + list_for_each_entry(dev, &bus->devices, bus_list)
> + if (dev->subordinate)
> + pci_bus_update_fixed_range_soft(dev->subordinate);
> +
> + if (!parent || !bus->self)
> + return;
> +
> + for (idx = 0; idx < ARRAY_SIZE(bus->fixed_range_hard); ++idx) {
> + struct resource *r;
> + resource_size_t soft_start, soft_end;
> + resource_size_t hard_start = bus->fixed_range_hard[idx].start;
> + resource_size_t hard_end = bus->fixed_range_hard[idx].end;
> +
> + if (hard_start > hard_end)
> + continue;
> +
> + r = bus->resource[idx];
> +
> + soft_start = hard_end - resource_size(r) + 1;
> + soft_end = hard_start + resource_size(r) - 1;
> +
> + if (soft_start > hard_start)
> + soft_start = hard_start;
> +
> + if (soft_end < hard_end)
> + soft_end = hard_end;
> +
> + list_for_each_entry(dev, &parent->devices, bus_list) {
> + struct pci_bus *sibling = dev->subordinate;
> + resource_size_t s_start, s_end;
> +
> + if (!sibling || sibling == bus)
> + continue;
> +
> + s_start = sibling->fixed_range_hard[idx].start;
> + s_end = sibling->fixed_range_hard[idx].end;
> +
> + if (s_start > s_end)
> + continue;
> +
> + if (s_end < hard_start && s_end > soft_start)
> + soft_start = s_end;
> + }
> +
> + bus->fixed_range_soft[idx].start = soft_start;
> + bus->fixed_range_soft[idx].end = soft_end;
> + }
> +}
> +
> /*
> * first try will not touch pci bridge res
> * second and later try will clear small leaf bridge res
> @@ -1847,6 +1902,7 @@ void pci_assign_unassigned_root_bus_resources(struct pci_bus *bus)
> /* Depth first, calculate sizes and alignments of all
> subordinate buses. */
> __pci_bus_size_bridges(bus, add_list);
> + pci_bus_update_fixed_range_soft(bus);
>
> /* Depth last, allocate resources and update the hardware. */
> __pci_bus_assign_resources(bus, add_list, &fail_head);
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 7a4d62d84bc1..75a56db73ad4 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -574,9 +574,11 @@ struct pci_bus {
>
> /*
> * If there are fixed resources in the bridge window, the hard range
> - * contains the lowest and the highest addresses of them.
> + * contains the lowest and the highest addresses of them, and this
> + * bridge window must reside within the soft range.
> */
> struct resource fixed_range_hard[PCI_BRIDGE_RESOURCE_NUM];
> + struct resource fixed_range_soft[PCI_BRIDGE_RESOURCE_NUM];
>
> struct pci_ops *ops; /* Configuration access functions */
> struct msi_controller *msi; /* MSI controller */
> --
> 2.20.1
>
next prev parent reply other threads:[~2019-03-26 21:01 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-11 13:31 [PATCH RFC v4 00/21] PCI: Allow BAR movement during hotplug Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 01/21] PCI: Fix writing invalid BARs during pci_restore_state() Sergey Miroshnichenko
2019-03-26 14:02 ` Bjorn Helgaas
2019-03-11 13:31 ` [PATCH RFC v4 02/21] PCI: Fix race condition in pci_enable/disable_device() Sergey Miroshnichenko
2019-03-26 19:00 ` Bjorn Helgaas
2019-03-27 17:11 ` Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 03/21] PCI: Enable bridge's I/O and MEM access for hotplugged devices Sergey Miroshnichenko
2019-03-26 19:13 ` Bjorn Helgaas
2019-03-27 17:13 ` Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 04/21] PCI: Define PCI-specific version of the release_child_resources() Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 05/21] PCI: hotplug: Add a flag for the movable BARs feature Sergey Miroshnichenko
2019-03-26 19:24 ` Bjorn Helgaas
2019-03-27 17:16 ` Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 06/21] PCI: Pause the devices with movable BARs during rescan Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 07/21] PCI: Wake up bridges during rescan when movable BARs enabled Sergey Miroshnichenko
2019-03-26 19:28 ` Bjorn Helgaas
2019-03-11 13:31 ` [PATCH RFC v4 08/21] nvme-pci: Handle movable BARs Sergey Miroshnichenko
2019-03-26 20:20 ` Bjorn Helgaas
2019-03-27 17:30 ` Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 09/21] PCI: Mark immovable BARs with PCI_FIXED Sergey Miroshnichenko
2019-03-26 20:28 ` Bjorn Helgaas
2019-03-27 17:03 ` David Laight
2019-03-27 17:39 ` Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 10/21] PCI: Fix assigning of fixed prefetchable resources Sergey Miroshnichenko
2019-03-26 20:37 ` Bjorn Helgaas
2019-03-11 13:31 ` [PATCH RFC v4 11/21] PCI: Release and reassign the root bridge resources during rescan Sergey Miroshnichenko
2019-03-26 20:41 ` Bjorn Helgaas
2019-03-27 17:40 ` Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 12/21] PCI: Don't allow hotplugged devices to steal resources Sergey Miroshnichenko
2019-03-26 20:55 ` Bjorn Helgaas
2019-03-27 18:02 ` Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 13/21] PCI: Include fixed BARs into the bus size calculating Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 14/21] PCI: Don't reserve memory for hotplug when enabled movable BARs Sergey Miroshnichenko
2019-03-26 20:57 ` Bjorn Helgaas
2019-03-11 13:31 ` [PATCH RFC v4 15/21] PCI: Allow the failed resources to be reassigned later Sergey Miroshnichenko
2019-03-26 20:58 ` Bjorn Helgaas
2019-03-11 13:31 ` [PATCH RFC v4 16/21] PCI: Calculate fixed areas of bridge windows based on fixed BARs Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 17/21] PCI: Calculate boundaries for bridge windows Sergey Miroshnichenko
2019-03-26 21:01 ` Bjorn Helgaas [this message]
2019-03-11 13:31 ` [PATCH RFC v4 18/21] PCI: Make sure bridge windows include their fixed BARs Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 19/21] PCI: Prioritize fixed BAR assigning over the movable ones Sergey Miroshnichenko
2019-03-11 13:31 ` [PATCH RFC v4 20/21] PCI: pciehp: Add support for the movable BARs feature Sergey Miroshnichenko
2019-03-26 21:11 ` Bjorn Helgaas
2019-03-11 13:31 ` [PATCH RFC v4 21/21] powerpc/pci: Fix crash with enabled movable BARs Sergey Miroshnichenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190326210128.GW24180@google.com \
--to=helgaas@kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux@yadro.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=s.miroshnichenko@yadro.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).