{"id":2235170,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2235170/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260508183717.193630-9-tdave@nvidia.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.2/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260508183717.193630-9-tdave@nvidia.com>","list_archive_url":null,"date":"2026-05-08T18:37:17","name":"[RFC,8/8] hw/arm/virt: add pci-pre-enum machine property","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"bed6ae240ccad6723accba4e8fe01d44b69ecae1","submitter":{"id":89928,"url":"http://patchwork.ozlabs.org/api/1.2/people/89928/?format=json","name":"Tushar Dave","email":"tdave@nvidia.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260508183717.193630-9-tdave@nvidia.com/mbox/","series":[{"id":503429,"url":"http://patchwork.ozlabs.org/api/1.2/series/503429/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=503429","date":"2026-05-08T18:37:09","name":"hw/arm/virt, hw/pci: PCI pre-enumeration and fixed BAR allocation","version":1,"mbox":"http://patchwork.ozlabs.org/series/503429/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2235170/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2235170/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256\n header.s=selector2 header.b=mQtH6eN9;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)","dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=nvidia.com;"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4gByZg2Z7nz1yCg\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 09 May 2026 04:39:23 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wLQ5e-0006lZ-9g; Fri, 08 May 2026 14:38:23 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <tdave@nvidia.com>)\n id 1wLQ5Y-0006jj-Nt; Fri, 08 May 2026 14:38:16 -0400","from\n mail-northcentralusazlp170100001.outbound.protection.outlook.com\n ([2a01:111:f403:c105::1] helo=CH1PR05CU001.outbound.protection.outlook.com)\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <tdave@nvidia.com>)\n id 1wLQ5T-0002b2-Kj; Fri, 08 May 2026 14:38:14 -0400","from BY5PR12MB4179.namprd12.prod.outlook.com (2603:10b6:a03:211::8)\n by DM4PR12MB6205.namprd12.prod.outlook.com (2603:10b6:8:a8::19) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.15; Fri, 8 May\n 2026 18:37:59 +0000","from BY5PR12MB4179.namprd12.prod.outlook.com\n ([fe80::2036:e8b:9b3:f325]) by BY5PR12MB4179.namprd12.prod.outlook.com\n ([fe80::2036:e8b:9b3:f325%4]) with mapi id 15.20.9891.019; Fri, 8 May 2026\n 18:37:58 +0000"],"ARC-Seal":"i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=eqZq4FdQOzqMOFoVmld+5x5yfQmATNoFIcvPuIxQDb0RXN6mL1oZnnuc5YSZ829B6CxqzQ14xVCPMmk4Eu5lZTQfXhsZ4uduVQwrnzACZIxCsEt+uKBz+nXZjkKYOI2TBHXGYgfDPVa6wBSlIXaMdSmX+XQOEpX7v0wiQ1f4hGBWvMzBij6lWqPyAjDFVLb8YSTO2i6c4Ie9/0uwOxRB0sxMeey5G/E5v5Bunqyd+41CyVGsUnRgMYR/8vhgahRqW/60w+QUCHAKQEPjFDSanK02l2h+mS+i/a8zSvmu1oXYRve3BXipYDoGVW+WNuNbUTAzncSka43FpbgJgpAbjQ==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n 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;\n bh=3BmZzqD5g0RjTtepjL+pk+Y22ANUW4q9Gg58vJr4ggA=;\n b=qF8FC3Y6navVIjEIw4rtZwYWnV1znESVZtk9hjzlreE9IBW1LT3QuhWw9SYoMarxXa+Frm8jUOUNkc0GEETKuPVa6GViBMeqpLzK7kAifrieFV7E6qba8sFnKMZ6YIS8hV9d22lRRMKaHSBYjUXhaKsNN1R1xiTiFvVbFYbo4coAdUyFomDz5CHzJfwopZLDgGdPXRxPjHRRKlmRinHvDCyu9wyw9vcq5t9LYXvh0ifruq6/UscZU0jEfKzVui1g+cncdBRRAxgNvYvjrNSSkRV8swNgL5y0a6XNUHMRE+XZQiy0WNvzpcwRC/9GI4gxCxGnyeZV1sS4lzoLepKUOQ==","ARC-Authentication-Results":"i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com;\n dkim=pass header.d=nvidia.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=3BmZzqD5g0RjTtepjL+pk+Y22ANUW4q9Gg58vJr4ggA=;\n b=mQtH6eN9/dvf3QPdvkbqREk9lxTSD1Cv6Jk8HssoyOkiNNV7Cvxq3n+BFCz91lmEVkoSiKayLRlUQY0VDexDaDicFybNFxF5XsM83Gkvn8y0IqW8WFHfEU0dMHYOnF1NBwI23BIeNK6jyGDwBvrirGZngOQeIHmlTwESVPeejC39sVnWJr1PQNLv9Hvuy2ioWTerrKN/EeQjmLIc5tVm1rKvZIiRBe+weAbzo74y41gyX0ypgrhXkjv3pLEp921I3YFRot1BLDggjyeGs6xNIuw1H+eGx7OZBYiQ2G3cLIgu80LzKhBRabeT4TN+MgwTwrdtC0wuaj2hDeDvwDJgzA==","From":"Tushar Dave <tdave@nvidia.com>","To":"qemu-devel@nongnu.org","Cc":"alwilliamson@nvidia.com, jgg@nvidia.com, skolothumtho@nvidia.com,\n qemu-arm@nongnu.org, peter.maydell@linaro.org, mst@redhat.com,\n marcel.apfelbaum@gmail.com, devel@edk2.groups.io","Subject":"[RFC PATCH 8/8] hw/arm/virt: add pci-pre-enum machine property","Date":"Fri,  8 May 2026 13:37:17 -0500","Message-Id":"<20260508183717.193630-9-tdave@nvidia.com>","X-Mailer":"git-send-email 2.34.1","In-Reply-To":"<20260508183717.193630-1-tdave@nvidia.com>","References":"<20260508183717.193630-1-tdave@nvidia.com>","Content-Transfer-Encoding":"8bit","Content-Type":"text/plain","X-ClientProxiedBy":"MN0PR04CA0024.namprd04.prod.outlook.com\n (2603:10b6:208:52d::14) To BY5PR12MB4179.namprd12.prod.outlook.com\n (2603:10b6:a03:211::8)","MIME-Version":"1.0","X-MS-PublicTrafficType":"Email","X-MS-TrafficTypeDiagnostic":"BY5PR12MB4179:EE_|DM4PR12MB6205:EE_","X-MS-Office365-Filtering-Correlation-Id":"10276576-64e8-4e5f-0acc-08dead30ed16","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"BCL:0;\n ARA:13230040|366016|1800799024|376014|22082099003|18002099003|56012099003|3023799003;","X-Microsoft-Antispam-Message-Info":"\n 1mbtS108Ad2Im9h41cs0MDVzTO84ku6mE+4M6jA03+Mzsl6vlSx5kDHb4QRMltoKeMCLDQcsf7pjtL/YUfSgcJ+x7hK9dcJSf6zmvQXsAq8nqUmeQ9nQPAEA1KFtG4wwKOPUwwz7P//biab/4qPGowJHmoc/19Oc06AqyyH5udUZiUvBs9G4/XVplddY8YxWPYrc3PnUUi9rtpvCtvDX+pSyDkD59g0T8ZdYV33LSk1/gmITQj2Z9bhLku1ww4qCbdmAEsAiLO7KZBKYfp1XhPZ+jnwUstB17yOJ21VCBGsZ7xlN31GtMIS9zlSQVvpTeywCYiq9HL/PfiHskl22/Sy0FfxVPYOA8RtdMV+6YuR45x37ldUzMUpKcjlXymTVyIl7YlO6aI93As9XtM9Miq1sKk4fay5ZkvCbLF018g6aKTAk9n3diYAsLkXQKqgxDipMcKE+C9o5WraIKr3jeVo8E6pzzJpOqZ5O/7FpnrNmvIAqYlpMTa8m6jweS+WjI19Q0vEpblOOk6N0OxUa5/PalxdJ17jdUp5jbXa3SBvx5GO4ieei6bRge71RjrIwowzYV+li0P66IFwFhKWdrq5ea2peWB1nY75hRpoQfmMnjGr55MTmT2ZN/WxJNiWb0iWpPopfcZjF8v90pgkip3T9LO4XAp97NjhiclS18+xq2M7A2QzydKXRVfOmmiZI","X-Forefront-Antispam-Report":"CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:BY5PR12MB4179.namprd12.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230040)(366016)(1800799024)(376014)(22082099003)(18002099003)(56012099003)(3023799003);\n DIR:OUT; SFP:1101;","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"\n wUdyKEgwyAvbMyuX2X1tp+MnZi0ajBKONOrzBRgrRSBgOSmWdn0LBaYHwYsx9MGteLvsqk0iOAf5skDadkfDtEXWF55FPKT3CtDsW5QRQaqZdUpT581ox+ZwxgLGdYK79rdafv/sLdnZUclV0GoHdfSGvdR1rMoEJpAtJ1C4qUPa52mqqvV1jofMQxUoQa0+JGdq24y5CPOSDk+RaY4EDXwt6Ipq482p5zgvELckA2dzou6NQAPLH73KzrUCh3mNdUYh3dRVps9O0fPRZcjLQ4Jr597jefzRg++iMVqvHXwMBAlvyLLY1l/JxqlGfn33qPpkcgr9bMcs0c3KAjArMjOtNDpAsU6+b/tdm2cMTXXGNsIUyYC8TMSYIa3WHJYjoKBG4FFNNWjnxcFU3GuNxVYycLjeExSbARATBYAF089Z7k40sKk4E3Le4z7QjVYFYXjyuOhdslbXr85K7qLBy+ftbTS2BIGK9bq1vn5T8qQHA3zyaPbKSiGEHEwah/y/GYHaE+KXpYZYesrrvlbCUBPHP6i5jimzLrlisVqnwysXR/PZOr+E/R+wvN4Kt4cAYn6+I247pK1I2717krXv4oQGYCNfG4ttdoFMRXdMNwsDPPVyaMlWkwDfGUpUAmXhOjPoHWCscreQ48FmOSEUrNGKMTc1zwQalvUF41FVp+tSIGPwn7MYuATVS3uG7xNZTtlYorzyeV6dC5oaxTLJDyshBqzNZekkQ/5oPSB5SIPLDOTzC+38mKKLh/x/iVZHvyLslrfqSt3UJuMJxeW4veQxxAhxzcKGiUza3WrGcmtD6SPsqPpitM71oLsB5BU4mwgkhCyYo1ERBhv87i/b1+YhNfjQ5WwFVER46pc2008Dbv+UfpAWWD2+zqc0FmzckMK+MnFjeUTNj0icSVM2ijZtrKYaH7zTNy+1MPCdkcchNs0BPSMslR1oUmtmfsUcnkr0lxNlFDARoflnHASyhq/3hioqMwwtn4amOlMuiuQmvZ8BSXsxbjYc386fMk+l4YuaOr8u/ixvgphDKvpiloLl2nfFBvLsfxD4bzB8tigkpxOYslUNvTj+sCWwCFME1nAnnr3FxNOGLyqV6XTATHpkQwK85bIFB4mpec0xdadhcEl3iySK8IETGbOlOce8Ph5IqYTjGGaVdoap3JTuQnWVmNLZ3Yr1HZxlmytrB98Gjo+wr7Va3x33mE2Sr+j7kqVOWVP0FkimzHIWLehVWfG4sqvAuNFWiyzHElOWaeOI/53TtFsO4zKTMrUDx2VVQULJhkwzOK9jtCQiq1bGuznMc7m8sUoGTvAIJz0OH2th12m9JhL8bXAQnJgebhNspWAVX5fmZc1hzlu/5E9sUU7LqObmSOXWO7+96z3UZ5wb4MxY7m3HdSh+WVQ193oYpviQ/JaYzeB5jLnK0uNUR0ULYXdiYtG3sf0thVwSAVkEnqqbF2RQRZx+mxYS+2me+nc+Hze90uQvrndHkdwKqZ2IAOmsnNEQCoZOtGo4stX6ZAlAxCSfXa46rsWHnoazATDyH4kejo/LGn49/fPsSqwAwODxJQSMDzUd1YHKjz4SK1Bew6RdKYjOjuxrimJUIbETxpicWIR1t8uZalFkPlHbnH1Vi31DwiXrF6j+LXuu6w/71Q0ZFlkaQwSigJHG5E1mb/n+2GYkCRlSsUB+DpyOAiUBSq8yeY/F6oF8M1xFgeyxqLMuR6FlGEb7IfZVpdmi+L68B2MuCPMWKeJTJA==","X-OriginatorOrg":"Nvidia.com","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n 10276576-64e8-4e5f-0acc-08dead30ed16","X-MS-Exchange-CrossTenant-AuthSource":"BY5PR12MB4179.namprd12.prod.outlook.com","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"08 May 2026 18:37:58.2351 (UTC)","X-MS-Exchange-CrossTenant-FromEntityHeader":"Hosted","X-MS-Exchange-CrossTenant-Id":"43083d15-7273-40c1-b7db-39efd9ccc17a","X-MS-Exchange-CrossTenant-MailboxType":"HOSTED","X-MS-Exchange-CrossTenant-UserPrincipalName":"\n x79vPuThMU3c+/VYYEvq+Z3Xa++cVmi9yOjltDZ+Sj5Puyr/MlKfi7bpr6su/fn1YfN0dpxZTnrqLMTzztYuxg==","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"DM4PR12MB6205","Received-SPF":"permerror client-ip=2a01:111:f403:c105::1;\n envelope-from=tdave@nvidia.com;\n helo=CH1PR05CU001.outbound.protection.outlook.com","X-Spam_score_int":"-14","X-Spam_score":"-1.5","X-Spam_bar":"-","X-Spam_report":"(-1.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.44,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n FORGED_SPF_HELO=1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_PASS=-0.001,\n SPF_NONE=0.001 autolearn=no autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"Add a \"pci-pre-enum\" option for the virt machine. When enabled, QEMU\nperforms PCI enumeration and programs BARs before handing control to\nfirmware.\n\nThis is intended for use with the \"fixed-bars\" property, where the\nuser assigns fixed BAR addresses and expects firmware to preserve the\nconfiguration.\n\npci-pre-enum is exposed as a separate machine property rather than\nbeing implied by the presence of fixed-bars. This allows QEMU's PCI\nenumeration path to be exercised independently (for example, to\nverify that QEMU produces the same device enumeration as EDK2)\nwithout requiring any device to specify fixed BARs.\n\nWhen enabled, a \"pci-enum-done\" property is added to the PCI node in\nthe device tree to indicate to firmware (e.g. EDK2) that PCI\nenumeration has already been performed.\n\nWhen disabled (default), behavior is unchanged.\n\nSigned-off-by: Tushar Dave <tdave@nvidia.com>\n---\n hw/arm/virt.c         | 70 +++++++++++++++++++++++++++++++++++++++++--\n include/hw/arm/virt.h |  1 +\n 2 files changed, 68 insertions(+), 3 deletions(-)","diff":"diff --git a/hw/arm/virt.c b/hw/arm/virt.c\nindex 55f41c7e46..7d41bfc457 100644\n--- a/hw/arm/virt.c\n+++ b/hw/arm/virt.c\n@@ -52,6 +52,7 @@\n #include \"system/whpx.h\"\n #include \"system/qtest.h\"\n #include \"system/system.h\"\n+#include \"system/reset.h\"\n #include \"hw/core/loader.h\"\n #include \"qapi/error.h\"\n #include \"qemu/bitops.h\"\n@@ -94,6 +95,8 @@\n #include \"hw/cxl/cxl.h\"\n #include \"hw/cxl/cxl_host.h\"\n #include \"qemu/guest-random.h\"\n+#include \"hw/pci/pci-resource.h\"\n+#include \"hw/pci/pci-enumerate.h\"\n \n static GlobalProperty arm_virt_compat_defaults[] = {\n     { TYPE_VIRTIO_IOMMU_PCI, \"aw-bits\", \"48\" },\n@@ -1697,6 +1700,10 @@ static void create_pcie(VirtMachineState *vms)\n     qemu_fdt_setprop_cell(ms->fdt, nodename, \"#interrupt-cells\", 1);\n     create_pcie_irq_map(ms, vms->gic_phandle, irq, nodename);\n \n+    if (vms->pci_pre_enum) {\n+        qemu_fdt_setprop_cell(ms->fdt, nodename, \"pci-enum-done\", 1);\n+    }\n+\n     if (vms->iommu) {\n         vms->iommu_phandle = qemu_fdt_alloc_phandle(ms->fdt);\n \n@@ -1832,6 +1839,20 @@ static void virt_build_smbios(VirtMachineState *vms)\n     }\n }\n \n+static void virt_pci_apply_fix_bar_after_reset(void *opaque)\n+{\n+    VirtMachineState *vms = opaque;\n+    PciFixedBarMmioParams mmio = {\n+      .mmio32_base = vms->memmap[VIRT_PCIE_MMIO].base,\n+      .mmio32_size = vms->memmap[VIRT_PCIE_MMIO].size,\n+      .mmio64_base = vms->memmap[VIRT_HIGH_PCIE_MMIO].base,\n+      .mmio64_size = vms->memmap[VIRT_HIGH_PCIE_MMIO].size,\n+    };\n+\n+    pci_enumerate_bus(vms->bus);\n+    pci_fixed_bar_allocator(vms->bus, &mmio);\n+}\n+\n static\n void virt_machine_done(Notifier *notifier, void *data)\n {\n@@ -1864,11 +1885,30 @@ void virt_machine_done(Notifier *notifier, void *data)\n     if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as, ms, cpu) < 0) {\n         exit(1);\n     }\n-\n-    pci_bus_add_fw_cfg_extra_pci_roots(vms->fw_cfg, vms->bus,\n-                                       &error_abort);\n+    /*\n+     * In pci-pre-enum mode, EDK2 does not perform PCI enumeration or\n+     * resource assignment (PcdPciDisableBusEnumeration = TRUE). All root\n+     * bridges are marked ResourceAssigned, meaning the topology and\n+     * MMIO/MMIO64 apertures provided by QEMU are treated as final.\n+     *\n+     * In this mode, each root bridge is consumed as an independent resource\n+     * domain. Exposing additional root bridges (e.g. PXB extra roots) that\n+     * share identical MMIO/MMIO64 apertures creates duplicate resource domains\n+     * with overlapping address spaces, which is invalid in this mode.\n+     *\n+     * Therefore, extra root bridges are not exposed in pre-enumeration mode.\n+     */\n+    if (!vms->pci_pre_enum) {\n+        pci_bus_add_fw_cfg_extra_pci_roots(vms->fw_cfg, vms->bus,\n+                                           &error_abort);\n+    }\n \n     virt_acpi_setup(vms);\n+\n+    if (vms->pci_pre_enum) {\n+        qemu_register_reset(virt_pci_apply_fix_bar_after_reset, vms);\n+    }\n+\n     virt_build_smbios(vms);\n }\n \n@@ -2988,6 +3028,20 @@ static void virt_set_mte(Object *obj, bool value, Error **errp)\n     vms->mte = value;\n }\n \n+static bool virt_get_pci_pre_enum(Object *obj, Error **errp)\n+{\n+    VirtMachineState *vms = VIRT_MACHINE(obj);\n+\n+    return vms->pci_pre_enum;\n+}\n+\n+static void virt_set_pci_pre_enum(Object *obj, bool value, Error **errp)\n+{\n+    VirtMachineState *vms = VIRT_MACHINE(obj);\n+\n+    vms->pci_pre_enum = value;\n+}\n+\n static char *virt_get_gic_version(Object *obj, Error **errp)\n {\n     VirtMachineState *vms = VIRT_MACHINE(obj);\n@@ -3726,6 +3780,13 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)\n                                           \"in ACPI table header.\"\n                                           \"The string may be up to 8 bytes in size\");\n \n+    object_class_property_add_bool(oc, \"pci-pre-enum\",\n+                                   virt_get_pci_pre_enum,\n+                                   virt_set_pci_pre_enum);\n+    object_class_property_set_description(oc, \"pci-pre-enum\",\n+                                          \"Set on/off to enable/disable PCI enumeration and resource assignment\"\n+                                          \" in QEMU. When enabled, QEMU programs BARs (including fixed-bars\"\n+                                          \" addresses) before handing control to firmware.\");\n }\n \n static void virt_instance_init(Object *obj)\n@@ -3768,6 +3829,9 @@ static void virt_instance_init(Object *obj)\n     /* MTE is disabled by default.  */\n     vms->mte = false;\n \n+    /* PCI pre-enumeration disabled by default */\n+    vms->pci_pre_enum = false;\n+\n     /* Supply kaslr-seed and rng-seed by default */\n     vms->dtb_randomness = true;\n \ndiff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h\nindex 410df857c7..0786f4a4fc 100644\n--- a/include/hw/arm/virt.h\n+++ b/include/hw/arm/virt.h\n@@ -187,6 +187,7 @@ struct VirtMachineState {\n     MemoryRegion *sysmem;\n     MemoryRegion *secure_sysmem;\n     bool pci_preserve_config;\n+    bool pci_pre_enum;\n     hwaddr override_pcie_mmio_base;\n     hwaddr override_pcie_mmio_size;\n };\n","prefixes":["RFC","8/8"]}