On Wed, 17 Sep 2025, Lucas De Marchi wrote:

> From: Ilpo Järvinen <ilpo.jarvi...@linux.intel.com>
> 
> Resizing BAR to a larger size has to release upstream bridge windows in
> order make the bridge windows larger as well (and to potential relocate
> them into a larger free block within iomem space). Some GPUs have an
> integrated PCI switch that has BAR0. The resource allocation assigns
> space for that BAR0 as it does for any resource.
> 
> An extra resource on a bridge will pin its upstream bridge window in
> place which prevents BAR resize for anything beneath that bridge.
> 
> Nothing in the pcieport driver provided by PCI core, which typically is
> the driver bound to these bridges, requires that BAR0. Because of that,
> releasing the extra BAR does not seem to have notable downsides but
> comes with a clear upside.
> 
> Therefore, release BAR0 of such switches using a quirk and clear its
> flags to prevent any new invocation of the resource assignment
> algorithm from assigning the resource again.
> 
> Due to other siblings within the PCI hierarchy of all the devices
> integrated into the GPU, some other devices may still have to be
> manually removed before the resize is free of any bridge window pins.
> Such siblings can be released through sysfs to unpin windows while
> leaving access to GPU's sysfs entries required for initiating the
> resize operation, whereas removing the topmost bridge this quirk
> targets would result in removing the GPU device as well so no manual
> workaround for this problem exists.
> 
> Reported-by: Lucas De Marchi <lucas.demar...@intel.com>
> Cc: <sta...@vger.kernel.org> # 6.12+
> Link: 
> https://lore.kernel.org/linux-pci/fl6tx5ztvttg7txmz2ps7oyd745wg3lwcp3h7esmvnyg26n44y@owo2ojiu2mov/
> Signed-off-by: Ilpo Järvinen <ilpo.jarvi...@linux.intel.com>
> Signed-off-by: Lucas De Marchi <lucas.demar...@intel.com>
> ---
>  drivers/pci/quirks.c | 20 ++++++++++++++++++++

Please include all relevant people into submissions. You've left all PCI 
receipients out (except me).

I also recommend you leave that part I put under --- line into the 
submission as it explain my position on why I think it's reasonable 
interim solution as we don't expect it more complicated solution to be 
something we wnat to push into older kernels (perhaps mark it as 
"Remarks from Ilpo:" or something along those lines so it doesn't get 
misattributed to you).

-- 
 i.

>  1 file changed, 20 insertions(+)
> 
> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
> index d97335a401930..98a4f0a1285be 100644
> --- a/drivers/pci/quirks.c
> +++ b/drivers/pci/quirks.c
> @@ -6338,3 +6338,23 @@ static void pci_mask_replay_timer_timeout(struct 
> pci_dev *pdev)
>  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_GLI, 0x9750, 
> pci_mask_replay_timer_timeout);
>  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_GLI, 0x9755, 
> pci_mask_replay_timer_timeout);
>  #endif
> +
> +/*
> + * PCI switches integrated into some GPUs have BAR0 that prevents resizing
> + * the BARs of the GPU device due to that bridge BAR0 pinning the bridge
> + * window it's under in place. Nothing in pcieport requires that BAR0.
> + *
> + * Release and disable BAR0 permanently by clearing its flags to prevent
> + * anything from assigning it again.
> + */
> +static void pci_release_bar0(struct pci_dev *pdev)
> +{
> +     struct resource *res = pci_resource_n(pdev, 0);
> +
> +     if (!res->parent)
> +             return;
> +
> +     pci_release_resource(pdev, 0);
> +     res->flags = 0;
> +}
> +DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_INTEL, 0xe2ff, pci_release_bar0);
> 
> 

Reply via email to