[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC PATCH 1/2] pci: Allow platforms to modify BAR adresses


  • To: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Mykyta Poturai <Mykyta_Poturai@xxxxxxxx>
  • Date: Tue, 21 Apr 2026 07:57:14 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=eWEjEoDaHyx8D7ETHnBAHXhn2LY10JL0lgsjPN9gVyk=; b=tBuM79ja/E11hWANBFpfWdTIK519F9Z7+06pChE54z0WYC6jF22Bf7MAWHzULplcoNsWNA9UeInhmxJBHOPwOzHW2mrWGKrkol5Q815nmjhLI6wo+EpPDDTF0IqkqSWOMAVadnANcIa89y9mclG8eKVrsh//7dvoSIrDAIeQ1jxjqh/MHYIA3FtM1t5IGI6lxxzfeMoQsCoEvi6H7zQwG1DEtYhDZ9aQlBrHTEvf6Wer6k/mN0vnvEkLlMSYsxYf7K+zQxNA0rmm+itrU8+jREe7hQqQ7vfRrj/VZp/jPR4znsHsewIrDzbz0tYOQp7TAEeBmz8b8kp5qCuKacOO5w==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QFmAk0co2D8Ev4JkBp4yE24TvdWu2lreWVF5ykhBNjfhd3He+2K++A3lIfK7jbZ6ARBquK43JhnXIEGcNuCAndx00/KEtdC8X4LDxKTH1EJDjLP4xik3JgS3V/FoL0CGx2INwO/sGTXD0vQxvmSI8arnSpoS9ZeMRy3OJkcEVGcaVWS7RmGvxuVzEXPllk2B2sdFh++6DTzhRSU2ArHF8P8lnnG2/b4xeg0h7XIGvAbai83KOP+HG5Ej+Kd9ljmJuQJ7csnKrWHlpPePpI7C86McIvJsqkjQxuBm1G6UQ3/itr7q72dF0U7OiM7o87/KNxIvNVhpMIipkVYI8r70UQ==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=epam.com header.i="@epam.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=epam.com;
  • Cc: Mykyta Poturai <Mykyta_Poturai@xxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Teddy Astie <teddy.astie@xxxxxxxxxx>, Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
  • Delivery-date: Tue, 21 Apr 2026 07:57:19 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHc0WR37j+cn2EDhkOwlRb5qqOUDg==
  • Thread-topic: [RFC PATCH 1/2] pci: Allow platforms to modify BAR adresses

This patch is a preparatory work for adding Region ID support on Renesas
R-Car series boards. Add new host bridge op "fixup_bar" that allows
platforms to modify BAR addresses before they are mapped.

Because x86 don't have support for PCI Host Bridge drivers, add another
level of indirection in form of platform_pci_fixup_bar() function, that
will call host bridge op on ARM and do nothing on x86.

Signed-off-by: Mykyta Poturai <mykyta_poturai@xxxxxxxx>
---
 xen/arch/arm/include/asm/pci.h  |  3 +++
 xen/arch/arm/include/asm/vpci.h |  9 +++++++++
 xen/arch/arm/vpci.c             | 12 ++++++++++++
 xen/arch/x86/include/asm/vpci.h |  6 ++++++
 xen/drivers/vpci/header.c       |  2 ++
 5 files changed, 32 insertions(+)

diff --git a/xen/arch/arm/include/asm/pci.h b/xen/arch/arm/include/asm/pci.h
index 7c3211823f..398a4eb746 100644
--- a/xen/arch/arm/include/asm/pci.h
+++ b/xen/arch/arm/include/asm/pci.h
@@ -80,6 +80,9 @@ struct pci_ops {
     void (*init_bus_range)(struct dt_device_node *dev,
                            struct pci_host_bridge *bridge,
                            struct pci_config_window *cfg);
+    void (*fixup_bar)(struct pci_host_bridge *bridge,
+                      unsigned int bar_num,
+                      paddr_t *addr);
 };
 
 /*
diff --git a/xen/arch/arm/include/asm/vpci.h b/xen/arch/arm/include/asm/vpci.h
index 0cc6f5a105..f5c817a51c 100644
--- a/xen/arch/arm/include/asm/vpci.h
+++ b/xen/arch/arm/include/asm/vpci.h
@@ -16,6 +16,10 @@ struct vpci_arch_msix_entry {
 
 int domain_vpci_init(struct domain *d);
 unsigned int domain_vpci_get_num_mmio_handlers(struct domain *d);
+
+void platform_pci_fixup_bar(const struct pci_dev *pdev, unsigned int bar_num,
+                            paddr_t *addr);
+
 #else
 static inline int domain_vpci_init(struct domain *d)
 {
@@ -26,6 +30,11 @@ static inline unsigned int 
domain_vpci_get_num_mmio_handlers(struct domain *d)
 {
     return 0;
 }
+
+static inline void platform_pci_fixup_bar(const struct pci_dev *pdev,
+                                          unsigned int bar_num,
+                                          paddr_t *addr)
+{}
 #endif /* CONFIG_HAS_VPCI */
 
 #endif /* ARM_VPCI_H */
diff --git a/xen/arch/arm/vpci.c b/xen/arch/arm/vpci.c
index d41aa383a8..ec6efec22e 100644
--- a/xen/arch/arm/vpci.c
+++ b/xen/arch/arm/vpci.c
@@ -189,6 +189,18 @@ unsigned int domain_vpci_get_num_mmio_handlers(struct 
domain *d)
     return 1;
 }
 
+void platform_pci_fixup_bar(const struct pci_dev *pdev,
+                                          unsigned int bar_num,
+                                          paddr_t *addr)
+{
+    struct pci_host_bridge *bridge = pci_find_host_bridge(pdev->sbdf.seg, 
pdev->sbdf.bus);
+
+    if ( bridge->ops->fixup_bar )
+    {
+        bridge->ops->fixup_bar(bridge, bar_num, addr);
+    }
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/xen/arch/x86/include/asm/vpci.h b/xen/arch/x86/include/asm/vpci.h
index c501ff1709..a05b70abbf 100644
--- a/xen/arch/x86/include/asm/vpci.h
+++ b/xen/arch/x86/include/asm/vpci.h
@@ -16,6 +16,12 @@ struct vpci_arch_msix_entry {
     int pirq;
 };
 
+/* X86 does not require PCI BAR modifications */
+static inline void platform_pci_fixup_bar(const struct pci_dev *pdev,
+                                          unsigned int bar_num,
+                                          paddr_t *addr)
+{}
+
 #endif /* X86_VPCI_H */
 
 /*
diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c
index a760d8c32f..d89e43354c 100644
--- a/xen/drivers/vpci/header.c
+++ b/xen/drivers/vpci/header.c
@@ -882,6 +882,8 @@ int vpci_init_header(struct pci_dev *pdev)
         bars[i].size = size;
         bars[i].prefetchable = val & PCI_BASE_ADDRESS_MEM_PREFETCH;
 
+        platform_pci_fixup_bar(pdev, i, &bars[i].addr);
+
         rc = vpci_add_register(pdev->vpci,
                                is_hwdom ? vpci_hw_read32 : guest_mem_bar_read,
                                is_hwdom ? bar_write : guest_mem_bar_write,
-- 
2.51.2



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.