mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v1] PCI: endpoint: Skip upper halves of 64-bit BARs during search
@ 2026-10-21  8:06 Manikanta Maddireddy
  2026-10-21 10:45 ` Niklas Cassel
  0 siblings, 1 reply; 3+ messages in thread
From: Manikanta Maddireddy @ 2026-10-21  8:06 UTC (permalink / raw)
  To: mani, kwilczynski, linux-pci
  Cc: kishon, Frank.Li, bhelgaas, cassel, den, thierry.reding,
	jonathanh, vidyas, linux-tegra, linux-kernel, mmaddireddy

pci_epc_get_next_free_bar() skips the upper half of a 64-bit BAR only
when it is the starting BAR. If the search subsequently passes a
reserved or disabled 64-bit BAR, it can return its upper half as an
independent BAR because that slot has a default programmable descriptor.

For example, Tegra exposes a programmable 64-bit BAR0 and reserved
64-bit BAR2 and BAR4. A search starting at BAR1 skips BAR1 and BAR2,
then incorrectly returns BAR3. The next search can similarly return
BAR5, causing the EPF test driver to allocate and program BARs that
belong to the reserved hardware windows.

Check each candidate's preceding descriptor inside the search loop so
upper halves are skipped throughout the search. With the Tegra layout,
BAR0 is the only available BAR and subsequent searches return NO_BAR.

Signed-off-by: Manikanta Maddireddy <mmaddireddy@nvidia.com>
---
 drivers/pci/endpoint/pci-epc-core.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci-epc-core.c
index 831b40458dcd..8d0df9fc1df9 100644
--- a/drivers/pci/endpoint/pci-epc-core.c
+++ b/drivers/pci/endpoint/pci-epc-core.c
@@ -98,11 +98,11 @@ enum pci_barno pci_epc_get_next_free_bar(const struct pci_epc_features
 	if (!epc_features)
 		return BAR_0;
 
-	/* If 'bar - 1' is a 64-bit BAR, move to the next BAR */
-	if (bar > 0 && epc_features->bar[bar - 1].only_64bit)
-		bar++;
-
 	for (i = bar; i < PCI_STD_NUM_BARS; i++) {
+		/* Skip the upper half of a 64-bit BAR. */
+		if (i > 0 && epc_features->bar[i - 1].only_64bit)
+			continue;
+
 		/* If the BAR is not reserved or disabled, return it. */
 		if (epc_features->bar[i].type != BAR_RESERVED &&
 		    epc_features->bar[i].type != BAR_DISABLED)
-- 
2.34.1


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

end of thread, other threads:[~2026-10-21 14:25 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-21  8:06 [PATCH v1] PCI: endpoint: Skip upper halves of 64-bit BARs during search Manikanta Maddireddy
2026-10-21 10:45 ` Niklas Cassel
2026-10-21 14:25   ` Niklas Cassel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®