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

[PATCH v2 2/3] vpci: allow BAR map/unmap without affecting memory decoding bit


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
  • Date: Wed, 23 Jul 2025 12:37:42 -0400
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • 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=xe9gMIo3gkDd6ETT+xugRqmmoUz50b4pUIRZemnzS2M=; b=kK+llIiAC3VuD3kIDPqcczuB06twz0/CE1NqsJs60nP19D5o3jzc0HbDaCQ8ebzNrtoC2z10jTOHSz7N8T+iaxcz0617oj5Gbrbb+wHOakxAVc5qDoT1yawm5f991+CNgZ4i0oDXgugm50Ai7yWee3rRR+Exylcix0BpU8ScbL1FmhlK67BOOgC8n0v43l9rcSYQfze68Gr+atZa0F5zqZJv5HSl6IeVf2ulNUIO2xuMiEcxv8jRDsLcLiSUMcj32PA5a2022RwhWqxASiDkOX+mSVBg5kUh1D8hhz2xeaqJZ+F92OWEp9q0oGlVxTqCPVoiCmqpxOfgX5iweIj85w==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rfP1tYK0MX1VPMxn1SQXhhkKqLDzqXQ4pVhQxdXPKR5PiATHm1kM4I87XY7xo2MGq4vZ6W+nOfhEpQdOLqBD3xC49gpvi4gYnn8HStnxSoV4dMK6YwSKEfKE7zmLExtYcGADonipiRfU7gW8nZRrZ9b1UWolGCVfs4vY4mrmqPxHFY7rastS5Nzq91/MLNctYuLQZZEafc8N8+FxocG2aGqo9bcsRJzrJAtfmL76blkAyPHBlWN3rWavlnm4vmDsissVK3ar9CGde+jW0ri/aOCsMD7Fo+hTbgKj6RFtQ8pUkES0Bzz9V90TxCpOum7vGndxfXPhPIsSpvpUkk6R+Q==
  • Cc: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Delivery-date: Wed, 23 Jul 2025 16:38:17 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Introduce enum vpci_map_op and allow invoking modify_bars() without
changing the memory decoding bit.

Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
---
v1->v2:
* new patch
---
 xen/drivers/vpci/header.c | 22 +++++++++++++++-------
 xen/include/xen/vpci.h    |  4 ++++
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c
index df065a5f5faf..1c66796b625b 100644
--- a/xen/drivers/vpci/header.c
+++ b/xen/drivers/vpci/header.c
@@ -189,7 +189,7 @@ static bool vpci_process_map_task(struct vpci_map_task 
*task)
         struct vpci_bar_map *bar = &task->bars[i];
         struct map_data data = {
             .d = task->domain,
-            .map = task->cmd & PCI_COMMAND_MEMORY,
+            .map = task->map_op == VPCI_MAP,
             .bar = bar,
         };
         int rc;
@@ -298,7 +298,9 @@ static int __init apply_map(struct vpci_map_task *task)
 }
 
 static struct vpci_map_task *alloc_map_task(const struct pci_dev *pdev,
-                                            uint16_t cmd, bool rom_only)
+                                            uint16_t cmd,
+                                            enum vpci_map_op map_op,
+                                            bool rom_only)
 {
     struct vpci_map_task *task = xzalloc(struct vpci_map_task);
     unsigned int i;
@@ -333,6 +335,7 @@ static struct vpci_map_task *alloc_map_task(const struct 
pci_dev *pdev,
     task->pdev = pdev;
     task->domain = pdev->domain;
     task->cmd = cmd;
+    task->map_op = map_op;
     task->rom_only = rom_only;
 
     return task;
@@ -359,13 +362,14 @@ static void defer_map(struct vpci_map_task *task)
     raise_softirq(SCHEDULE_SOFTIRQ);
 }
 
-static int modify_bars(const struct pci_dev *pdev, uint16_t cmd, bool rom_only)
+static int modify_bars(const struct pci_dev *pdev, uint16_t cmd,
+                       enum vpci_map_op map_op, bool rom_only)
 {
     struct vpci_header *header = &pdev->vpci->header;
     struct pci_dev *tmp;
     const struct domain *d;
     const struct vpci_msix *msix = pdev->vpci->msix;
-    struct vpci_map_task *task = alloc_map_task(pdev, cmd, rom_only);
+    struct vpci_map_task *task = alloc_map_task(pdev, cmd, map_op, rom_only);
     unsigned int i, j;
     int rc;
 
@@ -614,7 +618,8 @@ static void cf_check cmd_write(
          * memory decoding bit has not been changed, so leave everything as-is,
          * hoping the guest will realize and try again.
          */
-        modify_bars(pdev, cmd, false);
+        modify_bars(pdev, cmd, cmd & PCI_COMMAND_MEMORY ? VPCI_MAP : 
VPCI_UNMAP,
+                    false);
     else
         pci_conf_write16(pdev->sbdf, reg, cmd);
 }
@@ -782,7 +787,8 @@ static void cf_check rom_write(
      * Pass PCI_COMMAND_MEMORY or 0 to signal a map/unmap request, note that
      * this fabricated command is never going to be written to the register.
      */
-    else if ( modify_bars(pdev, new_enabled ? PCI_COMMAND_MEMORY : 0, true) )
+    else if ( modify_bars(pdev, new_enabled ? PCI_COMMAND_MEMORY : 0,
+                          new_enabled ? VPCI_MAP : VPCI_UNMAP, true) )
         /*
          * No memory has been added or removed from the p2m (because the actual
          * p2m changes are deferred in defer_map) and the ROM enable bit has
@@ -1067,7 +1073,9 @@ static int cf_check init_header(struct pci_dev *pdev)
             goto fail;
     }
 
-    return (cmd & PCI_COMMAND_MEMORY) ? modify_bars(pdev, cmd, false) : 0;
+    return (cmd & PCI_COMMAND_MEMORY)
+           ? modify_bars(pdev, cmd, VPCI_MAP, false)
+           : 0;
 
  fail:
     pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd);
diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h
index c2e75076691f..fb6cad62d418 100644
--- a/xen/include/xen/vpci.h
+++ b/xen/include/xen/vpci.h
@@ -205,6 +205,10 @@ struct vpci_map_task {
         struct rangeset *mem;
     } bars[PCI_HEADER_NORMAL_NR_BARS + 1];
     uint16_t cmd;
+    enum vpci_map_op {
+        VPCI_MAP,
+        VPCI_UNMAP,
+    } map_op;
     bool rom_only : 1;
 };
 
-- 
2.50.1




 


Rackspace

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